W dzisiejszym wpisie zajęliśmy się analizą zbioru danych [1] zawierającego ranking dyscyplin sportowych pod względem stopnia trudności.
Cechy zbioru:
- Łączna liczba dyscyplin sportowych: 60;
- 10 parametrów wziętych pod uwagę do budowy rankingu: wytrzymałość, siła, moc, szybkość, zręczność, gibkość, odwaga, wytrwałość, koordynacja ręka-oko, zdolność analitycznego myślenia/odpowiednia reakcja w strategicznych momentach;
- Każdy parametr był oceniany w skali 1-10, a więc maksymalna suma punktów do zdobycia wynosiła 100;
Ranking dyscyplin
Pierwsza dziesiątka dyscyplin sportowych przedstawia się następująco:
1. Boks – 72.375 pkt.
2. Hokej na lodzie 71,75 pkt.
3. Futbol amerykański 68,375 pkt.
4. Koszykówka 67,875 pkt.
5. Wrestling 63,5 pkt.
6. Sztuki walki 63,375 pkt.
7. Tenis ziemny 62,75 pkt.
8. Gimnastyka 62,5 pkt.
9. Baseball 62,25 pkt.
10. Piłka nożna 61,5 10 pkt.
Na poniższym wykresie pudełkowym zobrazowany został rozkład poszczególnych cech.
Analiza wariancji
Do dalszej analizy podzieliliśmy dyscypliny na grupy:
1. Dyscypliny indywidualne:
Gimnastyka, Narciarstwo dowolne, Alpinizm, Skok o tyczce, Łyżwiarstwo szybkie, Łyżwiarstwo figurowe, Kolarstwo szosowe, Squash, Surfing, Kolarstwo torowe, Skok wzwyż, Skok w dal, Jazda na deskorolce, Biegi krótkodystansowe, Biegi długodystansowe, Biegi średniodystansowe, Narciarstwo wodne, Kulturystyka, Wyścigi konne, Jeździectwo, Łucznictwo, Kręgle, Strzelectwo, Wędkarstwo, Bilard
2. Dyscypliny zespołowe:
Rugby, Piłka Nożna, Baseball, Hokej na lodzie, Futbol amerykański, Koszykówka, Piłka wodna, Hokej na trawie, Cheerleading, Siatkówka, Piłka ręczna, Curling, Bobsleje, Lacrosse
3. Dyscypliny mieszane:
Tenis stołowy, Tenis ziemny, Badminton, Skoki narciarskie, Wyścigi samochodowe, Wioślarstwo, Nurkowanie, Podnoszenie ciężarów, Pływanie długodystansowe, Pływanie krótkodystansowe, Kajakarstwo, Golf, Jazda na rolkach
4. Dyscypliny indywidualne-kontaktowe:
Sztuki walki, Wrestling, Boks, Szermierka, Rodeo: Calf Roping, Rodeo Steer Wrestling, Rodeo: Bull/Bareback/Bronc Riding
Do zbioru danych dodaliśmy kolumnę o nazwie „Grupa” i w każdym wierszu wstawiliśmy odpowiednią wartość dla każdej dyscypliny (1,2,3,4). Następnie za pomocą języka Python, przy wykorzystaniu modułu pandas zbudowaliśmy dwuwymiarową strukturę DataFrame w której zapisaliśmy cały zbiór danych z pliku o rozszerzeniu CSV. Na tej podstawie mogliśmy zbudować DataFrame dla każdej z grup.
import pandas as pd df = pd.read_csv("toughestsport.csv",sep=";") Grupa1 = df[(df['Grupa'] == 1)] Grupa1= Grupa1.reset_index(drop=True) Grupa2 = df[(df['Grupa'] == 2)] Grupa2= Grupa2.reset_index(drop=True) Grupa3 = df[(df['Grupa'] == 3)] Grupa3= Grupa2.reset_index(drop=True) Grupa4 = df[(df['Grupa'] == 4)] Grupa4= Grupa4.reset_index(drop=True)
Na wykresach pudełkowych przedstawiliśmy rozkład cech dla poszczególnych grup.
Dyscypliny indywidulne
Dyscypliny zespołowe
Dyscypliny mieszane
Dyscypliny indywidualne-kontaktowe
Jednoczynnikowa analiza wariancji ANOVA została przeprowadzana w celu wyjaśnienia wpływu poszczególnych cech zbioru na wynik, jaki osiągnęły dyscypliny w rankingu. Przed przystąpieniem do tego typu analizy należy zweryfikować czy badany zbiór danych spełnia pewne założenia, a mianowicie czy cechy/czynniki mają jednorodną wariancje, czyli czy nie różnią się zmiennością oraz czy mają rozkład normalny. Jeżeli zbiór danych nie spełnia tych założeń to zalecana jest transformacja cech/czynników.
Weryfikacja normalności cech
Do sprawdzenia czy cechy mają rozkład normalny wykorzystaliśmy test Shapiro-Wilka. W trakcie testu sprawdzana jest hipoteza zerowa zakładająca, że próba badawcza pochodzi z populacji o rozkładzie normalnym. Jeśli wartość istotności p jest większa niż 0,05 to brak jest podstaw do odrzucenia hipotezy zerowej i tym samym stwierdza się, że próba ma kształt krzywej Gaussa (rozkład cechy jest rozkładem normalnym). Test Shapiro-Wilka rekomendowany jest dla grup o liczebności nieprzekraczającej 100 elementów. Dla większych grup zalecane jest użycie testu Kołmogorowa-Smirnowa.
Poniższy kod wykorzystuję moduł scipy.stats do przeprowadzenia testu Shapiro-Wilka.
def testShapiroWilka(data): F, p = stats.shapiro(data) print('F=%.3f, p=%.3f' % (F, p)) alpha = 0.05 if p > alpha: print('Próba ma kształt krzywej Gaussa(brak jest podstaw do odrzucenia hipotezy zerowej)') else: print('Próba nie ma kształtu krzywej Gaussa(odrzucenie hipotezy zerowej)') for x in range(1,5): print('-----------------------Shapiro-Wilk Grupa ',x,'-------------------------------------') group = df[(df['Grupa'] == x)] for (columnName, data) in group.iloc[:, 1:11].iteritems(): print('Nazwa parametru : ', columnName) testShapiroWilka(group[columnName])
Weryfikacja jednorodności wariancji
Jednym ze sposobów przeprowadzenia weryfikacji jednorodności wariancji jest test Levene’a. W trakcie testu sprawdzana jest hipoteza zerowa zakładająca równość wariancji. Jeśli wartość istotności p jest większa niż 0,05 to brak jest podstaw do odrzucenia hipotezy zerowej i tym samym zakłada się równość wariancji w badanych grupach. Podstawowym wymogiem testu jest rozkład normalny cech oraz porównywalna liczebność w każdej grupie. W naszym przypadku liczebność przedstawia się następująco: Grupa 1 – 25, Grupa 2 -14, Grupa 3 – 16, Grupa 4 – 5, a więc nie jest spełniony wymóg dotyczący równej liczebności grup. Modyfikacją testu Levene’a, niewymagającą porównywalnej liczebności w próbach jest test Browna-Forsythe’a
Poniższy kod wykorzystuję ten sam moduł scipy.stats do przeprowadzenia testu Levena, a dokładnie testu Browna-Forsythe’a (wystarczy przy center podać median).
def testLevenea(grupa1, grupa2,grupa3,grupa4): F, p = stats.levene(grupa1, grupa2,grupa3,grupa4, center='median') print('F=%.3f, p=%.3f' % (F, p)) alpha = 0.05 if p > alpha: print('Wariancje grup są równe (brak jest podstaw do odrzucenia hipotezy zerowej)') else: print('Wariancje grup nie są równe (odrzucenie hipotezy zerowej)') for (columnName, data) in Grupa1.iloc[:, 1:11].iteritems(): print('Nazwa parametru : ', columnName) testLevenea(Grupa1[columnName], Grupa2[columnName],Grupa3[columnName], Grupa4[columnName])
ANOVA
Na koniec jeżeli cechy spełniają założenia to można je poddać testowi Anova.
Poniższy kod również wykorzystuję moduł scipy.stats do przeprowadzenia testu Anova.
def testAnova(grupa1, grupa2,grupa3,grupa4): F, p = stats.f_oneway(grupa1, grupa2,grupa3,grupa4) print('F=%.3f, p=%.3f' % (F, p)) alpha = 0.05 if p > alpha: print('nie ma znaczących różnic pomiędzy grupami (brak jest podstaw do odrzucenia hipotezy zerowej)') else: print('są znaczące różnice pomiędzy grupami (odrzucenie hipotezy zerowej)') for (columnName, data) in Grupa1.iteritems(): print('Nazwa parametru : ', columnName) testAnova(Grupa1[columnName], Grupa2[columnName],Grupa3[columnName], Grupa4[columnName])
Źródła danych
[1] Ranking dyscyplin sportowych