Cieľ¶
Cieľom tohto reportu je preskúmať dataset a skúsiť zistiť, či existuje vzťah medzi počtom odohraných zápasov počas sezóny, resp. priemerným počtom minút strávených na ľade počas jedného zápasu a inými štatistikami ako napr. počet strelených gólov/počet striel na bránu a podobne. Pozrieme sa aj na to, či to ovplyvňuje pozícia, na ktorej hráč hrá. Následne skúsime vytvoriť model, ktorý bude predikovať úspešnosť hráča (počet striel na bránku) v nasledujúcej sezóne na základe dát z predchádzajúcich sezón. Vyhodnotíme úspešnosť viacerých verzií modelu pomocou krosvalidácie.
Dataset¶
Popis¶
Dataset obsahuje informácie a individuálne štatistiky o hráčoch v NHL z rokov 2004 až 2018. Dataset obsahuje 12 328 riadkov, pričom v jednom riadku je informácia o jednom hráčovi počas jednej sezóny (hráč môže byť vo viacerých riadkoch, ak hral v NHL viac sezón). Dataset obsahuje 32 stĺpcov, každý stĺpec obsahuje jednu informáciu/štatistiku ako napríklad počet strelených gólov počas sezóny.
Stĺpce v datasete¶
V datasete máme tieto informácie (na konci máme vždy uvedený dátový typ daného stĺpca):
- Rk: poradie, je unikátne vrámci sezóny, ale nie celkovo medzi sezónami. Nie je zrejmé, podľa čoho bolo priradené, niektoré sezóny majú poradie samostatné, niektoré spojené cez viac sezón, int64
- Player: meno hráča, string
- Nick: skratka mena, string
- Age: vek hráča v príslušnej sezóne, int64
- Pos: pozícia, na ktorej hráč hral počas sezóny (napr. C=center, RW=pravé krídlo, ...), brankári nie sú súčasťou tohto datasetu, string
- Tm: skratka tímu, string
- GP: počet odohraných zápasov, int64
- G, A, PTS: poporadí to je počet gólov, asistencií, počet bodov v bodovaní (súčet predchádzajúcich dvoch údajov), všetko int64
- plusminus: počet gólov daných tímom mínus počet obdržaných gólov pri prítomnosti hráča na ľade, int64
- PIM: počet trestných minút, int64
- PS: odhad podielu na počte bodov tímu, float64
- EV, PP, SH, GW: poporadí počet gólov pri rovnakom počte hráčov, v presilovkách, v oslabení, víťazné góly, všetko int64
- EV, PP, SH: poporadí počet asistencií pri rovnakom počte hráčov, v presilovkách, v oslabení, všetko int64
- S: počet striel, int64
- S_percent: percentuálna úspešnosť striel (pomer striel, ktoré skončili gólom ku všetkým strelám krát 100 percent), float64
- TOI: celkový počet minút na ľade, int64
- ATOI: priemerný počet minút strávený na ľade počas jedného zápasu, float64
- BLK: počet blokovaných striel, float64
- HIT: počet hitov, int64
- FOW, FOL: poporadí počet vyhraných a prehraných vhadzovaní, obe float64
- FO_percent: percentuálna úspešnosť vhadzovaní (pomer vyhraných vhadzovaní ku všetkým vhadzovaniam hráča krát 100 percent), float64
- HART, Votes: poporadí príznak zisku Hart Trophy a počet hlasov, obe int64
- Season: rok sezóny, int64
Duplikáty¶
V datasete nemáme žiadne duplikované riadky.
Chýbajúce informácie a konzistentnosť dát¶
Najprv sa pozrime na chýbajúce hodnoty. Vo väčšine stĺpcov nechýbajú žiadne hodnoty, len v 5 stĺpcoch chýba aspoň jedna hodnota. V stĺpci S_percent chýba 124 hodnôt a v stĺpci FO_percent ich chýba 311. Tieto hodnoty sa však dajú dopočítať z hodnôt v iných stĺpcoch. Konkrétne S_percent sa dá dopočítať ako počet gólov (G) / počet striel (S) a FO_percent sa dá dopočítať ako vyhrané vhadzovania (FOW) / všetky vhadzovania (FOW + FOL). Takže tieto chýbajúce hodnoty môžeme v týchto riadkoch nahradiť týmito dopočítanými informáciami. Pozor si ale musíme dať, ak by bol menovateľ nulový. Všade, kde v týchto stĺpcoch chýbala hodnota, tak to bolo kvôli nulovému menovateľu. Preto tam bola hodnota NaN, čo v tomto prípade vlastne dáva zmysel. Je ťažké hovoriť o percentuálnej úspešnosti, keď daný človek nemal žiadnu strelu, resp. žiadne vhadzovanie. Preto som sa rozhodla tieto údaje nemeniť.
Skontrolujeme, či vyplnené údaje v stĺpcoch S_percent a FO_percent sú konzistentné s dátami v ostatných stĺpcoch. Prepočítame tieto percentuálne údaje pre všetky riadky okrem tých s nulovým menovateľom a skontrolujeme, či sa dopočítaná hodnota nelíši o viac ako 0.1 od pôvodnej hodnoty (túto hranicu tám máme preto, že údaje sú uložené ako float).
Po tomto sme zistili, že všetky dáta sú konzistentné s údajmi v ostatných stĺpcoch (žiadne sa nelíši o viac ako o 0.1 oproti tomu, čo sa dopočíta z dát).
0krem toho hýba 1 hodnota v stĺpci BLK, 1 hodnota v stĺpci FOW a 1 hodnota v stĺpci FOL. Tieto údaje sa nedajú zistiť, a keďže chýbajúcich je takto málo, tak ak by sme potrebovali pracovať s týmito hodnotami, tak sa jednoducho len na tieto riadky nebudeme pozerať.
Skontrolujeme ešte konzistenciu hodnoty PTS, mala by sa rovnať súčtu gólov (G) a asistencií(A).
Zistili sme, že údaje v stĺpci PTS sú konzistentné s údajmi v G a A.
Explorácia dát¶
Post hráča¶
Pozrime sa aké hodnoty sú v poste hráča, teda pozície, na ktorej hráč môže hrať.
D 4219 C 3556 LW 2279 RW 2266 C/LW 3 LW/RW 2 LW/C 1 W 1 RW/LW 1 Name: Pos, dtype: int64
D znamená obranca, C, LW, RW sú poporadí center, ľavé krídlo, pravé krídlo, to sú všetko útočníci. Potom tam máme pár zmiešaných kategórií, ale vždy to je len medzi pozíciami útočníka. V tomto reporte pre zjednodušenie budeme rozlišovať len medzi obrancami a útočníkmi. Preto si pridáme do dát príznak defender, ktorý označuje, či je hráč obrancom. Vytvoríme ho jednoducho: ak má v poste D, tak je defender, inak nie. Ďalej už budeme pracovať len s týmto príznakom a nie s kategóriu Pos.
Rozloženie dát počas sezón¶
Štatistiky o počte záznamov pre jednotlivé roky zoradené od najväčšieho počtu záznamov:
2004 916 2016 898 2012 894 2011 891 2018 890 2017 888 2014 886 2009 885 2015 882 2010 879 2006 870 2007 858 2008 852 2013 839 Name: Season, dtype: int64
Počty sú celkom vyrovnané, ale chýba rok 2005. Je to preto, že v tom roku sa NHL nehrala. Dáta vyzerajú byť úplné, je dobré, že tam nemáme sezónu, v ktorej by sme mali výrazne menej alebo výrazne viac záznamov, čo by mohlo naznačovať nejakú chybu.
Základné štatistiky¶
Pozrime sa na základné štatistiky pre numerické stĺpce, ktoré nás budú najviac zaujímať počas tohto reportu.
Age | GP | G | A | ATOI | |
---|---|---|---|---|---|
count | 12328.00 | 12328.00 | 12328.00 | 12328.00 | 12328.00 |
mean | 26.64 | 48.90 | 7.48 | 12.79 | 14.25 |
std | 4.58 | 28.67 | 8.85 | 13.13 | 4.98 |
min | 0.00 | 1.00 | 0.00 | 0.00 | 0.00 |
25% | 23.00 | 21.00 | 1.00 | 2.00 | 10.97 |
50% | 26.00 | 57.00 | 4.00 | 9.00 | 14.62 |
75% | 30.00 | 76.00 | 11.00 | 20.00 | 18.00 |
max | 48.00 | 84.00 | 65.00 | 96.00 | 26.80 |
Minimálny vek 0 neznie ako správny údaj, vyskytuje sa však len v jednom riadku (celkovo vek nižší ako 15 sa vyskytuje len v tom jednom riadku), preto by nám to nemalo pokaziť štatistiky pri takom veľkom množstve údajov, aj keď sa určite jedná o chybu.
Dáta o jednotlivých hráčoch¶
Keď sa chceme pozerať na dáta o jednotlivom hráčovi počas všetkých sezón, hodí sa nám zagregovať dáta podľa nicku hráča. V datasete je 2 723 rôznych hráčov, jeden hráč sa priemerne vyskytuje v zhruba 4,5 sezónach.
Dáta o jednotlivých sezónach¶
Priemerný počet gólov¶
Pozrime sa na priemerný počet gólov v jednotlivých sezónach:
avg_goals | |
---|---|
Season | |
2004 | 6.90 |
2006 | 8.55 |
2007 | 8.25 |
2008 | 7.85 |
2009 | 7.92 |
2010 | 7.74 |
2011 | 7.54 |
2012 | 7.32 |
2013 | 4.55 |
2014 | 7.42 |
2015 | 7.43 |
2016 | 7.31 |
2017 | 7.55 |
2018 | 8.37 |
Môžeme si všimnúť, že priemerný počet gólov v sezóne 2013 je podozrivo oveľa nižší ako v iných sezónach.
Priemerný počet zápasov¶
Pozrime sa na priemerný počet odohraných zápasov pre jedného hráča:
avg_games_played | |
---|---|
Season | |
2004 | 48.33 |
2006 | 50.85 |
2007 | 51.58 |
2008 | 51.96 |
2009 | 50.01 |
2010 | 50.37 |
2011 | 49.68 |
2012 | 49.52 |
2013 | 30.89 |
2014 | 49.97 |
2015 | 50.20 |
2016 | 49.31 |
2017 | 49.86 |
2018 | 51.41 |
Takisto v sezóne 2013 je priemerný počet odohraných zápasov oveľa nižší ako v iných sezónach. Asi bola táto sezóna nejako skrátená, alebo iba máme dáta len pre nejakú časť sezóny. Nižší počet odohraných zápasov vysvetľuje aj nižší počet gólov. Do budúcna sa radšej ako na priemerný počet gólov budeme pozerať na priemerný počet gólov na zápas, čo nám odstráni problém, že v nejakej sezóne sa odohralo menej zápasov.
Priemerný počet gólov na zápas¶
Pridáme si do dát stĺpec GPP, ktorý znamená priemerný počet gólov na jeden zápas pre hráča a počíta sa ako počet gólov hráča / počet odohraných zápasov hráča.
Pozrime sa na štatistiky pre túto hodnotu:
count 12328.00 mean 0.12 std 0.13 min 0.00 25% 0.02 50% 0.09 75% 0.19 max 1.50 Name: GPP, dtype: float64
A rozdelené po sezónach:
avg_goals_per_play | |
---|---|
Season | |
2004 | 0.11 |
2006 | 0.14 |
2007 | 0.13 |
2008 | 0.12 |
2009 | 0.13 |
2010 | 0.12 |
2011 | 0.12 |
2012 | 0.12 |
2013 | 0.12 |
2014 | 0.12 |
2015 | 0.12 |
2016 | 0.12 |
2017 | 0.12 |
2018 | 0.14 |
Vidíme, že teraz sú už hodnoty podobné pre všetky sezóny. Podobne si vytvoríme aj APP, čo bude priemerný počet asistencií na zápas a SPP, čo bude priemerný počet striel na zápas.
Korelácie¶
Spočítajme si Spearmanovu korelačnú konštantu medzi počtom odohraných zápasov, priemerným počtom minút, gólmi na zápas, asistenciami na zápas, strelami na zápas.
GP | ATOI | GPP | APP | SPP | |
---|---|---|---|---|---|
GP | 1.00 | 0.50 | 0.54 | 0.56 | 0.50 |
ATOI | 0.50 | 1.00 | 0.37 | 0.56 | 0.47 |
GPP | 0.54 | 0.37 | 1.00 | 0.62 | 0.75 |
APP | 0.56 | 0.56 | 0.62 | 1.00 | 0.67 |
SPP | 0.50 | 0.47 | 0.75 | 0.67 | 1.00 |
Vidíme, že medzi týmito vlastnosťami sú určité korelácie, pretože hodnota konštanty nie je úplne blízko 0. Neprekvapivo veľká korelácia je napríklad medzi počtom striel a počtom gólov, dáva to zmysel, že pravdepodobne čím viac hráč strieľa, tým viac gólov dáva.
Nás však najviac zaujíma či existuje vzťah medzi počtom odohraných zápasov a počtom gólov/asistencií/striel a počtom minút na zápas a počtom gólov/asistencií/striel. Vyzerá, že nejaká korelácia tam je, nie však silná.
Je však pravdepodobné, že korelácia by bola vyššia keby sa pozeráme len na útočníkov, pretože obrancovia môžu tráviť veľa času na ľade a byť platnými hráčmi, aj keď nedávajú veľa gólov, lebo to nie je ich úlohou. Skúsime sa pozerať oddelene na útočníkov a obrancov.
Vzťah medzi počtom odohraných zápasov a priemerným počtom gólov¶
Modrou sú označení útočníci, oranžovou obrancovia. Z grafu vidíme, že útočníci dávajú v priemere viac gólov na zápas ako obrancovia. Nevidíme však nejakú výraznú koreláciu medzi počtom odohraných zápasov a počtom gólov na zápas.
Vzťah medzi priemerným počtom minút na zápas a priemerným počtom gólov¶
Tento graf už vyzerá zajímavejšie. Keď sa najprv pozrieme len na útočníkov (modrá), tak máme tam síce nejaké outliery, ale väčšina hodnôt je v jednom hlúčiku, ktorý má stúpajúci trend. Teda vyzerá, že existuje vzťah medzi počtom gólov a počtom odohraných minút pre útočníkov. Pre obrancov táto korelácia nie je viditeľná, sú rozdelení na dva hlúčiky. Máme jeden hlúčik obrancov, čo odohrávajú málo minút za zápas a potom druhý hlúčik, čo odohráva veľa minút za zápas ale priemerné počty gólov sa pre oba hlúčiky pohybujú v podobných hodnotách.
Vzťah medzi priemerným počtom minút na zápas a priemerným počtom asistencií¶
Pre útočníkov to vyzera podobne ako v predchádzajúcom grafe. Pre obrancov v podstate tiež, len to vyzerá, že dávajú viac asistencií. Znova by sme mohli usúdiť, že existuje vzťah medzi počtom asistencií a odohraných minút pre obrancov, ale nie pre útočníkov.
Vzťah medzi priemerným počtom minút na zápas a priemerným počtom striel¶
Vyzerá to takmer rovnako ako predchádzajúci graf. Znova by sme mohli usúdiť, že existuje vzťah medzi počtom striel a odohraných minút pre obrancov, ale nie pre útočníkov.
Modely nad dátami¶
V tejto časti sa už budeme zaoberať len hráčmi, ktorí sú útočníci (rozlíšime to na základe nami vytvoreného flagu defender, ktorý rozlišuje medzi obrancami a útočníkmi a budeme sa už pozerať len na podmnožinu dát). V predchádzajúcej sekcii sme zistili, že korelácia medzi výkonom hráča (počet striel na bránku/počet gólov) a počtom odohraných minút na zápas je oveľa viditeľnejšia pre útočníkov a preto si myslím, že bude lepšie vytvárať regresné modely len na tejto skupine hráčov. Z dát tiež odstránime riadky v ktorých sú NaN hodnoty.
Predikcia priemerného počtu striel na základe priemerného počtu minút na ľade¶
Najprv skúsime predikovať modelom logistickej regresie priemerný počet striel na zápas na základe priemerného počtu minút na ľade. Priemerný počet striel je nejaké reálne číslo, ktoré sa hýbe od 0 do takmer 7, s priemerom 1,44. Kvôli predikcii som sa rozhodla tieto hodnoty zlúčiť do kategórií (keďže budeme predikovať kategóriu), konkrétne máme 4 kategórie 0-1 strela, 1-2 strely, 2-3 strely a 3+ strely.
Najprv vytvoríme logistickej regresie, ktorý predikuje jednu z týchto kategórií na základe stĺpcov ATOI (priemerný počet minút na ľade a Age (vek).
Beta koeficienty: [[-0.8123562 0.04993546] [-0.22766533 0.02402472] [ 0.28509167 -0.02218872] [ 0.75492986 -0.05177146]] Správnosť (accurracy) na trénovacej množine: 0.659637439881613 Správnosť (accurracy) vyhodnotená pomocou krosvalidácie: [0.64053254 0.67340898 0.67044894 0.65318204]
Priemerná accurracy krosvalidácie cez 65% neznie zle. Je jasné, že sa to nedá predikovať len na základe tohto, ako sme aj videli na grafoch v predchádzajúcej sekcii, ale je zjavné, že do určitej miery sa to predikovaž dá.
Skúsila som ešte model logistickej regresie, ktorý predikuje len na základe ATOI, teda odstránili sme vek.
Beta koeficienty: [[-0.79644014] [-0.21675219] [ 0.27425174] [ 0.7389406 ]] Správnosť (accurracy) na trénovacej množine: 0.657417684054754 Správnosť (accurracy) vyhodnotená pomocou krosvalidácie: [0.63708087 0.66946226 0.66896892 0.64430192]
Accuracy nám klesla len veľmi minimálne, takže vek asi nehrá veľkú rolu.
Predikcia priemerného počtu striel v nasledujúcej sezóne¶
Skúsime vytvoriť model, ktorý by nám mohol na základe nejakých štatistík z predchádzajúcich sezón predikovať priemerný počet striel hráča v nasledujúcej sezóne. Rozdelíme si naše dáta na dve skupiny (dáta zo sezón 2004-2017 a dáta zo sezóny 2018). Model natrénujeme tak, aby nám na základe dát zo sezón 2004-2017 predikoval priemerný počet striel zo sezóny 2018, o ktorej model nemá iné informácie. Tým simulujeme predpovedanie na budúcu sezónu. Tento model by sme potom mohli použiť tak, že doňho dáme dáta za doterajšie sezóny a on by nám predikoval nasledujúcu sezónu.
Príprava dát¶
Dáta si teda rozdelíme na tieto 2 skupiny podľa hodnôt v stĺpci Season. Následne dáta zo starších skupín zgrupíme podľa Nicku hráča a zagregujeme tam nasledujúce stĺpce: GP, ATOI, GPP, APP, SPP, ku všetkým vyrátame ich priemer pre každého hráča cez všetky sezóny 2004-2017, v ktorých hral. To nám bude reprezentovať naše dáta o minulosti (o priemernom výkone hráča za všetky minulé sezóny).
Následne spojíme cez Nick tieto 2 skupiny dát, pričom z druhej skupiny si okrem Nicku necháme len hodnotu SPP za sezónu 2018. Tým dostaneme dáta, v ktorých máme pre každého hráča jeho informácie o minulosti a hodnotu SPP za szónu 2018. Z dát ešte odstránime riadky, v ktorých sú NaN hodnoty (jedná sa o hráčov, ktorí nehrali v sezóne 2018). Dostali sme týmto 507 riadkov.
Model logistickej regresie¶
Použijeme model logistickej regresie, ktorý dostane na vstup priemerné štatistiky o hráčovi z minulosti (tým, že sú priemerné, tak je jedno za koľko sezón), konkrétne stĺpce GP, ATOI, GPP, APP, SPP. Predikovať bude hodnotu SPP zo sezóny 2018, ktorú znova rozdelíme do 4 kategórií ako v predchádzajúcom modeli.
Beta koeficienty: [[ 2.77975496e-04 1.72202467e-02 -1.51381057e+00 -2.66137877e+00 -2.14453022e+00] [ 4.41185868e-03 4.56717121e-02 -2.07312241e+00 -1.01334302e+00 -1.12638865e+00] [-4.21534996e-03 9.27369815e-02 1.01477397e+00 1.32986981e+00 2.23355005e-01] [-4.74484215e-04 -1.55628940e-01 2.57215901e+00 2.34485198e+00 3.04756387e+00]] Správnosť (accurracy) na trénovacej množine: 0.6035502958579881 Správnosť (accurracy) vyhodnotená pomocou krosvalidácie: [0.60629921 0.59055118 0.64566929 0.55555556]
Priemerná accurracy pri krosvalidácii je okolo 60 percent, čo je celkom fajn, vzhľadom na to, že máme 4 kategórie.
Skúsila som ešte model logistickej regresie, ktorý predikuje len na základe stĺpcov ATOI a SPP:
Beta koeficienty: [[-0.0967748 -2.29888182] [-0.01392131 -1.24833317] [ 0.125313 0.31856369] [-0.01461689 3.2286513 ]] Správnosť (accurracy) na trénovacej množine: 0.5877712031558185 Správnosť (accurracy) vyhodnotená pomocou krosvalidácie: [0.62204724 0.57480315 0.5984252 0.57936508]
Vidíme, že accurracy nám klesla, ale nie nejak výrazne, takže tie zvyšné neboli pri predpovedaní až také podstatné.
Zhrnutie¶
Dáta sú úplne a konzistentné. Našli sme vzťah medzi priemerným počtom strávených minút na ľade a priemerným počtom gólov/asistencií/striel pre útočníkov. Dáva to zmysel - útočníci, ktorí sú v týchto činnostiach dobrí budú viac nasadzovaní a budú hrať viac minút za zápas. Pre obrancov tento vzťah v dátach nebol viditeľní.
Vytvorili sme modely na predikovanie priemerného počtu striel na zápas na základe priemerného času stráveného na ľade s presnosťou zhruba 65 percent a modely na predikovanie priemerného počtu striel na zápas v nasledujúcej sezóne na základe dát z minulosti s presnosťou zhruba 60 percent.
V budúcnosti by bolo dobré tieto modely viac preskúmať a skúsiť iné spôsoby predikcie. Model na predpovedanie na nasledujúcu sezónu má určite slabinu v tom, že sa na všetky dáta z minulosti pozerá rovnomerne a nepozerá sa na trend (či sa hráč v poslednom čase zlepšuje alebo zhoršuje), ani nedáva väčší dôraz na dáta z bližšej minulosti, čo by mohlo priniesť zlepšenie.
Takisto by bolo zaujímave skúsiť predikovať nejaké iné štatistiky.