satsa klokt: förutsäga Resultatlinjen för en fotbollsmatch med Poisson Distribution

denna artikel publicerades som en del av Data Science Blogathon.

”den största religionen i världen är inte ens en religion.”- Fernando Torres

fotboll är älskad av alla och dess skönhet ligger i dess oförutsägbara natur. En sak som är starkt förknippad med detta spel är dess fans, grubblar och debatterar innan ett spel om vem som vinner spelet. Och vissa fans går till och med till gränsen för att spekulera resultatlinjen före matchen. Så låt oss försöka svara på några av dessa frågor logiskt.

lär känna Poisson

som jag har sagt tidigare är fotboll ett oförutsägbart spel, ett mål kan inträffa när som helst i matchen helt slumpmässigt utan beroenden på tidigare mål eller lag eller andra faktorer. Vänta sa jag ”slumpmässigt”. Eftersom det finns en fördelning i statistiken som används för att hitta sannolikheten för slumpmässigt förekommande händelser, Poisson Distribution.

Antag att din vän säger att i genomsnitt 2 Mål händer per match, ja, har han rätt? Om just då vilka är de faktiska chanserna att se två mål i en match? Här kommer till vår räddning Poisson distribution hjälper oss att hitta sannolikheten för att observera ’n’ händelser (Läs ’n’ mål) i en fast tidsperiod med tanke på att vi ger den med förväntan om händelser som inträffar (Genomsnittliga Händelser per tidsperiod). Låt oss se det matematiskt en gång

Poisson Distribution

(6865 >

chanser att göra poäng

låt oss nu svara på några frågor med denna ekvation, men först behöver vi data, så för detta laddade jag ner de internationella fotbollsresultaten från 1872 till 2020 data från Kaggle. Ett exempel på vår dataset visas nedan.

kod:

data.head(3)
Poisson Distribution-chef

Låt oss börja med att hitta de genomsnittliga mål vi kan förvänta oss inom 90 minuter.

för detta har jag skapat en separat dataset som filtrerar ut data för matcher som spelades i det 21: a århundradet(2000-2020) och lagt till home_score och away_score för att ta reda på det totala antalet. av mål som inträffar i varje match och sedan tagit medelvärdet av kolumnen totala mål för att få de genomsnittliga mål vi kan förvänta oss i en match.

kod:

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

nu sätter denna förväntan i Poissson Distribution formula låt oss se vilka är de faktiska chanserna att se 3 mål i en match.

Wow, bara en ren 22% chans. Låt oss plotta sannolikheten för nej. mål i en match för att få en bättre bild.

Poisson Distribution

nu kan vi beräkna sannolikheten för att se ’x ’eller färre antal mål helt enkelt genom att lägga till sannolikheten för’ x ’och siffrorna som är mindre än’x’.Och genom att bara subtrahera detta från 1 kan vi få sannolikheten att se mer än ’x’ mål i en match. Låt oss plotta detta också.

väntan är över…

Antag nu att du har en otålig vän som inte vill sitta för hela spelet. Och han kommer till dig under en match och frågar hur mycket tid har han att vänta för att se ett mål. Woah, det är en tuff fråga rätt, men oroa dig inte, be honom att sitta igenom 10000 spel och notera tiden mellan varje mål. Skojar bara, självklart, han skulle freak out. Egentligen simulerade jag 10000 matcher och fick reda på den genomsnittliga tiden.

den mest troliga väntetiden är 2 minuter. Men vänta detta inte faktiskt vad jag letade efter, jag vill ha den genomsnittliga tiden som jag måste vänta för att se ett mål om jag börjar titta på spelet på en slumpmässig tid. För det kommer jag att ta 10000-instanser, där varje instans tittar på 10000-spel och beräknar den genomsnittliga väntetiden mellan mål i de 10000-spelen och rapporterar oss. Slutligen kommer jag att plotta de 10000 rapporterna från var och en av mina instanser och ta reda på den förväntade genomsnittliga väntetiden.

det verkar som om vi måste vänta i 33 minuter ca. Men vi kan behöva vänta på mer, det här är en klassisk Väntetidsparadox.

förutsäga resultatlinjen

slutligen, låt oss göra den fråga som vi började och den mest spännande frågan som vem som vinner och vad som blir resultatlinjen för att vara exakt.

för detta kommer jag att använda historiken mellan två lag (låt dem betrakta som hemmalag och bortalag) och ta average_home_score som de förväntade målen för hemmalaget och average_away_score som de förväntade målen för bortalaget och förutsäga resultatlinjen med Poisson-distribution. Om lagen har färre möten mellan dem kommer vi att överväga några faktorer

HS = medelvärdet av hemmamål som hemmalaget gjort genom historien.

som = medelvärdet av bortamål som gjorts av bortalag genom historien.

HC = medelvärde av mål som släpps in i hemmamatcher av hemmalaget.

AC = medelvärde av mål som beviljats i bortamatcher av bortalaget.

så, hemmalagets förväntade poäng kommer att beräknas som (HS + AC) / 2

så, bortalagets förväntade poäng kommer att beräknas som (AS + HC) / 2

vänta, den förväntade poängen är inte den förutsagda poängen. Den förväntade poängen är det genomsnittliga antalet mål vi förväntar oss att göra mål i ett spel mellan dem.

kod:

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

Låt oss försöka med Brasilien som hemmalag och Mexiko som bortalag.

kod:

PredictScore()

Poisson Distribution ger oss en förutsägelse av Brasilien vinna med en 2-0 score. Jag sökte på nätet och fann att den sista matchen mellan dem spelades på 2 juli 2018 och resultatlinjen säger Brasilien vann med 2-0. Tja, jag hade tur, du kanske inte.

slutsats

om du vill utforska ytterligare ingen oro, här är min kod. Dessutom är detta bara ett grundläggande sätt att förutsäga spelet, numera används klassificeringsalgoritmer för att förutsäga resultatet och regressionsalgoritmen för att förutsäga resultatlinjen. Men det är ämnet för en annan dag, tills dess ha kul att spela med detta. Adios!

Lämna ett svar

Din e-postadress kommer inte publiceras.