Ciekawostka, Python

Ranking dyscyplin sportowych pod względem trudności. Analiza wariancji ANOVA

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

 

Komentarze z Facebooka

Mogą Ci się również spodobać...

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *