Cursus
Meerdere groepen vergelijken is eenvoudig als je data normaal verdeeld is. Het probleem is: de meeste data uit de echte wereld is dat niet.
Als ANOVA je standaardtoets is, kom je tot de verkeerde conclusies, omdat die ervan uitgaat dat je data een normale verdeling volgt. Wanneer dat niet zo is - denk aan scheve data of kleine steekproeven - heb je een andere aanpak nodig.
De Kruskal-Wallis-toets is die andere aanpak. Het is een niet-parametrisch alternatief voor ANOVA en werkt op gerangschikte data in plaats van ruwe waarden, waardoor een normale verdeling geen vereiste is.
In dit artikel behandel ik het concept, de wiskunde erachter, hoe je de toets uitvoert in Python en R, en hoe je de resultaten interpreteert.
Wat is de Kruskal-Wallis-toets?
De Kruskal-Wallis-toets is een niet-parametrische methode om drie of meer onafhankelijke groepen te vergelijken. Hij zet alle observaties om in rangen en vergelijkt die rangen tussen groepen in plaats van met ruwe waarden te werken.
Je kunt het zien als een uitbreiding van de Mann-Whitney U-toets, waarover ik ook heb geschreven.
De Mann-Whitney U doet dezelfde ranggebaseerde vergelijking, maar dan voor slechts twee groepen. De Kruskal-Wallis-toets schaalt dit op naar drie of meer, dus wanneer je meerdere groepen hebt en ANOVA niet kunt gebruiken, is dit wat je moet inzetten.
Omdat hij met rangen werkt in plaats van ruwe waarden, gaat hij niet uit van een specifieke verdeling van je data. Dat maakt hem nuttig voor data uit de praktijk, die zelden perfect één verdelingstype volgt.
Wanneer gebruik je de Kruskal-Wallis-toets
De Kruskal-Wallis-toets is ideaal wanneer je te maken hebt met:
- Drie of meer onafhankelijke groepen die je wilt vergelijken
- Ordinale of continue data zoals Likertschaal-beoordelingen of meetdata
- Niet-normale verdelingen door scheve data, uitschieters, kleine steekproeven of alles wat ANOVA niet aankan
- Kleine steekproeven waarbij normaliteit lastig te verifiëren is
Hier is een eenvoudig voorbeeld.
Stel, je wilt eindexamencijfers vergelijken van drie verschillende klassen. De scores zijn scheef verdeeld en de steekproeven zijn klein, dus ANOVA is geen goede keuze. De Kruskal-Wallis-toets heeft geen normaliteit nodig, dus die werkt hier. Hij vertelt je of minstens één klas anders scoorde dan de andere, zonder aannames te maken die je data niet kan dragen.
Kruskal-Wallis-toets vs. ANOVA
Beide toetsen vergelijken groepen, maar ze doen dat op een andere manier.
ANOVA vergelijkt groepsgemiddelden en gaat ervan uit dat je data normaal verdeeld is met ongeveer gelijke varianties. Als die aannames kloppen, is dit de betere keuze - statistisch krachtiger en eenvoudiger te interpreteren.
De Kruskal-Wallis-toets vergelijkt groepsverdelingen met behulp van rangen. Hij geeft niet om normaliteit of gelijke varianties. Dat maakt hem flexibeler, maar je levert wel wat statistische power in.
Hier is een snelle vergelijkingstabel:

ANOVA vergeleken met de Kruskal-Wallis-toets
Is je data normaal verdeeld, gebruik dan ANOVA. Is dat niet zo - of kun je het niet verifiëren - gebruik dan Kruskal-Wallis.
Formule van de Kruskal-Wallis-toets
De Kruskal-Wallis-toets komt neer op één teststatistiek, H. Dit is de formule:

