scieee AI-readable full text Open interactive document viewer

Creació d’eines de decisió per a equips de bàsquet

Ramos Navarro, Irene

Abstract

Aquest treball consisteix en trobar una manera de predir victòries i/o derrotes d’un equip de bàsquet a temps real, és a dir, minut a minut. Per tal de poder dur a terme aquestes prediccions, s’ha hagut de fer un estudi sobre les variables que intervenen en un partit, aquelles que es recullen en una acta oficial. A partir d’aquest estudi, es plantegen una sèrie de simulacions per tal d’obtenir unes aproximacions per a les probabilitats de guanyar aquests part its en funció de dues variables; temps restant i diferència de punts. També mostra la creació d’una aplicació interactiva per tal de poder observar aquests resultats a temps real

Full text

Títol: Creació d’eines de decisió per a equips de bàsquet Autor: Irene Ramos Navarro Director: Lluís Marco i Lourdes Rodero Departament: Estadística i Investigació Operativa (UPC) Convocatòria: Juny 2016 : Grau en Estadística Resum Aquest treball consisteix en trobar una manera de predir victòries i/o derrotes d’un equip de bàsquet a temps real, és a dir, minut a minut. Per tal de poder dur a terme aquestes prediccions, s’ha hagut de fer un estudi sobre les variables que intervenen en un partit, aquelles que es recullen en una acta oficial. A partir d’aquest estudi, es plantegen una sèrie de simulacions per tal d’obtenir unes aproximacions per a les probabilitats de guanyar aquests partits en funció de dues variables; temps restant i diferència de punts. També mostra la creació d’una aplicació interactiva per tal de poder observar aquests resultats a temps real. Paraules clau: Lluïsos de Gràcia (LLdG), temps entre anotacions, diferències de punts, simulacions, millors/pitjors classificats, probabilitat de guanyar, Shiny Classificació: 68U20 Simulation, 65C10 Random number generation, 62P99 Applications. None of the above, but in this section, 62-07 Data analysis Agraïments als meus tutors Lourdes i Lluís per la seva ajuda i dedicació. Índex 1 Introducció i Motivació ............................................................................................................... 5 1.1 Objectius ............................................................................................................................. 6 2 Un article inspirador .................................................................................................................... 7 2.1 El primer test ....................................................................................................................... 7 2.2 El segon test ........................................................................................................................ 9 3 Metodologia .............................................................................................................................. 14 4 Recollida i manipulació de les dades ......................................................................................... 15 5 Anàlisi descriptiva ...................................................................................................................... 18 5.1 Jugador .............................................................................................................................. 18 5.2 Puntuació .......................................................................................................................... 19 5.3 Jornada .............................................................................................................................. 20 5.4 Temporada i Resultat final ................................................................................................ 21 5.5 Temps mort ....................................................................................................................... 21 5.6 Equip anotador .................................................................................................................. 22 5.7 Minuts restants, minut total i diferència de punts ........................................................... 23 5.8 Resultat LldG i Resultat rival.............................................................................................. 25 5.9 Victòries de LldG i Local..................................................................................................... 26 6 Simulació de partits ................................................................................................................... 27 6.1 Simulació del temps entre anotacions .............................................................................. 30 6.1.1 LldG vs millors ........................................................................................................... 32 6.1.2 LldG vs pitjors ............................................................................................................ 33 6.1.3 Intragrups: Millors ..................................................................................................... 35 6.1.4 Intragrups: Pitjors ...................................................................................................... 36 6.2 Simulació d’un partit ......................................................................................................... 38 6.2.1 Distribucions de les diferències de punts .................................................................. 40 6.3 Anàlisi dels resultats i comparació amb l’article ............................................................... 43 7 Comprovació de mites .............................................................................................................. 44 7.1 Simulació dels tests trobats a l’article ............................................................................... 44 7.1.1 Test 1 ......................................................................................................................... 44 7.1.2 Test 2 ......................................................................................................................... 46 7.1.3 Test 3 ......................................................................................................................... 49 8 Creació de l’eina ........................................................................................................................ 52 8.1 Què és Shiny? .................................................................................................................... 52 8.1.1 User-interface code ................................................................................................... 52 8.1.2 Server ........................................................................................................................ 54 8.2 Aplicació Shiny ................................................................................................................... 55 8.3 User-interface.................................................................................................................... 56 8.4 Server ................................................................................................................................ 57 9 Ús de l’eina ................................................................................................................................ 60 10 Conclusions ........................................................................................................................... 63 11 Bibliografia ............................................................................................................................ 64 12 Annex..................................................................................................................................... 65 12.1 Codi R – Inici.R ................................................................................................................... 65 12.2 Simulacions........................................................................................................................ 70 12.3 Codi R - Shiny ..................................................................................................................... 87 12.3.1 ui.R ............................................................................................................................. 87 12.3.2 server.R...................................................................................................................... 88 5 1 Introducció i Motivació Des dels 8 anys he sigut jugadora de bàsquet, sent una part molt important de la meva vida en quant a creixement com a persona. Més endavant, aquesta passió va fer que em formés com a entrenadora volent transmetre els meus coneixements sobre el joc a altres nens i nenes, i mostrant la disciplina que aquest esport inculca als jugadors des de ben petits. És per aquest motiu que m’ha sorgit la idea de veure si es pot crear un programa que calculi les probabilitats de guanyar un partit de bàsquet en qualsevol instant. Evidentment, calcular aquesta probabilitat és força complicada ja que existeixen moltes variables que influeixen en un partit de bàsquet com per exemple la classificació de cada equip, la qualitat dels jugadors, si juguen com a local o visitant, etc. La majoria d’aquestes variables no es poden controlar. Per exemple, l’encert d’un jugador pot ser més alt o més baix en funció de la qualitat d’aquest, però no sempre té perquè ser similar. Durant molts anys he jugat a un equip del barri que es diu Sagrada Família Claror, on es pot dir que he après gairebé tot el que sé de bàsquet. Tot i així, a mesura que et vas fent gran vols anar canviant d’aires, conèixer gent nova i aprendre coses diferents d’altres llocs. Finalment, he acabat jugant al club Lluïsos de Gràcia, un altre equip de barri que acull als seus jugadors com si fos una gran família. És d’aquí d’on ha sortit la idea d’estudiar un dels millors equips de la casa: el Sènior A Masculí. Un equip que està format per 10 jugadors, que porten la majoria d’ells molts anys jugant junts. És un equip format per jugadors de diferents edats, sent 18 l’edat mínima. Aquest equip competeix en una categoria força alta anomenada Copa Catalunya, que com el nom indica competeix només amb equips del territori català. Es pot trobar més informació d’aquest equip, de la temporada 2015-2016, en el següent enllaç: http://www.basquetcatala.cat/club/080060/00. Tot i així, les dades emprades en aquest treball són de la temporada 2014-2015, doncs eren l’última temporada completa. 6 1.1 Objectius L’objectiu general d’aquest treball és trobar un model que expliqui el comportament general d’un partit de bàsquet de l’equip Lluïsos de Gràcia per tal de poder estudiar-lo i poder realitzar prediccions per futures jornades, en temps real. D’altra banda, existeixen altres objectius secundaris tot i que també són rellevants: - Observació de les variables d’interès d’un partit - Simulació de partits a partir dels temps entre anotacions - Creació de tests predictius, de la revisió bibliogràfica, i observació dels resultats amb les nostres dades - Comparació entre tests - Creació d’una web interactiva Un objectiu més pedagògic del treball és conèixer el paquet de R: Shiny, que a partir de codi en R pot crear una aplicació web, que mostri dades, gràfiques i resultats d’operacions de manera interactiva. 7 2 Un article inspirador L’article “Light It Up: Predicting the winner of an NBA game before the end” escrit per Katherine McGivney, Ray McGivney i Ralph Zegarelli (2008) de la revista CHANCE, mostra un estudi estadístic sobre la probabilitat de guanyar un partit de bàsquet de la NBA en un determinat instant de temps, en funció de la diferència de punts entre ambdós equips. La idea és aplicar tres tipus de tests per predir, amb una alta probabilitat, quin serà l’equip guanyador del partit abans de que s’acabi. Per poder realitzar aquest estudi, ha calgut conèixer el temps restant de partit, l’instant en què es produeix una cistella i el resultat en cada moment. Figura 2.1 Esdeveniments en un partit dels LA Lakers vs Phoenix Suns, de l’article de McGivney, McGivney i Zegarelli (2008) 2.1 El primer test L’article proposa un primer test que consisteix en satisfer dues condicions: ha de dependre només de la informació observada durant el partit i ha de ser de fàcil aplicació. Es considera una nova variable D que representa el valor absolut de la diferència entre les puntuacions d’ambdós equips, calculada a partir de la tercera columna de la Figura 2.1 i la variable T que representa els minuts restants de partit (depreciant els segons). Aleshores, es defineix el Test 1: Seleccionar l’equip que va guanyant quan es satisfà la condició D > T. 8 Però s’ha de tenir en compte dues possibilitats en les que el test pot fallar: - L’equip que va per davant al marcador en el moment en que el Test 1 es satisfà per primera vegada es projecta com a guanyador. Pot ser que aquest equip no torni a estar per davant i que el Test no es torni a executar, és a dir, la diferència de punts no sigui mai superior al temps restant de partit. - El Test 1 no s’executi mai. La següent gràfica mostra la freqüència amb què el Test 1 s’invoca en funció del temps que queda de partit. Figura 2.2. Número de vegades que s’invoca el Test 1 respecte el temps restant de partit, de l’article de McGivney, McGivney i Zegarelli (2008) Per exemple, en l’últim minut de partit (T=0) el Test 1 s’invoca 1 sola vegada, mentre que quan resten 10 minuts de partit, el Test 1 es satisfà 10 vegades. En aquest partit, no es compleix la condició D > T fins que queden 25 minuts de joc. L’scatterplot de la Figura 2.2 té una tendència creixent a mesura que s’apropa el final del partit, indicant que quan encara resta molt temps de partit, és poc freqüent que les diferències entre ambdós equips sigui superior al temps però, en canvi, a falta de 5-6 minuts, es compleix la condició un elevat nombre de cops. D’aquesta manera obtenim les prediccions de guany d’un equip. En la Taula 2.1 es pot observar el percentatge d’encert del Test 1 en diferents instants de partit. Per crear-la, s’han observat totes les vegades que el Test 1 s’ha invocat, i quantes vegades l’ha encertat, durant el tercer període, durant el quart període, i per als últims sis i tres minuts de partit. Per exemple, en el tercer període el Test 1 indica correctament el guanyador el 100% de les vegades, mentre que en els últims tres minuts de partit només encerta un 70.6%, i s’invoca una quarta part menys de les vegades. 9 Taula 2.1 Prediccions de victòria amb el Test 1 per quart 2.2 El segon test Un cop observats els resultats del Test 1, i la quantitat de prediccions realitzades quan porten poc temps de joc, es decideix realitzar el Test 2: Seleccionar l’equip que es troba per sobre del marcador quan es compleix 𝐷 > 𝑇2 ⁄ . Els resultats obtinguts amb el Test 2 són similars als del Test 1 (Figura 2.3). Com era d’esperar, es pot observar que el nombre de vegades que s’invoca el Test 2 és superior al del Test 1, i a més, la primera vegada es produeix en el minut cinc de partit, mentre que amb el Test 1 s’havia jugat gairebé la meitat del partit. Figura 2.3 Número de vegades que s’invoca el Test 2 respecte el temps restant de partit, segons l’article de McGivney, McGivney i Zegarelli (2008) Pel que fa al Test 2, a la Figura 2.3 es pot observar que s’invoca molt abans que el Test 1 i el model logístic que utilitzen és el següent: 𝑃 = 0.930 1 + 3797𝑒−2.80𝑇 En aquest cas, la corba no s’ajusta tant bé a les dades (Figura 2.4). S’observa que els últims 20 minuts de partit es produeix major dispersió. 16 Informació La Figura 4.2 mostra les dades per als jugadors de l’equip local, equip A. Temps morts 1r i 2n període (3 per als darrers períodes) Faltes comeses al 3r període Cognom, Nom. Línia separadora mitja part Minut en què es comet la falta Figura 4.2 Zona d’equips Anotació La Figura 4.3 mostra les dades obtingudes durant el partit; les anotacions per cada equip i el minut. El jugador nº 13 de l’equip B anota una cistella de 2 punts El jugador nº 4 de l’equip A anota el 1r tir lliure i falla el 2n. El jugador nº 15 de l’equip B Minut 4 de partit anota una cistella de 3 punts Figura 4.3 Zona de puntuacions La Figura 4.4 representa l’encapçalament de l’acta del partit; conté informació extra que no utilitzarem per a la creació de la base de dades, només els equips que s’enfronten durant el partit. Figura 4.4 Encapçalament de l’acta 17 A partir d’aquesta informació, s’ha creat una base de dades que consta de les següents variables: Taula 4.1 Taula de variables i descripcions Variable Descripció T temps restant de partit Min_tot minut de partit en què es produeix un esdeveniment Jugador nº del jugador que anota cistella Puntuacio pren valors 1, 2 o 3 segons el valor de la cistella anotada Jornada nº de partit de la lliga (1-30 jornades) Local pren valor 1 si Lluïsos de Gràcia juga com a local; 0 en cas contrari Victoria_llg pren valor 1 si Lluïsos de Gràcia guanya el partit; 0 en cas contrari Equip_anotador nom de l’equip al qual pertany el jugador que anota Score_lluisos puntuació acumulada de l’equip Lluïsos de Gràcia en l’instant de temps Score_rival puntuació acumulada de l’equip rival en l’instant de temps Score_final resultat final del partit D diferència de punts en l’instant de temps Temps_mort nom de l’equip que demana temps mort en l’instant de temps Temporada temporada en que es produeix el partit (2014-2015 o 2015-2016) Class posició de la classificació en què ha quedat l’equip rival (1-16) En total sumen 2219 observacions i 15 variables. Cal mencionar que tres de les trenta jornades es produeix un empat en el minut 40, és a dir, el partit acaba amb diferència de punts igual a 0. Aleshores, en aquests partits es disputa una pròrroga de cinc minuts, fent que la variable temps restant de partit T i la variable minut en què es produeix un esdeveniment min_tot prenguin valors des de 0 fins a 44 minuts. Aquestes tres jornades són la jornada 16, la jornada 19 i la jornada 30. 18 5 Anàlisi descriptiva Les variables d’aquesta base de dades són de diferents tipus: - Les variables Jugador, puntuació i jornada prenen valors numèrics que segueixen un determinat ordre. - Les variables equip_anotador i temps_mort, que indiquen el nom de l’equip que realitza l’acció d’anotar una cistella o de demanar un temps mort, estan definides com a tipus caràcter i són una simple etiqueta. Al igual que les variables score_final i temporada, que són dues variables totalment informatives. - Les variables min_rest, T i D s’expressen numèricament i amb valors finits, indicant els minuts restants de partit, el minut de partit en què ens trobem i la diferència de punts. - Les variables local i victoria_llg prenen valor 1 si la condició de què els LldG juguen com a local, i la condició de què els LldG guanyen el partit és certa, o bé 0 si és falsa. Un cop organitzades totes les variables, es realitza una anàlisi descriptiva variable a variable. 5.1 Jugador La variable jugador conté els valors del dorsal de cada jugador que anota. Es pot trobar un gran repertori de dorsals per cada equip, pel que faria que tinguéssim una taula molt gran amb freqüències més elevades pels jugadors dels Lluïsos de Gràcia en comparació amb la resta d’equips, ja que tenim resultats de 30 partits jugats pels Lluïsos de Gràcia i tan sols dos partits per a cada jugador rival. La Figura 5.1 Freqüències d’anotacions segons els dorsalsFigura 5.1 mostra la freqüència d’anotacions en les 30 jornades per a cada dorsal, independentment de si el jugador és dels Lluïsos de Gràcia o d’un equip rival. Figura 5.1 Freqüències d’anotacions segons els dorsals 19 Es pot observar que els dorsals que anoten més freqüentment són entre el 4 i el 20. Això és degut també a què els dorsals utilitzats, en la major part dels equips, prenen sempre valors entre el 4 i el 15. A la Taula 5.1 es troben el nombre de vegades que anota cada jugador dels Lluïsos de Gràcia i de quina puntuació anota: Taula 5.1 Taula de freqüències d’anotacions per jugador dels LLdG Jugador 4 5 6 7 9 10 12 13 14 15 18 55 1p 78 52 15 46 10 17 25 69 61 76 1 0 2p 103 45 18 89 24 20 28 47 63 64 5 4 3p 15 10 4 1 0 10 70 33 42 3 1 3 Freq. 196 107 37 136 34 48 123 149 166 143 7 7 Punts totals 329 172 63 227 58 89 291 262 313 213 14 17 Els jugadors que més punts han anotat durant tota la temporada són el jugador número 4, el número 12 i el número 14 amb 329, 291 i 313 punts respectivament. Cal esmentar que tots tres jugadors són exteriors i que per tant, és més probable que anotin cistelles de tres punts que no pas els jugadors interiors. Figura 5.2 Gràfic del total d’anotació dels jugadors dels LLdG En la Figura 5.2 es veu clarament que el jugador que més anota, amb diferència, és el número 4, seguidament del jugador número 14. 5.2 Puntuació La variable puntuació indica quin tipus d’anotació s’ha produït, independentment de si l’equip que anota és els LLdG o un rival. Pren valor 1 si s’anota un tir lliure, 2 si s’anota un tir de camp o bé 3 si s’anota un triple (tir per fora de la línia de 6,75m). 20 En la Taula 5.2 Taula de freqüènciesTaula 5.2 es mostren les freqüències obtingudes per a la variable puntuació. El 45.5% de les cistelles anotades són de 2 punts, seguides dels tirs lliures amb un 37.9%. Com és lògic, en un partit de bàsquet són més freqüents les cistelles de dos punts que les de tres punts, degut a la seva dificultat. Taula 5.2 Taula de freqüències puntuacio Freq % 1 842 0.379 2 1009 0.455 3 368 0.166 Figura 5.3 Diagrama de barres de la variable puntuació 5.3 Jornada Estudiar la variable jornada servirà per obtenir resultats informatius respecte el nombre de cistelles que s’anoten jornada a jornada, en total dels dos equips. Taula 5.3 Resum estadístic de la variable jornada jornada Mín. 51.00 1r quantil 64.25 Mediana 74.50 Mitjana 73.97 3r quantil 79.75 Màx. 99.00 El nombre mínim d’anotacions d’entre totes les jornades és de 51 i el màxim és de 99. 21 Figura 5.4 Número d’anotacions per cada jornada A la Figura 5.4 es pot observar que les jornades que tenen més anotacions, entre ambdós equips, són al 16 i la 19, justament les dues jornades que es juga una pròrroga de cinc minuts. Seguidament està la primera jornada, que està formada per força observacions ja que el resultat final és de 72-68 a favor dels Lluïsos de Gràcia. 5.4 Temporada i Resultat final La variable temporada pren sempre el mateix valor i es considerarà de tipus caràcter, ja que només indica la temporada en què es troba: “2014-2015”. La variable score_final conté, per totes les observacions de cada jornada, el resultat final de partit; sempre el mateix per tota la jornada. 5.5 Temps mort La variable temps_mort indica el nom de l’equip que ha demanat un temps mort durant el partit. Cal recordar que cada equip pot demanar un màxim de cinc temps morts, per tant, cada equip podrà demanar com a molt 10 temps morts (en dues jornades), excepte els Lluïsos de Gràcia que al tenir dades de les seves 30 jornades pot aconseguir un màxim de 150 temps morts. Taula 5.4 Taula de freqüències de la variable Temps morts Equip TM Equip TM Equip TM Lluïsos de Gràcia 62 AE Minguella 4 CB Viladecans 8 AE Sant Andreu de Natzaret 6 CB Castellbisbal 8 CB Igualada 8 Círcol Catòlic de Badalona 10 AECS Ramon Llull 7 UBSA 6 Sant Josep de Badalona 6 BARNA 8 SESE 9 SEDIS BÀSQUET 9 CB El Vendrell 6 UE Horta 10 CB Esparraguera 7 22 Sovint, els temps morts serveixen per a aturar dinàmiques positives del rival, o bé per aturar dinàmiques negatives del propi equip. S’utilitzen també al final del partit, a falta de dos minuts, per tal de poder posar la pilota en joc des de la pista d’atac i no haver de recórrer botant tota la pista o poder realitzar jugades de banda concretes. Dels dos equips que han demanat tots els temps morts possibles, només ha servit a el Círcol Catòlic de Badalona per guanyar un partit, mentre que l’UE Horta els va perdre tots dos. 5.6 Equip anotador Pel que fa a la variable equip_anotador, que indica el nom de l’equip que aconsegueix una cistella s’obté la taula de freqüències següent. Taula 5.5 Taula de freqüències de la variable Equip anotador Equip Freq. % Equip Freq. % Equip Freq. % Lluïsos de Gràcia 1153 - AE Minguella 74 6.9% CB Viladecans 72 6.8% AE Sant Andreu de Natzaret 69 6.5% CB Castellbisbal 94 8.8% CB Igualada 64 6.0% Círcol Catòlic de Badalona 79 7.4% AECS Ramon Llull 62 5.8% UBSA 51 4.8% Sant Josep de Badalona 78 7.3% BARNA 86 8.1% SESE 71 6.7% SEDIS BÀSQUET 74 6.9% CB El Vendrell 59 5.5% UE Horta 73 6.8% CB Esparraguera 60 5.6% NOTA: es calcula la freqüència relativa descartant els valors obtinguts per l’equip Lluïsos de Gràcia. En la Taula 5.5 s’haurà de comparar entre els equips exceptuant als Lluïsos de Gràcia, ja que la freqüència d’anotació és de 30 partits i la resta de dos partits. Els equips més anotadors en dues jornades han estat el CB Castellbisbal i el BARNA, amb un 8.8% i un 8.1% del total d’anotacions dels equips rivals. Figura 5.5 Gràfic de freqüències d’anotacions dels equips rivals Com que descartar l’equip Lluïsos de Gràcia implica descartar 1153 observacions, més de la meitat de les dades, calcularem les freqüències per a cada jornada tenint sempre una freqüència pels LLdG i una freqüència per l’equip rival. 23 En la Figura 5.5 es pot observar que els equips que han anotat més nombre de cistelles en el total dels dos partits, independentment de la puntuació, són el C.B. Castellbisbal i el BARNA, anotant 94 i 86 cistelles, respectivament. La Taula 5.6 mostra els resultats obtinguts per a les tres primeres jornades. Taula 5.6 Taula de freqüències d’anotacions per jornada i equip Jornada Freq Equip 1 46 CB Castellbisbal 1 45 Lluïsos de Gracia 2 38 Lluïsos de Gracia 2 26 UBSA 3 35 AE Minguella 3 42 Lluïsos de Gracia Per exemple, en la segona jornada els Lluïsos anoten 38 cistelles en total, mentre que l’UBSA només 26. Tot i això, pot ser que el resultat sigui ajustat, ja que el que es compta són el nombre de cistelles però no la puntuació de cadascuna d’aquestes. Taula 5.7 Resultats estadístics del nombre d’anotacions per jornada i per equip Mín. 23.00 1r quantil 32.00 Mediana 37.00 Mitjana 36.98 3r quantil 42.00 Màx. 50.00 Sd 6.711 La mitjana d’anotacions per equip i per jornada és de 36.98, amb un màxim de 50 i un mínim de 23 anotacions per a algun equip en les 30 jornades, independentment de si són d’un, de dos o de tres punts. 5.7 Minuts restants, minut total i diferència de punts De totes les variables només es pot realitzar un resum directe del minut total de partit, del temps restant i de la diferència de punts ja que les variables score_lluisos i score_rival contenen observacions repetides degut a la forma de recollida de dades. Per exemple: l’score_rival és de 60 punts i l’score_lluisos és de 58 punts, si Lluïsos anota sis punts seguits, la variable score_rival prendria tres vegades més el valor 60 i la variable score_lluisos prendria valors 60, 62 i 64. 24 Taula 5.8 Resum estadístic de les variables T, min_tot i D T Min_tot D Mín. 0.00 1.00 -18.00 1r quantil 8.00 11.00 -3.00 Mediana 19.00 22.00 2.00 Mitjana 18.67 21.93 1.70 3r quantil 29.00 33.00 7.00 Màx. 44.00 45.00 26.00 Sd 12.01 12.09 7.49 Les variables de temps restant i minut de partit no expliquen gaire més nou. Es pot observar que la variable de diferència de punts pren un mínim de -18 punts, és a dir, Lluïsos de Gràcia en algun moment arriba a anar perdent per 18 punts, i un màxim de 26 punts a favor. Representant gràficament aquestes variables es pot observar que pel que fa a la variable D, la major part dels resultats obtinguts es troben al voltant de -3 i 10 punts, més del 50% de les dades ja que entre el 1r i el 3r quartil trobem el 50% de les dades. Figura 5.6 Freqüències de les variables D, T i min_tot Les freqüències obtingudes per a la variable de minuts restants són força semblants, però es pot destacar que la major part dels esdeveniments s’han produït gairebé al final del partit. La variable minut de partit està directament relacionada amb els minuts restants ja que la variable T = 40 – minut del partit, o bé T = 45 – minut del partit en el cas de les jornades 16, 19 i 30 en les què es produeix una pròrroga. 25 En la Figura 5.7 es pot observar que per la variable de diferències de punts existeixen casos extrems. Figura 5.7 Boxplot de les variables D, min_tot i T 5.8 Resultat LldG i Resultat rival Es procedeix a analitzar les dues variables de resultat del partit per cada equip, definides per cada esdeveniment del partit. Per tal de realitzar aquests càlculs, prèviament s’ha d’eliminar totes les files repetides esmentades anteriorment. Els resultats obtinguts es troben a la Taula 5.9: Taula 5.9 Resum estadístic de les variables score_lluisos i score_rival Score_lluisos Score_rival Mín. 0.00 0.00 1r quantil 18.00 17.00 Mediana 35.00 33.50 Mitjana 36.01 34.16 3r quantil 53.00 50.00 Màx. 86.00 84.00 sd 20.78 20.37 La puntuació màxima per Lluïsos és de 86 punts i la puntuació màxima obtinguda pels rivals, per a algun d’ells, és de 84. La mitjana de resultats obtinguts pels LldG és superior en un tir de camp que la dels rivals. Figura 5.8 Puntuacions obtingudes durant les 30 jornades 32 6.1.1 LldG vs millors El primer grup que estudiarem és el de les anotacions dels LLdG enfront als rivals que es troben a la part alta de la classificació. En aquest grup, només es trobaran les anotacions contra 5 rivals, és a dir, anotacions de 10 partits disputats. Taula 6.7 Taula de freqüències dels temps entre tirs lliures T entre 1p Freq. T entre 1p Freq. 0 72 8 1 1 27 10 3 2 21 11 1 3 10 13 1 4 6 14 1 5 4 15 1 6 3 16 1 7 4 26 1 Es pot observar que el més freqüent és trobar diferències de temps entre anotacions de 0 minuts; això és degut a què en la majoria de casos en què es produeix una falta de tir, si no s’aconsegueix encistellar aquest tir, es realitzen dos tirs lliures seguits i es continua el partit. També pot ser degut a què, en finals de partits ajustats, es realitzen més faltes, i a partir de la quarta falta d’un equip, les properes que realitzi seran tirs lliures pels rivals. Taula 6.8 Taula de freqüències dels temps entre tirs de 2 T entre 2p Freq. T entre 2p Freq. 0 14 5 8 1 46 6 3 2 45 7 3 3 17 8 1 4 14 Les anotacions de tirs de dos punts són més freqüents cada un i dos minuts. S’ha de tenir present que un tir de dos punts és aquell que es produeix en qualsevol punt de la pista situat per sota de la línia de 6,25 m. Taula 6.9 Taula de freqüències dels temps entre triples T entre 3p Freq. T entre 1p Freq. 0 3 8 1 1 12 9 2 2 9 10 1 3 7 11 1 4 4 12 1 5 5 14 2 6 3 15 1 7 3 19 2 33 Pel que fa a les anotacions de 3 punts, es pot observar que el rang de temps entre anotacions és més elevat. El més freqüent segueix sent 1 minut entre cada triple, però amb una freqüència molt més baixa que la resta de puntuacions. El temps màxim que ha passat entre una anotació i la següent de l’equip LLdG enfront els millors és de 26 minuts. En la Figura 6.4 es pot veure la distribució dels temps entre els tres tipus d’anotacions. Podria semblar que segueixen una distribució exponencial. Figura 6.4 Histogrames dels temps entre anotacions en partits dels LLdG vs equips millors 6.1.2 LldG vs pitjors De la mateixa manera que en el grup anterior, anem a estudiar només les anotacions dels LLdG contra els equips pitjors classificats; en aquest cas, es disposen de 10 equips, i per tant, 20 partits jugats. Taula 6.10 Taula de freqüències dels temps entre tirs lliures T entre 1p Freq. T entre 1p Freq. 0 105 8 6 1 45 9 4 2 40 10 1 3 19 11 4 4 9 18 1 5 10 19 1 6 9 25 1 7 8 De nou, el més freqüent és que es produeixin tirs lliures cada 0 minuts, seguidament de 1 i dos minuts, amb gairebé la mateixa freqüència. També es produeix un cas de 25 minuts entre un tir lliure i el següent. 34 Taula 6.11 Taula de freqüències dels temps entre tirs de 2 T entre 2p Freq. T entre 2p Freq. 0 40 6 11 1 109 7 6 2 79 8 3 3 39 9 1 4 27 10 1 5 12 11 2 En aquest cas, es troben 109 casos en els que s’ha produït una diferència d’un minut entre un tir de dos punts i el següent. La freqüència de temps entre tirs de dos punts igual a zero és més petita ja que no és molt habitual anotar moltes cistelles consecutives en un mateix minut. Taula 6.12 Taula de freqüències dels temps entre triples T entre 3p Freq. T entre 1p Freq. 0 3 10 4 1 14 11 4 2 19 13 2 3 12 14 1 4 8 16 5 5 11 22 1 6 9 26 1 7 4 29 1 8 4 31 1 9 1 En quant a temps entre triples anotats, el més freqüent és que es produeixin cada 1-6 minuts. En aquest cas, s’observen temps màxims entre triples superiors als del grup dels LLdG contra els equips millors. Segurament degut a què es tenen moltes més observacions per a aquest grup. Figura 6.5 Histogrames dels temps entre anotacions en partits dels LLdG vs equips pitjors Les distribucions observades en la Figura 6.5 no disten gaire de les trobades per als resultats trobats per als LLdG contra equips millors. 35 6.1.3 Intragrups: Millors Els següents grups estan formats només per les anotacions dels equips rivals. En aquest cas, anem a veure quins són els resultats obtinguts per a les anotacions dels equips del grup millors contra els Lluïsos de Gràcia. Taula 6.13 Taula de freqüències dels temps entre tirs lliures T entre 1p Freq. T entre 1p Freq. 0 67 8 2 1 26 9 1 2 12 10 1 3 11 11 1 4 6 13 1 5 4 18 1 6 1 20 1 7 6 Per als tirs lliures trobem menys observacions que per la resta de grups. De totes maneres, els casos més observats són els que es produeixen dos tirs lliures consecutius en un mateix minut, seguidament dels que es produeixen cada minut. Taula 6.14 Taula de freqüències dels temps entre tirs de 2 T entre 2p Freq. T entre 2p Freq. 0 16 6 6 1 50 7 1 2 38 8 2 3 19 9 2 4 11 15 1 5 3 22 1 Pel que fa als tirs de camp, els equips rivals anoten aproximadament els mateixos, en total, que els Lluïsos de Gràcia, i produïts gairebé amb la mateixa freqüència de temps. Taula 6.15 Taula de freqüències dels temps entre triples T entre 3p Freq. T entre 1p Freq. 0 1 9 4 1 7 10 1 2 5 12 1 3 6 13 1 4 4 16 2 5 3 17 1 6 7 19 1 7 2 34 1 8 1 En aquest grup, es troba la màxima diferència de temps entre dues anotacions: 34 minuts, i una freqüència màxima trobada de 7 vegades. 36 La Figura 6.6 és molt semblant a les distribucions de temps entre anotacions trobades per als LLdG contra rivals del grup millors. Figura 6.6 Histogrames dels temps entre anotacions en partits dels equips millors 6.1.4 Intragrups: Pitjors Per últim tenim el grup de les anotacions dels rivals de la part baixa de la classificació. Taula 6.16 Taula de freqüències dels temps entre tirs lliures T entre 1p Freq. T entre 1p Freq. 0 96 10 3 1 28 11 4 2 23 12 3 3 9 13 1 4 12 14 1 5 9 15 1 6 8 17 2 7 5 22 2 8 9 23 1 9 4 En aquest grup, es pot observar la major diferència de freqüències entre 0 i 1 minuts. Es pot observar també que entre els 3-11 minuts es troben força repartits. 37 Taula 6.17 Taula de freqüències dels temps entre tirs de 2 T entre 2p Freq. T entre 2p Freq. 0 40 7 7 1 108 8 2 2 70 9 3 3 37 11 2 4 22 12 1 5 17 13 1 6 8 Pel que fa als tirs de dos punts, es troben freqüències de temps entre tirs molt similars a les produïdes per l’equip Lluïsos de Gràcia enfront de rivals classificats com a pitjors. Cal destacar que el màxim de temps entre un tir i el següent és només de 13 minuts. Taula 6.18 Taula de freqüències dels temps entre triples T entre 1p Freq. T entre 1p Freq. 0 5 11 3 1 18 12 1 2 17 13 1 3 8 14 2 4 6 15 4 5 5 16 1 6 3 18 1 7 4 19 1 8 6 21 1 9 7 26 1 10 2 33 1 Els equips rivals pitjors classificats anoten més triples que els LLdG entre 0 i 1 minuts, essent 2 i 4 triples més respectivament. Al igual que els Lluïsos de Gràcia, els temps entre triples estan força repartits i en temps prou similars. Figura 6.7 Histogrames dels temps entre anotacions en partits dels equips pitjors 38 Anem a comparar els resultats obtinguts per a cada grup. Com que els grups millors i pitjors tenen mides diferents, compararem els resultats obtinguts per LLdG vs millors i grup millors, i els resultats obtinguts per LLdG vs pitjors i grup pitjors. Taula 6.19 Freqüències totals 1p 2p 3p TOTAL LLdG vs Millors 157 151 57 365 Millors 141 150 48 339 LLdG vs Pitjors 263 330 105 698 Pitjors 221 318 98 637 Cal recordar que el 33.3% dels partits es disputen contra equips del grup millors, mentre que un 66.6% es disputen contra equips del grup pitjors, per això les freqüències d’anotacions són gairebé el doble. Tant en els partits disputats contra equips millors com contra equips pitjors, el nombre d’anotacions de l’equip Lluïsos de Gràcia és superior al nombre d’anotacions dels equips rivals. Es pot observar que les diferències són superiors quan juga contra equips inferiors que contra equips de la part alta de la classificació, com és d’esperar. Excepte en les anotacions dels Lluïsos contra equips millors, els més freqüents són els tirs de dos punts, en segon lloc els tirs lliures i en la darrera posició els triples, degut a la seva dificultat. 6.2 Simulació d’un partit Un cop obtingudes aquestes 12 taules, es procedeix a simular un partit en funció de contra quin tipus de rival jugui l’equip LLdG, millor o pitjor. Per exemple, si juguen contra un equip del grup millors, s’utilitzarà la taula d’anotacions dels LLdG enfront equips millors per a simular una mostra d’anotacions pels Lluïsos i s’utilitzarà la taula d’anotacions per grup entre els equips millors per a simular les anotacions de l’equip rival. Es van realitzar les simulacions d’aquesta manera ja que si es prenien mostres a partir de la distribució total del temps, la simulació no generava partits amb el mateix comportament. Per tant, es van fer servir les anotacions per a cada grup amb una probabilitat calculada a partir de les freqüències empíriques. A partir d’aquestes anotacions, es calcula la puntuació de cada equip en tot moment i la diferència de punts entre ells, essent sempre la puntuació de LLdG – la puntuació del rival. A més, es crea una variable aleatòria per tal de trencar l’ordre establert d’anotacions. És a dir, no sempre anotarà primer els LLdG i després els rivals, sinó que anotaran tirs, al llarg d’un partit, de manera aleatòria. Per evitar tenir possibles errades en les simulacions d’anotacions per a cada minut, s’ha d’observar quin és el nombre màxim d’anotacions per a cada minut en el total de les 30 jornades. 39 Taula 6.20 Nombre d’anotacions per minut N_anot_min Mín. 1.000 1r quantil 1.000 Mediana 2.000 Mitjana 2.146 3r quantil 3.000 Màx. 9.000 El nombre màxim d’anotacions que s’han produït en algun dels 30 partits disputats és de 9 anotacions per a un minut concret. I essent tres el nombre d’anotacions que es troba en el 75% dels casos. Figura 6.8 Histograma del nombre d’anotacions per minut La Figura 6.8 mostra clarament que en la major part dels partits com a màxim, entre ambdós equips, s’anoten 4 cistelles en un mateix minut, i per tant, seleccionant els partits simulats de màxim 4 anotacions per minut, s’obté una bona representació de les dades reals. S’afegeix també la variable guanya_llg que indica amb un 1 que el partit el guanya l’equip Lluïsos de Gràcia i amb un 0 si el guanya el rival. La Taula 6.21 mostra els primers 10 esdeveniments d’un partit simulat dels Lluïsos de Gràcia contra un rival del grup millors. 40 Taula 6.21 Simulació d’un partit de LLdG vs millor min_rest puntuacio equip_anotador aleat score_llg score_rival Dif guanya_llg 40 1 Lluisos de Gracia 1.76924760 1 0 1 1 40 1 RIVAL 0.02975589 1 1 0 1 40 3 RIVAL -1.07854063 1 4 -3 1 39 2 RIVAL -1.34812287 1 6 -5 1 38 2 Lluisos de Gracia -0.73475334 3 6 -3 1 38 3 RIVAL -2.11810940 3 9 -6 1 37 2 RIVAL 0.02821287 3 11 -8 1 36 2 RIVAL 0.69566850 3 13 -10 1 36 2 Lluisos de Gracia -0.06456568 5 13 -8 1 34 2 Lluisos de Gracia 0.41067690 7 13 -6 1 Per exemple, a falta de 37 minuts per a que acabi el partit, el resultat del partit és de 3-11 a favor dels rivals, i per tant, la diferència de punts en aquest moment és de -8 punts per als Lluïsos de Gràcia. Tot i així, la variable guanya_llg indica que el partit el guanya l’equip LLdG. 6.2.1 Distribucions de les diferències de punts Un cop es tenen simulats 10.000 partits dels dos tipus, contra equips millors i contra equips pitjors, es seleccionen per cada grup els partits que guanyen els Lluïsos de Gràcia i els partits que guanya l’equip rival. De manera que es tindran quatre grups diferents de tipus de partits: 1. LLdG guanya contra rivals millors 2. LLdG perd contra rivals millors 3. LLdG guanya contra rivals pitjors 4. LLdG perd contra rivals pitjors Amb les dades separades per grups, com que es poden obtenir un màxim de 5 diferències de punts per a cada minut, es selecciona només la primera diferència de punts trobada en un minut determinat. En cas de no existir cap cistella anotada per al minut escollit, es selecciona la última diferència de punts trobada per al minut anterior. Obtenim 10.000 taules, una per a cada partit, de 41 observacions cadascuna, formades de la següent manera: Taula 6.22 Dades finals utilitzades per al càlcul de probabilitats Min.restants Dif guanya_llg partit categoria 40 -2 1 1 Millors 39 -1 1 1 Millors 38 -1 1 1 Millors 37 -2 1 1 Millors 36 -2 1 1 Millors 35 -5 1 1 Millors 34 -5 1 1 Millors 33 -6 1 1 Millors 32 -5 1 1 Millors 31 -2 1 1 Millors 41 Les variables Dif i guanya_llg estan definides de la mateixa manera que les variables inicials. La variable Min.restants indica el nombre de minuts que resten per acabar el partit; pren valors del 40 fins al 0. La variable partit pren valors del 1 al 10.000 i la variable categoria indica a quin grup pertany el rival; millors o pitjors, en funció de la seva classificació. Aleshores, es vol saber quina és la distribució de les diferències de punts per tal de calcular les probabilitats de guanyar, depenent de l’equip contra el que es disputi el partit. La Figura 6.9 mostra les diferències de punts trobades, a falta d’un minut, en tots els partits simulats que ha guanyat l’equip LLdG enfront rivals millors. Figura 6.9 Diferències de punts, minut restant = 1, guanya_llg = 1 Si ens trobéssim amb una diferència de 10 punts, a falta d’un minut de partit, la probabilitat de guanyar el partit contra un rival millor seria l’àrea que resta al costat esquerre del valor Dif = 10, és a dir, la probabilitat d’obtenir aquesta diferència de punts, o una més extrema. La Figura 6.10 mostra la distribució de les diferències de punts, a falta d’un minut de partit, per als partits perduts enfront els equips classificats com a millors. Figura 6.10 Diferències de punts, minut restant = 1, guanya_llg = 0 48 Comparació ambdós tests: Taula 7.5 Comparació dels Tests S’obtenen resultats lògics ja que cada cop que dividim el temps T, assumim que la diferència a partir de la qual donarem un equip com a guanyador és inferior, i per tant, serà més fàcil que l’equip rival recuperi aquesta diferència i es posi per davant del marcador. A més, ens plantejarem un tercer test degut a que entre jugadors i entrenadors corre la dita de que el primer equip que arriba als 60 punts, és l’equip que acaba guanyant el partit. En aquest test també es pot plantejar un problema: és possible que en un partit cap dels dos equips arribi a aquesta puntuació. Per tal de poder realitzar aquest test, es crea una nova variable anomenada va_guanyant que pot prendre els valors “Lluïsos de Gràcia” si la diferència de punts D és major que 0, “nom del rival” si la diferència D és negativa i “EMPAT” en cas que la D sigui igual a 0. Test 1 (D>T) Encerts/Total partits % Test 2 (D>T/2) Encerts/Total partits % Tots els partits 27/30 0.900 23/30 0.767 Locals 14/15 0.933 12/15 0.800 Visitants 13/15 0.867 11/15 0.733 49 7.1.3 Test 3 En la taula següent es poden observar els resultats obtinguts en aplicar a les dades el Test 3: qui arriba abans a 60 punts guanya? Taula 7.6 Resultats obtinguts pel Test 3 Victoria_real Predicció Test 3 Min_rest encert jor 1 Lluïsos de Gràcia 6 1 1 1 Lluïsos de Gràcia 1 1 2 1 Lluïsos de Gràcia 4 1 3 1 Lluïsos de Gràcia 4 1 4 1 Sant Josep de Badalona 8 0 5 1 Lluïsos de Gràcia 0 1 6 1 SEDIS BASQUET 7 0 7 1 Lluïsos de Gràcia 0 1 8 0 BARNA 8 1 9 0 AECS Ramon Llull 0 1 10 1 Lluïsos de Gràcia 9 1 11 0 CB Esparraguera 6 1 12 1 Lluïsos de Gràcia 8 1 13 1 CB Viladecans 6 0 14 0 CB El Vendrell 2 1 15 0 CB Castellbisbal 11 1 16 1 Lluïsos de Gràcia 0 1 17 0 Lluïsos de Gràcia 7 0 18 1 Lluïsos de Gràcia 12 1 19 0 Sant Josep de Badalona 6 1 20 0 Lluïsos de Gràcia 4 0 21 1 Lluïsos de Gràcia 6 1 22 0 SESE 3 1 23 1 Lluïsos de Gràcia 0 1 24 1 Lluïsos de Gràcia 0 1 25 1 Lluïsos de Gràcia 0 1 26 1 Lluïsos de Gràcia 4 1 28 1 Lluïsos de Gràcia 9 1 29 1 CB Viladecans 5 0 30 Es prenen les mateixes variables que en els tests anteriors. Recordem que la variable Victoria_real pren valor 1 en cas que el partit l’hagi guanyat l’equip Lluïsos de Gràcia i 0 en altre cas. Com s’havia comentat anteriorment, és possible que el test no s’arribi a executar alguna jornada, en els casos en què cap dels dos equips arriba a anotar 60 punts. De les 30 jornades que tenim de dades, només una no han aconseguit la puntuació: la jornada 27. Pel que fa als minuts restants, és evident que no és normal que el test s’executi abans dels 20 minuts. Generalment, els equips assoleixen uns 40 punts, com a molt, a la mitja part. Per tant, és obvi trobar resultats inferiors de 10 minuts. Això vol dir que els equips acostumen a arribar als 60 punt en l’últim període. 50 Respecte a la variable encert, s’observa que no hi ha gaires 0 i per tant, ens trobem amb un alt percentatge d’encert. En la Taula 7.7 es pot observar que en la major part dels casos, l’equip que ha arribat als 60 punts és l’equip dels Lluïsos de Gràcia. Taula 7.7 Freqüències de victòries predites pel Test 3 Predicció Test 3 Lluïsos de Gràcia 18 Sant Josep de Badalona 2 CB Viladecans 2 SEDIS BASQUET 1 BARNA 1 AECS Ramon Llull 1 CB Esparraguera 1 CB El Vendrell 1 CB Castellbisbal 1 SESE 1 Gràficament es pot veure que com menys temps queda de partit, més vegades s’invoca el test 3, sobretot en l’últim minut de partit i al voltant dels 4-6 minuts finals. Figura 7.3 Nº de vegades que s’invoca el Test 3 respecte el temps restant El primer cop que es fa la crida és a falta de 12 minuts per acabar el partit, és a dir, en el tercer període. Tant aquest com el cas dels 11 minuts, són casos particulars ja que pertanyen a dues jornades de les tres que han tingut pròrroga i per tant, vol dir que manquen 12 minuts per arribar al minut 45 final. 51 Taula 7.8 Resultats dels 30 partits Encerts/Total partits % Tots els partits 23/29 0.793 Locals 10/14 0.714 Visitants 13/15 0.867 La Taula 7.8 mostra el nombre d’encerts de les prediccions pel test 3 i els percentatges. Es pot observar que per aquest test s’han obtingut més encerts quan els LLdG jugaven com a visitants, i que, en general, he tingut més encert que el segon test però menys que el primer. 52 8 Creació de l’eina 8.1 Què és Shiny? Shiny és una eina de RStudio per crear aplicacions web interactives de manera fàcil sense requerir coneixements de HTML, CSS o JavaScript. Permet als usuaris interactuar amb les dades sense haver de manipular el codi. Shiny és un paquet de programació reactiva, és a dir, a mesura que vas canviant inputs, els resultats es van modificant. Per tant, es requereixen valors que es vagin modificant amb el temps i expressions que registrin aquests canvis. Un exemple simple del que es pretén fer és el següent. 𝑎 = 2 𝑏 = 𝑎 + 3 𝑎 = 7 De manera habitual, el resultat de b seria igual a 5, però utilitzant la programació de Shiny obtindríem el valor b = 7+3 = 10. D’aquesta manera, selecciona els principals inputs en HTML ja sigui a través de text, pestanyes de selecció de variables, barres de rang, etc. i un cop realitzat els càlculs, o les funcions desitjades, mostra els elements de sortida en forma de taules, gràfics i text. Les aplicacions Shiny consten de dos components: un codi interfície d’usuari (user-interface, ui.R) i un codi servidor (server, server.R). 8.1.1 User-interface code El codi ui.R conté tota la programació necessària per tal de crear la part visible per a l’usuari, és a dir, conté expressions que mostren els títols, els escrits, les pestanyes, els gràfics i els resultats que l’usuari pot veure i/o triar. En la següent imatge es pot observar un exemple de la sortida per pantalla del codi ui.R. En aquest cas, es mostra el títol “Hello Shiny”, una pestanya en la que es pot triar el nombre de particions que es vol a l’histograma, i el gràfic d’aquest que anirà actualitzant-se en funció de la tria de l’usuari. La Figura 8.1 mostra un exemple de sortida de Shiny. 53 Figura 8.1 Sortida de Shiny El codi del user-interface emprat per a la creació d’aquest exemple és el següent: Es troben dues funcions bàsiques: el fluidPage i el mainPanel. En el fluidPage s’introdueixen totes les instruccions per a mostrar, a la zona desitjada de la pantalla, el títol i les diferents seleccions de variables o dades d’interès. En aquest cas, es crea una barra de 54 selecció on el valor mínim que es pot seleccionar és 1 i el màxim, 50. L’usuari pot moure el valor d’aquesta barra segons el seu interès. Per altra banda, el mainPanel conté les instruccions per a representar un gràfic. 8.1.2 Server El codi server.R és la part pràctica dels resultats visibles per pantalla, és a dir, conté totes les especificacions per tal de realitzar operacions amb les dades, crear gràfics, crear rangs de valors, etc. que es re-executen cada cop que l’usuari fa una tria de valors. En l’exemple anterior, el codi utilitzat per al servidor és: Consisteix en una sola funció que conté totes les funcions que es volen desenvolupar. En aquest cas, s’utilitza un renderPlot per tal d’anar creant un histograma reactiu, que es va modificant en funció de la selecció de la barra. 55 Un altre exemple senzill de Shiny és el cas de la Figura 8.2, on l’usuari tria el conjunt de dades “rock” i el nombre d’observacions per mostrar és 10. A més, a través del codi server es calcula un resum de les dades. Figura 8.2 Exemple 8.2 Aplicació Shiny Com s’havia esmentat als objectius principals del treball, també es pretén crear una aplicació interactiva amb el paquet de RStudio anomenat Shiny. A partir d’aquesta aplicació, l’usuari pot seleccionar: - el grup al què pertany l’equip rival; Millors en cas de estar per sobre de la 7a posició de la classificació, Pitjors en cas contrari - els minuts restants que els hi queden de partit - la diferència de punts que existeix entre ambdós equips en aquell moment; essent positiva en cas que els LLdG guanyin, i negativa altrament. El resultat final de la aplicació creada amb el paquet Shiny el mostra laFigura 8.3. Anem a veure quina ha hagut de ser la programació per tal d’obtenir aquesta vinyeta. 56 Figura 8.3 Aplicació Shiny 8.3 User-interface En aquest arxiu es recullen totes les instruccions de què es vol mostrar per pantalla i on, de manera estètica. El codi emprat per a la visualització de l’aplicació és el següent: Figura 8.4 ui.R 57 Amb la funció titlePanel s’afegeix el títol desitjat, en aquest cas, “Predicció de victòries”. Les següents instruccions ens indiquen quins són els valors que l’usuari vol que prenguin les diferents variables; la funció selectInput recollirà en la variable dataset quina és la classificació de l’equip rival contra el que juga l’equip LLdG, podent triar “Millors/Pitjors”. La funció numericInput recull, en cada cas, els valors que l’usuari vol per als minuts restants de partit, màxim 40 i mínim 0, i per a la diferència de punts que tinguin. La funció img afegeix per pantalla una imatge, el logo dels LLdG, i un text: “Bàsquet Lluïsos de Gràcia”. Per altra banda, hi ha les instruccions qui indiquen què es vol mostrar en el panell principal. Es mostra un nou títol, “Probabilitat de Guanyar/Perdre” i dos gràfics; un dels quals conté dos histogrames i l’altre és un termòmetre, indicant en cada cas quina és la seva mida. 8.4 Server En l’arxiu server hi trobarem totes les indicacions específiques per a realitzar els càlculs, cada cop que l’usuari modifiqui la seva selecció. En aquest cas, es tenen funcions reactives. És a dir, que modifiquen el seu resultat en funció dels valors de les variables que se li passin. 64 11 Bibliografia Apuestas de baloncesto – Estrategias para ganar (2016) Disponible a: https://blog.prediccionesdeportivas.es/apuestas-de-baloncesto-estrategias, consulta 19 de maig de 2016 Martínez, J. A. (2014). La influencia del primer cuarto en el resultado final en baloncesto. Revista internacional de Medicina y Ciencias de la Actividad Física del Deporte. McGivney, K., McGivney, R., & Zegarelli, R. (2008). Light It Up: Predicting the winner of an NBA game before the end. Chance, 21(4), 45-50. Predicciones de NBA para hacer apuestas deportivas (2016) Disponible a: https://blog.prediccionesdeportivas.es/el-momento-preciso-para-apostar-con- pronosticos-nba, consulta 19 de maig de 2016 San Miguel, Eduardo (2016). R + Interactividad + Web Shiny Server. Creando aplicaciones web en R con Shiny. Disponible a: http://webmelisa.es/docs/xornadar/Shiny.pdf, consulta 10 de juny de 2016 Teach yourself Shiny (2016). Disponible a: http://shiny.rstudio.com/tutorial, consulta 20 de juny de 2016 65 12 Annex 12.1 Codi R – Inici.R ### LECTURA DE DADES dades <- read.csv2("dades2.csv", header=T, sep=";") # Creació de noves variables per agilitzar els càlculs # conta és un vector que conté 1, i el nombre de files que existeixen per cada jornada conta=NULL cont=0 for(t in 1:30){ cont=0 for(i in 1:length(dades$D)){ if(dades$jornada[i] == t){ cont=cont+1 } } conta[t]=cont } conta= c(1,conta) # numero de la fila en la que es comença un nou partit fila=NULL fila[1]=1 for (i in 2:31){ fila[i]= fila[i-1]+conta[i] } ### INVOCACIÓ I RESULTATS TEST 1 source("TESTS.R") t1 = test1(dades) encert <- NULL for (i in 1:length(t1$jor)){ if((t1$v[i] == "Lluisos de Gracia" && t1$u[i] == 1 ) || (t1$v[i] != "Lluisos de Gracia" && t1$u[i] == 0)){ encert[i] = 1 }else{ encert[i]=0 } } t1 = cbind(t1,encert) colnames(t1) <- c("victoria_real","predict","jornada","min_rest","local","Dif","encert") p_encert <- sum(t1$encert)/length(t1$encert) 66 # A casa/ a fora enc_local <- NULL enc_visitant <- NULL for (i in 1:length(t1$jor)){ if(t1$encert[i] == 1 && t1$local[i] == 1){ enc_local[i] <- 1 }else{ enc_local[i] <- 0 } if(t1$encert[i] == 1 && t1$local[i] == 0){ enc_visitant[i] <- 1 }else{ enc_visitant[i] <- 0 } } p_encert_local <- round(sum(enc_local)/length(t1[which(t1$local==1),1]),3) p_encert_visitant <- round(sum(enc_visitant)/length(t1[which(t1$local==0),1]),3) taula_t1 = as.data.frame(c(p_encert,p_encert_local,p_encert_visitant)) num_encert <- c(sum(t1$encert),sum(enc_local),sum(enc_visitant)) num_jornades <- c(length(t1$encert),length(t1[which(t1$local==1),1]),length(t1[which(t1$local==0),1]) ) taula_t1 = cbind(num_encert,num_jornades,taula_t1) colnames(taula_t1) <- c("win","predict","%") # Gràfic plot((table(t1$min_rest)), type = "b", main = "Test 1 \n Temporada 14-15", xlab ="Temps restant", ylab = "Nº de vegades que s'invoca Test 1",lwd =1) ### INVOCACIÓ I RESULTATS TEST 2 t2 = test2(dades) encert <- NULL for (i in 1:length(t1$jor)){ if((t2$v[i] == "Lluisos de Gracia" && t2$u[i] == 1 ) || (t2$v[i] != "Lluisos de Gracia" && t2$u[i] == 0)){ encert[i] = 1 }else{ encert[i]=0 } } t2 = cbind(t2,encert) colnames(t2) <- c("victoria_real","predict","jornada","min_rest","local","Dif","encert") p_encert <- sum(t2$encert)/length(t2$encert) # A casa/ a fora enc_local <- NULL enc_visitant <- NULL for (i in 1:length(t2$jor)){ if(t2$encert[i] == 1 && t2$local[i] == 1){ enc_local[i] <- 1 67 }else{ enc_local[i] <- 0 } if(t2$encert[i] == 1 && t2$local[i] == 0){ enc_visitant[i] <- 1 }else{ enc_visitant[i] <- 0 } } p_encert_local <- round(sum(enc_local)/length(t2[which(t2$local==1),1]),3) p_encert_visitant <- round(sum(enc_visitant)/length(t2[which(t2$local==0),1]),3) taula_t2 = as.data.frame(c(p_encert,p_encert_local,p_encert_visitant)) num_encert <- c(sum(t2$encert),sum(enc_local),sum(enc_visitant)) num_jornades <- c(length(t2$encert),length(t2[which(t2$local==1),1]),length(t2[which(t2$local==0),1]) ) taula_t2 = cbind(num_encert,num_jornades,round(taula_t2,3)) colnames(taula_t2) <- c("win","predict","%") # Gràfic plot((table(t2$min_rest)), type = "b", main = "Test 2 \n Temporada 14-15", xlab ="Temps restant", ylab = "Nº de vegades que s'invoca Test 2",lwd =1) ### INVOCACIÓ I RESULTATS TEST 3 t3 = test3(dades) summary(t3) perc_encert = round(length(which(t3$encert==1)) / length(t3$encert),3) enc_local=NULL enc_visitant=NULL s=1 ss=1 for (i in 1:length(t3$jor)){ if(t3$local[i] == 1){ if(t3$encert[i] == 1 && t3$local[i] == 1){ enc_local[s] <- 1 s=s+1 }else{ enc_local[s] <- 0 s=s+1 } }else{ if(t3$encert[i] == 1 && t3$local[i] == 0){ enc_visitant[ss] <- 1 ss=ss+1 }else{ enc_visitant[ss] <- 0 ss=ss+1 } 68 } } sum(enc_local)/length(enc_local) sum(enc_visitant)/length(enc_visitant) # Gràfic plot((table(t3$min_rest)), type = "b", main = "Test 3 \n Temporada 14-15", xlab ="Temps restant", ylab = "Nº de vegades que s'invoca Test 3",lwd =1) ### ANÀLISI DESCRIPTIU summary(dades$D) # PUNTUACIÓ I JUGADOR t =table(dades$puntuacio) t = as.data.frame(t) colnames(t) = c("puntuacio","Freq") perc = round(t$Freq/sum(t$Freq),3) t = cbind(t,perc) table(dades$equip_anotador[which(dades$equip_anotador=="Lluisos de Gracia")],dades$jugador[which(dades$equip_anotador=="Lluisos de Gracia")]) l =table(dades$puntuacio[which(dades$equip_anotador=="Lluisos de Gracia")],dades$jugador[which(dades$equip_anotador=="Lluisos de Gracia")]) # Surt el numero 11, però és un error de les dades --> en realitat anota el 10 # El jugador 10, quan juga com a visitant és el numero 11. M'hauré equivocat al passar les dades punts = 1*l[1,] + 2*l[2,]+3*l[3,] ggplot(dades[which(dades$equip_anotador=="Lluisos de Gracia"),], aes( x=dades$jugador[which(dades$equip_anotador=="Lluisos de Gracia")]), color = cyl)+ geom_bar() + coord_cartesian(xlim = c(4,5,6,7,9,10,12,13,14,15,18,55)) + xlab("Jugadors")+ ylab("Freq") ggplot(dades, aes( x=dades$puntuacio), color=) +geom_bar() + scale_size_area()+ xlab("Puntuacio")+ ylab("Freq") # JORNADA mean(table(dades$jornada)) x = c( 91 ,64 ,77, 65, 79 ,58, 77 ,59 ,89, 67 ,79 ,73, 87, 86, 65 ,96 ,64, 80, 99, 75, 74 ,80, 79, 71 ,64, 57, 51, 79 ,63, 71 ) summary(x) ggplot(dades, aes( x=dades$jornada )) +geom_bar() + scale_size_area()+xlab("Jornada")+ ylab("Freq")#+coord_fixed(ratio = 1) # EQUIP_ANOTADOR, TEMPS_MORTS, SCORE_FINAL I TEMPORADA # Temps mort table(dades2$temps_mort) ggplot(dades2[which(dades2$temps_mort != ""),], aes( x=dades2$temps_mort[which(dades2$temps_mort != "")] )) +geom_bar() + scale_size_area()+xlab("")+ ylab("Freq")#+coord_fixed(ratio = 1) 69 # Equip_anotador ggplot(dades[which(dades$equip_anotador != "Lluisos de Gracia"),], aes( x=dades$equip_anotador[which(dades$equip_anotador != "Lluisos de Gracia")] )) +geom_bar() + scale_size_area()+xlab("")+ ylab("") m = as.data.frame(summary(dades$equip_anotador)) colnames(m) = c("Freq") p = round(m$Freq/(sum(m$Freq)-1153),3) m=cbind(m,p) o =(as.data.frame(table(dades$equip_anotador,dades$jornada))) o = data.frame(o[which(o$Freq!=0),]$Var2, o[which(o$Freq!=0),]$Freq, o[which(o$Freq!=0),]$Var1) colnames(o) = c("Jornada", "Freq","Equip") summary(o) sd(o$Freq) # DIFERENCIA DE PUNTS D, MINUT TOTAL, I MINUT RESTANT, T sd(dades$D) sd(dades$min_tot) sd(dades$T) IQR(dades$D) IQR(dades$min_tot) IQR(dades$T) sd(dades$D)/mean(dades$D) sd(dades$min_tot)/mean(dades$min_tot) sd(dades$T)/mean(dades$T) par(mfrow=c(3,1)) hist(dades$D, xlab= "diferències", ylab = "Freq", main="") hist(dades$T, xlab = "minuts restants", ylab = "Freq", main="") hist(dades$min_tot, xlab = "minut de partit", ylab = "Freq", main="") par(mfrow=c(1,3)) boxplot(dades$D, ylab= "diferències", main="") boxplot(dades$T, ylab = "minuts restants", main="") boxplot(dades$min_tot, ylab = "minut de partit", main="") # SCORE_LLUISOS I SCORE_RIVAL sc_llg = NULL sc_riv = NULL f = NULL f1 = NULL i=1 for (i in 2:length(dades$score_lluisos)){ if(dades$score_lluisos[i-1] != dades$score_lluisos[i]){ sc_llg[i] = dades$score_lluisos[i] }else{ 70 sc_llg[i] = NA } if(dades$score_rival[i-1] != dades$score_rival[i]){ sc_riv[i] = dades$score_rival[i] }else{ sc_riv[i] = NA } f1 = c(sc_llg[i],sc_riv[i],dades$jornada[i]) f = rbind(f,f1) } colnames(f) = c("sc_llg","sc_riv","jornada") summary(f) f = as.data.frame(f) sd(f$sc_llg,na.rm=T) sd(f$sc_riv, na.rm=T) ggplot(f, aes( x=f$sc_llg)) +geom_bar() + scale_size_area()+xlab("Scores Lluïsos")+ ylab("Freq") ggplot(f, aes( x=f$sc_riv )) +geom_bar() + scale_size_area()+xlab("Scores_rivals")+ ylab("Freq") par(mfrow=c(1,2)) boxplot(f$sc_llg, ylab="Resultats LLG") boxplot(f$sc_riv, ylab = "Resultats Rivals") # LOCAL i VICTORIA_LLG loc =NULL v_llg=NULL for(i in 2:31){ loc[i-1]=dades$local[fila[i-1]] v_llg[i-1]= dades$victoria_llg[fila[i-1]] } table(loc) table(v_llg) summary(dades$local) 12.2 Codi R - Simulacions ####### DISTRIBUCIONS DELS TEMPS ENTRE CISTELLES (1,2,3) #### 1A CATEGORIA: VS EQUIPS MILLORS (CLASS = 1) ## TEMPS_Pi : vector que contindra el minut restant (dades$T) en que es produeix una cistella de i punts i # la resta --> NA temps_p1 = NULL temps_p2 = NULL temps_p3 = NULL #### Vi: vector que contindra el nombre de cistelles de i punts per a cada jornada v1= NULL v2=NULL v3=NULL 71 # Fa servir el vector fila, que conte l'inici de cada jornada i passa partit a partit for(i in 2:31){ cont_p1 =0 cont_p2=0 cont_p3=0 for(j in fila[i-1]: (fila[i]-1)){ # j passa per les anotacions dins d'un partit if(dades$class[j] >=1 && dades$class[j] < 7){ # equips millors if(dades$puntuacio[j]=="1" && dades$equip_anotador[j] == "Lluisos de Gracia"){ temps_p1[j] = dades$T[j] cont_p1 = cont_p1 +1 }else{ temps_p1[j] = NA } if(dade1s$puntuacio[j]=="2" && dades$equip_anotador[j] == "Lluisos de Gracia"){ temps_p2[j] = dades$T[j] cont_p2 = cont_p2 +1 }else{ temps_p2[j] = NA } if(dades$puntuacio[j]=="3" && dades$equip_anotador[j] == "Lluisos de Gracia"){ temps_p3[j] = dades$T[j] cont_p3 = cont_p3 +1 }else{ temps_p3[j] = NA } } } # Cada element de v1, v2 i v3 es un partit, i conte el numero d'anotacions de 1 punt, 2 punts o 3 punts v1 = c(v1, cont_p1) v2 = c(v2, cont_p2) v3 = c(v3, cont_p3) } #### ritme_pi contindrà els temps entre cistelles sense NA's ritme_p1 = NULL ritme_p2 = NULL ritme_p3 = NULL ritme_p1 = temps_p1[!is.na(temps_p1)] ritme_p2 = temps_p2[!is.na(temps_p2)] ritme_p3 = temps_p3[!is.na(temps_p3)] t_entre_p1 <- -diff(ritme_p1) t_entre_p2 <- -diff(ritme_p2) t_entre_p3 <- -diff(ritme_p3) # Hem d'eliminar els valors negatius ja que són els inicis d''altres partits'anotacions de jornades diferents t_entre_p1 = t_entre_p1[t_entre_p1>=0] t_entre_p2 = t_entre_p2[t_entre_p2>=0] t_entre_p3 = t_entre_p3[t_entre_p3>=0] 72 #### GRÀFIC DE LA DISTRIBUCIÓ DELS TEMPS ENTRE CISTELLES DE i PUNTS par(mfrow = c(1,3)) table(t_entre_p1) hist(t_entre_p1 , xlab = "T entre tirs de 1", main="",ylab = "Freq", breaks = c(0:max(t_entre_p1))) table(t_entre_p2) hist(t_entre_p2, xlab = "T entre tirs de 2", main = "",ylab = "Freq", breaks = c(0:max(t_entre_p2))) table(t_entre_p3) hist(t_entre_p3, xlab = "T entre tirs de 3", main = "",ylab = "Freq", breaks = c(0:max(t_entre_p3))) ## Taules amb temps entre anotacions de LLG vs millors TET_Lluisos_millors <- list(T1 = as.data.frame(table(t_entre_p1)), T2 =as.data.frame(table(t_entre_p2)), T3= as.data.frame(table(t_entre_p3)) ) TET_Lluisos_millors$T1[2]=TET_Lluisos_millors$T1[2]/sum(TET_Lluisos_millors$T1[2]) TET_Lluisos_millors$T2[2]=TET_Lluisos_millors$T2[2]/sum(TET_Lluisos_millors$T2[2]) TET_Lluisos_millors$T3[2]=TET_Lluisos_millors$T3[2]/sum(TET_Lluisos_millors$T3[2]) #### 2A CATEGORIA: VS EQUIPS PITJORS (CLASS >= 7) #### TEMPS_Pi temps_p1 = NULL temps_p2 = NULL temps_p3 = NULL #### Vi v1= NULL v2=NULL v3=NULL for(i in 2:31){ cont_p1 =0 cont_p2=0 cont_p3=0 for(j in fila[i-1]: (fila[i]-1)){ if(dades$class[j]>= 7){ if(dades$puntuacio[j]=="1" && dades$equip_anotador[j] == "Lluisos de Gracia"){ temps_p1[j] = dades$T[j] cont_p1 = cont_p1 +1 }else{ temps_p1[j] = NA } if(dades$puntuacio[j]=="2" && dades$equip_anotador[j] == "Lluisos de Gracia"){ temps_p2[j] = dades$T[j] cont_p2 = cont_p2 +1 }else{ temps_p2[j] = NA } if(dades$puntuacio[j]=="3" && dades$equip_anotador[j] == "Lluisos de Gracia"){ temps_p3[j] = dades$T[j] cont_p3 = cont_p3 +1 73 }else{ temps_p3[j] = NA } } } v1 = c(v1, cont_p1) v2 = c(v2, cont_p2) v3 = c(v3, cont_p3) } ritme_p1 = NULL ritme_p2 = NULL ritme_p3 = NULL ritme_p1 = temps_p1[!is.na(temps_p1)] ritme_p2 = temps_p2[!is.na(temps_p2)] ritme_p3 = temps_p3[!is.na(temps_p3)] t_entre_p1 <- -diff(ritme_p1) t_entre_p2 <- -diff(ritme_p2) t_entre_p3 <- -diff(ritme_p3) t_entre_p1 = t_entre_p1[t_entre_p1>=0] t_entre_p2 = t_entre_p2[t_entre_p2>=0] t_entre_p3 = t_entre_p3[t_entre_p3>=0] #### GRÀFIC DE LA DISTRIBUCIÓ DELS TEMPS ENTRE CISTELLES DE i PUNTS par(mfrow = c(1,3)) table(t_entre_p1) hist(t_entre_p1 , xlab = "T entre tirs de 1", main="",ylab = "Freq") table(t_entre_p2) hist(t_entre_p2, xlab = "T entre tirs de 2", main = "",ylab = "Freq") table(t_entre_p3) hist(t_entre_p3, xlab = "T entre tirs de 3", main = "",ylab = "Freq") ### Taules amb temps entre anotacions de LLG vs pitjors TET_Lluisos_pitjors <- list(T1 = as.data.frame(table(t_entre_p1)), T2 =as.data.frame(table(t_entre_p2)), T3= as.data.frame(table(t_entre_p3)) ) TET_Lluisos_pitjors$T1[2]=TET_Lluisos_pitjors$T1[2]/sum(TET_Lluisos_pitjors$T1[2]) TET_Lluisos_pitjors$T2[2]=TET_Lluisos_pitjors$T2[2]/sum(TET_Lluisos_pitjors$T2[2]) TET_Lluisos_pitjors$T3[2]=TET_Lluisos_pitjors$T3[2]/sum(TET_Lluisos_pitjors$T3[2]) ####### CREACIÓ DE TAULES D'ANOTACIONS PER CADA GRUP (MILLORS, PITJORS) ######## MILLORS. temps entre anotacions dels equips millors temps_p1 = NULL temps_p2 = NULL temps_p3 = NULL #### Vi v1= NULL v2=NULL 80 ########## PUNTUACIONS PER EQUIP I DIFERÈNCIES score_llg = NULL score_rival = NULL for(i in 2:length(taula_LLGvsMillor$min_rest)){ if(taula_LLGvsMillor$equip_anotador[1]== "Lluisos de Gracia"){ score_llg[1]= taula_LLGvsMillor$puntuacio[1] score_rival[1] = 0 }else{ score_llg[1]= 0 score_rival[1] = taula_LLGvsMillor$puntuacio[1] } if(taula_LLGvsMillor$equip_anotador[i] == "Lluisos de Gracia"){ score_llg[i] = score_llg[i-1] + taula_LLGvsMillor$puntuacio[i] score_rival[i] = score_rival[i-1] }else{ score_llg[i] = score_llg[i-1] score_rival[i] = score_rival[i-1] + taula_LLGvsMillor$puntuacio[i] } } taula_LLGvsMillor = cbind(taula_LLGvsMillor, score_llg, score_rival) Dif = NULL for( i in 1:length(taula_LLGvsMillor$min_rest)){ Dif[i] = score_llg[i] - score_rival[i] } taula_LLGvsMillor = cbind(taula_LLGvsMillor, Dif) guanya_llg = NULL for(i in 1:length(taula_LLGvsMillor$Dif)){ if(taula_LLGvsMillor$Dif[length(taula_LLGvsMillor$Dif)] > 0){ guanya_llg[i]=1 }else{ guanya_llg[i]=0 } } taula_LLGvsMillor = cbind(taula_LLGvsMillor, guanya_llg) cts= 1 l = 2 p = 1 while(l <= length(taula_LLGvsMillor$min_rest)){ if(taula_LLGvsMillor$min_rest[l-1] == taula_LLGvsMillor$min_rest[l]){ cts = cts +1 }else{ cts = 1 } if(cts > 5){ p = p +1 81 } l = l +1 } r=2 q=1 cto=1 if (p == 1 ) { #&& q == 1 lista1[s] = list(taula_LLGvsMillor) s = s+1 } } ##### ESCENARI 2: LLDG VS PITJOR lista2 = list() ss=1 numpart=10000 while ( ss <= numpart){ LLGP1 <-as.numeric(as.vector(sample(TET_Lluisos_pitjors$T1$t_entre_p1, 200,replace=T,prob=as.numeric(TET_Lluisos_pitjors$T1$Freq)) )) LLGP2 <-as.numeric(as.vector(sample(TET_Lluisos_pitjors$T2$t_entre_p2, 200,replace=T,prob=as.numeric(TET_Lluisos_pitjors$T2$Freq)) )) LLGP3 <-as.numeric(as.vector(sample(TET_Lluisos_pitjors$T3$t_entre_p3, 200,replace=T,prob=as.numeric(TET_Lluisos_pitjors$T3$Freq)) )) #### Simulacio de temps entre cistelles simulacio_t_p1 = NULL simulacio_t_p2 = NULL simulacio_t_p3 = NULL for(i in 1:length(LLGP1)){ simulacio_t_p1 = c(simulacio_t_p1,LLGP1[i]) simulacio_t_p2 = c(simulacio_t_p2,LLGP2[i]) simulacio_t_p3 = c(simulacio_t_p3,LLGP3[i]) } ### Creem el vector igual que esta creat a la base de dades: com a minuts restants de partit. stp1 = NULL stp2 = NULL stp3 = NULL stp1[1]= 40 - simulacio_t_p1[1] stp2[1]= 40 - simulacio_t_p2[1] stp3[1]= 40 - simulacio_t_p3[1] for (i in 2:length(simulacio_t_p1)){ stp1[i] = stp1[i-1] - simulacio_t_p1[i] } 82 for (i in 2:length(simulacio_t_p2)){ stp2[i] = stp2[i-1] - simulacio_t_p2[i] } for (i in 2:length(simulacio_t_p3)){ stp3[i] = stp3[i-1] - simulacio_t_p3[i] } stp1 = stp1[stp1>=0] stp2 = stp2[stp2>=0] stp3 = stp3[stp3>=0] puntuacio = rep(1, length(stp1)) #### Creem el vector puntuació: tot 1 # taula que conte els minuts restants en que es produeix un tir lliure, i puntuacio indica de quin punt a = cbind(stp1,puntuacio) a = as.data.frame(a) colnames(a) = c("min_rest", "puntuacio") puntuacio = rep(2, length(stp2)) #### Creem el vector puntuació: # taula que conte els minuts restants en que es produeix un tir lliure, i puntuacio indica de quin punt b = cbind(stp2,puntuacio) b = as.data.frame(b) colnames(b) = c("min_rest", "puntuacio") puntuacio = rep(3, length(stp3)) #### Creem el vector puntuació: # taula que conte els minuts restants en que es produeix un tir lliure, i puntuacio indica de quin punt c = cbind(stp3,puntuacio) c = as.data.frame(c) colnames(c) = c("min_rest", "puntuacio") taula1 = rbind(a,b,c) ### Creem la taula d'anotacions de LLDG al = rnorm(length(taula1$min_rest)) taula1 = cbind(taula1, al) taula1 = taula1[order(taula1$min_rest, taula1$al,decreasing=T),] equip_anotador = rep ("Lluisos de Gracia", length(taula1$min_rest)) taula1 = cbind(taula1, equip_anotador) RIVP1 <-as.numeric(as.vector(sample(TET_rivals_pitjors$T1$t_entre_p1, 200,replace=T,prob=as.numeric(TET_rivals_pitjors$T1$Freq)) )) RIVP2 <-as.numeric(as.vector(sample(TET_rivals_pitjors$T2$t_entre_p2, 200,replace=T,prob=as.numeric(TET_rivals_pitjors$T2$Freq)) )) RIVP3 <-as.numeric(as.vector(sample(TET_rivals_pitjors$T3$t_entre_p3, 200,replace=T,prob=as.numeric(TET_rivals_pitjors$T3$Freq)) )) 83 #### Simulacio de temps entre cistelles simulacio_t_p1 = NULL simulacio_t_p2 = NULL simulacio_t_p3 = NULL for(i in 1:length(LLGP1)){ simulacio_t_p1 = c(simulacio_t_p1,RIVP1[i]) simulacio_t_p2 = c(simulacio_t_p2,RIVP2[i]) simulacio_t_p3 = c(simulacio_t_p3,RIVP3[i]) } #### Creem el vector igual que esta creat a la base de dades: com a minuts restants de partit. stp1 = NULL stp2 = NULL stp3 = NULL stp1[1]= 40 - simulacio_t_p1[1] stp2[1]= 40 - simulacio_t_p2[1] stp3[1]= 40 - simulacio_t_p3[1] for (i in 2:length(simulacio_t_p1)){ stp1[i] = stp1[i-1] - simulacio_t_p1[i] } for (i in 2:length(simulacio_t_p2)){ stp2[i] = stp2[i-1] - simulacio_t_p2[i] } for (i in 2:length(simulacio_t_p3)){ stp3[i] = stp3[i-1] - simulacio_t_p3[i] } stp1 = stp1[stp1>=0] stp2 = stp2[stp2>=0] stp3 = stp3[stp3>=0] puntuacio = rep(1, length(stp1)) #### Creem el vector puntuació: tot 1 # taula que conte els minuts restants en que es produeix un tir lliure, i puntuacio indica de quin punt a = cbind(stp1,puntuacio) a = as.data.frame(a) colnames(a) = c("min_rest", "puntuacio") puntuacio = rep(2, length(stp2)) #### Creem el vector puntuació: # taula que conte els minuts restants en que es produeix un tir lliure, i puntuacio indica de quin punt b = cbind(stp2,puntuacio) b = as.data.frame(b) colnames(b) = c("min_rest", "puntuacio") 84 puntuacio = rep(3, length(stp3)) #### Creem el vector puntuació: # taula que conte els minuts restants en que es produeix un tir lliure, i puntuacio indica de quin punt c = cbind(stp3,puntuacio) c = as.data.frame(c) colnames(c) = c("min_rest", "puntuacio") taula2 = rbind(a,b,c) ### Creem la taula d'anotacions de LLDG al = rnorm(length(taula2$min_rest)) taula2 = cbind(taula2, al) taula2 = taula2[order(taula2$min_rest,taula2$al, decreasing=T),] equip_anotador = rep ("RIVAL", length(taula2$min_rest)) taula2 = cbind(taula2, equip_anotador) taula = rbind(taula1, taula2) taula_LLGvsPitjor = taula[order(taula$min_rest, decreasing=T),] aleat = rnorm(length(taula_LLGvsPitjor$min_rest)) taula_LLGvsPitjor = cbind(taula_LLGvsPitjor, aleat) taula_LLGvsPitjor = taula_LLGvsPitjor[order(taula_LLGvsPitjor$min_rest,taula_LLGvsPitjor$aleat , decreasing=T),] # PUNTUACIONS I DIFERENCIES score_llg = NULL score_rival = NULL for(i in 2:length(taula_LLGvsPitjor$min_rest)){ if(taula_LLGvsPitjor$equip_anotador[1]== "Lluisos de Gracia"){ score_llg[1]= taula_LLGvsPitjor$puntuacio[1] score_rival[1] = 0 }else{ score_llg[1]= 0 score_rival[1] = taula_LLGvsPitjor$puntuacio[1] } if(taula_LLGvsPitjor$equip_anotador[i] == "Lluisos de Gracia"){ score_llg[i] = score_llg[i-1] + taula_LLGvsPitjor$puntuacio[i] score_rival[i] = score_rival[i-1] }else{ score_llg[i] = score_llg[i-1] score_rival[i] = score_rival[i-1] + taula_LLGvsPitjor$puntuacio[i] } } taula_LLGvsPitjor = cbind(taula_LLGvsPitjor, score_llg, score_rival) Dif = NULL for( i in 1:length(taula_LLGvsPitjor$min_rest)){ Dif[i] = score_llg[i] - score_rival[i] } 85 taula_LLGvsPitjor = cbind(taula_LLGvsPitjor, Dif) guanya_llg = NULL for(i in 1:length(taula_LLGvsPitjor$Dif)){ if(taula_LLGvsPitjor$Dif[length(taula_LLGvsPitjor$Dif)] > 0){ guanya_llg[i]=1 }else{ guanya_llg[i]=0 } } taula_LLGvsPitjor = cbind(taula_LLGvsPitjor, guanya_llg) cts= 1 l = 2 p = 1 while(l <= length(taula_LLGvsPitjor$min_rest)){ if(taula_LLGvsPitjor$min_rest[l-1] == taula_LLGvsPitjor$min_rest[l]){ cts = cts +1 }else{ cts = 1 } if(cts > 5){ p = p +1 } l = l +1 } if (p == 1 ) { lista2[ss] = list(taula_LLGvsPitjor) ss = ss+1 } } 12.3 Codi R - Selecció de diferències ###### LLISTA 1 (VS MILLORS) lista1_difer=list() s = 1 for(i in 1: 10000){ # Difer = NULL Diferencia = NULL for(d in 40:0){ k = 0 n = 0 for(j in 1: length(lista1[[i]]$min_rest)){ if (lista1[[i]]$min_rest[1] < d){ Difer = lista1[[i]][1,] Difer$Dif = 0 } 86 if(lista1[[i]]$min_rest[j] >= d){ k = k+1 if(lista1[[i]]$min_rest[k] == d){ n = n+1 } } if(lista1[[i]]$min_rest[j] == d){ Difer = lista1[[i]][(k-n+1),] } if(lista1[[i]]$min_rest[j] > d){ Difer = lista1[[i]][k,] } } Difer = c(Difer,d) Diferencia = rbind(Diferencia,Difer) } lista1_difer[s] = list(Diferencia) s = s+1 print(s) } for (i in 1:length(lista1_difer)){ rownames(lista1_difer[[i]]) <- c() } millors <- as.data.frame(lista1_difer[[1]][,8:10]) for (i in 2:10000){ millors <- rbind(millors, as.data.frame(lista1_difer[[i]][,8:10])) } millors$partit <- rep(1:100, each=41) colnames(millors)[3] <- "Min.restants" ###### LLISTA 2 (VS PITJORS) lista2_difer=list() s = 1 for(i in 1: 10000){ # Difer = NULL Diferencia = NULL for(d in 40:0){ k = 0 n = 0 for(j in 1: length(lista2[[i]]$min_rest)){ if (lista2[[i]]$min_rest[1] < d){ Difer = lista2[[i]][1,] Difer$Dif = 0 } if(lista2[[i]]$min_rest[j] >= d){ k = k+1 87 if(lista2[[i]]$min_rest[k] == d){ n = n+1 } } if(lista2[[i]]$min_rest[j] == d){ Difer = lista2[[i]][(k-n+1),] } if(lista2[[i]]$min_rest[j] > d){ Difer = lista2[[i]][k,] } } Difer = c(Difer,d) Diferencia = rbind(Diferencia,Difer) } lista2_difer[s] = list(Diferencia) s = s+1 print(s) } for (i in 1:length(lista2_difer)){ rownames(lista2_difer[[i]]) <- c() } pitjors <- as.data.frame(lista2_difer[[1]][,8:10]) for (i in 2:10000){ pitjors <- rbind(pitjors, as.data.frame(lista2_difer[[i]][,8:10])) } pitjors$partit <- rep(1:100, each=41) colnames(pitjors)[3] <- "Min.restants" 12.4 Codi R - Shiny 12.4.1 ui.R shinyUI(fluidPage( titlePanel("PREDICCIÓ DE VICTÒRIES"), fluidRow( column(3, h3("Selecció de dades"), selectInput("dataset", label = "Escull equip Rival", choices = c("Millors", "Pitjors")), em("*Millors = fins el 7è classificat, Pitjors = altrament") ), column(3, br(),br(),br(), numericInput("min_rest" ,"Minut de partit restant, T:",min=0,max =40,5), 88 em("*Màxim 40, Mínim 0") ), column(3, br(),br(),br(), numericInput("Dif" ,"Diferència de punts, D:",5), em("*Diferències negatives, LLdG perd") ), column(3, br(),br(), img(src = "logo.jpg", height=66.3, width=71.7, " Bàsquet Lluïsos de Gràcia") ) ), br(),br(), h3("Probabilitat de Guanyar/Perdre"), plotOutput("hist1", width = 1200, height = 200), plotOutput("termometre", width = 1200, height = 200) )) 12.4.2 server.R shinyServer( function(input, output) { datasetInput = reactive({ switch(input$dataset, "Millors" = millors, "Pitjors" = pitjors ) }) output$hist1 <- renderPlot({ if(input$dataset == "Millors"){ min_seleccionat = input$min_rest seleccionados_g = as.numeric(filter(dades[1:410000,], Min.restants == min_seleccionat, guanya_llg==1)$Dif) seleccionados_p = as.numeric(filter(dades[1:410000,], Min.restants == min_seleccionat, guanya_llg==0)$Dif) par(mfrow=c(1,2)) hist(seleccionados_g, ylab="Freq", main = c("Guanyats a falta de",min_seleccionat,"minuts"),xlab = "Diferències de punts") hist(seleccionados_p,ylab="Freq", main=c("Perduts a falta de",min_seleccionat,"minuts"),xlab = "Diferències de punts") }else{ min_seleccionat = input$min_rest seleccionados_g = as.numeric(filter(dades[410001:820000,], Min.restants == min_seleccionat, guanya_llg==1)$Dif) seleccionados_p = as.numeric(filter(dades[410001:820000,], Min.restants == min_seleccionat, guanya_llg==0)$Dif) par(mfrow=c(1,2)) 89 hist(seleccionados_g,ylab="Freq", main =c("Guanyats a falta de",min_seleccionat,"minuts"),xlab = "Diferències de punts") hist(seleccionados_p,ylab="Freq", main =c("Perduts a falta de",min_seleccionat,"minuts"),xlab = "Diferències de punts") } }) output$termometre <- renderPlot({ if(input$dataset == "Millors"){ dif_seleccionada = input$Dif min_seleccionat = input$min_rest seleccionados_p = as.numeric(filter(dades[1:410000,], Min.restants == min_seleccionat, guanya_llg==0)$Dif) seleccionados_g = as.numeric(filter(dades[1:410000,], Min.restants == min_seleccionat, guanya_llg==1)$Dif) }else{ dif_seleccionada = input$Dif min_seleccionat = input$min_rest seleccionados_p = as.numeric(filter(dades[410001:820000,], Min.restants == min_seleccionat, guanya_llg==0)$Dif) seleccionados_g = as.numeric(filter(dades[410001:820000,], Min.restants == min_seleccionat, guanya_llg==1)$Dif) } p_guanyar = length(seleccionados_g[which(seleccionados_g <= dif_seleccionada)])/length(seleccionados_g) p_perdre = length(seleccionados_p[which(seleccionados_p >= dif_seleccionada)])/length(seleccionados_p) p_total = p_guanyar + p_perdre pg_total = round((p_guanyar/p_total)*1000) pp_total = round((p_perdre/p_total)*1000) # Codi de la barra: h.count <- c(1000) h.ramp <- heat.colors(h.count) h.ramp[pg_total]="black" legenda=rep("",1000) legenda[pg_total]= pg_total barplot(rep(1, h.count), names.arg=legenda, axes = F, space = 0, border=NA, col = h.ramp, main = "Probabilitat de guanyar", xlab = c("p =",round(pg_total/1000,3)), ) }) })