Zephyrnet-logo

Verstandig wedden: de score van een voetbalwedstrijd voorspellen met behulp van Poisson-verdeling

Datum:

"De grootste religie ter wereld is niet eens een religie. ' - Fernando Torres

De Spaanse voetbalgigant Sevilla FC heeft samen met FC Bengaluru United, een van India's meest opwindende voetbalteams, een Football Hackathon – Gegevensgestuurde prestatiebeoordeling van spelers. Deze Hackathon zal een unieke kans zijn om effectief gebruik te maken van datawetenschap op het gebied van scouting van professioneel voetbal en analyse en verbetering van de prestaties van spelers.

Voetbal Hackathon is NU LIVE!

Introductie

Voetbal is geliefd bij iedereen en zijn schoonheid ligt in zijn Onvoorspelbare natuur. Een ding dat sterk geassocieerd wordt met dit spel, zijn de fans, die piekeren en debatteren voor een spel over wie het spel zal winnen. En sommige fans gaan zelfs tot het uiterste om de score voor de wedstrijd te speculeren. Laten we daarom proberen een aantal van deze vragen logisch te beantwoorden.

Poisson leren kennen

Stel dat je vriend zegt dat er gemiddeld 2 goals per wedstrijd worden gemaakt, wel, heeft hij gelijk? Zo ja, wat zijn dan de werkelijke kansen om twee goals in een wedstrijd te zien? Hier komt ons te hulp Poisson-verdeling helpt ons om de waarschijnlijkheid te vinden van het waarnemen van 'n' gebeurtenissen (lees 'n' doelen) in een vaste tijdsperiode, aangezien we het voorzien van de verwachting van gebeurtenissen die plaatsvinden (gemiddelde gebeurtenissen per tijdsperiode). Laten we het eens wiskundig bekijken

(waar λ = gemiddelde gebeurtenissen per tijdsperiode)

Kansen om te scoren

Laten we nu enkele vragen beantwoorden met deze vergelijking, maar eerst hebben we gegevens nodig, dus hiervoor heb ik de internationale voetbalresultaten van 1872 tot 2020 gedownload gegevens van Kaggle. Hieronder ziet u een voorbeeld van onze dataset.

code:

data.head(3)
Poissonverdeling - Hoofd

Laten we beginnen met het vinden van de gemiddelde doelen die we binnen 90 minuten kunnen verwachten.

Hiervoor heb ik een aparte dataset gemaakt die gegevens uitfiltert voor wedstrijden gespeeld in de 21st eeuw (2000-2020) en de home_score en away_score toegevoegd om het totale aantal te vinden. aantal doelpunten in elke wedstrijd en vervolgens het gemiddelde van de kolom met het totale aantal doelpunten om de gemiddelde doelpunten te krijgen die we in een wedstrijd kunnen verwachten.

code: 

data['total_goals']=data['home_score']+data['away_score'] data['date']=data['date'].apply(lambda x : int(str.split(x,'-') )[0])) rec_data=data.loc[(data['date']>=2000)] rec_data.iloc[[rec_data.total_goals.argmax()]] print(rec_data.total_goals.mean())

2.744112130054189

Nu we deze verwachting in de Poissson Distribution-formule plaatsen, laten we eens kijken wat de werkelijke kansen zijn om 3 goals in een wedstrijd te zien.

Wow, slechts een kans van slechts 22%. Laten we de kansen van de nee plotten. doelpunten in een wedstrijd om een ​​beter beeld te krijgen.

Poisson Distributie

Hieruit kunnen we nu de kans berekenen om 'x' of minder doelpunten te zien door simpelweg de kansen van 'x' en de getallen die kleiner zijn dan 'x' op te tellen. En door dit af te trekken van 1 krijgen we de kans op het zien van meer dan 'x' goals in een wedstrijd. Laten we dit ook plotten.

Het wachten is voorbij…

Stel nu dat je een ongeduldige vriend hebt die niet het hele spel wil zitten. En hij komt tijdens een wedstrijd naar je toe en vraagt ​​hoe lang hij moet wachten op een doelpunt. Woah, dat is een moeilijke vraag, maar maak je geen zorgen, vraag hem om 10000 wedstrijden te spelen en de tijd tussen elk doelpunt te noteren. Grapje, het is duidelijk dat hij in paniek zou raken. Ik simuleerde eigenlijk 10000 wedstrijden en ontdekte de gemiddelde tijd.