Kruskal-Wallis-formule
Hier is de uitleg van de componenten:
-
N- totaal aantal observaties over alle groepen -
k- aantal groepen -
n_i- aantal observaties in groepi -
R_i- som van rangen toegekend aan groepi
De formule meet hoeveel de rangensommen van elke groep afwijken van wat je zou verwachten als alle groepen identiek waren. Een grote H betekent dat de groepen verschillend zijn, en een kleine H dat ze niet zo verschillend zijn.
Zodra je H hebt, vergelijk je die met een chi-kwadraatverdeling met k - 1 vrijheidsgraden om een p-waarde te krijgen.
Hoe de Kruskal-Wallis-toets werkt
Er zijn vier stappen nodig om de Kruskal-Wallis-toets uit te voeren:
- Combineer alle groepen: Neem alle observaties uit iedere groep en voeg ze samen tot één dataset
- Rangschik alle observaties: Sorteer de gecombineerde data van klein naar groot en ken rangen toe. De kleinste waarde krijgt rang 1, de volgende rang 2, enzovoort. Als twee waarden gelijk zijn, delen ze het gemiddelde van de rangen die ze zouden hebben ingenomen.
- Bereken rangensommen: Verdeel de rangen terug over hun oorspronkelijke groepen. Tel de rangen per groep op. Dit zijn je rangensommen -
R_iin de formule - Bereken de teststatistiek: Vul de rangensommen in de
H-formule in. Als de groepen vergelijkbaar zijn, liggen hun rangensommen dicht bij elkaar en isHklein. Als één groep consequent hogere of lagere rangen krijgt, wordtHgroter
En dat is alles!
Je ziet dat de toets niet om de daadwerkelijke waarden geeft, maar alleen om hun positie ten opzichte van de rest.
Kruskal-Wallis-toets in Python
De Python-bibliotheek scipy heeft een ingebouwde functie voor de Kruskal-Wallis-toets, waardoor je de formule niet met de hand hoeft te implementeren. Laten we een voorbeeld doornemen.
Stel dat je eindexamencijfers vergelijkt tussen drie klassen. Zo voer je de toets uit:
from scipy import stats
# Exam scores
class_a = [78, 85, 90, 72, 88]
class_b = [65, 70, 68, 74, 60]
class_c = [88, 92, 95, 85, 91]
# Run the test
statistic, p_value = stats.kruskal(class_a, class_b, class_c)
print(f"H statistic: {statistic:.4f}")
print(f"P-value: {p_value:.4f}")

Python-uitvoer
De p-waarde is lager dan 0,05, wat betekent dat minstens één klas anders scoorde dan de andere. Onthoud wel dat de toets je niet vertelt welke - daarvoor heb je een post-hoc-toets nodig, die ik in de volgende sectie behandel.
Kruskal-Wallis-toets in R
Net als in Python heeft R een ingebouwde functie voor deze toets. We gebruiken hetzelfde examencijferscenario.
# Exam scores
class_a <- c(78, 85, 90, 72, 88)
class_b <- c(65, 70, 68, 74, 60)
class_c <- c(88, 92, 95, 85, 91)
# Combine
scores <- c(class_a, class_b, class_c)
groups <- factor(rep(c("A", "B", "C"), each = 5))
# Run the test
kruskal.test(scores ~ groups)

