NFL Statistical Analysis

Usaremos una librería llamada nflfastR. En esta librería, hay un play by play de todos los partidos que han habido esta temporada. En este momento, es la semana 10, por lo tanto, la información tendrá una fecha máxima de la semana 9.

Este RMD será usado para comprobar si mis teorías de la NFL son correctas o incorrectas.

¿Es Bijan Robinson tan bueno como Christian McCaffrey?

Limpieza de Datos

#Primero vamos a limpiar la entrada de B. Robinson, ya que uno es Bijan Robinson y el otro es Brian Robinson.

pbp <- pbp %>%
  mutate(receiver_player_name = ifelse(receiver_id == "00-0038542", "Bijan Robinson", receiver_player_name)) %>%
  mutate(rusher_player_name = ifelse(rusher_id == "00-0038542", "Bijan Robinson", rusher_player_name)) %>%
  mutate(receiver_player_name = ifelse(receiver_id == "00-0037746", "Brian Robinson", receiver_player_name)) %>%
  mutate(rusher_player_name = ifelse(rusher_id == "00-0037746", "Brian Robinson", rusher_player_name))

EPA

EPA es Expected Points Added. Esta estadística tiene el propósito de medir el impacto de un juego, jugador o una jugada en términos de puntos esperados. El EPA se calcula comparando la situación antes y después de una jugada en términos de la probabilidad de anotar puntos. Por ejemplo, si un equipo logra un avance exitoso, un pase largo o una conversión de tercer down, se calcula cuánto aumentan las probabilidades de ese equipo para anotar puntos en función de la situación del juego, la distancia al touchdown, el tiempo restante, entre otros factores. Básicamente, mide la eficacia de un equipo, jugador, juego o jugada para avanzar el campo de manera éxitosa con la finalidad de obtener puntos.

Rushing EPA

#Aquí quiero ver quienes son los QBs con mayor EPA promedio en el juego terrestre
#Lo quiero filtrar por un mínimo de intentos, entonces estoy viendo como hacerlo.

rush_avg_epa <- group_by(pbp, rusher_player_name) %>% summarise(avg_epa = mean(epa), plays=n()) %>%  filter(plays > 50) %>% arrange(desc(avg_epa)) 
rush_avg_epa
## # A tibble: 47 × 3
##    rusher_player_name avg_epa plays
##    <chr>                <dbl> <int>
##  1 R.Mostert          0.133     109
##  2 K.Williams         0.100      97
##  3 D.Swift            0.0578    135
##  4 G.Edwards          0.0533    111
##  5 K.Hunt             0.0398     60
##  6 J.Hurts            0.0372     60
##  7 K.Herbert          0.0364     52
##  8 J.Hill             0.0268     58
##  9 D.Foreman          0.0256     86
## 10 J.Conner           0.00797    70
## # ℹ 37 more rows
write.csv(rush_avg_epa, file = "rush_avg_epa.csv", row.names = FALSE)

A día de hoy, 9 de noviembre del 2023, Bijan Robinson es el corredor #28 (-0.1013) en cuanto a Rushing EPA mientras que Christian McCaffrey es el corredor #18 (-0.0352) en esta métrica. En las últimas semanas de la temporada, estas siendo desde la semana 5, Bijan Robinson ha lidiado con una enfermedad, por lo tanto, su uso dentro del campo y su eficacia ha sido minimizada. Probablemente, sería apropiado que la muestra sea desde semana 1 a semana 5. Sin embargo, creo que es un sample size demasiado chico contra oponentes relativamente débiles en cuanto a su defensiva terrestre. Reconsiderando esto, tomaremos todas las jugadas posibles.

Receiving YAC EPA

wrs_best_yac_epa <- 
  group_by(pbp, receiver_player_name, ) %>% 
  summarise(avg_yac_epa = mean(yac_epa, na.rm = TRUE), plays=n()) %>% 
  filter(plays > 10) %>% 
  arrange(desc(avg_yac_epa))
wrs_best_yac_epa
## # A tibble: 234 × 3
##    receiver_player_name avg_yac_epa plays
##    <chr>                      <dbl> <int>
##  1 D.Henry                     1.34    21
##  2 J.McLaughlin                1.26    14
##  3 R.White                     1.23    34
##  4 I.Pacheco                   1.21    28
##  5 D.Achane                    1.19    11
##  6 T.Etienne                   1.17    35
##  7 Brian Robinson              1.17    19
##  8 A.Jones                     1.12    22
##  9 L.Murray                    1.11    12
## 10 Z.Moss                      1.08    21
## # ℹ 224 more rows
write.csv(wrs_best_yac_epa, file = "wrs_best_yac_epa.csv", row.names = FALSE)

En este caso podemos ver como Bijan Robinson #49 (0.3764) ha sido menos eficiente que Christian McCaffrey #18 (0.9637) en cuanto a yardas después de la recepción. Sin embargo, esto puede ser sesgado por el volumen de recepciones que ellos tienen o la cantidad de recepciones detrás de la línea de golpeo. Vamos a analizar si en realidad es esto.

ADoT Bijan Robinson y Christian McCaffrey

library(dplyr)

bijan_yac_epa <- pbp %>%
  filter(receiver_player_name == "Bijan Robinson") %>%
  summarise(mean_yac_epa = mean(yac_epa, na.rm = TRUE)) %>%
  pull(mean_yac_epa)

bijan_yac_epa
## [1] 0.3764714

EPA Promedio por QB

#Aquí quiero ver quienes son los QBs con mayor EPA promedio.
#Lo quiero filtrar por un mínimo de intentos, entonces estoy viendo como hacerlo.

qbs_avg_epa <- group_by(pbp, passer_player_name) %>% summarise(avg = mean(epa), plays=n()) %>% filter(plays > 50) %>% arrange(desc(avg))
qbs_avg_epa
## # A tibble: 41 × 3
##    passer_player_name    avg plays
##    <chr>               <dbl> <int>
##  1 B.Purdy            0.262    238
##  2 T.Tagovailoa       0.233    323
##  3 J.Allen            0.169    340
##  4 C.Stroud           0.142    300
##  5 J.Hurts            0.121    327
##  6 P.Mahomes          0.118    346
##  7 D.Prescott         0.108    287
##  8 J.Herbert          0.0941   303
##  9 T.Heinicke         0.0747    61
## 10 A.Dalton           0.0746    61
## # ℹ 31 more rows