Este artículo se publicó como parte del Blogathon de Ciencia de Datos.
«La religión más grande del mundo ni siquiera es una religión.»- Fernando Torres
Introducción
El fútbol es amado por todos y su belleza radica en su naturaleza impredecible. Una cosa que está fuertemente asociada con este juego son sus fans, meditando y debatiendo antes de que termine el juego quién ganará el juego. Y algunos fanáticos incluso llegan al límite de especular el marcador antes del partido. Así que tratemos de responder algunas de estas preguntas lógicamente.
Conociendo a Poisson
Como he dicho anteriormente, el fútbol es un juego impredecible, un gol puede ocurrir en cualquier momento del partido totalmente aleatorio, sin depender de goles o equipos anteriores ni de ningún otro factor. Espera, dije «Al azar». Debido a que hay una distribución en las estadísticas que se utiliza para encontrar las probabilidades de eventos que ocurren aleatoriamente, la Distribución de Poisson.
Supongamos que tu amigo dice que en promedio suceden 2 goles por partido, bueno, ¿tiene razón? Si es así, ¿cuáles son las posibilidades reales de ver dos goles en un partido? Aquí viene nuestra distribución de Poisson de rescate que nos ayuda a encontrar la probabilidad de observar ‘n’ eventos (lea ‘n’ objetivos) en un período de tiempo fijo, dado que le proporcionamos la expectativa de que ocurran eventos (eventos promedio por período de tiempo). Vamos a verlo matemáticamente una vez
(donde λ = eventos promedio por período de tiempo)
Posibilidades de Anotar
Ahora respondamos algunas preguntas con esta ecuación, pero primero necesitamos datos, así que para esto descargué los resultados de fútbol Internacional de 1872 a 2020 de Kaggle. A continuación se muestra una muestra de nuestro conjunto de datos.código
:
data.head(3)
Comencemos por encontrar los objetivos promedio que podemos esperar en 90 minutos.
Para esto, he creado un conjunto de datos separado que filtra los datos de los partidos jugados en el siglo 21 (2000-2020) y agregué home_score y away_score para averiguar el número total. de goles que ocurren en cada partido y luego tomamos la media de la columna de goles totales para obtener los goles promedio que podemos esperar en un partido.código
:
data=data+datadata=data.apply(lambda x : int(str.split(x,'-')))rec_data=data.loc>=2000)]rec_data.iloc]print(rec_data.total_goals.mean())
2.744112130054189
Ahora, poniendo esta expectativa en la fórmula de distribución de Poissson, veamos cuáles son las posibilidades reales de ver 3 goles en un partido.
Wow, sólo un 22% de probabilidad. Vamos a trazar las probabilidades del no. de goles en un partido para tener una mejor imagen.
Ahora, a partir de esto, podemos calcular la probabilidad de ver ‘x ‘o un menor número de objetivos simplemente agregando las probabilidades de ‘x’ y los números que son menores que ‘x’.Y restando esto de 1 podemos obtener la probabilidad de ver más de ‘x’ goles en un partido. Vamos a trazar esto también.
La espera ha terminado
Ahora supongamos que tiene un amigo impaciente que no quiere sentarse durante todo el juego. Y se acerca a ti durante un partido y te pregunta cuánto tiempo tiene que esperar para ver un gol. Woah, esa es una pregunta difícil, pero no te preocupes, pídele que se siente durante 10000 partidos y anote el tiempo entre cada gol. Es broma, obviamente, se volvería loco. En realidad simulé 10000 coincidencias y descubrí el tiempo promedio.
El tiempo de espera más probable es de 2 minutos. Pero espera, esto no es realmente lo que estaba buscando, quiero el tiempo promedio que tengo que esperar para ver un gol si empiezo a ver el partido en un momento aleatorio. Para eso, tomaré 10000 instancias, donde cada instancia está viendo 10000 juegos y calculando el tiempo de espera promedio entre goles en esos 10000 juegos e informándonos. Finalmente, trazaré esos 10000 informes de cada una de mis instancias y averiguaré el tiempo de espera promedio esperado.
parece Que tenemos que esperar a los 33 minutos aprox. Sin embargo, es posible que tengamos que esperar más, esta es una Paradoja clásica del Tiempo de Espera.
Predecir el marcador
Finalmente, vamos a hacer la pregunta con la que empezamos y la pregunta más emocionante que quién ganará y cuál será el marcador para ser precisos.
Para esto, usaré el historial entre dos equipos (que consideren como equipo local y equipo visitante) y tomaré el promedio_home_score como los goles esperados para el equipo local y promedio_away_score como los goles esperados para el equipo visitante y predeciré el marcador utilizando la distribución de Poisson. En caso de que los equipos tengan menos encuentros entre ellos, consideraremos algunos factores
HS = Promedio de goles en casa marcados por el equipo local a lo largo de la historia.
AS = Promedio de goles marcados por el equipo visitante a lo largo de la historia.
HC = Media de goles concedidos en partidos en casa por el equipo local.
AC = Promedio de goles concedidos en partidos fuera de casa por el equipo visitante.
Por lo tanto, el puntaje esperado del equipo Local se calculará como (HS + AC) / 2
Por lo tanto, el puntaje esperado del equipo visitante se calculará como (AS + HC) / 2
Espere, el puntaje esperado no es el puntaje predicho. El resultado esperado es el número promedio de goles que esperamos que anoten en un partido entre ellos.código
:
import pandas as pdimport numpy as npfrom scipy import stats
def PredictScore(): home_team = input("Enter Home Team: ") ht = (''.join(home_team.split())).lower() away_team = input("Enter Away Team: ") at = (''.join(away_team.split())).lower() if len(data) > 20: avg_home_score = data.home_score.mean() avg_away_score = data.away_score.mean() home_goal = int(stats.mode(np.random.poisson(avg_home_score,100000))) away_goal = int(stats.mode(np.random.poisson(avg_away_score,100000))) else: avg_home_goal_conceded = data.away_score.mean() avg_away_goal_scored = data.away_score.mean() away_goal = int(stats.mode(np.random.poisson(1/2*(avg_home_goal_conceded+avg_away_goal_scored),100000))) avg_away_goal_conceded = data.home_score.mean() avg_home_goal_scored = data.home_score.mean() home_goal = int(stats.mode(np.random.poisson(1/2*(avg_away_goal_conceded+avg_home_goal_scored),100000))) avg_total_score = int(stats.mode( np.random.poisson((data.total_goals.mean()),100000))) print(f'Expected total goals are {avg_total_score}') print(f'They have played {len(data)} matches') print(f'The scoreline is {home_team} {home_goal}:{away_goal} {away_team}')
Probemos con Brasil como equipo local y México como equipo visitante.código
:
PredictScore()
La distribución de Poisson nos da una predicción de que Brasil ganará con un marcador de 2-0. Busqué en la red y encontré que el último partido entre ellos se jugó el 2 de julio de 2018 y el marcador dice que Brasil ganó por 2-0. Bueno, tuve suerte, puede que no.
Conclusión
Si desea explorar más, no se preocupe, aquí está mi código. Además, esto es solo una forma básica de predecir el juego, hoy en día los algoritmos de clasificación se utilizan para predecir el resultado y el algoritmo de regresión para predecir el marcador. Pero ese es el tema para otro día, hasta entonces diviértete jugando con esto. ¡Adiós!