veto viisaasti: jalkapallo-ottelun tulosrajan ennustaminen Poisson-jakaumalla

tämä artikkeli julkaistiin osana Data Science-blogia.

”maailman suurin uskonto ei ole edes uskonto.”- Fernando Torres

jalkapallo on kaikkien rakastama ja sen kauneus piilee sen arvaamattomuudessa. Yksi tähän peliin vahvasti liittyvä asia on sen fanit, jotka hautovat ja väittelevät ennen peliä siitä, kuka voittaa pelin. Osa faneista menee jopa äärirajoille spekuloidessaan pistepörssiä ennen ottelua. Joten yritetään vastata joihinkin näistä kysymyksistä loogisesti.

tutustuminen Poissoniin

hyvin kuten olen aiemmin sanonut, jalkapallo on arvaamaton peli, maali voi tapahtua minä hetkenä tahansa ottelussa täysin sattumanvaraisesti ilman riippuvuuksia aiemmista maaleista tai joukkueista tai muista tekijöistä. Sanoinko ”Satunnainen”? Koska tilastoissa on jakauma, jota käytetään satunnaisesti esiintyvien tapahtumien todennäköisyyksien löytämiseen, Poisson-jakauma.

oletetaan ystäväsi sanovan, että keskimäärin 2 maalia tapahtuu per peli, No, onko hän oikeassa? Jos oikein niin mitkä ovat todelliset mahdollisuudet nähdä kaksi maalia ottelussa? Tässä tulee meidän pelastus Poisson Jakelu auttaa meitä löytämään todennäköisyys havainnoimalla ” n ”tapahtumia (Lue” n ” tavoitteet) kiinteässä ajassa, koska annamme sen odotus tapahtumien (keskimäärin tapahtumia per ajanjakso). Katsotaan se kerran matemaattisesti.

 Poisson-jakauma

(missä λ = keskimäärin tapahtumia per aikajakso)

maalinteon mahdollisuudet

nyt vastataan joihinkin kysymyksiin tällä yhtälöllä, mutta ensin tarvitaan dataa, joten tätä varten latasin Kaggelta kansainvälisen jalkapallon tulokset vuosilta 1872-2020. Alla on näyte aineistostamme.

koodi:

data.head(3)
Poisson Distribution-Head

lähdetään siitä, että 90 minuutin sisällä löydetään ne maalikeskiarvot, joita on odotettavissa.

tätä varten olen luonut erillisen aineiston, joka suodattaa pois tiedot 2000-luvulla(2000-2020) pelatuista otteluista ja lisännyt home_score-ja away_score-tiedostot selvittääkseni kokonaisnumeron. maaleista esiintyy jokaisessa ottelussa ja sitten otetaan keskiarvo yhteismaalit sarake saada keskimäärin tavoitteet voimme odottaa ottelussa.

koodi:

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

nyt laittaa tämä odotus Poisson Jakelu kaava katsotaanpa, mitkä ovat todelliset mahdollisuudet nähdä 3 maalia ottelussa.

vain 22 prosentin mahdollisuus. Piirretään todennäköisyydet ei. maaleista ottelussa paremman kuvan saamiseksi.

Poisson-jakauma

nyt tästä voimme laskea todennäköisyyden nähdä ” x ”tai vähemmän maalimäärä yksinkertaisesti lisäämällä todennäköisyydet” x ”ja luvut, jotka ovat vähemmän kuin ”x”.Ja pelkästään vähentämällä tämä 1 voimme saada todennäköisyys nähdä enemmän kuin ” x ” maalia ottelussa. Juonnetaan tämäkin.

odotus on ohi …

nyt oletetaan, että sinulla on kärsimätön ystävä, joka ei halua istua koko peliä. Hän tulee ottelun aikana kysymään, kuinka kauan hänen pitää odottaa maalia. Woah, se on vaikea kysymys oikea, mutta huoli ei, pyydä häntä istumaan läpi 10000 pelejä ja huomata aika välillä jokaisen maalin. Kunhan vitsailin. hän sekoaisi. Itse asiassa simuloin 10000 ottelua ja selvitin keskimääräisen ajan.

todennäköisin odotusaika on 2 minuuttia. Mutta odota tämä ei oikeastaan mitä olin etsimässä, Haluan keskimääräinen aika, että minun täytyy odottaa nähdä tavoite, jos alan katsella peliä satunnaiseen aikaan. Siitä, otan 10000 tapauksissa, joissa jokainen esiintymä on katsomassa 10000 pelejä ja laskemalla keskimääräinen odotusaika tavoitteiden välillä, että 10000 pelejä ja raportointi meille. Lopuksi, aion suunnitella nämä 10000 raportit jokaisesta minun tapauksissa ja selvittää odotettavissa keskimääräinen odotusaika.

näyttää siltä, että joudumme odottamaan 33 minuuttia n. Miten tahansa joudummekin odottamaan lisää, Tämä on klassinen Odotusaikaparadoksi.

ennustetaan tulosrivi

lopuksi tehdään kysymys, jolla lähdettiin liikkeelle ja jännittävin kysymys, että kuka voittaa ja mikä on tulosrivi tarkkaan ottaen.

käytän tähän kahden joukkueen välistä historiaa (Pitäkööt kotijoukkue ja vierasjoukkue) ja otan keskiarvon_home_score kotijoukkueen odotetuiksi maaleiksi ja average_away_score vierasjoukkueen odotetuiksi maaleiksi ja ennustan pisterajan Poisson-jakaumalla. Mikäli joukkueiden keskinäisiä kohtaamisia on vähemmän, huomioidaan muutamia tekijöitä

HS = kotijoukkueen kautta aikojen tekemien kotimaalien keskiarvo.

as = vierasjoukkueen kautta aikain tekemien vierasmaalien keskiarvo.

HC = kotijoukkueen kotiotteluissa päästämien maalien keskiarvo.

AC = vierasjoukkueen päästämien maalien keskiarvo vierasotteluissa.

niin, kotijoukkueen odotettu pistemäärä lasketaan muodossa (HS + AC) / 2

niin, vierasjoukkueen odotettu pistemäärä lasketaan muodossa (AS + HC) / 2

odota, odotettu pistemäärä ei ole ennustettu pistemäärä. Odotettu pistemäärä on keskimääräinen maalimäärä, jonka odotamme heidän tekevän keskinäisessä ottelussa.

koodi:

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

kokeillaan Brasiliaa kotijoukkueena ja Meksikoa vierasjoukkueena.

koodi:

PredictScore()

Poissonin jakauma antaa ennusteen Brasilian voitosta 2-0-lukemin. Tutkin verkkoa ja huomasin, että viimeinen ottelu heidän välillään on pelattu 2.heinäkuuta 2018 ja tulosrivi kertoo Brasilian voittaneen 2-0. Minulla kävi tuuri.

Conclusion

If you want to explore further no worry, here is my code. Lisäksi tämä on vain perus tapa ennustaa pelin, nykyään luokittelualgoritmeja käytetään ennustamaan tuloksen ja regressioalgoritmia ennustamaan tulosrivi. Mutta se on toisen päivän aihe, siihen asti hauskaa leikkiä tämän kanssa. Adios!

Vastaa

Sähköpostiosoitettasi ei julkaista.