A lo largo de la historia el deporte ha tenido una gran influencia en la cultura y la construcción de una identidad nacional. Además, tiene un impacto positivo en el desarrollo de un país en temas como la educación, la economía y la salud pública. Dada la atención que tienen ciertas disciplinas deportivas en la sociedad, el deporte se ha convertido en uno de los grandes negocios del mundo y ha demostrado ser una parte importante en el crecimiento económico. De la totalidad de los deportes que existen, muchos coinciden en que el futbol es el más popular del mundo, ya que detona un gran movimiento de dinero en apuestas, patrocinios, asistencia a fiestas, venta de camisetas, accesorios, etcétera. Es por ello que se ha despertado un gran interés en construir modelos predictivos y estadísticos. Además, la gran cantidad de información disponible tales como resultados de partidos, inversiones realizadas, características de los jugadores, etcétera, permiten encontrar mecanismos que proporcionan ventajas competitivas.
El presente proyecto tiene como finalidad poner en práctica los conocimientos adquiridos durante el presente curso de Procesos Estocásticos, en un ejemplo práctico aplicado al Futbol.
El torneo de la Copa del Mundo con las mejores selecciones nacionales es lo último en el mundo del fútbol. Se realiza cada cuatro años. Rusia patrocino el último torneo. Ese torneo involucró a 32 países, que inicialmente se dividieron en 8 grupos de cuatro. En esta primera etapa, cada país jugó contra cada uno de sus 3 compañeros de grupo. Los 2 primeros países de cada grupo avanzaron luego a una segunda etapa eliminatoria. En Brasil-2014, Sudáfrica 2010, Alemania 2006 y Corea del Sur/Japón 2002, se utilizó el mismo formato de torneo en Rusia. Los datos sobre todos los goles en estos cuatro torneos de la Copa del Mundo están disponibles en el sitio web de la Copa del Mundo de la FIFA.
Se trabajará con los 256 partidos disputados en los campeonatos de la Copa del Mundo 2002-2014. Lo ideal sería considerar los goles marcados en el tiempo reglamentario de 90 minutos. Excluyendo los goles marcados en la prórroga o en la tanda de penaltis. Un partido de fútbol regular consta de dos mitades programadas para 45 minutos. Sin embargo, el tiempo de descuento a menudo se agrega al final de cada mitad para compensar las interrupciones del juego derivadas de las lesiones de los jugadores. Por lo cual trabajaremos con el total de goles por partido ya que lamentablemente, la extensión del tiempo de descuento en cada juego no está disponible. Para mantener la coherencia en el análisis, un gol marcado en el tiempo de descuento, digamos en el minuto 92, se registra como ocurrido en el minuto 90, de igual forma para los goles ocurridos por ejemplo al tiempo 46, se registra como ocurrido en el minuto 45. Esto se debe a que, hasta 1998, los goles marcados en tiempos añadidos siempre se registraban en el minuto 45 o en el 90. Esto puede tener algún efecto sobre el ajuste de las distribuciones de Poisson y exponenciales a los datos.
El primer partido en Corea del sur/Japón 2002 se tuvo a Senegal anotando un solo gol contra Francia en el minuto 30. En el segundo juego, Camerún anotó 1 gol contra Irlanda al minuto 39, e Irlanda anoto 1 gol contra Camerún al minuto 52. Es así como el tiempo entre goles estará dado de la siguiente manera:
\[\begin{eqnarray*} TEG1 &=& (90-30)+39\\ &=& 99\\ TEG2 &=& 52-39\\ &=& 13\\ \end{eqnarray*}\]
Observación
Los primeros tiempos entre goles se muestran a continuación.
| Corea del Sur/Japon 2002 | Alemania 2006 | Sudafrica 2010 | Brasil 2014 |
|---|---|---|---|
| 99 | 17 | 126 | 19 |
| 13 | 6 | 24 | 18 |
| 83 | 5 | 108 | 42 |
| 2 | 44 | 45 | 19 |
| 36 | 12 | 44 | 61 |
| 27 | 14 | 88 | 56 |
| 5 | 27 | 36 | 17 |
| 15 | 56 | 129 | 9 |
| 5 | 13 | 95 | 11 |
| 24 | 201 | 14 | 8 |
Representación gráfica del tiempo entre goles.
# Representacio grafica del tiempo entre goles:
Npois <- c(1,replicate(10,1))
Texp <- cumsum(c(0,CSJ2002[1:10]))
qplot(Texp,Npois,geom=c("step","point"), main = 'Tiempo entre Goles',
ylab = '', xlab = 'Tiempo entre goles', col='red')
A continuación se muestra el histograma del tiempo entre goles.
hist(c(CSJ2002,A2006,SA2010,B2014),border = 'Blue',
main = 'Histograma del tiempo entre goles',
col = 'darkgreen',xlab = 'Tiempo entre goles', ylab = 'Frecuencia')
Notamos que el tiempo entre goles para los mundiales entre 2002 y 2014 presenta una tendencia exponencial. La idoneidad de un ajuste exponencial a los 607 intervalos de tiempo entre goles se puede demostrar de muchas formas. Por ejemplo, una propiedad especial de la distribución exponencial es que su media es igual a su desviación estándar.
## Media= 37.7084
## Desviacion Estandar= 39.18795
Dado que este resultado no es suficiente para demostrar que el tiempo entre goles en un partido sigue un ajuste exponencial, se plantea a continuacón la pruea Chi-Cuadrado para el eajuste exponencial.
Una validación más completa es comparar las distribuciones empíricas de los tiempos entre goles contra una distribución exponencial con la media estimada. Por ejemplo, la probabilidad teórica de observar un intervalo de tiempo entre goles entre 0 y 10 minutos es: \[\begin{eqnarray*} 1-\exp\left(-\lambda * \frac{10}{90}\right) &=& 0.2319411 \end{eqnarray*}\]
Esto implica que entre 607 intervalos entre goles, esperaríamos que \(140 \approx 607 ∗ 0.2319411\) se encuentren entre 0 y 10 minutos.
| Duracion.entre.goles | Actual | Probabilidad.Enpirica | Probabilidad.Teorica | Esperado |
|---|---|---|---|---|
| 0-10 | 151 | 0.2487644 | 0.2319411 | 140 |
| 10-20 | 105 | 0.1746293 | 0.1781444 | 108 |
| 20-30 | 87 | 0.1433278 | 0.1368254 | 83 |
| 30-40 | 65 | 0.1070840 | 0.1050900 | 63 |
| 40-50 | 37 | 0.0626030 | 0.0807153 | 48 |
| 50-60 | 40 | 0.0658979 | 0.0619941 | 37 |
| 60-70 | 26 | 0.0444811 | 0.0476151 | 28 |
| 70-80 | 22 | 0.0362438 | 0.0365712 | 22 |
| 80-90 | 22 | 0.0362438 | 0.0280888 | 17 |
| 90-100 | 10 | 0.0181219 | 0.0215739 | 13 |
| 100-110 | 5 | 0.0082372 | 0.0165700 | 10 |
| 110-120 | 4 | 0.0082372 | 0.0127267 | 7 |
| 120-130 | 7 | 0.0115321 | 0.0097749 | 5 |
| Mayor que 130 | 20 | 0.0345964 | 0.0323690 | 19 |
Se observa que los resultados teóricos se ajustan a los empíricos
A continuación se muestra una representacion gráfica del número de intervalos entre goles actual comparado con el esperado teórico.
Se realiza la prueba chi-cuadrado para un ajuste exponencial, obteniendo los siguientes resultados:
##
## Pearson's Chi-squared test
##
## data: tabla_1$Actual and tabla_1$Esperado
## X-squared = 168, df = 156, p-value = 0.2419
Dado que el p-valor es de \(0.2419\). aceptamos la hipótesis de que nuestros datos de los tiempos entre goles siguen una distribución exponencial con parámetro \(\lambda = \frac{2.375}{90}\).
Se estudiará la independencia de los tiempos entre goles. Esto, se puede visualizar mediante un gráfico de dispersión de tiempos consecutivos entre goles, como se muestra a continuación.
# Grafico de Dispersion
plot(c(CSJ2002,A2006,SA2010,B2014)[1:606], c(CSJ2002,A2006,SA2010,B2014)[2:607],
xlab = 'Tiempo entre goles', ylab = 'Tiempo entre goles + 1',
main = 'Diagrama de dispersion', col='deepskyblue4')
Notamos que no existe ninguna patrón, es decir, los tiempos entre goles son independientes.
Tenemos que los tiempos entre goles se distribuyen exponencialmente con parámetro \(\lambda = \frac{2.375}{90}\), además de ser independientes. Consideremos el siguiente proceso de Poisson con parámetro \(\lambda\) a tiempo continuo \(t\).
\[\begin{eqnarray*} \{X_{t}: \quad t \geq 0 \} \end{eqnarray*}\]
Se tiene que \(X_{t}\) representa el número de goles hasta el tiempo t. Se considera \(t=90\) (Duración estándar de un encuentro), entonces se tiene:
\[\begin{eqnarray*} P(X_{90} = n) &=& \frac{e^{-\lambda t} (\lambda t)^n}{n!}\\ &=& \frac{e^{-2.375} (2.375)^{n}}{n!}\\ \end{eqnarray*}\]
Es decir el número de goles dentro de un período fijo de tiempo de \(90\) minutos sigue una distribución de Poisson con parámetro \(\lambda = 2.375\).
Se calculo la varianza del número de goles por partido a partir de los datos históricos y se obtuvo 2.628704. Esto está en estrecha conformidad con el resultado teórico de que la media y la varianza de una distribución de Poisson coinciden. El ajuste de la distribución de Poisson se puede evaluar más a fondo comparando una distribución de frecuencia teórica de goles por partido con las frecuencias reales.
Se tiene que el numero de goles en un encuentro sigue una Poisson(\(\lambda\)) con \(\lambda = 2.375\), entonces se calcula las probabilidades teóricas talque:
\[\begin{eqnarray*} P(X_{90} = 0) &=& \frac{e^{-2.375} (2.375)^{0}}{0!}\\ &=& 0.093015 \end{eqnarray*}\]
| Numero.de.Goles | N.juegos.actuales | Probabilidad.Empirica | Probabilidad.teorica | N.juegos.esperado |
|---|---|---|---|---|
| 0 | 24 | 0.0955882 | 0.0930145 | 23 |
| 1 | 57 | 0.2242647 | 0.2209094 | 56 |
| 2 | 59 | 0.2316176 | 0.2623299 | 67 |
| 3 | 58 | 0.2279412 | 0.2076779 | 53 |
| 4 | 32 | 0.1250000 | 0.1233087 | 31 |
| 5 | 14 | 0.0551471 | 0.0585716 | 14 |
| 6 o mas | 10 | 0.0404412 | 0.0341880 | 8 |
Se observa que los resultados teóricos se ajustan a los empíricos
Se realiza la prueba chis-cuadrado para un ajuste de Poisson, a continuación se muestran los resultados:
chisq.test(Ppois$N.juegos.actuales,Ppois$N.juegos.esperado)
##
## Pearson's Chi-squared test
##
## data: Ppois$N.juegos.actuales and Ppois$N.juegos.esperado
## X-squared = 42, df = 36, p-value = 0.227
Dado que el p-valor es \(0,227\). aceptamos la hipótesis de que nuestros datos de número de goles dentro de un período fijo siguen una distribución Poisson con parámetro \(\lambda = 2,375\).
El número esperado de juegos con \(n\) goles se obtiene multiplicando la probabilidad de Poisson de \(n\) goles por 256, el número total de partidos.
#Representacion grafica del proceso de estudio.
Npois <- c(0:5)
Texp <- cumsum(c(0,CSJ2002[1:5]))
qplot(Texp,Npois,geom=c("step","point"),xlab = 'Tiempo entre goles',
ylab = 'Numero de goles')
Dado un equipo A y un equipo B, nos interesa saber cuántos goles anotara el equipo A en un partido y de igual forma para el equipo B, teniendo así un posible resultado. De los datos históricos correspondientes a los torneos mundiales del 2002 al 2014, logramos encontrar que el número de goles en 90 minutos es un proceso de Poisson homogéneo con parámetro lambda 2.375.
Se propone el siguiente algoritmo para simular el número total de goles del encuentro. En el cual se simulará N veces un resultado del total de número de goles, y se tomará como representante a la moda de los resultados.
#Algoritmo 1.
#Simulacion del numero de goles de un encuentro del campeonato mundial.
nsim = 100
nresultado <- function (nsim){
lambda <- 2.375
Ng <- numeric(nsim)
for (i in 1:nsim){
Ng[i] <- rpois(1,lambda)
}
moda <- mfv(Ng)
s <- 0
for (i in 1:nsim){
if(Ng[i]==moda){
s <- s+1
}
}
p <- s*100/nsim
res <- data.frame(moda,p)
return (res)
}
nres <- nresultado(nsim)
Se obtiene el siguiente resultado:
| Numero Total de Goles | Probabilidad |
|---|---|
| 1 | 34 |
Lamentablemente este resultado no provee una idea acerca sobre la victoria del Equipo A, contra el equipo B o viceversa.
Para abordar este nuevo problema se considerará lo siguiente.
\[\begin{eqnarray*} \lambda_A &=& \frac{\text{Numero de Goles marcados por el equipo A}}{\text{Numero de partidos jugados por el equipo A}}\\ \end{eqnarray*}\]
Ejemplo Sean A y B dos equipos para los cuales se tiene:
\[\begin{eqnarray*} \lambda_{A} &=& \lambda_{B} = 2.375\\ \end{eqnarray*}\]
Se propone el siguiente algoritmo para estimar el resultado de un partido.
#Algoritmo 2.
get_score <- function (){
# Simulacion de los resultados de un partido.
h_scored = rpois(1, 2.375)
a_scored = rpois(1, 2.375)
return (data.frame('Equipo A='=h_scored,'Equipo B='= a_scored))
}
Ejemplo1 <- get_score()
kable(Ejemplo1,caption = 'Resultado')
| Equipo.A. | Equipo.B. |
|---|---|
| 0 | 2 |
Se obtiene el resultado de un encuentro genérico.
Observaciones
Se considera el primer encuentro en el campeonato mundial RUSIA2018, donde Rusia se impuso 5-0 ante Arabia Saudita.
Para pronosticar el resultado de ese encuentro se hará uso de las observaciones mencionadas anteriormente para la estimación de \(\lambda_A\). Se utilizaran los datos históricos correspondientes a los campeonatos mundiales del 2002 al 2014, mostrados a continuación:
| AÑO | EQUIPO | PARTIDOS JUGADOS | GOLES MARCADOS |
|---|---|---|---|
| 2002 | BRA | 7 | 18 |
| 2002 | GER | 7 | 14 |
| 2002 | ESP | 5 | 10 |
| 2002 | TUR | 7 | 10 |
| 2002 | KOR | 7 | 8 |
Los cuales cuentan con las estadísticas por equipo, mismas que se usaran para el cálculo del parámetro \(\lambda_{A}\).
Observación Existe la posibilidad de que uno o varios equipos participantes del mundial Rusia 2018, no tengan datos históricos en la base con la cual estamos trabajando, para esos casos, usaremos \(\lambda \approx \frac{2.375}{2}\)
A continuación se muestran los equipos participantes en el campeonato mundial RUSIA 2018:
## [1] "Russia" "Egypt" "Morocco" "Portugal" "France"
## [6] "Argentina" "Peru" "Croatia" "Costa Rica" "Germany"
## [11] "Brazil" "Sweden" "Belgium" "Tunisia" "Poland"
## [16] "Columbia" "Uruguay" "Iran" "Denmark" "Nigeria"
## [21] "Serbia" "South Korea" "England" "Japan" "Saudi Arabia"
## [26] "Spain" "Australia" "Iceland" "Mexico" "Switzerland"
## [31] "Senegal" "Panama"
Para los países de los cuales se tiene datos históricos, se procede a calcular su correspondiente \(\lambda_{A}\), así se tiene el siguiente algoritmo:
#Estimacion de lambda por equipos.
Estlambda <- function(x,y){
return(sum(x)/sum(y))
}
#Filtramos los datos para aquellos que paises participantes en el
#Mundial Rusia 2018
LambdaEquipos <- Estequipos %>%group_by(EQUIPO) %>%
summarize('lambda'=Estlambda(`GOLES MARCADOS`,`PARTIDOS JUGADOS`)) %>%
filter (EQUIPO %in% equipos)
Se muestran los primeros países con su correspondiente \(\lambda\) estimado:
| EQUIPO | lambda |
|---|---|
| Argentina | 1.450000 |
| Australia | 1.100000 |
| Belgium | 1.333333 |
| Brazil | 2.000000 |
| Columbia | 2.400000 |
Se presenta el siguiente algoritmo para estimar los resultados en los encuentros de la copa del mundo RUSIA18:
#Algoritmo 3.
#Simulacion de resultados, dado datos historicos por paises.
nsim = 100
resultado <- function (eqA, eqB, nsim){
subset <- LambdaEquipos[which( LambdaEquipos$EQUIPO==eqA | LambdaEquipos$EQUIPO==eqB),]
lambda_a <- subset$lambda[1]
lambda_b <- subset$lambda[2]
lambda_aux <- (2.375/2)
score_line = character(length(nsim))
# simulation idea similar to that of sim.R
for (i in 1:nsim){
if (!is.na(lambda_a)){
Resultado_a = rpois(1, lambda_a)
}
else{
Resultado_a = rpois(1, lambda_aux)
}
# if we have no historical result of the match
if (!is.na(lambda_b)){
Resultado_b = rpois(1, lambda_b)
}
else{
Resultado_b = rpois(1, lambda_aux)
}
score_line[i] = paste0(Resultado_a, '-', Resultado_b)
}
return (list(names(which.max(table(score_line))), max(table(score_line))))
}
Ejemplo. Se comenzara simulando los resultados de la primera Fase del torneo, recordemos que el campeonato mundial se divide en 4 fases cada una con 16 encuentros.
Se tiene que los 16 encuentros de la primera fase son:
| Equipo A | Equipo B |
|---|---|
| Russia | Saudi Arabia |
| Egypt | Uruguay |
| Morocco | Iran |
| Portugal | Spain |
| France | Australia |
| Argentina | Iceland |
| Peru | Denmark |
| Croatia | Nigeria |
| Costa Rica | Serbia |
| Germany | Mexico |
| Brazil | Switzerland |
| Sweden | South Korea |
| Belgium | Panama |
| Tunisia | England |
| Poland | Senegal |
| Columbia | Japan |
Se usará el Algoritmo 3 para pronosticar los resultados de la primera fase.
Se presentan los resultados pronosticados junto a lo reales de los encuentros de la primera fase.
| Equipo A | Equipo B | Pronostico | Resultado Real | Probabilidad |
|---|---|---|---|---|
| Russia | Saudi Arabia | 1-0 | 5-0 | 28 |
| Egypt | Uruguay | 1-1 | 0-1 | 15 |
| Morocco | Iran | 0-1 | 0-1 | 21 |
| Portugal | Spain | 1-1 | 3-3 | 11 |
| France | Australia | 1-0 | 2-1 | 18 |
| Argentina | Iceland | 1-1 | 1-1 | 16 |
| Peru | Denmark | 1-1 | 0-1 | 20 |
| Croatia | Nigeria | 1-0 | 2-0 | 25 |
| Costa Rica | Serbia | 0-1 | 0-1 | 21 |
| Germany | Mexico | 1-1 | 0-1 | 14 |
| Brazil | Switzerland | 2-1 | 1-1 | 17 |
| Sweden | South Korea | 1-1 | 1-0 | 15 |
| Belgium | Panama | 1-0 | 3-0 | 16 |
| Tunisia | England | 1-1 | 1-2 | 20 |
| Poland | Senegal | 0-1 | 1-2 | 14 |
| Columbia | Japan | 1-0 | 1-2 | 11 |
En el ejemplo anterior se realizaron predicciones de los resultados de los encuentros de la primera fase, una adaptación del ejemplo anterior es pronosticar al equipo ganador, para ello se muestra el siguiente algoritmo:
#Algoritmo 4.
#Simulacion del equipo ganador.
#Nos basaremos en el Algoritmo 3
nsim = 100
resultado <- function (eqA, eqB, nsim){
subset <- LambdaEquipos[which( LambdaEquipos$EQUIPO==eqA|LambdaEquipos$EQUIPO==eqB),]
lambda_a <- subset$lambda[1]
lambda_b <- subset$lambda[2]
lambda_aux <- (2.375/2)
Goles_eqA <- numeric(nsim)
Goles_eqB <- numeric(nsim)
#Simulacion de los resultados
for (i in 1:nsim){
ifelse(!is.na(lambda_a),Goles_eqA[i] <- rpois(1, lambda_a),
Goles_eqA[i] <- rpois(1, lambda_aux))
ifelse(!is.na(lambda_b),Goles_eqB[i] <- rpois(1, lambda_b),
Goles_eqB[i] <- rpois(1, lambda_aux))
}
#score_sim <- data.frame(Goles_eqA,Goles_eqB)
#return(score_sim)
#Eleccion del ganador.
Sa <- 0
Sb <- 0
for (i in 1:nsim) {
ifelse(Goles_eqA[i] > Goles_eqB[i],Sa <- Sa +1,
Sb <- Sb +1)
}
p <- 0
Ganador <- 'Equipo'
ifelse(Sa > Sb,Ganador <- eqA,Ganador <- eqB)
ifelse(Sa > Sb,p <- (Sa*100/nsim),p <- (Sb*100/nsim))
ResN <- data.frame('Equipo Ganador'=Ganador,'Probabilidad'=p)
return(ResN)
}
Para el primer partido de la primera fase, pronosticaremos el equipo ganador. Se tiene:
| Equipo A | Equipo B | Resultado Real | Ganador Pronosticado | Probabilidad |
|---|---|---|---|---|
| Russia | Saudi Arabia | 5-0 | Russia | 62 |
El fútbol es difícil de predecir no porque sea aleatorio, sino todo lo contrario, porque tiene una estructura hermosa. Son muchos los factores que influyen en el resultado de un partido, hemos logrado comprobar que las distribuciones de Poisson y exponenciales se pueden ilustrar de manera convincente utilizando una aplicación de interés para muchos fanáticos del fútbol en todo el mundo, como lo es el número de goles del encuentro. Aun así, los pronósticos no son ni cercanos a la realidad, tomando como ejemplo el primer partido de la fase 1, obtuvimos un resultado de 1 gol a favor de Rusia lo cual es muy lejano a los 5 goles reales, pero también de los 100 diferentes resultados que simulamos en 62 de ellos Rusia gano, tal y como paso realmente.
Operacionalmente los modelos planteados presentan una gran dificultad, la cual es la selección del representante entre las simulaciones.
La mayoría de los modelos matemáticos para determinar los resultados se basan en aspectos cualitativos, ya que son objetivos y más fáciles de incorporar a un cálculo; pero al haber tantos otros factores no controlables, lo único que los modelos pueden hacer es estimaciones de probabilidades, nunca garantizar un resultado concreto.
Singfat Chu (2016), “Using Soccer Goals to Motivate the Poisson Process”.
Luis Rincón (2012), “Introducción a los procesos estocásticos”, pp. 115-118.
tuangauss/DataScienceProjects. (2020). Retrieved 15 September 2020, from https://github.com/tuangauss/DataScienceProjects/tree/master/R/EPL/prediction