R-uitvoer
De output is hetzelfde als wat ik in Python kreeg - dezelfde H-statistiek, dezelfde p-waarde. Met p < 0,05 verwerp je de nulhypothese en concludeer je dat minstens één groep verschilt.
Hoe je Kruskal-Wallis-resultaten interpreteert
De nulhypothese van de Kruskal-Wallis-toets is dat alle groepen dezelfde verdeling hebben. De p-waarde vertelt je of je die moet verwerpen. Zo interpreteer je het:
- p < 0,05: Minstens één groep verschilt van de andere, dus verwerp de nulhypothese
- p >= 0,05: Er is geen sterk bewijs dat de groepen verschillen, dus verwerp de nulhypothese niet
De drempel van 0,05 is een conventie. Afhankelijk van je vakgebied of de impact van je analyse, kun je een strengere drempel zoals 0,01 of een ruimere zoals 0,10 gebruiken.
Houd er rekening mee dat deze toets je niet vertelt welke groep verschilt. Een significant resultaat betekent alleen dat de groepen niet allemaal hetzelfde zijn. Je weet dat er iets aan de hand is, maar niet waar. Om te achterhalen welke paren het verschil veroorzaken, heb je een post-hoc-toets nodig.
Post-hoc-toetsen na Kruskal-Wallis
De toets vertelt je dat minstens één groep verschilt, maar niet welke groep daadwerkelijk anders is. Als je drie groepen hebt en p < 0,05, kan dat A versus B zijn, A versus C, B versus C, of een combinatie. Je moet een post-hoc-toets uitvoeren om deze paarvergelijkingen te krijgen.
De toets van Dunn is de meest gangbare keuze. Die voert paargewijze vergelijkingen tussen alle groepen uit en past de p-waarden aan om rekening te houden met multiple testing - zonder die correctie vergroot je de kans op een vals-positief. Hoe meer vergelijkingen je doet, hoe groter het risico dat je toevallig een "significant" resultaat vindt.
Dunns toets in Python
Hiervoor heb je de bibliotheek scikit_posthocs nodig. Als je die niet hebt, installeer dan met pip install scikit-posthocs.
Daarna is de berekening eenvoudig:
import scikit_posthocs as sp
import pandas as pd
# Same exam scores as before
class_a = [78, 85, 90, 72, 88]
class_b = [65, 70, 68, 74, 60]
class_c = [88, 92, 95, 85, 91]
# Combine
scores = class_a + class_b + class_c
groups = ["A"] * 5 + ["B"] * 5 + ["C"] * 5
df = pd.DataFrame({"score": scores, "group": groups})
# Run the test
result = sp.posthoc_dunn(df, val_col="score", group_col="group", p_adjust="bonferroni")
print(result)

Dunns toets in Python
Elke cel toont de aangepaste p-waarde voor dat paar. Hier overschrijdt alleen B versus C (p = 0,004) de drempel van 0,05, dus die twee groepen verschillen. A versus B (p = 0,167) en A versus C (p = 0,607) niet, wat betekent dat klas A statistisch niet verschilt van de andere twee.
Dunns toets in R
Begin met het installeren van de bibliotheek indien nodig met het commando install.packages("dunn.test"):
library(dunn.test)
# Same exam scores as before
class_a <- c(78, 85, 90, 72, 88)
class_b <- c(65, 70, 68, 74, 60)
class_c <- c(88, 92, 95, 85, 91)
scores <- c(class_a, class_b, class_c)
groups <- factor(rep(c("A", "B", "C"), each = 5))
# Run the test
dunn.test(scores, groups, method = "bonferroni")

