pariați cu înțelepciune: prezicerea liniei de scor a unui meci de fotbal folosind distribuția Poisson

acest articol a fost publicat ca parte a Blogathonului Data Science.

„cea mai mare religie din lume nu este nici măcar o religie.”- Fernando Torres

Fotbalul este iubit de toți și frumusețea sa constă în natura sa imprevizibilă. Un lucru care este puternic asociat cu acest joc este fanii săi, clocitoare și dezbateri înainte de un joc peste care va câștiga jocul. Și unii fani chiar merg la limita speculării liniei de scor înainte de meci. Deci, să încercăm să răspundem logic la unele dintre aceste întrebări.

Noțiuni de bază pentru a cunoaște Poisson

Ei bine, așa cum am spus mai devreme de fotbal este un joc imprevizibil, un gol poate avea loc în orice moment în Meci Total aleatoare având dependențe de goluri anterioare sau Echipe sau orice alți factori. Stai am spus „aleatoare”. Deoarece există o distribuție în statistici care este utilizată pentru găsirea probabilităților evenimentelor care apar la întâmplare, distribuția Poisson.

să presupunem că prietenul tău spune că în medie se întâmplă 2 goluri pe meci, Ei bine, are dreptate? Dacă chiar atunci care sunt șansele reale de a vedea două goluri într-un meci? Aici vine în ajutorul nostru Poisson distribution ajutându-ne să găsim probabilitatea de a observa evenimentele ‘n’ (citiți obiectivele ‘n’) într-o perioadă de timp fixă, având în vedere că îi oferim așteptarea evenimentelor care apar (evenimente medii pe perioadă de timp). Să o vedem matematic o dată

Poisson Distribution

(în cazul în care XQX = evenimente medii pe perioadă de timp)

șanse de notare

acum să răspundem la câteva întrebări cu această ecuație, dar mai întâi avem nevoie de date, așa că pentru aceasta am descărcat rezultatele fotbalului internațional din 1872 până în 2020 date de la Kaggle. Un eșantion din setul nostru de date este prezentat mai jos.

Cod:

data.head(3)
Poisson Distribution-Head

să începem cu găsirea obiectivelor medii la care ne putem aștepta în 90 de minute.

pentru aceasta, am creat un set de date separat care filtrează datele pentru meciurile jucate în secolul 21(2000-2020) și am adăugat home_score și away_score pentru a afla numărul total. de goluri care apar în fiecare meci și apoi a luat media coloanei total goluri pentru a obține obiectivele medii ne putem aștepta într-un meci.

Cod:

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

acum, punând această așteptare în Formula de distribuție Poissson să vedem care sunt șansele reale de a vedea 3 goluri într-un meci.

doar 22% șanse. Să complot probabilitățile nr. de goluri într-un meci pentru a obține o imagine mai bună.

Poisson Distribution

acum, din aceasta, putem calcula probabilitatea de a vedea ‘ x ‘sau un număr mai mic de goluri pur și simplu prin adăugarea probabilităților lui’ x ‘și a numerelor care sunt mai mici decât’x’.Și doar scăzând acest lucru de la 1 putem obține probabilitatea de a vedea mai mult de goluri ‘x’ într-un meci. Hai să complotăm și asta.

așteptarea s-a terminat…

acum să presupunem că ai un prieten nerăbdător care nu vrea să stea tot jocul. Și vine la tine în timpul unui meci și întreabă Cât timp trebuie să aștepte pentru a vedea un gol. Woah, asta e o întrebare grea dreapta, dar nu vă faceți griji, cere-i să stea prin 10000 jocuri și nota timpul dintre fiecare gol. Glumeam, evident, s-ar speria. De fapt, am simulat 10000 meciuri și a aflat timpul mediu.

cel mai probabil timp de așteptare este de 2 minute. Dar așteptați acest lucru nu de fapt ceea ce căutam, vreau timpul mediu pe care trebuie să-l aștept pentru a vedea un gol dacă încep să urmăresc jocul la un moment aleatoriu. Pentru asta, voi lua instanțe 10000, în care fiecare instanță urmărește jocurile 10000 și calculează timpul mediu de așteptare între golurile din jocurile 10000 și ne raportează. În cele din urmă, voi complota acele rapoarte 10000 din fiecare dintre instanțele mele și voi afla timpul mediu de așteptare așteptat.

se pare că trebuie să așteptăm 33 minute aprox. Oricum ar fi să așteptăm mai mult, acesta este un Paradox clasic al timpului de așteptare.

prezicerea liniei de scor

în cele din urmă, să facem întrebarea cu care am început și cea mai interesantă întrebare că cine va câștiga și care va fi linia de scor pentru a fi precis.

pentru aceasta, voi folosi istoricul dintre două echipe (lăsați-le să ia în considerare ca echipa gazdă și echipa în deplasare) și să ia average_home_score ca goluri așteptate pentru echipa gazdă și average_away_score ca goluri așteptate pentru echipa în deplasare și să prezică linia de scor folosind distribuția Poisson. În cazul în care echipele au mai puține întâlniri între ele, vom lua în considerare câțiva factori

HS = Media golurilor marcate de echipa gazdă de-a lungul istoriei.

AS = Media golurilor marcate de echipa oaspete de-a lungul istoriei.

HC = Media golurilor primite în meciurile de acasă de către echipa gazdă.

AC = Media golurilor primite în meciurile din deplasare de către echipa din deplasare.

deci, scorul așteptat al echipei gazdă va fi calculat ca (HS + AC) / 2

deci, scorul așteptat al echipei oaspete va fi calculat ca (AS + HC) / 2

așteptați, scorul așteptat nu este scorul prezis. Scorul așteptat este numărul mediu de goluri pe care ne așteptăm să le înscrie într-un joc între ele.

Cod:

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

să încercăm cu Brazilia ca echipă gazdă și Mexic ca echipă în deplasare.

Cod:

PredictScore()

distribuția Poisson ne oferă o predicție a Braziliei câștigătoare cu o linie de scor 2-0. Am căutat pe net și am constatat că ultimul meci dintre ei a fost jucat pe 2 iulie 2018, iar scorul spune că Brazilia a câștigat cu 2-0. Ei bine, am avut noroc, s-ar putea să nu.

concluzie

dacă doriți să explorați în continuare nu vă faceți griji, aici este codul meu. În plus, acesta este doar un mod de bază de a prezice jocul, în zilele noastre algoritmii de clasificare sunt folosiți pentru a prezice rezultatul și algoritmul de regresie pentru a prezice linia de scor. Dar acesta este subiectul pentru o altă zi, până atunci distrează-te jucându-te cu asta. Adios!

Lasă un răspuns

Adresa ta de email nu va fi publicată.