Bet Wisely: Forutsi Scoreline Av En Fotballkamp ved Hjelp Av Poisson Distribution

denne artikkelen ble publisert som En del Av Data Science Blogathon.

«den største religionen i verden er ikke engang en religion.»- Fernando Torres

Fotball er elsket av alle og dens skjønnhet ligger I Sin Uforutsigbare natur. En ting som er sterkt forbundet med dette spillet er sine fans, grubler og debattere før et spill over hvem som vil vinne spillet. Og noen fans går selv til grensen for å spekulere i scorelinjen før kampen. Så la oss prøve å svare på noen av disse spørsmålene logisk.

Bli kjent Med Poisson

vel som jeg har sagt tidligere fotball er et uforutsigbart spill, kan et mål oppstå når som helst i kampen helt tilfeldig uten å være avhengig av tidligere mål eller lag eller andre faktorer. Vent sa jeg «Tilfeldig». Fordi det er en fordeling i statistikk som brukes til å finne sannsynlighetene for tilfeldig forekommende hendelser, Poisson-Fordelingen.

Anta at vennen din sier at i gjennomsnitt skjer 2 mål per kamp, vel, har han rett? Hvis riktig så hva er de faktiske sjansene for å se to mål i en kamp? Poisson-distribusjonen hjelper Oss å finne sannsynligheten for å observere ‘ n ‘hendelser (les’ n ‘ mål) i en fast tidsperiode gitt at vi gir den forventning om hendelser som oppstår (gjennomsnittlige hendelser per tidsperiode). La oss se det matematisk en gang

Poisson Distribusjon

(hvor λ = gjennomsnittlige hendelser per tidsperiode)

Sjansene For Å Score

la Oss nå svare på noen spørsmål med denne ligningen, men først trenger vi data, så for dette lastet jeg Ned De Internasjonale fotballresultatene fra 1872 til 2020 data fra Kaggle. Et utvalg av våre datasett er vist nedenfor.

kode:

data.head(3)
Poisson Distribusjon-Head

la oss starte med å finne de gjennomsnittlige målene vi kan forvente innen 90 minutter.

For dette har jeg laget et eget datasett som filtrerer ut data for kamper spilt i det 21. århundre (2000-2020)og lagt til home_score og away_score for å finne ut totalt nr. mål som oppstår i hver kamp og deretter tatt gjennomsnittet av totalt antall mål kolonne for å få de gjennomsnittlige målene vi kan forvente i en kamp.

kode:

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

nå setter denne forventningen I Poissson Distribution formula la oss se hva som er de faktiske sjansene for å se 3 mål i en kamp.

Wow, bare bare 22% sjanse. La oss plotte sannsynlighetene for nei. mål i en kamp for å få et bedre bilde.

Poisson Distribusjon

nå fra dette kan vi beregne sannsynligheten for å se ‘x’ eller færre antall mål ved å legge til sannsynlighetene for ‘ x ‘og tallene som er mindre enn ‘x’.Og ved å bare trekke dette fra 1 kan vi få sannsynligheten for å se mer enn ‘ x ‘ mål i en kamp. La oss plotte dette også.

ventetiden er over…

anta nå at du har en utålmodig venn som ikke vil sitte for hele spillet. Og han kommer til deg under en kamp og spør hvor mye tid har han til å vente for å se et mål. Woah, det er et tøft spørsmål riktig, men bekymre deg ikke, be ham om å sitte gjennom 10000 kamper og noter tiden mellom hvert mål. Bare tuller, åpenbart, han ville freak out. Faktisk simulerte jeg 10000 kamper og fant ut gjennomsnittlig tid.

den mest sannsynlige ventetiden er 2 minutter. Men vent dette egentlig ikke det jeg lette etter, jeg vil ha den gjennomsnittlige tiden jeg må vente på å se et mål hvis jeg begynner å se spillet på en tilfeldig tid. For det vil jeg ta 10000 tilfeller, hvor hver forekomst ser på 10000 spill og beregner gjennomsnittlig ventetid mellom mål i de 10000 spillene og rapporterer oss. Til slutt vil jeg plotte de 10000 rapportene fra hver av mine tilfeller og finne ut forventet gjennomsnittlig ventetid.

Det ser ut til at vi må vente i 33 minutter ca. Men vi må kanskje vente på mer, dette er et klassisk Ventetidsparadoks.

Forutsi scoreline

Til Slutt, La oss gjøre spørsmålet som vi startet og det mest spennende spørsmålet om hvem som vil vinne og hva som vil være scoreline for å være presis.

for dette vil jeg bruke historikken mellom to lag (la dem betrakte som hjemmelaget og bortelaget) og ta average_home_score som forventet mål for hjemmelaget og average_away_score som forventet mål for bortelaget og forutsi scorelinjen ved Hjelp Av Poisson-fordelingen. I tilfelle lagene har færre møter mellom dem, vil vi vurdere noen faktorer

HS = Gjennomsnitt av hjemmemål scoret av hjemmelaget gjennom historien.

AS = Gjennomsnitt av bortemål scoret av bortelaget gjennom historien.

HC = Gjennomsnitt av mål sluppet inn i hjemmekamper av hjemmelaget.

AC = Gjennomsnitt av mål sluppet inn i bortekamper av bortelaget.

Så Hjemmelagets forventede poengsum vil bli beregnet som (HS + AC) / 2

Så Bortelagets forventede poengsum vil bli beregnet som (AS + HC) / 2

Vent, forventet poengsum er ikke forventet poengsum. Forventet poengsum er det gjennomsnittlige antall mål vi forventer at de skal score i en kamp mellom dem.

kode:

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

La Oss prøve Med Brasil som hjemmelaget Og Mexico som bortelaget.

kode:

PredictScore()

Poisson-Fordelingen gir Oss en prediksjon om At Brasil vinner med en 2-0-scoreline. Jeg søkte på nettet og fant ut at den siste kampen mellom dem ble spilt På 2 Jul 2018 og scoreline sier Brasil vant med 2-0. Vel, jeg var heldig, du kan ikke.

Konklusjon

hvis du vil utforske videre ingen bekymring, her er koden min. Videre er dette bare en grunnleggende måte å forutsi spillet, i dag brukes klassifiseringsalgoritmer til å forutsi utfallet og regresjonsalgoritmen for å forutsi scorelinjen. Men det er temaet for en annen dag, til da ha det gøy å leke med dette. Adios!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.