Análisis de Clusters de las 5 Grandes Ligas de Europa - Temporada 18/19

Ya con todos los partidos terminados de las 5 grandes ligas de Europa, es momento de hacer un análsis de clustering de todos los equipos de esta temporada 2018/2019.

¿Alguna vez has escuchado el término de “clustering”? ¿Acaso sabes lo que significa? Si es que no tienes idea de lo que es, estás en el lugar correcto!

Antes de iniciar, te advierto que el resultado final es una gráfica interactiva, por lo que es mucho mejor leer la información en un ordenador/PC en vez de un móvil.

Bueno ahora sí…

Como lo expliqué en su momento en mi artículo anterior, existe un concepto llamado Machine Learning, donde este se divide en Supervised y Unsupervised.

Para esta ocasión se hará un análisis de Unsupervised Learning.

En pocas palabras, Unsupervised Learning es un tipo de Machine Learning que se utiliza para hacer conclusiones, detectar patrones, y/o hacer inferencias de información sin categorizar las variables. Dentro de los algoritmos, el que más se destaca (o bueno, el más popular) es el análisis de clusters.

Clusters son segmentaciones, y el hacer este análisis logra identificar grupos o patrones.

¿Y cómo se aplicará esto?

Tanto en el futbol como en cualquier otro caso (sea caso de negocio, ideas, etc.), este análisis puede ser ejecutado para encontrar segmentos.

Por las variables que se mostrarán en este artículo, se encontrarán los equipos que son más similares dentro de las 5 grandes ligas de Europa.

Hay que tomar en cuenta que la información que se va a utlizar tiene que ser normalizada o estandarizada para poder realizar la comparación. Cuando digo esto es porque algunos valores son muy pero muy grandes, y generalmente lo que se hace es calcular proporciones.

Un ejemplo rápido de lo que me refiero:

  • Un equipo puede tener un 10% de efectividad al anotar gol, con 5,000 tiros a puerta
  • Otro equipo puede tener también un 10% de efectividad al anotar gol, con 500 tiros a puerta

Si mides los equipos en base a cantidad de tiros, podrás darte cuenta que hay una diferencia abismal…Pero si comparas los equipos en base a porcentajes, puedes afirmar que son iguales. ¿O no?

Es a lo que voy…La información necesita ser normalizada o estandarizada para poder comparar correctamente las segmentaciones.

Entonces ya con esto sobre la mesa, a empezar el análisis!

A preparar la información!

Vamos a considerar los datos de la temporada 2018/2019 de la página football-data.co.uk.

## # A tibble: 98 x 22
##    Equipo GolesF GolesC    DG Puntos     W     D     L GolesMT_F GolesMT_C
##    <chr>   <dbl>  <dbl> <dbl>  <dbl> <int> <int> <int>     <dbl>     <dbl>
##  1 Bayer~     88     32    56     78    24     6     4        41        13
##  2 Dortm~     81     44    37     76    23     7     4        32        21
##  3 RB Le~     63     29    34     66    19     9     6        32        15
##  4 Lever~     69     52    17     58    18     4    12        37        22
##  5 M'gla~     55     42    13     55    16     7    11        14        21
##  6 Wolfs~     62     50    12     55    16     7    11        22        20
##  7 Ein F~     60     48    12     54    15     9    10        26        20
##  8 Werde~     58     49     9     53    14    11     9        25        23
##  9 Hoffe~     70     52    18     51    13    12     9        26        19
## 10 Fortu~     49     65   -16     44    13     5    16        17        22
## # ... with 88 more rows, and 12 more variables: TirosF <dbl>,
## #   TirosC <dbl>, TirosPF <dbl>, TirosPC <dbl>, Fouls_Prov <dbl>,
## #   Fouls_Rec <dbl>, Corners_Fav <dbl>, Corners_Con <dbl>, TA_Prov <dbl>,
## #   TA_Rec <dbl>, TR_Prov <dbl>, TR_Rec <dbl>

Como puedes observar la información contiene varias variables, entre ellas Goles a Favor (GolesF), Goles Medio Tiempo en Contra (GolesMT_C), Tiros a Puerta a Favor (TirosPF), etc.

Son demasiadas variables, y para fines de poder explicar con más detalle lo que sucede en este análisis, tendré que seleccionar solo una porción de las mismas.

