środa, 11 lutego 2015

Modelowanie liczby bramek w Serie-A - rozkład Poissona i rozkład Skellam

Problem

Wszystkie dotychczas przedstawione sposoby modelowania wyników wydarzeń sportowych oparte były na regresji logistycznej. Modelowaliśmy siłę drużyn, także rozróżniając ich jakość w zależności od tego czy dana drużyna była gospodarzem. Dzisiejszy wpis zakłada inny sposób mierzenia jakości drużyn, w którym bierzemy pod uwagę liczbę strzelonych i straconych bramek. Liczba bramek jaką strzela drużyna i-ta jest uzależniona od siły ofensywnej drużyny $\alpha_i$, słabości defensywny przeciwnika $\beta_j$, ewentualnego wsparcia kibiców $\gamma$ oraz innych czynników, których nie znamy albo za krótko zastanawialiśmy się nad problemem żeby zjawisko do końca zrozumieć. Przy modelowaniu liczby bramek musimy założyć właściwy rozkład, który byłby dyskretny i nieujemny - rozkład Poissona. Rozkładem Poissona opisujemy intensywność badanych zdarzeń w określonej jednostce czasu. W naszym przypadku intensywnością jest liczba bramek strzelonych przez gospodarze $X_{i,j}$ oraz liczba bramek strzelonych przez gościa $Y_{i,j}$.

$X_{i,j} \sim Poisson(\alpha_i \beta_j \gamma)$
$Y_{i,j} \sim Poisson(\alpha_j \beta_i)$

Powyższy jest modelem bazowym, zaproponowanym przez Maher (1982), w którym liczba strzelonych i liczba straconych bramek przez gospodarza są niezależne od siebie i podążają rozkładem Poissona. Warto mieć na uwadze dodatkowe założenia $\alpha_i, \beta_i, \gamma > 0, \forall_i$.
Tak to robi R.

Rozwiązanie

Pomijam tym razem pierwszą część kody, która wiele nie różni się od poprzednich. Ponownie zaciągnięto dane z www.football-data.co.uk i po kilku operacjach doprowadzamy zbiór do takiej formy:

idgoalsatakobronahome
10ChievoJuventus1
11JuventusChievo0
22RomaFiorentina1
20FiorentinaRoma0
30AtalantaVerona1
30VeronaAtalanta0

Dane w swojej formie odpowiadają formule, którą zamieściłem we wstępie, gdzie liczba goli w jednym meczu ($X_{i,j}$ i $Y_{i,j}$) to dwa rzędy z zbiorze. W związku z tym, że $X_{i,j}$ i $Y_{i,j}$ są od siebie niezależne przy szacowaniu są oddzielnymi obserwacjami. Do analizy użyjemy uogólnionego modelu liniowego z rozkładem Poissona (GLM). Anova zastosowana na modelu glm jest testem LR, który już opisywałem wcześniej. Szacujemy model i porządkujemy parametry wrzucając je do jednego data.frame. (Tak nawiasem pisząc - I <3 maggritr.)

Do prognozy wyników 23. kolejki Serie-A użyjemy wbudowanej funkcji predict(). Dane, na których dokonamy prognozy powinny mieć taką samą formę jak te, na których model szacowano. Wynik funkcji predict to logarytm intensywności rozkładu Poissona dla każdego $X_{i,j}$ $Y_{j,i}$ prognozowanych meczów. Intensywność rozkładu Poissona to inaczej średnia liczba bramek strzelonych przez daną drużynę w danym meczu. Dla każdego z prognozowanych meczów intensywności (h i a) wyglądają następująco.

Na podstawie intensywności możemy określić np. prawodpodobieństwo strzelenia określonej liczby bramek przez daną drużynę w danym meczu (dpois). Ważniejsze być może będzie dla nas rozstrzygnięcie spotkania czyli różnica w strzelonych golach. Ponieważ rozstrzygnięcie jest różnicą pomiędzy dwoma rozkładami Poissona, rozkład wyniku będzie miał postać rozkładu Skellama. Skorzystamy z funkcji dskellam() w pakiecie VGAM do określenia prawdopodobieństwa danej różnicy bramek. Ponieważ zwycięstwo gospodarza to różnica $X_{i,j} - Y_{j,i} \geqslant 1$ musimy zsumować gęstości dla każdego z możliwych wyników, w którym wygrywa gospodarz (od 1 do 30 powinno wystarczyć). Podobnie robimy dla porażek i dla zwycięstw.


idhomeawayhagosc_premis_pgosp_p
1SassuoloFiorentina1,094940721,34195772942,36%27,15%30,49%
2PalermoNapoli1,6609033452,0795597347,76%21,05%31,19%
3MilanEmpoli1,4685060370,81687463520,89%26,56%52,55%
4AtalantaInter0,9523213091,29065764344,27%28,26%27,47%
5GenoaVerona1,9908459190,85072298215,23%20,77%64,00%
6RomaParma2,9556156590,5016450623,82%9,87%86,31%
7TorinoCagliari1,8142613850,96842687619,88%22,87%57,24%
8UdineseLazio1,2371764841,45485357242,17%25,68%32,15%
9ChievoSampdoria0,6692198560,99473986642,22%33,81%23,97%
10CesenaJuventus0,3825026842,74271236586,40%10,36%3,24%


Tak prezentują się parametry siły dla poszczególnych zespołów.


See the Pen Serie A - current rating (2014/15) by Dawid 'Gonzo' Kałędkowski (@elo2zero) on CodePen.
link do pełnego skryptu

Literatura:
Maher, M.J. (1982) Modelling association football scores.Statistica Neerlandica36, 109-118

Brak komentarzy:

Prześlij komentarz