obstawiaj mądrze: przewidywanie wyniku meczu piłki nożnej przy użyciu rozkładu Poissona

ten artykuł został opublikowany w ramach Blogathonu Data Science.

„największa religia na świecie nie jest nawet religią.”- Fernando Torres

Piłka nożna jest kochana przez wszystkich, a jej piękno tkwi w jej nieprzewidywalnej naturze. Jedną z rzeczy, która jest silnie związana z tą grą jest jej fanów, rozmyślając i debatowanie przed meczem nad tym, kto wygra mecz. A niektórzy fani dochodzą nawet do granicy spekulowania na temat wyniku przed meczem. Spróbujmy więc odpowiedzieć logicznie na niektóre z tych pytań.

poznawanie Poissona

jak już wcześniej mówiłem, piłka nożna jest grą nieprzewidywalną, Gol może wystąpić w dowolnym momencie meczu całkowicie losowy, nie mając zależności od poprzednich bramek lub drużyn ani żadnych innych czynników. Czekaj, powiedziałem „przypadkowy”. Ponieważ istnieje rozkład w statystyce, który jest używany do znajdowania prawdopodobieństwa zdarzeń losowych, rozkład Poissona.

przypuśćmy, że Twój znajomy mówi, że średnio na mecz strzelają 2 bramki. Jeśli tak, to jakie są rzeczywiste szanse na zobaczenie dwóch bramek w meczu? Tutaj przychodzi na ratunek rozkład Poissona, który pomaga nam znaleźć Prawdopodobieństwo obserwowania ’ N 'zdarzeń (Czytaj’ N ’ celów) w ustalonym okresie czasu, biorąc pod uwagę, że dostarczamy mu oczekiwanie zdarzeń występujących (średnie zdarzenia na okres czasu). Zobaczmy to matematycznie raz

rozkład Poissona

(gdzie λ = średnia zdarzeń na okres czasu)

szanse na zdobycie gola

teraz odpowiem na kilka pytań z tym równaniem, ale najpierw potrzebujemy danych, więc do tego ściągnąłem Międzynarodowe wyniki piłki nożnej od 1872 do 2020 danych z Kaggle. Próbka naszego zbioru danych jest pokazana poniżej.

kod:

data.head(3)
rozkład Poissona-Kierownik

zacznijmy od znalezienia średniej goli, której możemy się spodziewać w ciągu 90 minut.

w tym celu utworzyłem oddzielny zestaw danych filtrujący dane dla meczów rozegranych w XXI wieku(2000-2020) i dodałem home_score i away_score, aby dowiedzieć się, ile wynosi całkowity brak. bramek występujących w każdym meczu, a następnie wzięliśmy średnią z całkowitej kolumny goli, aby uzyskać średnią goli, których możemy oczekiwać w meczu.

kod:

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

teraz umieszczając to oczekiwanie we wzorze rozkładu Poisssona zobaczmy, jakie są rzeczywiste szanse na zobaczenie 3 bramek w meczu.

tylko 22% szans. Narysujmy prawdopodobieństwo Nie. goli w meczu, aby uzyskać lepszy obraz.

rozkład Poissona

na tej podstawie możemy obliczyć prawdopodobieństwo zobaczenia ” x „lub mniejszej liczby bramek po prostu dodając prawdopodobieństwo” x „i liczby mniejsze niż „x”.I po prostu odejmując to od 1 Możemy uzyskać prawdopodobieństwo zobaczenia więcej niż ” x ” bramek w meczu. To też wykreślimy.

teraz Załóżmy, że masz niecierpliwego przyjaciela, który nie chce siedzieć przez całą grę. Przychodzi do Ciebie podczas meczu i pyta, ile czasu musi czekać, aby zobaczyć bramkę. Woah, to trudne pytanie prawda, ale nie martw się, poproś go, aby usiąść przez 10000 gier i zanotować czas między każdą bramką. Żartowałem, oczywiście, że by zwariował. Właściwie symulowałem 10000 meczów i dowiedziałem się o średnim czasie.

najbardziej prawdopodobny czas oczekiwania to 2 minuty. Ale poczekaj to nie jest właściwie to, czego szukałem, chcę średni czas, że muszę czekać, aby zobaczyć bramkę, jeśli zacznę oglądać mecz w losowym czasie. W tym celu wezmę 10000 przypadków, gdzie każda instancja ogląda 10000 meczów i oblicza średni czas oczekiwania między bramkami w tych 10000 meczach i zgłasza nas. Na koniec będę planował te 10000 raportów z każdej z moich instancji i dowiem się, jaki jest oczekiwany średni czas oczekiwania.

wygląda na to, że musimy poczekać ok. Jednak być może będziemy musieli czekać na więcej, jest to klasyczny Paradoks czasu oczekiwania.

Przewidywanie linii wyników

na koniec zróbmy pytanie, od którego zaczęliśmy i najbardziej ekscytujące pytanie, które kto wygra i jaka będzie linia wyników, aby być precyzyjnym.

w tym celu użyję historii między dwoma drużynami (niech rozważą jako drużynę gospodarzy i drużynę gości) i wezmę average_home_score jako oczekiwaną liczbę bramek dla drużyny gospodarzy i average_away_score jako oczekiwaną liczbę bramek dla drużyny gości i przewidzę wynik za pomocą rozkładu Poissona. W przypadku, gdy drużyny mają mniej spotkań między sobą, weźmiemy pod uwagę kilka czynników

HS = Średnia bramek zdobytych przez gospodarzy w historii.

AS = Średnia bramek zdobytych na wyjeździe przez drużynę wyjazdową w całej historii.

HC = Średnia goli straconych w meczach u siebie przez drużynę gospodarzy.

AC = Średnia bramek straconych w meczach wyjazdowych przez drużynę wyjazdową.

oczekiwany wynik drużyny gospodarzy zostanie obliczony jako (HS + AC) / 2

zatem oczekiwany wynik drużyny Gości zostanie obliczony jako (AS + HC) / 2

czekaj, oczekiwany wynik nie jest przewidywanym wynikiem. Oczekiwany wynik to średnia liczba goli, które mają zdobyć w meczu między nimi.

kod:

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

spróbujmy z Brazylią jako drużyną gospodarzy i Meksykiem jako drużyną gości.

kod:

PredictScore()

rozkład Poissona daje nam prognozę wygranej Brazylii z wynikiem 2-0. Przeszukałem siatkę i odkryłem, że ostatni mecz między nimi został rozegrany 2 lipca 2018 r., a wynik mówi, że Brazylia wygrała 2-0. Cóż, miałem szczęście, ty nie możesz.

wniosek

jeśli chcesz zgłębić dalej, nie martw się, oto mój kod. Ponadto jest to tylko podstawowy sposób przewidywania gry, obecnie algorytmy klasyfikacji są używane do przewidywania wyników i algorytm regresji do przewidywania linii wyników. Ale to jest temat na kolejny dzień, do tego czasu baw się dobrze grając z tym. Adios!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.