10. Kruskal Wallis toets#

10.1. Toepassing#

Gebruik de Kruskal Wallis toets om te toetsen of de gemiddelde rangnummers van de verdelingen van twee of meer groepen van elkaar verschillen.1, [&17] De Kruskal Wallis toets kan een alternatief zijn voor de one-way ANOVA.2 De Kruskal Wallis toets hoeft niet te voldoen aan de assumptie van normaliteit van de verdelingen van elke groep. Daarnaast hebben uitbijters bij de Kruskal Wallis toets minder invloed op het eindresultaat dan bij de one-way ANOVA. Daarentegen, als de data wel normaal verdeeld is, heeft de Kruskal Wallis toets minder onderscheidend vermogen4 dan de one-way ANOVA.3 Vandaar dat ondanks de voordelen van de grotere robuustheid er toch minder vaak voor de Kruskal Wallis toets gekozen wordt.

10.2. Onderwijscasus#

De opleidingsdirecteur van de tweejarige Masteropleiding Arbeidsrecht is geïnteresseerd in de afstudeersnelheid van haar studenten. Zij vraagt zich af of er een verschil zit in het type vooropleiding dat de studenten hebben gehaald en de hoeveel studiepunten die de studenten behalen in het eerste jaar. Zij kijkt naar de vier meest gangbare vooropleidingen die de studenten doorlopen voordat ze met de Master Arbeidsrecht beginnen: de Bachelors Fiscaal Recht, Notarieel Recht en Rechtsgeleerdheid en de Premaster.

Dit onderzoek vertaalt zich in de volgende combinatie van hypothesen, waarbij de nulhypothese zo geformuleerd is dat er geen effect of verschil is en de alternatieve hypothese zo geformuleerd is dat er wel een effect of verschil is.

H0: Het gemiddelde rangnummer van de verdeling van het aantal behaalde studiepunten in het eerste jaar van de master Arbeidsrecht is gelijk voor de studenten met als vooropleidingen Bachelor Fiscaal Recht, Notarieel Recht of Rechtsgeleerdheid of de Premaster.

HA: Het gemiddelde rangnummer van de verdeling van het aantal behaalde studiepunten in het eerste jaar van de master Arbeidsrecht is niet gelijk voor de studenten met als vooropleiding Bachelor Fiscaal Recht, Notarieel Recht of Rechtsgeleerdheid of de Premaster.

10.3. Assumpties#

Het meetniveau van de afhankelijke variabele is ordinaal16 of continu.6 In deze toetspagina staat een casus met continue data centraal; een casus met ordinale data met bijbehorende uitwerking is te vinden in de Kruskal Wallis toets II.

10.4. Post-hoc toets#

De Kruskal Wallis toets toetst of twee of meerdere groepen van elkaar verschillen. Een post-hoc toets specificeert of groep significant van een andere groep verschilt. Gebruik de Mann-Whitney U toets als post-hoc toets. Hoewel het minder gebruikelijk is, is Moods’mediaan toets ook een optie als post-hoc toets. Deze toets toetst het verschil tussen de medianen van twee ongepaarde groepen. De Mann-Whitney U toets toetst het verschil tussen de verdelingen van twee ongepaarde groepen.

Gebruik een correctie voor de p-waarden, omdat er meerdere toetsen tegelijkertijd worden gebruikt. Meerdere toetsen tegelijkertijd uitvoeren verhoogt de kans dat een van de nulhypotheses onterecht wordt verworpen en er bij toeval een verband wordt ontdekt dat er niet is (type I fout). In deze toetspagina wordt de Bonferroni correctie gebruikt. Deze correctie past de p-waarde aan door de p-waarde te vermenigvuldigen met het aantal uitgevoerde toetsen en verlaagt hiermee de kans op een type I fout.9 Een andere uitleg hiervan is dat het significantieniveau gedeeld wordt door het aantal toetsen wat leidt tot een lager significantieniveau en dus een strengere toets. Er zijn ook andere opties voor een correctie op de p-waarden.5

