Analítica de fútbol: Crea tu propio modelo xG

Ismael Gómez Schmidt
Ciencia y Datos
Published in
10 min readApr 14, 2020

En este artículo comparto detalles que pueden serte útiles para crear tu propio modelo xG, además de evaluar su rendimiento y analizar algunos de sus resultados.

¿Qué es el xG?

Los goles esperados o xG (eXpected Goals) se han transformado en la principal métrica de estos días en la Analítica de fútbol. En palabras simples, el xG es la probabilidad (entre 0 y 1) que tiene un tiro al arco de convertirse en gol, entendiendo que una probabilidad igual a 1 significa Gol y una probabilidad igual a 0 significa No gol.

Dicha probabilidad se obtiene a partir de un modelo estadístico entrenado con la suficiente cantidad de ejemplos de diversos tiros al arco y su respectiva información espacial, temporal, de contexto, entre otros detalles.

Una de las variables más importantes para ajustar un modelo xG es la posición dentro del campo desde dónde se realiza el tiro (ejemplo: coordenadas X, Y), con la cual es posible obtener la distancia al arco y el ángulo de tiro.

A continuación una visualización que muestra el xG que arroja un modelo básico considerando únicamente esta información. Como es de esperar, mientras más cerca del arco se realice el tiro más probabilidad tiene este de ser gol:

Hay otras variables útiles a considerar para robustecer el modelo. Más adelante veo en detalle y/o menciono algunas de ellas.

Si quieres revisar más detalles y ejemplos de uso de esta métrica revisa esta publicación previa.

Los datos

Aproveché la oportunidad de usar un set de datos que dispuso Wyscout para el acceso público con datos de eventos (tiros, pases, duelos, faltas, dribleos, etc.) de todos los partidos de la temporada 2017–2018 de las 5 principales ligas europeas. Acá puedes descargar los datos y acá puedes revisar detalles de lo que contienen y un análisis descriptivo de los mismos.

Luego de procesar la información me quedó un set de datos de 30912 tiros, de los cuales 4270 fueron goles (~14%). No se incluyen los tiros bloqueados ni los tiros de jugada detenida como penales, tiros libres o tiros de esquina.

Acá una visualización espacial de dichos tiros segmentando entre goles (rojo) y no goles (azul), donde se aprecia que la mayoría de los goles corresponden a tiros desde dentro del área.

Herramientas

Para todo el flujo de trabajo requerido usé RStudio, aplicando distintos paquetes según cada etapa en particular:

  • Procesamiento: jsonlite + dplyr + tidyr + purrr
  • Visualización: ggplot2 + ggsoccer + DataExplorer + RColorBrewer
  • Modelamiento: h2o + caret + pROC + ROCR + pdp + DALEX

Creé este repositorio en github para que puedas revisar el código completo e idealmente reproducir todo lo expuesto en este artículo. Ahí se incluyen comentarios y explicaciones para las distintas partes del código (creación de nuevos atributos, ajuste y evaluación de modelos, las visualizaciones, entre otros detalles), además de la función getshots que permite leer y procesar los archivos JSON originales para obtener los dataframes con las columnas que consideré útiles.

Variables de entrada

A continuación el listado de todas las variables de entrada consideradas. Algunas de ellas fueron utilizadas directamente “como venían” y otras fueron creadas a partir del proceso y cruce de información.

  • Coordenadas de posición del tiro (x_1, y_1): Se consideran tal y como vienen en el dataset. En ambos se casos representan el porcentaje de la posición del tiro (0 a 100%), respecto a la longitud y al ancho del campo de juego respectivamente.
  • Distancia al arco (distance_to_goal_line): Distancia en metros entre la posición del tiro y el punto central de la línea de meta en el arco. Esta fue calculada a partir de las coordenadas X,Y [%] y las dimensiones medias de un campo de juego europeo (longitud de 105 metros y ancho de 68 metros).
  • Ángulo visible de tiro (angle_to_goal): Corresponde al ángulo visible que tiene el jugador desde la posición del tiro, obtenido a partir de las coordenadas de posición y las dimensiones medias de un campo de juego europeo, además de la longitud de un arco de fútbol típico (7.32 metros).

Acá un ejemplo con distintos ángulos:

