Scommetti con saggezza: predire il punteggio di una partita di calcio usando la distribuzione di Poisson

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

“La più grande religione del mondo non è nemmeno una religione.”- Fernando Torres

Il calcio è amato da tutti e la sua bellezza sta nella sua natura imprevedibile. Una cosa che è fortemente associata a questo gioco è i suoi fan, rimuginare e discutere prima di una partita su chi vincerà la partita. E alcuni fan arrivano addirittura al limite di speculare sul punteggio prima della partita. Quindi proviamo a rispondere ad alcune di queste domande logicamente.

Conoscere Poisson

Beh, come ho detto in precedenza il calcio è un gioco imprevedibile, un obiettivo può verificarsi in qualsiasi momento della partita del tutto casuale non avendo dipendenze da obiettivi precedenti o squadre o altri fattori. Aspetta ho detto “Casuale”. Perché c’è una distribuzione nelle statistiche che viene utilizzato per trovare le probabilità di eventi che si verificano in modo casuale, Distribuzione di Poisson.

Supponiamo che il tuo amico dica che in media 2 gol accadono a partita, beh, ha ragione? Se proprio allora quali sono le reali possibilità di vedere due gol in una partita? Qui viene in nostro soccorso La distribuzione di Poisson che ci aiuta a trovare la probabilità di osservare ” n “eventi (leggi” n ” obiettivi) in un periodo di tempo fisso dato che gli forniamo l’aspettativa di eventi che si verificano (eventi medi per periodo di tempo). Vediamo matematicamente una volta

Distribuzione di Poisson

(dove λ = medio di eventi per periodo di tempo)

Possibilità di Segnare,

Ora proviamo a rispondere ad alcune domande con questa equazione, ma prima abbiamo bisogno di dati, per questo ho scaricato il calcio Internazionale risultati dal 1872 al 2020 dati da Kaggle. Un esempio del nostro set di dati è mostrato di seguito.

codice:

data.head(3)
Distribuzione di Poisson-Testa

Iniziamo con la ricerca degli obiettivi medi che possiamo aspettarci entro 90 minuti.

Per questo, ho creato un set di dati separato che filtra i dati per le partite giocate nel 21 ° secolo(2000-2020) e ho aggiunto home_score e away_score per scoprire il numero totale. di obiettivi che si verificano in ogni partita e poi preso la media della colonna obiettivi totali per ottenere gli obiettivi medi che possiamo aspettarci in una partita.

codice:

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

Ora mettendo questa aspettativa nella formula di distribuzione Poissson vediamo quali sono le reali possibilità di vedere 3 gol in una partita.

Wow, solo il 22% di possibilita’. Cerchiamo di tracciare le probabilità del no. di obiettivi in una partita per ottenere un quadro migliore.

Distribuzione di Poisson

Ora da questo, possiamo calcolare la probabilità di vedere ‘x ‘o meno numero di obiettivi semplicemente aggiungendo le probabilità di ‘x’ e i numeri che sono inferiori a ‘x’.E semplicemente sottraendo questo da 1 possiamo ottenere la probabilità di vedere più di obiettivi ” x ” in una partita. Tracciamo anche questo.

L’attesa è finita

Ora supponiamo di avere un amico impaziente che non vuole sedersi per l’intero gioco. E lui viene da te durante una partita e ti chiede quanto tempo deve aspettare per vedere un gol. Woah, questa è una domanda difficile a destra, ma non preoccupatevi, chiedergli di sedersi attraverso 10000 giochi e notare il tempo tra ogni obiettivo. Scherzavo, ovviamente, avrebbe dato di matto. In realtà ho simulato 10000 partite e ho scoperto il tempo medio.

Il tempo di attesa più probabile è di 2 minuti. Ma aspetta questo non è in realtà quello che stavo cercando, voglio il tempo medio che devo aspettare per vedere un obiettivo se comincio a guardare la partita in un momento casuale. Per questo, prenderò 10000 istanze, in cui ogni istanza sta guardando 10000 giochi e calcolando il tempo medio di attesa tra gli obiettivi in quei 10000 giochi e segnalandoci. Infine, traccerò quei 10000 rapporti da ciascuna delle mie istanze e scoprirò il tempo di attesa medio previsto.

Sembra che dobbiamo aspettare per 33 minuti circa. Tuttavia potremmo dover aspettare di più, questo è un classico paradosso del tempo di attesa.

Predire il punteggio

Infine, facciamo la domanda con cui abbiamo iniziato e la domanda più eccitante che chi vincerà e quale sarà il punteggio per essere precisi.

Per questo, userò la cronologia tra due squadre (che considerino la squadra di casa e la squadra in trasferta) e prenderò average_home_score come obiettivi previsti per la squadra di casa e average_away_score come obiettivi previsti per la squadra in trasferta e prevedo il punteggio utilizzando la distribuzione di Poisson. Nel caso in cui le squadre abbiano meno incontri tra di loro, prenderemo in considerazione alcuni fattori

HS = Media dei gol fatti in casa dalla squadra di casa nel corso della storia.

AS = Media dei gol in trasferta segnati dalla squadra in trasferta nel corso della storia.

HC = Media dei gol subiti nelle partite casalinghe dalla squadra di casa.

AC = Media dei gol subiti in trasferta dalla squadra in trasferta.

Quindi, il punteggio atteso della squadra di casa sarà calcolato come (HS + AC) / 2

Quindi, il punteggio atteso della squadra di casa sarà calcolato come (AS + HC) / 2

Aspetta, il punteggio atteso non è il punteggio previsto. Il punteggio previsto è il numero medio di gol che ci aspettiamo che segnino in una partita tra di loro.

codice:

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}')

Proviamo con il Brasile come squadra di casa e il Messico come squadra in trasferta.

codice:

PredictScore()

Distribuzione Poisson ci dà una previsione del Brasile vincente con un 2-0 scoreline. Ho cercato la rete e ho scoperto che l’ultima partita tra di loro è stata giocata su 2 Jul 2018 e il punteggio dice che il Brasile ha vinto per 2-0. Beh, sono stato fortunato, forse no.

Conclusione

Se vuoi esplorare ulteriormente nessuna preoccupazione, ecco il mio codice. Inoltre questo è solo un modo di base per predire il gioco, al giorno d’oggi gli algoritmi di classificazione sono usati per prevedere l’esito e l’algoritmo di regressione per prevedere il punteggio. Ma questo è l’argomento per un altro giorno, fino ad allora divertiti a giocare con questo. Adios!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.