10.5. Effectmaat#

De p-waarde geeft aan of het verschil tussen groepen significant is. De grootte van het verschil of effect is echter ook relevant. Een effectmaat is een gestandaardiseerde maat die de grootte van een effect weergeeft, zodat effecten van verschillende onderzoeken met elkaar vergeleken kunnen worden.2

Bij de Kruskal Wallis toets wordt eta-squared (η^2^) als effectmaat gebruikt.10 De effectmaat eta squared (η^2^) berekent de proportie van de variantie in de afhankelijke variabele die verklaard wordt door de onafhankelijke variabele. In deze casus berekent het de proportie van de variantie in het aantal studiepunten wat verklaard kan worden door de vooropleiding. Een indicatie om η^2^ te interpreteren is: rond 0,01 is een klein effect, rond 0,06 is een gemiddeld effect en rond 0,14 is een groot effect.11

10.6. Uitvoering#

Er is een dataset dfResultaten_Arbeidsrecht ingeladen met studieresultaten van het eerste jaar van de master Arbeidsrecht per vooropleiding: Fiscaal Recht, Notarieel Recht, Rechtsgeleerdheid en de Premaster.

10.6.1. De data bekijken#

Gebruik <dataframe>.head() en <dataframe>.tail() om de structuur van de data te bekijken.

import pandas as pd
## Eerste 6 observaties
print(dfResultaten_Arbeidsrecht.head(6))
   Studentnummer    Vooropleiding  EC_Jaar1
0        3807246        Premaster        42
1        3915405        Premaster        36
2        3188059    Fiscaal Recht        60
3        3098956  Notarieel Recht        48
4        3367486    Fiscaal Recht        48
5        3590979        Premaster        12
## Laatste 6 observaties
print(dfResultaten_Arbeidsrecht.tail(6))
     Studentnummer      Vooropleiding  EC_Jaar1
294        3442156          Premaster        42
295        3757991  Rechtsgeleerdheid        54
296        3783610  Rechtsgeleerdheid        36
297        3055956      Fiscaal Recht        66
298        3041376  Rechtsgeleerdheid         0
299        3395844      Fiscaal Recht        60

De dataset bevat data van studenten van verschillende vooropleidingen. Gebruik <data.frame>.<kolomnaam>.unique() om te onderzoeken welke opleidingen er in de data aanwezig zijn.

## Opleidingen in de data aanwezig
print(dfResultaten_Arbeidsrecht['Vooropleiding'].unique())
['Premaster' 'Fiscaal Recht' 'Notarieel Recht' 'Rechtsgeleerdheid']

Inspecteer om meer inzicht te krijgen in de data de groepen met .size() en .quantile(). Groepeer hiervoor eerst met <dataframe>.groupby([<column>]). De mediaan is gelijk aan kwantiel 0.5.

print(dfResultaten_Arbeidsrecht.groupby(['Vooropleiding']).size())
Vooropleiding
Fiscaal Recht        71
Notarieel Recht      77
Premaster            81
Rechtsgeleerdheid    71
dtype: int64
print(dfResultaten_Arbeidsrecht.groupby(['Vooropleiding']).quantile([0.25, 0.5, 0.75]))
                        Studentnummer  EC_Jaar1
Vooropleiding                                  
Fiscaal Recht     0.25      3326401.5      30.0
                  0.50      3609937.0      54.0
                  0.75      3787836.0      66.0
Notarieel Recht   0.25      3168105.0      42.0
                  0.50      3543586.0      54.0
                  0.75      3778668.0      60.0
Premaster         0.25      3264950.0      30.0
                  0.50      3494636.0      42.0
                  0.75      3704366.0      54.0
Rechtsgeleerdheid 0.25      3175899.5      21.0
                  0.50      3435286.0      36.0
                  0.75      3720481.0      48.0