Fuente: https://medium.com/@Soccermatics/the-geometry-of-shooting-ae7a67fdf760
  • Parte del cuerpo (skilled_foot): Variable categórica creada con 3 niveles para categorizar la parte del cuerpo con la que se realiza el tiro.
  1. Head/Body: Cabezazo o tiro realizado con alguna otra parte del cuerpo distinta a los pies.
  2. Skilled foot = Yes: Tiro al arco realizado con el pié hábil del jugador que patea.
  3. Skilled foot = No: Tiro al arco con el pié no hábil del jugador que patea.
  • Segundo del evento (EventSec): Segundos transcurridos hasta el momento del tiro desde el inicio de la 1era o 2da mitad del partido, según corresponda.
  • Mitad del partido (MatchPeriod): Variable categórica con 2 niveles para representar en qué mitad (Half) o del partido ocurre el tiro, 1H o 2H.
  • Tiempo desde el tiro previo (time_prev): Tiempo, en segundos, transcurrido desde el último tiro previo del mismo equipo, en el mismo partido. Con esta variable se busca incorporar información acerca de tiros que son rebotes.
  • ¿Es contra ataque? (is_CA): Variable booleana que indica si el tiro es el resultado de una jugada de contragolpe o no.
  • Resultado del tiro (is_goal): Corresponde a la variable que se busca predecir. Gol = 1, No Gol = 0.

Breve análisis exploratorio

  • Matriz de correlación

Las variables con la mayor correlación lineal para “is_goal =1” son la distancia al arco (-0.26), la coordenada X (0.22) y el ángulo de tiro (0.16). A priori podrían ser variables relevantes para el modelo.

Destaca la alta correlación lineal entre la distancia al arco y la coordenada X (-0.95), lo que es esperable, aunque podría ser un punto a considerar para posibles futuros análisis o mejoras, pensando en evitar una correlación tan alta entre los predictores.

  • Variables categóricas

La mayoría de los tiros considerados ocurren durante jugadas que no son contragolpes (is_CA = 0), con el pié hábil del jugador (skilled_foot = Yes) y en el segundo tiempo (matchPeriod = 2H).

  • Variables numéricas

La mayoría de los tiros considerados ocurren aprox. a menos de 35 metros y principalmente con ángulos visibles de tiro cercanos a 20°.

Hay algunos pocos casos de ángulos negativos que podrían analizarse en detalle para análisis o mejoras posteriores.

Consideraciones del ajuste

  • Es importante tener claro que este es un problema de clasificación binaria, puesto que la variable a predecir (is_goal) tiene dos posibles resultados: Sí y No (o 1 y 0).
  • Para el ajuste utilicé el algoritmo de Auto Machine Learning del paquete h2o con tal de obtener los algoritmos que tienen un buen desempeño para este problema. Además de los métodos ensamblados que propone la herramienta, en general el algoritmo mejor rankeado fue el Gradient Boosting Machine(GBM). Si bien posiblemente el algoritmo xGBoost también ande bien (no pude probarlo en Windows con h2o) e incluso también una “simple” regresión logística con distribución binomial, opté por quedarme con el GBM.
  • Aunque se trata de un caso de clases desbalanceadas (hay aprox. solo 14% de goles contra un 86% de tiros que no fueron goles), al trabajar con técnicas basadas en Boosting esto no es un problema dado que el mismo algoritmo lo compensa.
  • Usé una segmentación del 80% de los ejemplos para el dataset de entrenamiento y un 20% para el de testing. Para el entrenamiento usé validación cruzada.
  • Ajusté 2 modelos:
  1. Modelo GBM con solo 2 parámetros de entrada: Distancia y ángulo al arco.
  2. Modelo GBM con todos los parámetros detallados anteriormente (9).
  • No optimicé los hiperparámetros de los modelos, lo que podría ser una opción para futuras mejoras.

Análisis de resultados

Performance

Para la evaluación de performance consideré las métricas F1 (o FMeasure), Balanced Accuracy, AUC (Area Under Curve), Precission + Recall de manera simultánea y RMSE. Si no estás familiarizado con este tipo de métricas, puedes leer este artículo.

A continuación una tabla con el resumen de la performance de los 2 modelos según dichas métricas y una gráfica de la curva ROC donde es posible ver la ganancia en AUC al incorporar las variables adicionales a la distancia y el ángulo. Para ambos casos los cálculos se hacen considerando un umbral optimizado para Balanced Accuracy y por supuesto utilizando el dataset de testing.

Sin duda el modelo Nº2 (GBM2, línea roja) corresponde a la mejor opción dada su mejor performance en todas las métricas, excepto en el Recall que baja de 0.7293 a 0.6966, lo que es aceptable tomando en cuenta la mejora en todas las demás métricas.

Al comparar con otros modelos xG sabemos que este modelo debería mejorarse, aunque no está nada de mal para partir. Por ejemplo, en términos de RMSE habría que llegar a un rango de 0.3 a 0.26 o para AUC a valores entre 0.79 y 0.81.

