Si estás interesado en seguir aprendiendo y formarte como analista, seguro que este artículo te interesa.
No te olvides de llegar hasta el final….
Me imagino que a estas alturas las palabras “big data” no serán desconocidas para ti y tampoco que la cantidad de datos que generamos a todas horas y de diferentes maneras es gigantesca. Las empresas de diferentes tipos de sector también lo saben y están intentando sacarle partido. El mundo del fútbol no es una excepción pero no sirve de nada tener muchos datos si no obtenemos valor de ellos.
Mi nombre es Óscar Bartolomé, trabajo como ingeniero de datos y mi intención en este artículo es introduciros a una herramienta muy útil para este propósito: el lenguaje R.
¿Qué es el lenguaje R?
Si estás leyendo este blog es porque compartes con nosotros la pasión por el fútbol. En esta introducción, todos los ejemplos se explicarán con datos sobre este deporte, para darte una visión de lo que podemos conseguir con unas pocas líneas de código. Si esto último te ha dejado un poco confuso, te lo explico. R es un lenguaje de programación. Si ya tienes experiencia en este mundillo, no te costará mucho entrar en R. En cambio, si no tienes conocimientos de programación, ¡no te preocupes! Existen muchísimos cursos gratuitos de iniciación en R. A mí en su día, me fue muy útil este libro gratuito.
R es un lenguaje “open source”, lo cual quiere decir que es de libre acceso y que todo el mundo puede colaborar en su desarrollo y mejora. Es por eso que dispone de una gran comunidad detrás y encontrar tutoriales o respuestas a cualquier tipo de duda es bastante sencillo.
¿Por qué R y no otro lenguaje?
R, a diferencia de otros lenguajes de uso general, está enfocado al análisis estadístico. Provee una serie de paquetes que nos serán de gran ayuda a la hora de realizar experimentos o estudios desde procesos previos como el preprocesamiento de datos o el análisis descriptivo, a tareas más complejas como el diseño de modelos de Machine Learning. Además, ya hay usuarios que han creado paquetes orientados específicamente al análisis de datos de fútbol, como ggsoccer o soccergraphR.
¿Cómo empiezo?
El primer paso es descargar R e instalarlo. Podéis encontrar la última versión y las instrucciones de instalación en su página oficial.
Toca el turno de su IDE. Sí, puede que te suene a chino pero te lo explico. Son las siglas en inglés de “Entorno de Desarrollo Integrado” o, lo que es lo mismo, el software que utilizaremos para programar en R. A mí me parece muy fácil de usar ya que se divide en cuatro paneles y cada uno tiene un propósito.
En la página oficial de R Studio podéis encontrar la versión más reciente y tutoriales para iniciarse en su instalación y manejo.
¿Qué tiene que ver esto con el fútbol?
Con R podremos preparar los datos para dejarlos en el formato que necesitemos y posteriormente realizar todo tipo de visualizaciones. Gráficos de radar para comparar jugadores según ciertas características, grafos con las redes de pases de un equipo en un partido o gráficos de puntos con las posiciones de disparo de un jugador sobre el campo, son algunos ejemplos de las posibilidades que nos ofrece R.
¿No lo ves claro todavía? Te enseño un ejemplo
Vamos a entrar en materia. La temporada pasada, como suele ser habitual, Real Madrid y FC Barcelona estuvieron peleando por el título de liga hasta el último minuto y finalmente fue el equipo blanco el que consiguió levantar el trofeo. Sus principales estrellas consiguieron, como se suele decir, “buenos números”. O eso creemos. Vamos a analizar algunas estadísticas de Antoine Griezmann y Karim Benzema, los delanteros centro franceses de ambos equipos, durante la temporada 2019-2020.
1. Los datos
Principalmente para hacer un buen análisis son necesarios unos buenos datos. Existen proveedores de pago que nos ofrecen una completísima gama de datos de equipos, jugadores, partidos, competiciones, etc, así como gráficos e informes, sin el más mínimo esfuerzo. Pero sus precios sólo están al alcance de equipos profesionales. Los que nos iniciamos en esto recurrimos a fuentes gratuitas de datos, que también las hay. Aquí te dejo las 7 mejores páginas gratuitas para obtener datos de fútbol.
Yo he descargado los datos de FBRef.com y tienen esta pinta:
> str(liga.data)
'data.frame': 570 obs. of 30 variables:
$ RL : int 1 2 3 4 5 6 7 8 9 10 ...
$ Jugador : chr "Antonio Adán\\Antonio-Adan" ...
$ País : chr "es ESP" "es ESP" "gh GHA" "es ESP" ...
$ Posc : chr "PO" "DL" "DF" "DF" ...
$ Equipo : chr "Atlético Madrid" "Athletic Club" ...
$ Edad : int 32 38 22 23 23 30 33 25 28 26 ...
$ Nacimiento: int 1987 1981 1996 1996 1995 1989 1985 1993 ...
$ PJ : int 1 14 23 31 32 27 36 13 27 6 ...
$ Titular : int 0 0 20 23 27 25 36 11 20 0 ...
$ Mín : int 25 208 1805 2099 2502 2187 3237 924 1927 ...
$ Gls. : int 0 1 1 1 0 2 1 4 2 0 ...
$ Ass : int 0 0 0 1 1 5 0 1 2 0 ...
$ TP : int 0 0 0 0 0 0 0 0 0 0 ...
$ TPint : int 0 1 0 0 0 0 0 0 0 0 ...
$ TA : int 0 3 5 5 4 7 9 1 10 0 ...
$ TR : int 0 0 1 1 0 0 0 0 0 0 ...
$ Gls..1 : num 0 0.43 0.05 0.04 0 0.08 0.03 0.39 0.09 0 ...
$ Ast : num 0 0 0 0.04 0.04 0.21 0 0.1 0.09 0 ...
$ G.A : num 0 0.43 0.05 0.09 0.04 0.29 0.03 0.49 0.19 ...
$ G.TP : num 0 0.43 0.05 0.04 0 0.08 0.03 0.39 0.09 0 ...
$ G.A.TP : num 0 0.43 0.05 0.09 0.04 0.29 0.03 0.49 0.19 ...
$ xG : num 0 1.3 0.3 0.9 0.9 1 1.5 3.3 1.6 0 ...
$ npxG : num 0 0.6 0.3 0.9 0.9 1 1.5 3.3 1.6 0 ...
$ xA : num 0 0 1.9 0.9 1 3.4 0.4 1.5 0.9 0 ...
$ xG.1 : num 0 0.57 0.02 0.04 0.03 0.04 0.04 0.32 0.07 ...
$ xA.1 : num 0 0 0.09 0.04 0.04 0.14 0.01 0.15 0.04 ...
$ xG.xA : num 0 0.57 0.11 0.08 0.07 0.18 0.05 0.47 0.12 ...
$ npxG.1 : num 0 0.25 0.02 0.04 0.03 0.04 0.04 0.32 0.07 ...
$ npxG.xA : num 0 0.25 0.11 0.08 0.07 0.18 0.05 0.47 0.12 ...
2. A programar
Como podéis ver, tenemos muchas estadísticas de todos los jugadores de La Liga en la temporada 2019-2020. A nosotros sólo nos interesan dos jugadores en particular y no todas sus estadísticas, así que lo primero que debemos hacer es cargar y preprocesar los datos. Para este cometido existe un paquete muy útil llamado dplyr. Pertenece a una familia llamada tidyverse, que engloba varios paquetes dirigidos sobre todo al preprocesamiento de datos y a la visualización de éstos. Para ahondar más en estos paquetes, os recomiendo el libro web gratuito R for Data Science.
Vamos a ello. Lo que necesitamos es quedarnos sólo con las estadísticas de sus delanteros, Karim Benzema y Antoine Griezmann. Además sólo queremos ver ciertas estadísticas. Utilizando unas pocas funciones de dplyr lo podemos conseguir.
## install.packages(“tidyverse”)
library(tidyverse)
## Leemos el archivo .csv con los datos
liga.data <- read.csv("data/estadisticas_jugador_liga_19_20.csv",
skip = 1,
stringsAsFactors = F,
fileEncoding = "UTF-8")
## Filtramos Benzema y Griezmann, y seleccionamos las columnas
comparacion.data <- liga.data %>%
mutate(Jugador = gsub("[\\].*", "", Jugador)) %>%
filter(Jugador %in% c("Karim Benzema", "Antoine Griezmann")) %>%
column_to_rownames(var = "Jugador") %>%
select(Asistencias = Ass, xA, Goles = Gls., xG, De.penalty = TP,
npxG, Tarjetas.amarillas = TA, Tarjetas.rojas = TR)
Ya tenemos los datos que necesitamos, ¿ahora qué? Pues vamos a hacer un diagrama de radar para comparar los números de ambos jugadores. El paquete por excelencia para visualización en R es ggplot, también perteneciente a tidyverse. Con él se pueden realizar una infinidad de gráficos distintos y personalizarlos de múltiples maneras. Pero, para hacer gráficos de radar, me gusta más este otro, fmsb. Tiene la función radarchart, que es más sencilla de utilizar.
## install.packages(“fmsb”)
library(fmsb)
## Valores máximo y mínimo de cada columna
## Utilizamos los máximos de todos los jugadores
maximo <- apply(liga.data[, c("Ass", "xA", "Gls.", "xG", "TP",
"npxG", "TA", "TR")],
2,
max,
na.rm=T)
minimo <- apply(liga.data[, c("Ass", "xA", "Gls.", "xG", "TP",
"npxG", "TA", "TR")],
2,
min,
na.rm=T)
## Función para personalizar el gráfico de radar
grafico_radar <- function(data, max, min){
data <- rbind(max, min, data)
colors_border <- c(rgb(0.2,0.5,0.5,0.9), rgb(0.8,0.2,0.5,0.9),
rgb(0.7,0.5,0.1,0.9))
colors_in <- c(rgb(0.2,0.5,0.5,0.4), rgb(0.8,0.2,0.5,0.4),
rgb(0.7,0.5,0.1,0.4))
radarchart(data, axistype = 2, pcol = colors_border,
pfcol = colors_in, plwd = 4, plty = 1,
cglcol = "grey", cglty = 1, axislabcol = "red3",
cglwd = 0.8, vlcex = 0.8)
legend(x = 0.7, y=1.3, y.intersp=0.4,
legend = rownames(data[-c(1,2),]), bty = "n", pch=20,
col=colors_in, text.col = "black", cex=1, pt.cex=3)
}
## Dibujamos el gráfico de radar
grafico_radar(comparacion.data, maximo, minimo)
Ejecutamos el código y… ¡Magia! Ya tenemos nuestro gráfico de radar con las estadísticas de los dos jugadores.
Podemos apreciar como Karim Benzema ha sido muy superior a Antoine Griezmann durante la temporada 2019-2020. Además vemos que, en estadísticas como los goles marcados o los goles esperados, Karim Benzema ha tenido de los valores más altos entre todos los jugadores del campeonato. Estos gráficos son muy útiles para comparar jugadores, aunque también nos sirven para visualizar las principales características de cada jugador de forma individual. Incluso podemos representar en ellos otras entidades que no sean jugadores, como equipos o incluso ligas.
¿Os ha gustado? Pues esto es sólo una pequeña muestra de todo lo que el lenguaje R nos puede ofrecer. Te invito a que pruebes a ejecutar este ejemplo y personalizarlo a tu antojo o incluso a probar con otros gráficos que investigues por tu cuenta. No dudes en dejar tu opinión o preguntas que te surjan en los comentarios.
Si estás interesado en formarte con R y aplicarlo en el mundo del fútbol como analista, esta formación te va a interesar…Puedes pedir más información aquí.