¿Cómo obtener la probabilidad de que un equipo de fútbol gane un torneo?

Este proyecto se centra en analizar las probabilidades de campeonato en un torneo de fútbol de 5 equipos utilizando técnicas estadísticas y de visualización de datos. Se recopilaron datos sobre la tabla de posiciones, los puntos acumulados y la diferencia de goles de cada equipo a lo largo del torneo. A partir de estos datos, se desarrolló una función de probabilidad que tiene en cuenta tanto la posición en la tabla como la diferencia de goles de cada equipo para calcular su probabilidad de ganar el torneo.

install.packages("ggplot2")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
library(ggplot2)

# Crear la tabla de posiciones
tabla_posiciones <- data.frame(
  Posicion = 1:5,
  Equipo = c("Equipo A", "Equipo B", "Equipo C", "Equipo D", "Equipo E"),
  Puntos = c(12, 9, 6, 3, 0),
  Partidos_Jugados = c(4, 4, 4, 4, 4),
  Partidos_Ganados = c(4, 3, 2, 1, 0),
  Partidos_Empatados = c(0, 0, 0, 0, 0),
  Partidos_Perdidos = c(0, 1, 2, 3, 4),
  Goles_a_favor = c(10, 8, 5, 3, 1),
  Goles_en_contra = c(2, 4, 6, 7, 9),
  Diferencia_de_Goles = c(8, 4, -1, -4, -8)
)

# Ordenar la tabla de posiciones por puntos
#tabla_posiciones <- tabla_posiciones[order(tabla_posiciones$Puntos, decreasing = TRUE), ]

# Crear el gráfico de barras horizontales
ggplot(tabla_posiciones, aes(x = reorder(Equipo, Puntos), y = Puntos, fill = Equipo)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = Puntos), hjust = -0.25, vjust = 0.5, color = "black", size = 4) +  # Agregar etiquetas de puntos
  labs(title = "Tabla de posiciones", x = NULL, y = NULL) +
  theme_minimal() +
  theme(axis.text.y = element_text(size = 10)) +
  coord_flip()

# Resumen descriptivo
summary(tabla_posiciones$Puntos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       3       6       6       9      12
summary(tabla_posiciones$Goles_a_favor)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     1.0     3.0     5.0     5.4     8.0    10.0
summary(tabla_posiciones$Goles_en_contra)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     2.0     4.0     6.0     5.6     7.0     9.0
# Seleccionar los datos a graficar
equipos <- tabla_posiciones$Equipo
puntos <- tabla_posiciones$Puntos

# Crear el plot
barplot(puntos, names.arg = equipos, col = "skyblue",
        main = "Puntos por equipo",
        xlab = "Equipos",
        ylab = "Puntos",
        ylim = c(0, 15))

# Agregar puntos de cada equipo como etiquetas
text(x = barplot(puntos, names.arg = equipos, col = "skyblue",
                 main = "Puntos por equipo",
                 xlab = "Equipos",
                 ylab = "Puntos",
                 ylim = c(0, 15)),
     y = puntos + 1.5, labels = puntos, col = "black", cex = 0.8)

Calcular la probabilidad de ganar el torneo

Este modo de calcular la probabilidad de ser campeón porque considera dos aspectos importantes que suelen influir en el éxito de un equipo en un torneo de fútbol: su posición en la tabla de posiciones y su diferencia de goles.

Penalización por la posición en la tabla: La posición en la tabla de posiciones es un indicador importante del rendimiento de un equipo a lo largo del torneo. Equipos que ocupan posiciones más altas en la tabla generalmente han tenido un mejor desempeño y han acumulado más puntos. La función de probabilidad penaliza a los equipos que están en posiciones más bajas, reflejando la intuición de que es menos probable que estos equipos ganen el torneo.

Consideración de la diferencia de goles: La diferencia de goles es otro indicador clave del rendimiento de un equipo. Los equipos con una diferencia de goles alta suelen haber marcado más goles de los que han recibido, lo que sugiere una fuerte capacidad ofensiva y defensiva. Al incluir la diferencia de goles en la fórmula de probabilidad, estamos reconociendo la importancia de este factor en la determinación del éxito de un equipo.

Utilización de funciones exponenciales: La función de probabilidad utiliza funciones exponenciales para modelar la relación entre la posición en la tabla y la diferencia de goles y la probabilidad de ser campeón. Este enfoque tiene la ventaja de asignar probabilidades más bajas a equipos en posiciones bajas de manera más pronunciada, mientras que los equipos en posiciones más altas se benefician de una asignación de probabilidades relativamente alta. Esto refleja la intuición de que la probabilidad de ganar el torneo disminuye rápidamente a medida que un equipo desciende en la tabla o tiene una diferencia de goles negativa.

# Utilizaremos una función exponencial de la posición en la tabla y la diferencia de goles
# Cuanto menor sea la posición y mayor la diferencia de goles, mayor será la probabilidad

# Función de probabilidad
probabilidad_campeon <- function(posicion, diferencia_goles) {
  return(exp(-posicion) * exp(diferencia_goles))
}

# Calcular la probabilidad para cada equipo
probabilidades <- probabilidad_campeon(tabla_posiciones$Posicion,
                                       tabla_posiciones$Diferencia_de_Goles)

# Normalizar las probabilidades para que sumen 1
probabilidades_normalizadas <- probabilidades / sum(probabilidades)

# Mostrar las probabilidades de cada equipo
resultado <- data.frame(Equipo = tabla_posiciones$Equipo,
                        Probabilidad = probabilidades_normalizadas)
print(resultado)
##     Equipo Probabilidad
## 1 Equipo A 9.932904e-01
## 2 Equipo B 6.692738e-03
## 3 Equipo C 1.658964e-05
## 4 Equipo D 3.038498e-07
## 5 Equipo E 2.047324e-09
#Preparamos datos para la tabla
porcentajes <- probabilidades_normalizadas * 100

# Crear un data frame con el equipo y su porcentaje de ser campeón
tabla_probabilidad_campeon <- data.frame(Equipo = equipos,
                                         Porcentaje = round(porcentajes, 3))

# Imprimir la tabla
print(tabla_probabilidad_campeon)
##     Equipo Porcentaje
## 1 Equipo A     99.329
## 2 Equipo B      0.669
## 3 Equipo C      0.002
## 4 Equipo D      0.000
## 5 Equipo E      0.000
# Preparar datos para el gráfico
equipos <- tabla_posiciones$Equipo
porcentajes <- probabilidades_normalizadas * 100

# Agregar las etiquetas de porcentaje encima de las barras
barplot_posiciones <- barplot(porcentajes, names.arg = equipos, col = "skyblue",
                              main = "Probabilidad de ganar el torneo",
                              xlab = "Equipos",
                              ylab = "Probabilidad (%)",
                              ylim = c(0, 100))

# Crear el gráfico de barras y agregar las etiquetas de porcentaje encima de las barras
text(x = c(barplot_posiciones, barplot_posiciones[1]), 
     y = c(porcentajes + 3, porcentajes[1] - 5), 
     labels = c(paste(round(porcentajes, 3), "%"), paste(round(porcentajes[1], 3), "%")),
     col = "black", cex = 0.8)