## # A tibble: 98 x 9
##    Equipo GolesF GolesC TirosPF TirosPC Fouls_Prov Fouls_Rec Corners_Fav
##    <chr>   <dbl>  <dbl>   <dbl>   <dbl>      <dbl>     <dbl>       <dbl>
##  1 Bayer~     88     32     255      83        278       342         287
##  2 Dortm~     81     44     184     134        279       393         168
##  3 RB Le~     63     29     182     123        442       390         190
##  4 Lever~     69     52     197     145        349       384         189
##  5 M'gla~     55     42     158     155        310       358         189
##  6 Wolfs~     62     50     166     161        340       437         175
##  7 Ein F~     60     48     153     174        389       343         179
##  8 Werde~     58     49     176     156        405       350         168
##  9 Hoffe~     70     52     225     177        451       347         182
## 10 Fortu~     49     65     163     182        412       405         144
## # ... with 88 more rows, and 1 more variable: Corners_Con <dbl>

Las variables seleccionadas para esta ocasión fueron:

  1. Equipo
  2. Goles a Favor
  3. Goles en Contra
  4. Tiros a Puerta a Favor
  5. Tiros a Puerta en Contra
  6. Fouls Hechos
  7. Fouls Recibidos
  8. Corners a Favor
  9. Corners en Contra

Con estas 9 variables realizaremos en análisis de clusters.

Estandarizar la información

Existen varios métodos para normalizar o estandarizar la información, aunque afortunadamente en el mundo de R hay un paquete llamado recipes, que en español es “recetas”, y tiene como objetivo preparar la información acorde a tu necesidad.

Y usando el paquete, así es como queda ahora el resultado:

## # A tibble: 98 x 8
##    GolesF  GolesC TirosPF TirosPC Fouls_Prov Fouls_Rec Corners_Fav
##     <dbl>   <dbl>   <dbl>   <dbl>      <dbl>     <dbl>       <dbl>
##  1  2.28  -1.56    2.13    -2.56     -2.35      -1.62       2.87  
##  2  1.84  -0.585   0.360   -1.05     -2.34      -0.908     -0.542 
##  3  0.730 -1.80    0.311   -1.38     -0.204     -0.950      0.0880
##  4  1.10   0.0637  0.685   -0.726    -1.42      -1.03       0.0594
##  5  0.234 -0.748  -0.288   -0.430    -1.93      -1.40       0.0594
##  6  0.668 -0.0985 -0.0886  -0.253    -1.54      -0.289     -0.342 
##  7  0.544 -0.261  -0.413    0.132    -0.897     -1.61      -0.227 
##  8  0.420 -0.180   0.161   -0.401    -0.688     -1.51      -0.542 
##  9  1.16   0.0637  1.38     0.220    -0.0862    -1.55      -0.141 
## 10 -0.137  1.12   -0.163    0.368    -0.596     -0.739     -1.23  
## # ... with 88 more rows, and 1 more variable: Corners_Con <dbl>

Los datos ahora son diferentes. Te preguntarás por qué no está la columna Equipo…Bueno, por la sencilla razón de que la data tiene que estar en matriz para poder proceder a la preparación de estandarización ;)

Les recomiendo este enlace para que sepan un poco más sobre el paquete.

En fin, vamos al siguiente paso que son los “clusters”, y para ello utilizaremos K-Means.

Clustering

Dentro del “Clustering” existen varios métodos, de los cuales los más populares son K-Means y Hierarchical Clustering. Ambos son similares porque detectan grupos, y de forma muy resumida, el proceso de detección es por medio de una medida de similitud (Por ejemplo Euclidean Distance).

Ahora lo que sigue es determinar la cantidad de clusters que se usarán en este caso, por lo que recurriremos al “Scree Plot”.

¿Cómo interpretarlo?

Lo que se espera de este tipo de gráficas es que tenga una línea que descienda conforme vayan aumentando los clusters. Además, debe de tener una forma de “codo” (Si, así como leiste) porque esto indica que la calidad del modelo no mejora conforme va aumentando.

En otras palabras, donde exista un punto de inflección más notable será el número de clusters a utilizar en el análisis.

