Introducción
eurolig
es un paquete de R que he creado para facilitar la obtención y el análisis de datos de partidos de Euroliga. En esta entrada muestro cómo utilizar eurolig
para analizar diferentes aspectos de cómo se pasa el balón el FC Barcelona en esta Euroliga 2018-2019. En concreto, estamos interesados en averiguar:
Qué tipo de tiro genera cada jugador cuando da una asistencia
Cuántos puntos generan las asistencias de cada jugador
Quién asiste a quién
Cómo visualizar las asistencias del equipo
eurolig
El paquete eurolig
está en fase experimental y todavía tiene bastantes bugs. En este momento tan solo permite descargar datos jugada-a-jugada pero espero poder incluir la posibilidad de trabajar con otro tipo de datos como la localización de los tiros o estadísticas tradicionales.
Podéis instalar el paquete desde Github:
# install.packages("devtools")
devtools::install_github("solmos/eurolig")
Tened en cuenta, sin embargo, que el paquete está en su fase inicial y habrá numerosos cambios con los problemas de reproducibilidad que esto supone. Aún así, descargadlo y jugad con él. Si detectáis algún bug o pensáis en alguna funcionalidad que creáis que pueda ser útil hacédmelo saber.
Podéis estar al tanto de las novedades del paquete en el archivo NEWS.md
del repositorio.
Análisis
Los datos jugada-a-jugada nos permiten saber muchas cosas que no vemos en la tabla de estadísticas convencional. Son este tipo de datos los que nos van a permitir responder a nuestras preguntas sobre las asistencias del FC Barcelona en esta Euroliga.
Obtención de los datos
Podemos obtener los datos jugada-a-jugada introduciendo el código del partido/s junto con el año de la temporada correspondiente a la función extract_pbp()
.
El código del partido lo podemos encontrar en la propia URL de la página del partido. Por ejemplo, el último partido que disputó el FC Barcelona en esta Euroliga en el momento de escribir esto fue contra el Bayern de Munich en la ciudad alemana. La URL para este partido en la página oficial es
https://www.euroleague.net/main/results/showgame?gamecode=219&seasoncode=E2018
Observamos que el código del partido es 219 (gamecode=219
). Introduciendo este código junto con el año de inicio de esta temporada en la función extract_pbp()
obtenemos los datos jugada-a-jugada de este partido en un data frame:
library(eurolig)
game_pbp <- extract_pbp(game_code = 219, season = 2018)
game_pbp
## # A tibble: 518 x 18
## game_code play_number team_code player_name play_type time_remaining
## <fct> <int> <fct> <fct> <fct> <chr>
## 1 219 2 <NA> <NA> BP 10:00
## 2 219 3 MUN RADOSEVIC,… TPOFF 09:59
## 3 219 4 BAR TOMIC, ANTE TPOFF 09:59
## 4 219 5 BAR RIBAS, PAU 3FGM 09:37
## 5 219 6 BAR TOMIC, ANTE AS 09:35
## 6 219 7 MUN LUCIC, VLA… 2FGA 09:20
## 7 219 8 BAR TOMIC, ANTE D 09:18
## 8 219 10 BAR PANGOS, KE… 2FGA 08:58
## 9 219 11 MUN LUCIC, VLA… D 08:55
## 10 219 12 MUN JOVIC, STE… TO 08:34
## # … with 508 more rows, and 12 more variables: quarter <fct>,
## # points_home <dbl>, points_away <dbl>, team_name <fct>,
## # player_id <fct>, player_dorsal <dbl>, play_info <chr>, seconds <dbl>,
## # home_team <fct>, away_team <fct>, home <lgl>, season <int>
En el presente análisis queremos analizar más de un partido. En concreto, queremos obtener todos los partidos del FC Barcelona en la presente campaña. En lugar de ir buscando en la página web de la Euroliga todos los códigos de los partidos disputados por el FC Barcelona, podemos utilizar la función extract_team_pbp()
. Con esta función basta con introducir el código del equipo y el año para obtener todos los partidos que ha disputado ese equipo en esa temporada.
Procedemos pues a descargar los datos de todos los partidos que ha disputado el actual FC Barcelona hasta la fecha (25 de Marzo del 2019):
pbp <- extract_team_pbp(team = "BAR", season = 2018)
Nótese que lleva un tiempo considerable obtener el data frame final. No es por el tamaño de los datos, ni por falta de optimización del código. La función está diseñada para ser lenta. En la documentación de la API de la Euroliga se indica que dejemos unos segundos entre petición y petición para no saturar el servidor.
Análisis de asistencias
Para averiguar las diferentes preguntas que mencionamos en la introducción echamos mano de la función get_assists()
. Introduciendo los datos jugada-a-jugada en esta función obtenemos un data frame con el que luego podremos averiguar muchos detalles interesantes con unas pocas líneas de código. Para ello utilizaremos principalmente el paquete dplyr
.
library(dplyr)
assists <- get_assists(pbp, team = "BAR")
assists
## # A tibble: 475 x 12
## game_code season passer shooter shot_type points time_remaining quarter
## <fct> <fct> <fct> <fct> <fct> <dbl> <chr> <fct>
## 1 2 2018 HEURT… CLAVER… 2FG 1 09:43 1
## 2 2 2018 CLAVE… TOMIC,… 2FG 2 08:39 1
## 3 2 2018 HEURT… TOMIC,… 2FG 2 07:44 1
## 4 2 2018 HEURT… SINGLE… 2FG 2 07:34 1
## 5 2 2018 CLAVE… SINGLE… 2FG 3 03:19 1
## 6 2 2018 ORIOL… SERAPH… 2FG 2 00:46 1
## 7 2 2018 SERAP… KURIC,… 3FG 3 00:13 1
## 8 2 2018 HEURT… ORIOLA… 2FG 2 07:08 2
## 9 2 2018 HEURT… SERAPH… 2FG 2 04:58 2
## 10 2 2018 BLAZI… PUSTOV… 2FG 2 01:17 2
## # … with 465 more rows, and 4 more variables: seconds <int>, foul <lgl>,
## # and1 <dbl>, ftm <dbl>
¿Qué tipo de tiro genera cada jugador cuando da una asistencia?
Con el data frame assists
podemos averiguar el tipo de acción con la que culmina la asistencia. Una asistencia puede terminar con un tiro de tres, un tiro de dos, una falta personal de tiro o un tiro de campo más un tiro libre adicional.
En este caso, pongamos que estamos interesados solamente en saber si se trata de un tiro de dos o un tiro de tres. Los jugadores del FC Barcelona con más de 10 asistencias en total distribuyen sus asistencias de la siguiente manera:
assists %>%
group_by(passer) %>%
summarise(
assists = n(),
two_pointers = sum(shot_type == "2FG", na.rm = TRUE),
three_pointers = sum(shot_type == "3FG", na.rm = TRUE),
`3pt_ratio` = round(three_pointers / assists, 3)
) %>%
arrange(desc(assists)) %>%
filter(assists > 10)
passer | assists | two_pointers | three_pointers | 3pt_ratio |
---|---|---|---|---|
HEURTEL, THOMAS | 138 | 101 | 37 | 0.268 |
PANGOS, KEVIN | 92 | 55 | 36 | 0.391 |
TOMIC, ANTE | 53 | 34 | 19 | 0.358 |
RIBAS, PAU | 47 | 33 | 14 | 0.298 |
HANGA, ADAM | 30 | 20 | 10 | 0.333 |
SINGLETON, CHRIS | 26 | 15 | 11 | 0.423 |
CLAVER, VICTOR | 23 | 12 | 11 | 0.478 |
KURIC, KYLE | 21 | 13 | 8 | 0.381 |
ORIOLA, PIERRE | 15 | 8 | 7 | 0.467 |
BLAZIC, JAKA | 12 | 9 | 3 | 0.250 |
SERAPHIN, KEVIN | 12 | 8 | 4 | 0.333 |
En este caso Heurtel tiene el segundo menor ratio de asistencias a tiros de tres con respecto al total de asistencias dadas (0.268). Pangos, por otro lado, tiene una proporción bastante mayor de asistencias que van a la línea de tres (0.391).
Los jugadores grandes y móviles del FC Barcelona, como Claver, Singleton u Oriola, dan una mayor proporción de sus asistencias a tiros de tres.
¿Cuántos puntos generan las asistencias de cada jugador?
Como hemos visto, no todas las asistencias son iguales. Una asistencia a un tiro de 3 genera dos puntos más que una asistencia que resulta en una falta de tiro en la que el tirador sólo mete un tiro libre.
Con las siguientes lineas de código podemos calcular cuántos puntos ha generado cada jugador del FC Barcelona con sus asistencias:
assists %>%
group_by(passer) %>%
summarise(
assists = n(),
points = sum(points, na.rm = TRUE),
ppa = round(points / assists, 3)
) %>%
arrange(desc(assists)) %>%
filter(assists > 10)
passer | assists | points | ppa |
---|---|---|---|
HEURTEL, THOMAS | 138 | 311 | 2.254 |
PANGOS, KEVIN | 92 | 215 | 2.337 |
TOMIC, ANTE | 53 | 121 | 2.283 |
RIBAS, PAU | 47 | 105 | 2.234 |
HANGA, ADAM | 30 | 68 | 2.267 |
SINGLETON, CHRIS | 26 | 63 | 2.423 |
CLAVER, VICTOR | 23 | 58 | 2.522 |
KURIC, KYLE | 21 | 48 | 2.286 |
ORIOLA, PIERRE | 15 | 36 | 2.400 |
BLAZIC, JAKA | 12 | 26 | 2.167 |
SERAPHIN, KEVIN | 12 | 28 | 2.333 |
La última columna de esta tabla (ppa
) nos da los puntos por asistencia que genera cada jugador (con más de 10 asistencias). Vemos que Claver y Singleton generan el máximo valor por asistencia, dado que un porcentaje relativamente alto de sus asistencias son a tiros de tres puntos.
¿Quién pasa a quién?
También es posible hayar a quién han ido dirigidas las asistencias de cada jugador del FC Barcelona. A continuación se muestran las 10 combinaciones pasador-tirador más comunes en lo que llevamos de temporada:
assists %>%
group_by(passer, shooter) %>%
count() %>%
arrange(desc(n)) %>%
head(10)
passer | shooter | n |
---|---|---|
HEURTEL, THOMAS | SERAPHIN, KEVIN | 27 |
HEURTEL, THOMAS | TOMIC, ANTE | 24 |
PANGOS, KEVIN | TOMIC, ANTE | 22 |
HEURTEL, THOMAS | ORIOLA, PIERRE | 21 |
HEURTEL, THOMAS | SINGLETON, CHRIS | 17 |
PANGOS, KEVIN | KURIC, KYLE | 16 |
PANGOS, KEVIN | SERAPHIN, KEVIN | 15 |
TOMIC, ANTE | SINGLETON, CHRIS | 15 |
HEURTEL, THOMAS | CLAVER, VICTOR | 12 |
HEURTEL, THOMAS | KURIC, KYLE | 12 |
Las cinco combinaciones más comunes son entre base y pivot. Observamos que Heurtel se entiende muy bien con los interiores de su equipo, especialmente los dos cincos, Seraphin y Tomic. Esto explica la baja proporción de asistencias a tiros de tres que obervamos anteriormente.
Algo que debemos tener en cuenta, sin embargo, es la cantidad de minutos que estas parejas de jugadores están juntas en la cancha. Este dato permitiría tener una medida ajustada y nos permitiría identificar posibles mejoras en los quintetos que tiene en pista el equipo.
Cómo visualizar las asistencias del equipo
Es posible resumir algunos de los datos que hemos obtenido anteriormente mediante un heatmap que muestre la distribución de las asistencias. Para ello hacemos uso de la función plot_heatmap()
:
plot_heatmap(pbp, "BAR") +
ggplot2::labs(
title = "Patrón de asistencias del FC Barcelona",
subtitle = "Euroliga 2018-2019 (primeros 28 partidos)",
x = "Tirador",
y = "Pasador")
El eje vertical representa al pasador mientras que el eje horizontal representa al jugador que tira tras el pase. La diagonal de este heatmap contiene el número total de asistencias de cada jugador. El color indica el número de asistencias que un jugador ha dado a otro jugador.