Bet Wisely: egy labdarúgó-mérkőzés eredményének előrejelzése Poisson-eloszlással

ez a cikk a Data Science Blogathon részeként jelent meg.

“a világ legnagyobb vallása még csak nem is vallás.”- Fernando Torres

a futballt mindenki szereti, szépsége kiszámíthatatlan természetében rejlik. Az egyik dolog, ami szorosan kapcsolódik ehhez a játékhoz, a rajongók, akik a játék előtt vitatkoznak, hogy ki nyeri a játékot. Néhány rajongó pedig még a meccs előtt is spekulál az eredményvonalon. Tehát próbáljunk logikusan válaszolni ezekre a kérdésekre.

Ismerkedés Poisson

nos, mint már mondtam korábban futball kiszámíthatatlan játék, a cél is előfordulhat bármely pillanatban a mérkőzés teljesen véletlenszerű, amely nem függ a korábbi célok vagy csapatok, vagy bármely más tényező. Várj mondtam “Random”. Mivel a statisztikában van egy Eloszlás, amelyet a véletlenszerűen előforduló események valószínűségének megtalálására használnak, Poisson-eloszlás.

tegyük fel, hogy a barátod azt mondja, hogy átlagosan 2 gól történik meccsenként, nos, igaza van? Ha igaz, akkor mi a tényleges esélye annak, hogy két gólt lásson egy mérkőzésen? Itt jön a mentő Poisson eloszlás segít megtalálni a valószínűsége megfigyelése’ n ‘ események (read ‘n’ célok) egy meghatározott ideig, mivel mi biztosítja azt a várható események bekövetkezése (átlagos események időszakonként). Lássuk matematikailag egyszer

Poisson eloszlás

(

a pontozás esélye

most válaszoljunk néhány kérdésre ezzel az egyenlettel, de először adatokra van szükségünk, ezért ehhez letöltöttem a nemzetközi futball eredményeit 1872-től 2020-ig adatok Kaggle-től. Az alábbiakban bemutatjuk az adatkészletünk mintáját.

kód:

data.head(3)
Poisson disztribúció-Fej

kezdjük azzal, hogy megtaláljuk az átlagos célokat, amelyekre 90 percen belül számíthatunk.

ehhez létrehoztam egy külön adatkészletet, amely kiszűrte a 21.században(2000-2020) lejátszott mérkőzések adatait, és hozzáadtam a home_score-t és az away_score-t, hogy megtudjam a teljes számot. az egyes mérkőzéseken előforduló gólok közül, majd az összes gól oszlop átlagát vette fel, hogy megkapja az átlagos gólokat, amelyekre számíthatunk egy meccsen.

kód:

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

most, hogy ezt az elvárást Poissson Distribution formula lássuk, mi a tényleges esélye, hogy 3 gólt a mérkőzés.

csak 22% az esély. Ábrázoljuk a nem valószínűségeit. gólok egy mérkőzésen, hogy jobb képet kapjunk.

Poisson eloszlás

ebből kiszámíthatjuk annak valószínűségét, hogy ‘x’ – et vagy kevesebb célt látunk, egyszerűen az ‘x’ valószínűségeinek és az ‘x’ – nél kisebb számoknak a hozzáadásával.Ha ezt csak kivonjuk az 1-ből, megkaphatjuk annak valószínűségét, hogy több mint ‘x’ gólt látunk egy mérkőzésen. Tervezzük meg ezt is.

a várakozásnak vége…

most tegyük fel, hogy van egy türelmetlen barátod, aki nem akar ülni az egész játékot. És egy meccs alatt jön hozzád, és megkérdezi, mennyi időt kell várnia, hogy lássa a gólt. Woah, ez egy nehéz kérdés, de ne aggódj, kérd meg, hogy üljön át 10000 játékot, és jegyezze fel az egyes gólok közötti időt. Csak vicceltem, nyilvánvalóan, kiborulna. Valójában 10000 mérkőzést szimuláltam, és megtudtam az átlagos időt.

a legvalószínűbb várakozási idő 2 perc. De várj ez valójában nem az, amit kerestem, azt akarom, hogy az átlagos idő, hogy meg kell várni, hogy a cél, ha elkezdem nézni a játékot egy véletlen időben. Ehhez 10000 példányt fogok venni, ahol minden példány 10000 játékot néz, és kiszámítja az átlagos várakozási időt a gólok között az 10000 játékban, és jelentést tesz nekünk. Végül az egyes példányaimból származó 10000 jelentést fogom ábrázolni, és megtudom a várható átlagos várakozási időt.

úgy tűnik, hogy kb. 33 percet kell várnunk. Azonban lehet, hogy többet kell várnunk, ez egy klasszikus várakozási idő paradoxon.

a pontszám előrejelzése

végül tegyük fel azt a kérdést, amellyel elkezdtük, és a legizgalmasabb kérdést, hogy ki fog nyerni, és mi lesz az eredményvonal.

ehhez a két csapat közötti előzményeket fogom használni (hadd tekintsék őket hazai és idegenbeli csapatnak), az average_home_score-t pedig a hazai csapat várható góljainak, az average_away_score-t pedig a vendég csapat várható góljainak, és a Poisson-eloszlás segítségével megjósolom az eredményvonalat. Abban az esetben, ha a csapatoknak kevesebb találkozásuk van közöttük, néhány tényezőt figyelembe veszünk

HS = a hazai csapat által a történelem során szerzett hazai gólok átlaga.

AS = a vendégcsapat által a történelem során szerzett idegenbeli gólok átlaga.

HC = a hazai csapat által a hazai mérkőzéseken elért gólok átlaga.

AC = a vendégcsapat által idegenben elért gólok átlaga.

tehát a hazai csapat várható pontszámát (HS + AC) / 2

szóval, a Vendég csapat várható pontszámát (as + HC) / 2

várjon, a várható pontszám nem az előre jelzett pontszám. A várható pontszám az a gólok átlagos száma, amelyet elvárunk tőlük a köztük lévő játékban.

kód:

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

próbáljuk meg úgy, hogy Brazília a hazai csapat, Mexikó pedig a vendégcsapat.

kód:

PredictScore()

a Poisson-eloszlás előrejelzést ad arról, hogy Brazília 2-0-s pontszámmal nyer. Kerestem a neten, és megállapította, hogy az utolsó mérkőzés között játszott 2 Július 2018 és az eredményvonal szerint Brazília nyert 2-0. Nekem szerencsém volt, neked talán nem.

következtetés

ha azt szeretnénk, hogy vizsgálja meg a További nem gond, itt van a kódot. Továbbá ez csak egy alapvető módja a játék előrejelzésének, manapság osztályozási algoritmusokat használnak az eredmény előrejelzésére, a regressziós algoritmust pedig a pontszám előrejelzésére. De ez egy másik nap témája, addig szórakozzon ezzel. Adios!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.