Una mirada al Soccer Analytics usando R — Parte III

Ismael Gómez Schmidt
Ciencia y Datos
Published in
7 min readSep 14, 2019

En esta parte III [sí, hay Parte I y Parte II] propongo las categorías de Soccer Analytics que están basadas en los tipos de datos que se utilizan para realizar los distintos análisis de los que hablamos previamente (incluyendo los que faltó por abordar: rendimiento individual de jugadores + análisis espacio/temporal).

Elaboración propia con herramienta Lucid Chart

La categoría de datos Históricos (1) contiene toda la información que estamos más o menos acostumbrados a ver en los medios de comunicación y en general en literatura y sitios web dedicados a las estadísticas, los que en general son aplicados para hacer estadística descriptiva y modelos de probabilidades, como vimos en los post anteriores.

Se incluye, por nombrar algunos: información acerca de los partidos (fecha, estadio, torneo, alineaciones, resultado), algunos detalles sobre goles, pases, tiros, faltas, tiros de esquina, penales, tarjetas y otras incidencias, además de información sobre los equipos y sus jugadores (cantidad de torneos jugados y ganados, características físicas, rendimiento y valores monetarios en el mercado), entre otros.

Acá un ejemplo adicional de una aplicación reciente hecha por Opta con datos de jugadores del plantel profesional del Ajax (temporada 2018/19) que llamó la atención por la importante cantidad de jugadores jóvenes participando en gran parte de los minutos jugados.

La revolución de los datos

Gracias a la aparición de proveedores de datos más refinados y específicos del juego propiamente tal, como lo son los datos de Eventos (2) y Tracking (3), el área de Soccer Analytics se ha desarrollado notoriamente en los últimos 8–10 años.

Es así como el desarrollo tecnológico, con su ganancia en Velocidad de procesamiento, Volumen de almacenamiento y, especialmente para esta área, en la Variedad y Veracidad de los datos (las “4V del Big data” para poner un término marketero), aumentaron las posibilidades de describir, analizar y entender el juego.

Elaboración propia con herramienta Lucid Chart

Datos de eventos (2)

Este grupo de datos destaca porque contiene información espacial de diversos eventos y varios de sus detalles. Si bien los eventos principales son los pases, tiros y goles, también se registran los dribleos, quites, duelos, presión defensiva, entre varios otros.

Para cada evento se cuenta principalmente con el momento en que este ocurre + el nombre y la posición de los jugadores involucrados (ej: para un pase, quién lo da y quién lo recibe) + detalles específicos asociados (ej: para un tiro si este fue de cabeza, volea, pie hábil o no del jugador, etc.) + resultado del evento (pase preciso o fallido, tiro que terminó en gol, fuera, palo, atajado o bloqueado, etc.).

Gracias al detalle de esta información han surgido “nuevas” métricas y tipos de análisis, donde el principal exponente es el xG (eXpected Goals: Goles esperados).

En palabras simples el xG representa la probabilidad (entre 0 y 1) que tiene un tiro de convertirse en gol, a partir de un modelo matemático que considera parámetros como la distancia y el ángulo al arco, la parte del cuerpo con que se realiza el tiro, la cantidad de jugadores en línea “directa” hacia el arco, entre otros, dependiendo de la dificultad del modelo.

Si quieres saber más detalles sobre esta métrica puedes leer estos artículos: Analítica Sport y Objetivo Analista. Acá un esquema que considera un modelo básico de xG basado solamente en la ubicación del tiro, donde se aprecia el hecho natural de que mientras más cerca del arco es el tiro, más probabilidad tiene este de convertirse en gol:

Existen varias aplicaciones del xG. Una de las más utilizadas es el Mapa de tiros o Shotmap, el cual permite visualizar la ubicación de todos los tiros en alguna ventana temporal (1 solo partido o una temporada completa) y asociado a un equipo o a un solo jugador, entregando información sobre la posición, xG (tamaño del punto), resultado (color) y datos adicionales como por ejemplo la suma acumulada de xG por equipo, el ranking por jugador, el xG promedio por tiro, etc.

A continuación un ejemplo que hice con los datos del mundial femenino Francia 2019, liberados por Statsbomb, para el partido inaugural de Chile (frente a Suecia).

Elaboración propia con RStudio. Data: Statsbomb

Al mismo tiempo, gracias al detalle que se tiene acerca de los pases, otra aplicación importante son las Redes de pases o Passing Networks, las cuales permiten integrar en una misma visualización a) la posición promedio de los jugadores al interactuar con el balón (posición de nodos), b) dicha interacción ponderada en relación a sus compañeros (nitidez del color) y c) la ponderación respecto a lo pases precisos entre las distintas combinaciones de pares de jugadores (grosor y dirección de flechas).