Del cluster 1 al 2 vemos que bajó considerablemente, y del 2 al 3 también baja pero no tanto. Ya del 4 al 5 y los otros clusters que siguen realmente no hay mucha diferencia, por lo que deberíamos de elegir ya sea 2 o 3 clusters.

Una vez eligiendo el cluster ideal (Seleccioné 3), vamos con el siguiente paso que es muy interesante.

Combinando clusters con Reducción de Dimensionalidad

¿Combinando que cosa?

Lo que voy a hacer es graficar los clusters con todas las variables mencionadas anteriormente.

¿Pero cómo graficarlas?

Si, yo también me hubiera hecho la misma pregunta. La lógica es la siguiente…

Quieres graficar el peso y la altura de un grupo de personas. ¿Cómo sería? Graficando un eje X (Pongamos el peso) y un eje y (Pongamos la altura, y esto sería una gráfica de tres dimensiones.

Si quiero graficar tres variables (peso, altura y esperanza de vida), tendría que ser una gráfica de 3 dimensiones.

¿Qué sucede cuando quieres graficar 4, o 9 variables como ahorita?

Es ahí cuando entra la reducción de dimensionalidad.

Hay varios métodos para ejecutar esto, entre ellos los que más tienen fama son PCA (Principal Component Analysis) y UMAP (Uniform Manifold Approximation and Projection).

Verás, realizar Machine Learning en información de muchas variables aumenta el tiempo de respuesta de los algoritmos. Es por ello que la reducción de dimensiones puede ser aplicado como un paso para reducir el número de columnas de la data pero aún manteniendo la estructura.

Y, al vizualizar los primeros dos componentes generalmente nos permite hacer un análisis de clusters!

Ahora…

Una vez que se aplica la reducción de dimensiones (Usaré UMAP), es así como queda el resultado:

Vamos examinando lo que arrojó R.

De acuerdo con la siguiente gráfica, hay tres clusters de acuerdo a las variables mencionadas anteriormente en los equipos de las 5 grandes ligas de Europa.

En la parte superior izquierda estan Fulham, Hannover, Stuttgart, Cardiff, Huddersfield, Burnley, entre otros.

Todos esas escuadras tienen la similitud de que anotaron pocos goles, recibieron muchos goles, hicieron pocas faltas, pocos corners…Todos ellos hicieron mala temporada en general. Mientras que unos descendieron, otros estuvieron cerca.

Luego despúes de ellos está otra sección que también peculiarmente los equipos son tanto de liga alemana como de liga inglesa, algunos ejemplos son Augsburg, Fortuna Dusseldorf, Southampton, Watford, West Ham, Crystal Palace.

En el caso del Fortuna y el Watford, son dos equipos que estuvieron relativamente cómodos en sus respectivas tablas generales, pero su diferencia de goles y la gráfica demuestra que no estuvieron por encima de lo que aparentan.

Ya ahora nos metermos con equipos de más categoría, es decir, otro cluster.

Lo más interesante son los equipos de mayor categoría, que son los que están hasta la izquierda: Liverpool, Manchester City, Bayern Munich…Aunque también se colaron Atalanta, Napoli!

El Atalanta lleva varias temporadas haciendolo muy bien, y eso que le han quitado varios jugadores temporada tras temporada. El trabajo que ha hecho Gasperini ha sido fenomenal.

Para agregar, tanto la Juventus como el Lyon están muy pegados porque sus variables fueron similares! (Y cerca está el Real Madrid por si te preguntabas)

Por si no te diste cuenta, hay un punto de color diferente que se quizo colar a la otra categoría, pero parece ser que es más del otro grupo. Ese es la Fiorentina, una escuadra que tuvo mala “suerte”. Con tan sólo ver la diferencia de goles puedes ver que no debieron de haber estado en esa posición.

¿Qué habrá impactado? ¿Por qué le fue tan mal?

De igual manera puedes sacar tus propias conclusiones para el último cluster.

NOTA: Hay que tomar en cuenta que esto es una visualización y un análisis que un algoritmo hizo. No quiere decir que esto sea la absoluta verdad debido a que las variables tomadas fueron aleatorias con el fin de ver a grandes rasgos las similitudes de los equipos en Europa :)

Háblame por Telegram si quieres discutir más sobre esto!

Author

Samo Sánchez

No hay sensación más bella que el ver la pelota rodando