tento článek byl publikován jako součást blogu Data Science.
„největší náboženství na světě není ani náboženství.“- Fernando Torres
Úvod
Fotbal je milován všemi a jeho krása spočívá v jeho nepředvídatelné povaze. Jedna věc, která je silně spojena s touto hrou, jsou její fanoušci, napjaté a debaty před zápasem o tom, kdo vyhraje hru. A někteří fanoušci jdou dokonce na hranici spekulací o skóre před zápasem. Zkusme tedy odpovědět na některé z těchto otázek logicky.
seznámení se s Poissonem
jak jsem již řekl, fotbal je nepředvídatelná hra, gól může nastat kdykoli v zápase zcela náhodně bez závislosti na předchozích cílech nebo týmech nebo jiných faktorech. Počkej, řekl jsem „náhodný“. Protože ve statistikách existuje rozdělení, které se používá k nalezení pravděpodobností náhodně se vyskytujících událostí, Poissonovo rozdělení.
Předpokládejme, že váš přítel říká, že v průměru se 2 góly stanou za hru, dobře, má pravdu? Pokud ano, jaké jsou skutečné šance vidět dva góly v zápase? Zde přichází k naší záchraně Poissonova rozdělení, které nám pomáhá najít pravděpodobnost pozorování “ n „událostí (čti“ n “ cílů) ve stanoveném časovém období, vzhledem k tomu, že mu poskytujeme očekávání událostí (průměrné události za časové období). Podívejme se na to matematicky jednou

(kde λ = průměrné události za časové období)
šance na skórování
nyní odpovězme na některé otázky touto rovnicí, ale nejprve potřebujeme data, takže za to jsem stáhl Mezinárodní fotbalové výsledky z 1872 na 2020 data z Kaggle. Ukázka naší datové sady je uvedena níže.
kód:
data.head(3)
.png)
začněme s hledáním průměrných gólů, které můžeme očekávat během 90 minut.
za tímto účelem jsem vytvořil samostatný datový soubor odfiltrující data pro zápasy hrané v 21. století (2000-2020)a přidal home_score a away_score, abych zjistil celkové číslo. gólů vyskytujících se v každém zápase a pak se průměr celkového sloupce gólů dostat průměrné góly můžeme očekávat v zápase.
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
nyní uvedení tohoto očekávání do Poisssonova distribučního vzorce uvidíme, jaké jsou skutečné šance vidět 3 góly v zápase.

Páni, jen pouhá 22% šance. Pojďme vykreslit pravděpodobnosti ne. gólů v zápase získat lepší obraz.

nyní z toho můžeme vypočítat pravděpodobnost, že uvidíme “ x „nebo menší počet gólů jednoduše přidáním pravděpodobností“ x „a čísel, která jsou menší než „x“.A pouhým odečtením od 1 můžeme získat pravděpodobnost, že v zápase uvidíme více než “ x “ gólů. Pojďme to také vykreslit.

čekání skončilo …
nyní předpokládejme, že máte netrpělivého přítele, který nechce sedět po celou hru. A přijde za vámi během zápasu a zeptá se, kolik času musí čekat, až uvidí gól. Woah, to je těžká otázka, ale nebojte se, požádejte ho, aby seděl přes hry 10000 a zaznamenal čas mezi každým cílem. Jen si dělám srandu, očividně by šílel. Vlastně jsem simuloval 10000 zápasů a zjistil průměrný čas.

nejpravděpodobnější čekací doba je 2 minuty. Ale počkejte, to není vlastně to, co jsem hledal, chci průměrný čas, který musím čekat, až uvidím cíl, pokud začnu sledovat hru v náhodném čase. Za tímto účelem vezmu instance 10000, kde každá instance sleduje hry 10000 a vypočítává průměrnou čekací dobu mezi cíli v těchto hrách 10000 a hlásí nás. Nakonec budu vykreslovat tyto zprávy 10000 z každého z mých případů a zjistit očekávanou průměrnou čekací dobu.

vypadá to, že musíme počkat asi 33 minut. Jakkoli si budeme muset počkat na další, jedná se o klasický Paradox čekací doby.
předpovídání skóre
nakonec se podívejme na otázku, s jakou jsme začali, a nejzajímavější otázku, kdo vyhraje a jaká bude přesná skóre.
k tomu použiji historii mezi dvěma týmy (ať je považují za domácí tým a tým hostů) a vezmu průměre_home_score jako očekávané góly pro domácí tým a průměre_away_score jako očekávané góly pro hostující tým a předpovídám skóre pomocí Poissonova rozdělení. V případě, že mají týmy mezi sebou méně střetnutí, zvážíme několik faktorů
HS = průměr domácích gólů vstřelených domácím týmem v celé historii.
AS = průměr gólů hostů vstřelených týmem v celé historii.
HC = průměr inkasovaných gólů v domácích zápasech domácím týmem.
AC = průměr gólů vstřelených v zápasech venku hostujícím týmem.
takže očekávané skóre domácího týmu bude vypočteno jako (HS + AC) / 2
takže očekávané skóre hostujícího týmu bude vypočteno jako (AS + HC) / 2
počkejte, očekávané skóre není předpokládané skóre. Očekávané skóre je průměrný počet gólů, které očekáváme, že vstřelí v zápase mezi nimi.
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}')
zkusme to s Brazílií jako domácím týmem a Mexikem jako hostujícím týmem.
kód:
PredictScore()
.png)
Poissonovo rozdělení nám dává předpověď, že Brazílie zvítězí 2: 0. Prohledal jsem síť a zjistil, že poslední zápas mezi nimi se hrál 2. července 2018 a skóre říká, že Brazílie vyhrála 2-0. No, měl jsem štěstí, možná ne.
závěr
pokud chcete prozkoumat další bez obav, tady je můj kód. Dále je to jen základní způsob předpovídání hry, v dnešní době se klasifikační algoritmy používají k předpovědi výsledku a regresního algoritmu k předpovědi skóre. Ale to je téma na další den, do té doby se s tím bavte. Adiosi!