Dunns toets in R
De resultaten komen overeen met Python, zoals je zou verwachten. Alleen B versus C is significant, terwijl A versus B en A versus C dat niet zijn. Klas B en klas C liggen ten grondslag aan het verschil dat met de Kruskal-Wallis-toets werd gedetecteerd.
Aannames van de Kruskal-Wallis-toets
De Kruskal-Wallis-toets is flexibeler dan ANOVA, maar heeft nog steeds drie aannames die je moet controleren voordat je hem uitvoert:
- Onafhankelijke steekproeven: Observaties in de ene groep beïnvloeden observaties in een andere niet. Als je data gepaard is of herhaalde metingen bevat, is deze toets niet geschikt
- Ordinale of continue data: De toets vereist data die je kunt rangschikken. Nominale categorieën (zoals kleuren of labels) kun je niet rangschikken, dus die werken hier niet
- Vergelijkbare verdelingsvormen: Als je de resultaten wilt interpreteren als een vergelijking van medianen in plaats van alleen verdelingen, moeten de groepen ongeveer dezelfde vorm hebben. Als de vormen sterk verschillen, kun je nog steeds verdelingen vergelijken, maar de mediaaninterpretatie gaat niet op
Als je de eerste twee aannames schendt, zijn de testresultaten ongeldig. De derde aanname is wat zachter, omdat die invloed heeft op hoe je de resultaten interpreteert, niet op de vraag of je de toets überhaupt kunt uitvoeren.
Wanneer je de Kruskal-Wallis-toets niet moet gebruiken
Er zijn drie gevallen waarin een andere toets beter past:
- Je data is gepaard of bevat herhaalde metingen: Als dezelfde proefpersonen in meerdere groepen voorkomen, gebruik dan de Friedman-toets. Dat is het niet-parametrische equivalent voor afhankelijke steekproeven. Kruskal-Wallis op gepaarde data negeert de relatie tussen observaties en kan tot verkeerde conclusies leiden
- Je data voldoet aan de aannames van ANOVA: Als je data normaal verdeeld is met ongeveer gelijke varianties, is ANOVA de betere keuze. Die is statistisch krachtiger, wat betekent dat hij echte verschillen beter detecteert wanneer die bestaan
- Je steekproeven zijn groot: Bij grote steekproeven werken parametrische methoden vaak goed, zelfs als de data niet perfect normaal is. De centrale limietstelling doet zijn werk, en ANOVA geeft betrouwbaardere resultaten dan de ranggebaseerde aanpak. Werk je met honderden of duizenden observaties per groep, dan is Kruskal-Wallis niet de toets voor jou
Conclusie
De Kruskal-Wallis-toets vergelijkt drie of meer onafhankelijke groepen wanneer je data niet de normale verdeling volgt die toetsen zoals ANOVA vereisen. Dat kan omdat hij met rangen werkt in plaats van ruwe waarden.
Dat gezegd hebbende, het is geen vervanging voor ANOVA. Als je data normaal is, is ANOVA de betere toets omdat die meer statistische power heeft. Als je data daarentegen gepaard is, gebruik dan de Friedman-toets. Zoals altijd hangt de juiste toets af van je data.
Als de omstandigheden kloppen, is de Kruskal-Wallis-toets een betrouwbare en eenvoudige keuze. Je voert hem uit, bekijkt de p-waarde en volgt op met de toets van Dunn als je wilt weten welke groepen achter het verschil zitten.
Is je statistiekkennis wat roestig? Volg onze cursus Introduction to Statistics en je bent in één middag weer bij.
Kruskal-Wallis-toets: veelgestelde vragen
Waarvoor wordt de Kruskal-Wallis-toets gebruikt?
De Kruskal-Wallis-toets wordt gebruikt om drie of meer onafhankelijke groepen te vergelijken wanneer je niet kunt aannemen dat je data normaal verdeeld is. Het is een niet-parametrisch alternatief voor ANOVA dat werkt met rangen in plaats van ruwe waarden. Je vindt hem vooral nuttig bij scheve verdelingen of ordinale data.
Wat betekent een significant Kruskal-Wallis-resultaat?
Een significant resultaat - meestal p < 0,05 - betekent dat minstens één groep verschilt van de andere. Het vertelt je niet welke groepen verschillen, alleen dat ze niet allemaal hetzelfde zijn. Om te achterhalen welke paren achter het verschil zitten, moet je vervolgen met een post-hoc-toets zoals die van Dunn.
Wat zijn de aannames van de Kruskal-Wallis-toets?
De toets vereist onafhankelijke steekproeven, wat betekent dat observaties in de ene groep geen invloed hebben op observaties in een andere. Je data moet ordinaal of continu zijn - iets dat je kunt rangschikken. Als je de resultaten wilt interpreteren als een vergelijking van medianen, moeten de groepen bovendien vergelijkbare verdelingsvormen hebben.
Wat is het verschil tussen de Kruskal-Wallis-toets en de Mann-Whitney U-toets?
De Mann-Whitney U-toets vergelijkt twee onafhankelijke groepen, terwijl de Kruskal-Wallis-toets die aanpak uitbreidt naar drie of meer groepen. Beide werken met rangen en gaan niet uit van normaliteit. Heb je slechts twee groepen, dan kies je voor Mann-Whitney U - Kruskal-Wallis is het multigroep-equivalent.
Wanneer gebruik je de toets van Dunn na Kruskal-Wallis?
Voer de toets van Dunn uit wanneer je Kruskal-Wallis-resultaat significant is en je wilt weten welke specifieke paren van groepen verschillen. Hij voert paarvergelijkingen uit tussen alle groepen en past de p-waarden aan om de kans op vals-positieven te verkleinen. In Python doet scikit_posthocs.posthoc_dunn() dit, en in R biedt het dunn.test-pakket dezelfde functionaliteit.