Acá el ejemplo para el mismo partido del Shotmap previo, donde se aprecia claramente la baja interacción de la defensa chilena a nivel individual y en general la baja interacción entre las jugadoras chilenas a nivel colectivo en comparación con la selección sueca.

Se incluye también información general de cantidad de pases y precisión de los mismos: Chile con menos de la mitad de pases que Suecia y con una precisión del 53% (extremadamente baja):

¿Algo de código?

Bien, compartiré el código R que escribí para hacer un Shotmap con todos los tiros de Nikita Parris en su excelente temporada 2018/2019 con el Manchester City de la Premier League femenina. Los datos de Statsbomb, el paquete de R para facilitar su proceso y detalles sobre los términos de uso los puedes encontrar acá y acá.

## Carga de paquetes#devtools::install_github("statsbomb/StatsBombR")
library(StatsBombR
library(cowplot)
library(ggforce)
library(ggplot2)
# Dado que en algunos casos falla la instalación del paquete #"soccermatics" usando #devtools::install_github("jogall/soccermatics")
#sugiero descargar los archivos .R de las siguientes funciones #desde acá: https://github.com/JoGall/soccermatics/tree/master/R #para luego usar "source":
source("soccerTransform.R")
source("soccerShotmap.R")
source("soccerPitchHalf.R")

## Descarga y filtro de datos
#Obtiene la información de la liga Premier femenina (id=37) de la #temporada 2018/2019
Comp <- FreeCompetitions() %>% filter(competition_id==37, season_name=="2018/2019")
#Obtiene la información de todos los partidos y sus eventos
Matches <- FreeMatches(Comp)
StatsBombData <- StatsBombFreeEvents(MatchesDF = Matches , Parallel = T)
#Aplica funciones para limpiar y obtener la estructura óptima del dataframe
StatsBombData = allclean(StatsBombData)
#Escala las coordenadas para visualizar correctamente
data <- StatsBombData %>% soccerTransform(method = "statsbomb")
#Realiza el Shotmap
data %>% filter(player.name == "Nikita Parris") %>%
soccerShotmap(adj=F,
theme = "dark",
title = "Nikita Parris",
subtitle = "FA Women's Super League 2018/19")

Por supuesto depende de cada uno la personalización de colores (en este caso por defecto el color naranjo=Gol y celeste=Fuera/Atajado/Bloqueado) y la posibilidad de agregar otra métricas.

Aquí queda claro que Nikita disparó principalmente desde dentro del área y que convirtió 19 goles, lo que fue superior a lo esperado (xG=13.4).

Datos de tracking (3)

Los datos de tracking contienen las coordenadas (x,y) con la posición dentro del campo de los 22 jugadores y la pelota, junto con el tiempo exacto asociado y otros detalles como el nombre y/o el número de camiseta de cada jugador.

Toda esta información puede considerar una frecuencia típica de 10 Hz, lo que implica 10 muestras consecutivas por cada segundo transcurrido. De este modo un partido podría tener más de 54000 filas de datos (10*60*90), lo que en caso de análisis de una temporada completa y distintos equipos implica la necesidad especial de almacenamiento y procesamiento.

Hay dos principales métodos de recolección, uno que utiliza GPS de alta precisión insertados en camisetas, algún tipo de vestimenta similar o, en el caso del balón, sensores especiales. Y por otro lado, un sistema basado en tracking óptico (videos con cámaras que forman parte de un sistema calibrado).

Las aplicaciones van por el lado del análisis espacio/temporal tanto individual como colectivo. En la siguiente figura un ejemplo donde se calculan métricas de distancia y área considerando la relación entre los jugadores de un mismo equipo, la relación entre estos y el campo de juego y/o respecto al equipo rival:

A continuación les dejo un par de ejemplos que desarrollé con una pequeña secuencia del dataset liberado por Stats Insights para fines de investigación (no los puedo compartir “así no más”):

  1. En este link puedes ver el ejemplo considerando el Convex-Hull (área más chica que ocupan los jugadores de cada equipo, sin el arquero, al unir sus posiciones).
  2. En el siguiente video el ejemplo que considera diagramas de Voronoi para cuantificar el área que domina cada jugador (en este caso asumiendo que todos tienen la misma velocidad y la óptima orientación corporal):

Para ambos casos usé RStudio con los paquetes para R: reticulate, dplyr, tidyr, stringr, soccermatics, ggplot2, ggsoccer, gganimate & ggforce. También hice una función propia (soccerAnimate) cuyo código y detalles adicionales para hacer las animaciones los puedes ver en este repositorio Github.

Dejaré hasta acá la serie de post sobre este tema. La serie puede ser considerada como una introducción al área, o como dice el título: “una mirada”.

Para finalizar, les dejo otros recursos relacionados:

(i)¿Cómo llega Chile a la Copa América?

(ii) Resumen de primera rueda 2019 torneo chileno

--

--

Ismael Gómez Schmidt
Ciencia y Datos

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