Cabe recordar que acá solo consideramos tiros de jugadas no detenidas (Open Play), de una sola temporada (2017–2018) y de 5 ligas.

Valores xG

Los valores xG obtenidos tienen la distribución esperada, a pesar de que hay algunos outliers (por ejemplo los tiros desde mitad de cancha).

Variable importance

A continuación un gráfico de “importancia de variables” rankeadas para el modelo N°2 (valores escalados).

Queda claro que en el top 3 de variables relevantes tenemos la distancia al arco, el ángulo visible de tiro y la parte del cuerpo. Por otro lado, las variables menos relevantes serían la mitad del partido y si el tiro corresponde o no a una jugada de contragolpe.

Es importante tener claro que este ranking se basa en la métrica MSE, arrojado por defecto por la herramienta h2o, y que es posible analizar esta importancia de variables con otras métricas.

Gráficos de dependencia parcial

Ahora miraremos algunos gráficos de dependencia parcial para observar cómo las 3 variables más relevantes afectan las predicciones de los modelos según los distintos valores que estas toman.

Distancia al arco:

Ambos modelos consideran de forma similar a los tiros con distancia menores a 25 metros, aumentando la probabilidad a medida que disminuye la distancia (aunque el modelo 1 tiene un peak extraño cerca de los 13 metros).

Para distancia mayores a 25 metros, el modelo 2 asigna una probabilidad casi fija cercana a 0.25, lo que posiblemente es compensado mediante la interacción con otra variable. Por su parte, el modelo 1 asigna probabilidad cercana a 0, excepto por otro peak extraño cerca de los 100 metros que puede deberse a algún gol outlier y/o a la falta de más datos a esas distancias.

Ángulo de tiro:

Ambos modelos aumentan la probabilidad a medida que el ángulo visible crece desde aproximadamente los 15° en adelante, siendo el modelo 2 el más conservador.

Para ángulos negativos el modelo 1 tiene un comportamiento diferente ya que asigna valores altos de probabilidad, lo que a simple vista parece erróneo. El modelo 2 en cambio prácticamente mantiene su estimación en el nivel de los ángulos menores a 15°. De todas formas los ángulos negativos debiesen ser motivo de revisión en detalle si se quiere mejorar el ajuste.

Parte del cuerpo:

Se aprecia que no hay gran diferencia de estimaciones entre tiros realizados con el pié hábil o no del jugador, pero sí la hay entre tiros realizados con algún pié y los tiros realizados con otra parte del cuerpo. Como era esperable, los tiros realizados con el pié tienen una mayor probabilidad.

Potenciales variables a incluir

A continuación un listado de potenciales variables que podrían considerarse para evaluar su aporte a la performance del modelo:

  • Posición de los otros jugadores al momento del tiro: La ubicación del arquero junto con la ubicación y cantidad de rivales y compañeros de equipo.
  • Características de la asistencia (pase previo): Además de la ubicación del pase, este puede ser un pelotazo largo, un cambio de frente, un pase en profundidad, pase hacia atrás, etc.
  • Posición en la que juega el jugador que patea (defensa, mediocampista defensivo/ofensivo, delantero, etc.)
  • Alguna codificación arbitraria que indique si la jugada corresponde o no a una gran oportunidad. Por ejemplo Opta utiliza el parámetro “Big Chance”
  • Altura del balón
  • Distancia y ángulo del tiro previo
  • La diferencia en el marcador
  • El equipo que patea está jugando de local o visita
  • El tipo de torneo

Ejemplo de aplicación

Me di el gusto de armar un shotmap para “el king” Arturo Vidal en su última temporada en el Bayern Münich usando el modelo xG recién ajustado.

El shotmap es solo uno de los múltiples usos donde se aplica un modelo xG. Por un lado, podemos ver la ubicación y resultado de todos los tiros no bloqueados desde jugadas no detenidas (33) con sus respectivos valores xG mapeados con el tamaño de los puntos.

Y al mismo tiempo, calcular la suma acumulada de los xG (3.7) y comparar con los goles reales convertidos (6), obteniendo una diferencia positiva de +2.3, lo que implica que Vidal “rindió sobre lo esperado” en términos de conversión de goles.

Si tienes alguna duda puedes contactarme por twitter a la cuenta @DatoFutbol_cl

Te invito a visitar mi blog enfocado en analítica de fútbol: Dato Fútbol

--

--

Ismael Gómez Schmidt
Ciencia y Datos

Data Scientist | Football and Ice Hockey Data Analyst | #SportsAnalytics | @ismaelgomezs | datofutbol.cl | @DatoFutbol_cl