library(tidyverse)
library(gt)
liga_22_23 <- read_csv("https://www.football-data.co.uk/mmz4281/2223/SP1.csv")En una entrada del blog de hace diez años estudié cómo se ajustaba la distribución de Poisson al número de goles por partido en la liga española de fútbol. En aquella época era trabajoso conseguir los datos. Ahora he descubierto la página web https://www.football-data.co.uk/spainm.php en la que están bastante bien ordenados muchos datos del fútbol español de primera y segunda división, lo que permite actualizar fácilmente aquel estudio y realizar otros nuevos con otras variables.
Cargar las librerías y los datos
El siguiente código genera un data frame llamado liga_22_23 que incluye muchas variables relacionadas con la liga española de fútbol del año 2022/23. También cargamos los paquetes que vamos a usar.
La clave para interpretar los nombres de las variables se puede encontrar aquí.
El número de goles por partido y la distribución de Poisson
Frecuencias observadas y esperadas
Para comparar el número de goles por partido con la distribución de Poisson, en primer lugar definimos la variable número de goles por partido y la añadimos al fichero:
liga_22_23 <- liga_22_23 %>%
mutate(GOLES = FTHG + FTAG) A continuación calculamos la media de goles por partido y creamos un nuevo fichero con las frecuencias observadas y las esperadas bajo el modelo de Poisson con esa media:
media <- sum(liga_22_23$GOLES) / nrow(liga_22_23)
frecuencias_goles <- liga_22_23 %>%
count(GOLES) %>%
rename(frecuencia_observada = n) %>%
mutate(frecuencia_esperada = round(nrow(liga_22_23) * dpois(0:8, media), 2))
print(frecuencias_goles)
#> # A tibble: 9 × 3
#> GOLES frecuencia_observada frecuencia_esperada
#> <dbl> <int> <dbl>
#> 1 0 26 30.8
#> 2 1 85 77.4
#> 3 2 88 97.2
#> 4 3 95 81.4
#> 5 4 46 51.2
#> 6 5 22 25.7
#> 7 6 13 10.8
#> 8 7 3 3.87
#> 9 8 2 1.21En la temporada 2022/23 se alcanzó una media de 2.51 goles por partido.
Una tabla más presentable
Aprovecho este ejemplo para mostrar cómo se puede usar el paquete gt para producir una tabla con calidad de publicación:
gt(frecuencias_goles) %>%
tab_header("Liga española de fútbol 2022/23 (primera división)") %>%
cols_label(GOLES = "Goles",
frecuencia_observada = "Frecuencias observadas",
frecuencia_esperada = "Frecuencias esperadas")| Liga española de fútbol 2022/23 (primera división) | ||
| Goles | Frecuencias observadas | Frecuencias esperadas |
|---|---|---|
| 0 | 26 | 30.78 |
| 1 | 85 | 77.37 |
| 2 | 88 | 97.22 |
| 3 | 95 | 81.44 |
| 4 | 46 | 51.17 |
| 5 | 22 | 25.72 |
| 6 | 13 | 10.77 |
| 7 | 3 | 3.87 |
| 8 | 2 | 1.21 |
Representación gráfica de las frecuencias
A primera vista las frecuencias observadas y las esperadas no son muy diferentes. Las podemos representar gráficamente para compararlas más fácilmente. Esto resulta más difícil de lo que parece si queremos usar ggplot2. No sé si habrá una solución más sencilla.
frecuencias_goles %>%
pivot_longer(cols=c('frecuencia_observada', 'frecuencia_esperada'),
names_to = 'tipo_frecuencias', values_to = 'frecuencias') %>%
mutate(tipo_frecuencias = recode(tipo_frecuencias,
"frecuencia_observada" = "Observada",
"frecuencia_esperada" = "Esperada")) %>%
ggplot() +
geom_col(aes(x = GOLES, y = frecuencias, fill = tipo_frecuencias), position = 'dodge') +
labs(fill = "Tipo de frecuencias", x = "Número de goles", y = "Frecuencias",
title = "Liga española de fútbol 2022/23 (primera división)") 
Contraste de bondad de ajuste
Finalmente llevamos a cabo el contraste de bondad de ajuste. Consideramos que la última clase es siete o más goles, dado que las frecuencias observadas son muy pequeñas a partir de siete goles.
frecuencias_goles <- liga_22_23 %>%
count(GOLES)
poisson_prob = c(dpois(0:6, media), 1-sum(dpois(0:6, media)))
frecuencias_obs <- c(frecuencias_goles$n[1:7], sum(frecuencias_goles$n[8:9]))
estadistico_pearson <- chisq.test(frecuencias_obs, p = poisson_prob)$statistic
1 - pchisq(estadistico_pearson, df = 6) # p-valor correcto porque estimamos la media de la Poisson
#> X-squared
#> 0.4012041Como el p-valor está claramente por encima de los niveles de significación habituales, el modelo de Poisson es aceptable para el número de goles por partido en la liga española.