2020

Ejemplos de uso de StatsBomb Data con R

By Nick Dorrington | abril 19, 2020
2020

Ejemplos de uso de StatsBomb Data con R

Hace tres semanas publicamos nuestra introducción al uso de StatsBomb Data con R que abarcó los fundamentos de cómo organizar y utilizar nuestros datos gratuitos. Sin embargo, creemos que puede ser útil aportar otros ejemplos de cómo utilizar los datos. Existe una comunidad trabajando con nuestros datos y aportando el código para hacer cosas como mapas de pases, mapas de tiros o de acciones defensivas.

Para demostrar que no es tan difícil utilizar y modificar este código, los he comprobado por mí mismo. Soy novato total en R o cualquier otro lenguaje de programación, entonces si yo puedo hacerlo, estoy seguro de que vosotros no tendréis ningún problema a la hora de seguir estos ejemplos.

Mapa de Pases

En su blog BiscuitChaserFC, Mark Wilkins tiene un ejemplo, en inglés, de cómo crear un mapa de pases tanto de un equipo como de un jugador.

Puedes seguir el proceso paso a paso en el blog, pero este es el resultado final:

Y aquí el código:

Este código representa una buena base para crear mapas de pases de otros equipos y jugadores. Sólo tenemos que cambiar los detalles de la competición y el partido para recrearlo con otros equipos. Puedes ver aquí una lista de todas las competiciones disponibles y el 'competition_id' de cada una.

Por ejemplo, podemos utilizar este código para tener los datos de todos los partidos de la temporada 2008/09 de La Liga en que jugó Lionel Messi.

Comp<-FreeCompetitions()%>%filter(competition_id==11, season_name=="2008/09")

Matches<-FreeMatches(Comp)

Dentro de la pestaña 'Environment', en la categoría de 'Data', puedes hacer click en 'Matches' para ver una tabla de todos los partidos disponibles y el 'match_id' de cada uno.

Vamos a seleccionar el partido entre el Barcelona y el Real Madrid del 2 de mayo de 2009, que tiene un 'match_id' de 69249.

Si seguimos el resto de los pasos del código original, creamos esto:

Podemos hacer un par de cosas más. Si añadimos is.na(pass.outcome.name) a nuestro filtro, tendremos sólo los pases completados:

d1<-StatsBombData%>%

filter(match_id == 69249, type.name == "Pass" & is.na(pass.outcome.name), team.name == "Barcelona")

Con este resultado:

Si queremos el mapa de pases de un jugador en concreto, por ejemplo de Lionel Messi, podemos hacer esto:

d1<-StatsBombData%>% filter(match_id == 69249, type.name == "Pass" & is.na(pass.outcome.name), team.name == "Barcelona", player.name == "Lionel Andrés Messi Cuccittini")

Con este resultado:

Y si queremos añadir otro elemento, podemos hacer esto para crear un mapa de los pases de Messi a Xavi.

d1<-StatsBombData%>% filter(match_id == 69249, type.name == "Pass" & is.na(pass.outcome.name), team.name == "Barcelona", player.name == "Lionel Andrés Messi Cuccittini", pass.recipient.name == "Xavier Hernández Creus")

Con este resultado:

Con la ayuda de nuestra especificación de datos para ver los nombres de los variables, puedes hacer más cambios así para crear mapas de pases más especializados.

Mapa de Tiros

En su blog de medium, Ismael Gómez Schmidt tiene un ejemplo de cómo crear un mapa de tiros de un jugador con la ayuda de un paquete de R llamado 'soccermatics'.

Él utilizó los datos de la FA Women’s Super League para crear un mapa de tiros de Nikita Parris, la delantera del Manchester City.

Ismael recomienda el uso de la función source para cargar tres elementos del paquete 'soccermatics' ya que a veces se encuentran problemas en instalar el paquete en sí. No funcionó para mí la primera vez, pero después de instalar, por separado, los paquetes 'ggrepel' y 'xts', he podido instalar 'soccermatics'.

Si puedes instalarlo, ignoras la parte del código que se refiere a la función source y simplemente cargas el paquete 'soccermatics' al mismo tiempo que cargas los otros paquetes, usando:

library (soccermatics)

Además, existe un pequeño error en el código. Cuando se utiliza la función soccertransform para escalar las coordenadas para que se visualicen correctamente, debería ser escrito así:

data <- StatsBombData %>% soccerTransform(method = "statsbomb")

Cuando estés cómodo con el funcionamiento del código, puedes hacer pequeñas alteraciones para conseguir los mapas de tiros de otros jugadores en otras competiciones. Por ejemplo, he utilizado su código para hacer lo mismo para Kylian Mbappe en el Mundial de 2018.

La función soccerShotmap incluye cuatro plantillas diferentes que cambian el color del fondo. Por ejemplo, en vez de “dark,” se puede utilizar “grass”:

Mapa de acciones defensivas

Más allá de los mapas de tiros, hay varias funciones interesantes dentro del paquete 'soccermatics'. Su página de Github explica cómo utilizarlo para crear un abanico de visualizaciones diferentes.

StatsBomb es el único proveedor de datos que recoge las acciones de presión. Entonces, tiene sentido aportar un ejemplo que utiliza estos datos. Vamos a hacer un mapa de algunas de las acciones defensivas de un equipo y luego, sólo las acciones de presión del mismo.

El ejemplo en la página de ‘soccermatics’ (dentro de la sección 'Custom plots') es el partido entre Francia y Argentina en el Mundial de 2018:

El proceso es muy parecido a lo de los mapas de tiros. Cargas los datos de la competición y sus partidos, creas un data frame para el partido específico:

statsbomb<-data%>%filter(match_id == 7580)

Y luego creas el gráfico con el código de la pagina de ‘Soccermatics’:

d2 <- statsbomb %>% filter(type.name %in% c("Pressure", "Interception", "Block", "Dispossessed", "Ball Recovery") & team.name == "France")

soccerPitch(arrow = "r", title = "France (vs Argentina, 30th June 2018)”, subtitle = "Defensive actions") + geom_point(data = d2, aes(x = location.x, y = location.y, col = type.name), size = 3, alpha = 0.5)

Vamos a hacer lo mismo gráfico para otro partido de ese mundial, en este caso el octavo de final entre España y Rusia. Este partido tiene el ‘match_id’ de 7582. Aquí está el resultado:

Ahora, vamos a cambiarlo un poco para incluir sólo las acciones de presión:

d2 <- statsbomb %>% filter(type.name %in% c("Pressure") & team.name == “Russia”)

soccerPitch(arrow = "r", title = “Rusia (vs España, 01/07/2018)”, subtitle = “Acciones de Presión”) + geom_point(data = d2, aes(x = location.x, y = location.y, col = type.name), size = 3, alpha = 0.5)

Con este resultado:

Conclusión

Ojalá que sean útiles estes ejemplos. Son básicos, pero aportan una base para alteraciones y exploraciones adicionales. Puedo decir que he aprendido mucho de seguir y modificar el código de cada uno. Ahora es tu turno. Puedes compartir tus resultados con nosotros: @statsbombes en Twitter.