import numpy as np
EC_FSC = np.array(dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Fiscaal Recht"]["EC_Jaar1"])
EC_NTR = np.array(dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Notarieel Recht"]["EC_Jaar1"])
EC_PRE = np.array(dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Premaster"]["EC_Jaar1"])
EC_REC = np.array(dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Rechtsgeleerdheid"]["EC_Jaar1"])

vN_FIS = len(EC_FSC)
vN_NOT = len(EC_NTR)
vN_RCH = len(EC_PRE)
vN_PM = len(EC_REC)

vQ1_FIS = np.quantile(EC_FSC, 0.25)
vQ1_NOT = np.quantile(EC_NTR, 0.25)
vQ1_PM = np.quantile(EC_PRE, 0.25)
vQ1_RCH = np.quantile(EC_REC, 0.25)

vMed_FIS = np.quantile(EC_FSC, 0.5)
vMed_NOT = np.quantile(EC_NTR, 0.5)
vMed_RCH = np.quantile(EC_REC, 0.5)
vMed_PM = np.quantile(EC_PRE, 0.5)

vQ3_FIS = np.quantile(EC_FSC, 0.75)
vQ3_NOT = np.quantile(EC_NTR, 0.75)
vQ3_RCH = np.quantile(EC_REC, 0.75)
vQ3_PM = np.quantile(EC_PRE, 0.75)
  • Mediaan Fiscaal Recht is r Round_and_format(py$vMed_FIS), n = r py$vN_FIS.

  • Mediaan Notarieel Recht is r Round_and_format(py$vMed_NOT), n = r py$vN_NOT.

  • Mediaan Premaster is r Round_and_format(py$vMed_PM), n = r py$vN_PM.

  • Mediaan Rechtsgeleerdheid is r Round_and_format(py$vMed_RCH), n = r py$vN_RCH.

10.6.2. De data visualiseren#

Geef de verdeling van de verschillende vooropleidingen visueel weer met een histogram.18

# Laad seaborn of facets te maken
import seaborn as sb
# Laad matplotlib.pyplot om plots te maken
import matplotlib.pyplot as plt

# Maak een facet plot met een histogram voor elke vooropleiding
g = sb.FacetGrid(dfResultaten_Arbeidsrecht, col="Vooropleiding")
g = (g.map(plt.hist, "EC_Jaar1", edgecolor = "black").set_axis_labels("Aantal studiepunten jaar 1"))
plt.show()
../_images/10 Kruskal Wallis toets I-Python_14_0.png

Allereerst valt op dat de verdeling enigszins discreet is. Aangezien er in deze casus zes studiepunten per vak te verdienen zijn met een totaal van 60 in het eerste jaar, bestaan de histogrammen uit staven waartussen de verschillen zes studiepunten zijn. De verdeling van alle vier de vooropleidingen zijn niet normaal maar scheef verdeeld. Met uitzondering van de vooropleiding Rechtsgeleerdheid ligt de top op 60 studiepunten en is er een staart links daarvan.

10.6.3. Kruskal Wallis toets#

Voer de Kruskal Wallis toets uit om te onderzoeken of er verschillen zijn in het aantal studiepunten in het eerste jaar tussen de studenten van de master Arbeidsrecht met vier verschillende vooropleidingen Gebruik de functie kruskal() van het package scipy met als argumenten vier variabelen met het aantal studiepunten EC_Jaar1 voor elk van de vier vooropleidingen. Bij deze functie toetst Python standaard tweezijdig.

# Maak een variabele met het aantal studiepunten voor elke vooropleiding
EC_FSC = dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Fiscaal Recht"]["EC_Jaar1"]
EC_NTR = dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Notarieel Recht"]["EC_Jaar1"]
EC_PRE = dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Premaster"]["EC_Jaar1"]
EC_REC = dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Rechtsgeleerdheid"]["EC_Jaar1"]
# Voer de Kruskal Wallis toets uit
import scipy.stats as sp
print(sp.kruskal(EC_FSC, EC_NTR, EC_PRE, EC_REC))
KruskalResult(statistic=44.55700466208389, pvalue=1.1492264323603119e-09)

Bereken de effectmaat η^2^ vervolgens op basis van de χ^2^-waarde van de Kruskal-Wallis toets.

# Sla de teststatistiek op
stat, pval = sp.kruskal(EC_FSC, EC_NTR, EC_PRE, EC_REC)

# Bereken eta squared
Eta_squared = stat / (len(dfResultaten_Arbeidsrecht['EC_Jaar1']) - 1)

# Print de effectgrootte
print(Eta_squared)
0.14902008248188592
  • df: het aantal groepen - 1 = r py$df

  • H = r Round_and_format(py$stat), df = r py$df, p < 0,0001, η^2^ = r Round_and_format(py$Eta_squared) 13

  • p-waarde < 0,05, dus de H0 wordt verworpen14

  • Eta squared is r Round_and_format(py$Eta_squared) wat duidt op een gemiddeld tot groot effect

10.6.4. Post-hoc toets: Mann-Whitney U toets#

Gebruik de Mann-Whitney U toets als post-hoc toets om te bepalen wélke groepen significant verschillen. De Mann-Whitney U toets wordt ook wel de Wilcoxon rank-sum toets genoemd.10 Gebruik de functie pg.mwu().

import scikit_posthocs as skph

skph.posthoc_mannwhitney(dfResultaten_Arbeidsrecht, val_col = 'EC_Jaar1', group_col = 'Vooropleiding', p_adjust = 'bonferroni')
Fiscaal Recht Notarieel Recht Premaster Rechtsgeleerdheid
Fiscaal Recht 1.000000e+00 1.000000e+00 0.003341 5.709098e-07
Notarieel Recht 1.000000e+00 1.000000e+00 0.011389 1.214361e-07
Premaster 3.341440e-03 1.138931e-02 1.000000 2.170487e-02
Rechtsgeleerdheid 5.709098e-07 1.214361e-07 0.021705 1.000000e+00

De Mann-Whitney U toets gebruikt het gemiddelde rangnummer van twee ongepaarde groepen om de significantie van de toets te bepalen. Met behulp van het gemiddelde rangnummer kan bepaald worden welke groep hogere rangnummers heeft wat een benadering is voor het verschil tussen twee verdelingen.15 In deze casus heeft de vooropleiding met een hoger rangnummer dus over het algemeen studenten met een hoger aantal studiepunten. Bereken en rapporteer daarom het gemiddelde rangnummer.

import numpy as np
def Gemiddelde_rangschikking(Vooropleiding_1, Vooropleiding_2):
  # Bind alle observaties in een variabele
  Aantal_studiepunten = np.concatenate((np.array(Vooropleiding_1), np.array(Vooropleiding_2)))
  
  # Maak een variabele die aangeeft in welke groep de observatie zit
  Groepsindicator = np.concatenate([[1]*len(Vooropleiding_1),[2]*len(Vooropleiding_2)])

  # Bereken de rangschikkingen van alle observaties
  Rangschikkingen = sp.rankdata(Aantal_studiepunten)

  # Bereken de gemiddelde rangschikking voor beide vooropleidingen
  Gemiddelde_rangschikking_Vooropleiding_1 = np.mean(Rangschikkingen[Groepsindicator == 1])
  Gemiddelde_rangschikking_Vooropleiding_2 = np.mean(Rangschikkingen[Groepsindicator == 2])
  # Print resultaten
  return [Gemiddelde_rangschikking_Vooropleiding_1, Gemiddelde_rangschikking_Vooropleiding_2];

# Definieer variabelen die observaties bevatten voor de verschillende vooropleidingen
Studiepunten_Fiscaal_Recht = dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Fiscaal Recht"]["EC_Jaar1"]
Studiepunten_Notarieel_Recht = dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Notarieel Recht"]["EC_Jaar1"]
Studiepunten_Premaster = dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Premaster"]["EC_Jaar1"]
Studiepunten_Rechtsgeleerdheid = dfResultaten_Arbeidsrecht[dfResultaten_Arbeidsrecht['Vooropleiding'] == "Rechtsgeleerdheid"]["EC_Jaar1"]


# Bereken de gemiddelde rangschikkingen voor elke vergelijking
Gem_FR_NR_1, Gem_FR_NR_2 = Gemiddelde_rangschikking(Studiepunten_Fiscaal_Recht, Studiepunten_Notarieel_Recht)

Gem_FR_PM_1, Gem_FR_PM_2 = Gemiddelde_rangschikking(Studiepunten_Fiscaal_Recht, Studiepunten_Premaster)

Gem_FR_RG_1, Gem_FR_RG_2 = Gemiddelde_rangschikking(Studiepunten_Fiscaal_Recht, Studiepunten_Rechtsgeleerdheid)

Gem_NR_PM_1, Gem_NR_PM_2 = Gemiddelde_rangschikking(Studiepunten_Notarieel_Recht, Studiepunten_Premaster)

Gem_NR_RG_1, Gem_NR_RG_2 = Gemiddelde_rangschikking(Studiepunten_Notarieel_Recht, Studiepunten_Rechtsgeleerdheid)

Gem_PM_RG_1, Gem_PM_RG_2 = Gemiddelde_rangschikking(Studiepunten_Premaster, Studiepunten_Rechtsgeleerdheid)

Vergelijking

p-waarde

Gemiddelde rangschikking (links)

Gemiddelde rangschikking (rechts)

FR vs. NR

1,00 r #Round_and_format(abs(py$p_FR_NR))

r Round_and_format(py$Gem_FR_NR_1)

r Round_and_format(py$Gem_FR_NR_2)

FR vs. PM

0,10 r #Round_and_format(abs(py$p_FR_PM))

r Round_and_format(py$Gem_FR_PM_1)

r Round_and_format(py$Gem_FR_PM_2)

FR vs. RG

< 0,0001 r #Round_and_format(abs(py$p_FR_RG))

r Round_and_format(py$Gem_FR_RG_1)

r Round_and_format(py$Gem_FR_RG_2)

NR vs. PM

0,02 r #Round_and_format(abs(py$p_NR_PM))

r Round_and_format(py$Gem_NR_PM_1)

r Round_and_format(py$Gem_NR_PM_2)

NR vs. RG

< 0,0001 r #Round_and_format(abs(py$p_NR_RG))

r Round_and_format(py$Gem_NR_RG_1)

r Round_and_format(py$Gem_NR_RG_2)

PM vs. RG

0,03 r #Round_and_format(abs(py$p_PM_RG))

r Round_and_format(py$Gem_PM_RG_1)

r Round_and_format(py$Gem_PM_RG_2)

Tabel 1. Resultaten post-hoc toetsen voor vergelijking Fiscaal Recht (FR), Notarieel Recht (NR), Premaster (PM) en Rechtsgeleerdheid (RG).

Als voorbeeld wordt de bovenste rij van Tabel 1 in woorden uitgelegd. Er is geen significant verschil gevonden tussen Fiscaal (Gemiddelde rangschikking = r Round_and_format(py$Gem_FR_NR_1), n=r py$vN_FIS) Recht en Notarieel Recht (Gemiddelde rangschikking = r Round_and_format(py$Gem_FR_NR_2), n=r py$vN_NOT), p=1,00.

10.7. Rapportage#

De Kruskal Wallis toets is uitgevoerd om te toetsen of er verschillen zijn tussen de studenten van de Master Arbeidsrecht met als vooropleiding Bachelor Fiscaal Recht, Notarieel Recht of Rechtsgeleerdheid of de Premaster wat betreft de verdeling van het aantal studiepunten dat de studenten in het eerste jaar behalen. Uit de resultaten kan afgelezen worden dat er een significant verschil is tussen de verdelingen van het aantal studiepunten voor de verschillende vooropleidingen, H = r Round_and_format(py$stat), df = r py$df, p < 0,0001, η^2^ = r Round_and_format(py$Eta_squared). De resultaten ondersteunen de conclusie dat er een verschil is tussen studenten van de vier verschillende vooropleidingen wat betreft de verdeling van de hoeveelheid studiepunten die studenten behalen tijdens het eerste jaar van de master Arbeidsrecht.

De Mann-Whitney U toets is uitgevoerd als post-hoc toets om te onderzoeken welke vooropleidingen van elkaar verschillen qua aantal studiepunten dat studenten behalen. De studenten met Rechtsgeleerdheid als vooropleiding behalen significant minder punten bij de Master Arbeidsrecht, dan de studenten met een andere vooropleiding. Er is ook een significant verschil gevonden tussen de behaalde studiepunten van studenten met de vooropleiding Notarieel Recht en de Premaster, waarbij de studenten van de Premaster minder punten behaalden dan de studenten van Notarieel Recht. Er zijn geen significante verschillen gevonden tussen de vooropleidingen Fiscaal Recht en Notarieel Recht, en Fiscaal Recht en Premaster. De Bonferroni correctie is gebruikt om de Type I fout te voorkomen die gepaard gaat met het veelvuldig toetsen. De gemiddelde rangschikkingen en p-waarden van de post-hoc toetsen zijn te vinden in Tabel 1.


1

De toets rangschikt de datapunten van laag naar hoog en geeft elke datapunt een rangnummer. Vervolgens wordt per groep het gemiddelde berekend van de rangnummers. Deze gemiddelden wordt met elkaar vergeleken. Voor meer informatie lees: Field, A., Miles, J., & Field, Z. (2012). Discovering statistics using R. London: Sage publications.

2(1,2)

Van Geloven, N. (21 maart 2018). Kruskal Wallis. Wiki Statistiek Academisch Medisch Centrum.

4

Onderscheidend vermogen, in het Engels power genoemd, is de kans dat de nulhypothese verworpen wordt wanneer de alternatieve hypothese ‘waar’ is.

3

Universiteit van Amsterdam (7 juli 2014). Kruskal-Wallis Test. UvA Wiki Methodologiewinkel.

16

Een ordinale variabele is een categorische variabele waarbij de categorieën geordend kunnen worden. Een voorbeeld is de variabele beoordeling met de categorieën Onvoldoende, Voldoende, Goed en Uitstekend.

6

Van Geloven, N. (21 November 2017). KEUZE TOETS. Wiki Statistiek Academisch Medisch Centrum.

9

Universiteit van Amsterdam (7 juli 2014). Kruskal-Wallis Test. UvA Wiki Methodologiewinkel.

5

Field, A., Miles, J., & Field, Z. (2012). Discovering statistics using R. London: Sage publications.

10(1,2)

De effectmaat η^2^ wordt voor de Kruskal-Wallis toets berekend door de χ^2^-waarde te delen door het totaal aantal observaties minus één, i.e. \(\frac{\chi^2}{N-1} \).

11

Allen, P. & Bennett, K. (2012). SPSS A practical Guide version 20.0. Cengage Learning Australia Pty Limited.

18

De breedte van de staven van het histogram wordt vaak automatisch bepaald, maar kan handmatig aangepast worden. Aangezien de breedte van de staven bepalend zijn voor de indruk die de visualisatie geeft, is het verstandig om hier goed op te letten.

13

De test-statistiek H volgt bij benadering de chi-kwadraat verdeling. Onder deze hypothese is H chi-kwadraat, vandaar dat dit in de output uitgedrukt wordt in chi-kwadraat.

14

In dit voorbeeld wordt uitgegaan van een waarschijnlijkheid van 95% c.q. een p-waardegrens van 0,05. De grens is naar eigen inzicht aan te passen; houd hierbij rekening met Type I en Type II fouten.

15

Field, A. (2013). Discovering statistics using IBM SPSS statistics. Sage.