Jesús Lagos @Vdot_spain jelagmil@gmail.com 2019-07-08
La libreria soccergraphR esta pensada para todos aquellos que trabajen con los datos de OPTA y para que las personas que estén estudiando o quieran conocer los datos puedan analizarlos y hacer visualizaciones y análisis de los mismos. Con esta libreria podrás:
Para poder probar las funciones de la libreria se ha instalado en ..\R\R-3.5.1\library\soccergraphR\data
los siguientes ficheros:
Para instalar el paquete desde Github:
devtools::install_github('jelagmil/soccergraphR', build_opts = c("--no-resave-data", "--no-manual"))
library(soccergraphR)
Una vez instalado puedes leer la explicación de la libreria ejecutando:
#Para que se abra en el navegador:
browseVignettes("soccergraphR")
#Para que se abra en la pestaña de Help de RStudio:
vignette("my-vignette")
Para conocer cada función y como se usa cada una también puedes usar "?" seguido de la función para mostrar la ayuda en la pestaña de Help de RStudio. Si apretas F1 con el cursor puesto en la función también se despliega en la ayuda:
?OptaMAParrowpass
?OptaMAPcontras
?OptaMAPcorner
?OptaMAPdfrontpass
?OptaMAPdirectpass
?OptaMAPheatMapFrom
?OptaMAPheatMapTo
?OptaMAPmatrixpass
?OptaMAPmatrixpasscluster
?OptaMAPposesion
?OptaMAPposesionzonal
?OptaMAPradarevent
?OptaMAPshoot
?OptaMAPshoot2
?OptaXMLeventos
?OptaXMLpassmatrix
?OptaXMLposesion
?OptaXMLstats
Se vería así:
Con esta función df<-OptaXMLeventos(ruta_fichero)
podrás pasar el xml f24 a un dataframe teniendo cada evento por linea y sus cualificadores por columna ademas de servirte para muchas de las funciones de esta libreria.
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
Y así quedaría:
A la izq XML de Opta, a la derecha convertido a dataframe
Con esta función df<-OptaXMLpassmatrix(ruta_fichero)
podrás pasar el xml Pass_matrix a un dataframe teniendo cada jugador repetido por cada conexión con otro jugador para usarlo en algunas de las funciones descritas en esta libreria.
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_pases1<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/pass1.xml')
ruta_pases2<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/pass2.xml')
df1<-OptaXMLpassmatrix(ruta_pases1)
df2<-OptaXMLpassmatrix(ruta_pases2)
Y quedaría:
A la izq XML de Opta, a la derecha convertido a dataframe
Con esta función OptaMAPmatrixpass(df,4)
se lee el data frame parseado y se genera un grafo que conecta cada jugador con los otros jugadores según los pases realizados en el partido. El segundo parámetro indica el número de pases mínimo a tener en cuenta (si no queremos representar si un jugador pasa 1 vez a otro por ejemplo)
Además cada jugador será representado en la coordenada del XML, con un tamaño de punto según el número de pases exitosos y en color más claro si tiene más centralidad(betweenness) en el grafo.
La centralidad(betweenness) se define como la intermediación de un nodo en el camino que une otros nodos. Supongamos que escogemos dos jugadores al azar en un equipo, por lo que el camino más corto entre ellos en sus pases pasa por otro nodo. Ese nodo sería un intermediador y por tanto su centralidad mayor.
Las lineas se representan en de Rojo a Azul en función del número de pases. Cuanto más rojo más pases se han dado entre esos jugadores.
En la parte inferior se mostrará el valor de la densidad del grafo.
La densidad del grafo se mide como todos los posibles caminos entre los jugadores. Por ejemplo, imaginad que hay 3 jugadores en el campo, por tanto habría 3 conexiones teorica, entre 1 y 2, entre 1 y 3 y entre 2 y 3. Si se cumplen sería un valor de 1, pero si solo hay dos conexiones sería de un 0.6. Cuanta más densidad más conectados están los equipos como el caso de Barcelona y Betis
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_pases1<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/pass1.xml')
df1<-OptaXMLpassmatrix(ruta_pases1)
#Se calcula el grafo para la tabla df1 teniendo en cuenta un número de pases superior a 4
OptaMAPmatrixpass(df1,4)
Y quedaría:
También puedes usar la función grid.arrange(p1, p2,p4,p5,p6,p7,p8, nrow = 2)
si por ejemplo tienes 8 ficheros (no los hay en el paquete) y representar varios partidos a la vez:
Con esta función OptaMAPcorner(df,1)
podrás visualizar en un mapa de calor las zonas donde saca los corners un equipo y el tipo de remate y con que parte del cuerpo fue realizado.
El df será el parseado con la función OPTAXMLEVENTOS:
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPcorner(df,1)
Y quedaría:
Con esta función OptaMAPdirectpass(df,1)
podrás visualizar en un mapa a cada jugador con su gráfico de radar ubicado en la coordenada promedio de sus pases.
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPdirectpass(df,1)
Y quedaría:
También puedes usar la función grid.arrange(p1, p2,p4,p5,p6,p7,p8, nrow = 2)
si por ejemplo tienes 8 ficheros (no los hay en el paquete) y representar varios partidos a la vez.
El df será el parseado con la función OPTAXMLEVENTOS
Con estas funciones OptaMAPheatMapFrom(df,1)
y OptaMAPheatMapTo(df,1)
podrás visualizar un mapa por jugador con su mapa de calor desde donde pasan y adonde pasan
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPheatMapFrom(df,1)
OptaMAPheatMapTo(df,1)
El df será el parseado con la función OPTAXMLEVENTOS
Zonas desde donde pasan los jugadores
Zonas adonde pasan los jugadores
Con estas funciones OptaMAParrowpass(df,1)
podrás visualizar un mapa por jugador con su mapa de pases en función de su tipologia
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAParrowpass(df,1)
El df será el parseado con la función OPTAXMLEVENTOS
Zonas desde donde pasan los jugadores
Con esta función OptaMAPshoot(df,1))
podrás visualizar una porteria y adonde se ha dirigido cada tiro, cual fue gol y según el tamaño la distancia de donde fue realizado.
El df será el parseado con la función OPTAXMLEVENTOS:
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPshoot(df,1)
Y quedaría:
Con esta función OptaMAPshoot2(df,1))
podrás visualizar desde arriba los disparos realizados
El df será el parseado con la función OPTAXMLEVENTOS:
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPshoot2(df,1)
Y quedaría:
Con esta función OptaXMLposesion(path)
se parsea el fichero F28 de OPTA por el que conseguiremos un Data Frame preparado con los datos de posesiones por cada 1/3 del campo cada 15'.
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_posesion<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f28.xml')
df<-OptaXMLposesion(ruta_posesion)
Con esta función OptaMAPposesion(df)
podrás visualizar en el campo de fútbol las posesiones en cada 1/3 del campo, indicando el equipo donde se juega cada posesión.
El df será el parseado con la función OPTAXMLPOSESION
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_posesion<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f28.xml')
df<-OptaXMLposesion(ruta_posesion)
OptaMAPposesion(df)
Y quedaría:
Con esta función OptaMAPposesionzonal(df,0)
podrás visualizar en el campo de fútbol el número de eventos en cada zona del campo dividido en 18 zonas.
Si pasamos el parámetro 1 obtendremos el número de eventos durante todo el partido.
El df será el parseado con la función OPTAXMLEVENTOS:
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPposesionzonal(df,1)
Y quedaría:
Si pasamos el parámetro 0 obtendremos el número de eventos en rangos de 15 minutos:
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPposesionzonal(df,0)
Y quedaría:
Con esta función OptaXMLstats(df)
se parsea el XML de estadísticas de la temporada
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_stats<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/stats.xml')
df<-OptaXMLstats(ruta_stats)
Y quedaría:
Con esta función OptaMAPradarevent(df,0/1))
podemos dibujar gráficos de radar para jugadores (1) o para posiciones (0) con algunos eventos (se han seleccioando algunos pudiendo cambiar los campos en código)
El df será el parseado con la función OptaXMLstats
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_stats<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/stats.xml')
df<-OptaXMLstats(ruta_stats)
OptaMAPradarevent(df,0)
Y quedaría:
Con esta función OptaMAPanalisisdefensivo(df))
creamos un mapa de acciones defensivas con la coordenada promedio para cada jugador, haciendo el convex_hull y calculando la distancia del promedio del equipo a la porteria.
El df será el parseado con la función OPTAXMLEVENTOS
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPanalisisdefensivo(df)
Y quedaría:
Con esta función OptaMAPdfrontpass(df,home,metros,pases)
creamos el grafo para un partido pero solo de pases adelantados según los metros indicados como parámetro y un número de pases mínimo
El df será el parseado con la función OPTAXMLEVENTOS
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPdfrontpass(df,1,3,3)
Y quedaría:
A la izquierda el grafo normal y a la derecha el grafo solo con pases adelantados para el mismo partido con mínimo de 3 pases y 3 metros
Con esta función OptaMAPcontras(df,1)
creamos un mapa donde podemos observar los eventos de recuperación de balón y posesión y si hay un tiro asociado y el tiempo en segundos que ha pasado hasta el tiro
El df será el parseado con la función OPTAXMLEVENTOS
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPcontras(df,1)
Y quedaría:
Con esta función OptaMAPmatrixpasscluster(df,home,k)
creamos en primer lugar un modelo kmeans para todos los pases de un partido a partir del XML de eventos para generar el grafo de pases entre clusters independientemente de los jugadores. Este método está basado en los estudios de Kawasaki, Sakakue e Ishizaki.
El df será el parseado con la función OPTAXMLEVENTOS
#Pon la ruta donde tengas instsalada la libreria en mi caso:
ruta_eventos<-c('C:/My Program Files/R/R-3.5.1/library/soccergraphR/data/f24.xml')
df<-OptaXMLeventos(ruta_eventos)
OptaMAPmatrixpasscluster(df,1,20)
Y quedaría:
Con esta función OptaMAPcampofutbol()
creamos el campo de futbol y es llamada directamente desde cada función para dibujar el campo. Este campo es similar al publicado por soccermatics y es que cuando una cosa está bien, ¿para qué cambiarla?
#Si la invocamos direcamente:
OptaMAPcampofutbol()
quedaría:
Con esta función OptaMAPshootxG()
creamos el mapa con los datos de los tiros de uno o dos equipos, calculando para cada disparo el xG y calculando el resultado a partir de los xG. La función en la consola te va pidiendo los datos para construir el campo con los tiros.
#Si la invocamos direcamente con 1 o 2 en función de los equipos.
OptaMAPshootxG(1)
quedaría:
Con esta función OptaMAPcampofutbol2()
creamos el campo de futbol y es llamada directamente desde cada función para dibujar el campo y poder detectar las coordenadas de un tiro fácilmente
#Si la invocamos direcamente
OptaMAPcampofutbol2()
quedaría:
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.