De meest waarschijnlijke wachttijd is 2 minuten. Maar wacht, dit is niet echt wat ik zocht, ik wil de gemiddelde tijd die ik moet wachten om een ​​doelpunt te zien als ik de game op een willekeurig tijdstip begin te kijken. Daarvoor zal ik 10000 instanties nemen, waarbij elke instantie 10000 games bekijkt en de gemiddelde wachttijd tussen doelen in die 10000 games berekent en ons rapporteert. Ten slotte zal ik die 10000 rapporten van elk van mijn instanties plotten en de verwachte gemiddelde wachttijd achterhalen.

Het lijkt erop dat we ongeveer 33 minuten moeten wachten. Hoewel we misschien op meer moeten wachten, is dit een klassieke wachttijdparadox.

De achterstand voorspellen

Laten we tot slot de vraag doen waarmee we zijn begonnen en de meest opwindende vraag wie zal winnen en wat de scorelijn zal zijn om precies te zijn.

Hiervoor zal ik de geschiedenis tussen twee teams gebruiken (laat ze beschouwen als het thuisteam en het uitteam) en de gemiddelde_thuisscore nemen als de verwachte doelpunten voor het thuisteam en de gemiddelde_uitscore als de verwachte doelpunten voor het uitteam en de score voorspellen met Poisson-verdeling. In het geval dat de teams minder ontmoetingen hebben, zullen we een paar factoren in overweging nemen:

HS = Gemiddelde van thuisdoelpunten gescoord door de thuisploeg door de geschiedenis heen.

AS = Gemiddelde van gescoorde uitdoelpunten door het uit-team door de geschiedenis heen.

HC = Gemiddelde van de doelpunten tegen in thuiswedstrijden door de thuisploeg.

AC = Gemiddelde van de doelpunten tegen in uitwedstrijden door het uitspelende team.

De verwachte score van het thuisteam wordt dus berekend als (HS + AC) / 2

De verwachte score van het uitteam wordt dus berekend als (AS + HC) / 2

Wacht, de verwachte score is niet de voorspelde score. De verwachte score is het gemiddelde aantal doelpunten dat we van ze verwachten in een onderlinge wedstrijd.

code:

importeer panda's als pd importeer numpy als np van scipy importstatistieken
def PredictScore(): home_team = input("Voer thuisteam in: ") ht = (''.join(home_team.split())).lower() away_team = input("Voer uitteam in: ") at = (' '.join(away_team.split())).lower() als len(data[(data.home_team ==ht) & (data.away_team ==at)]) > 20: avg_home_score = data[(data.home_team ==ht) & (data.away_team ==at)].home_score.mean() avg_away_score = data[(data.home_team ==ht) & (data.away_team ==at)].away_score.mean() home_goal = int(stats.mode(np.random.poisson(avg_home_score,100000))[0]) away_goal = int(stats.mode(np.random.poisson(avg_away_score,100000))[0]) else: avg_home_goal_conceded = data[ (data.home_team ==ht)].away_score.mean() avg_away_goal_scored = data[(data.away_team ==at)].away_score.mean() away_goal = int(stats.mode(np.random.poisson(1/ 2*(avg_home_goal_conceded+avg_away_goal_scored),100000))[0]) avg_away_goal_conceded = data[(data.home_team ==at)].home_score.mean() avg_home_goal_scored = data[(data.away_team ==ht)].home_score. mean() home_goal = int(stats.mode(np.random.p oisson(1/2*(avg_away_goal_conceded+avg_home_goal_scored),100000))[0]) avg_total_score = int(stats.mode( np.random.poisson((data[(data.home_team==ht) & (data.away_team= =at)].total_goals.mean()),100000))[0]) print(f'Verwachte totale doelpunten zijn {avg_total_score}') print(f'Ze hebben {len(data[(data.home_team == ht) & (data.away_team ==at)])} wedstrijden') print(f'De score is {home_team} {home_goal}:{away_goal} {away_team}')

Laten we het proberen met Brazilië als thuisploeg en Mexico als uitploeg.

code:

VoorspelScore()

Poisson-verdeling geeft ons een voorspelling dat Brazilië wint met een 2-0-score. Ik zocht op het net en ontdekte dat de laatste wedstrijd tussen hen werd gespeeld op 2 juli 2018 en de achterstand zegt dat Brazilië met 2-0 heeft gewonnen. Nou, ik heb geluk gehad, jij misschien niet.

Conclusie

Als je verder wilt verkennen, maak je geen zorgen, hier is mijn code. Bovendien is dit slechts een eenvoudige manier om het spel te voorspellen. Tegenwoordig worden classificatie-algoritmen gebruikt om de uitkomst te voorspellen en regressie-algoritmen om de score te voorspellen. Maar dat is het onderwerp voor een andere dag, tot die tijd veel plezier ermee. Adios!

Voetbal Hackathon is NU LIVE!

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?