Hoppa till huvudinnehåll

Kruskal–Wallis-test: Jämföra flera grupper utan normalfördelning

En praktisk guide till Kruskal–Wallis-testet – vad det är, hur det fungerar, när du ska välja det framför ANOVA och hur du kör och tolkar det i Python och R.
Uppdaterad 4 maj 2026  · 9 min läsa

Att jämföra flera grupper är enkelt när dina data följer en normalfördelning. Problemet är att de flesta data i verkligheten inte gör det.

Om ANOVA är ditt standardtest riskerar du att dra fel slutsatser, eftersom det förutsätter att dina data är normalfördelade. När de inte är det – tänk snedfördelade data eller små stickprov – behöver du ett annat angreppssätt.

Kruskal–Wallis-testet är just det alternativa angreppssättet. Det är ett icke-parametriskt alternativ till ANOVA och bygger på rangordnade data i stället för råvärden, så normalfördelning är inget krav.

I den här artikeln går jag igenom konceptet, matematiken bakom, hur du kör det i Python och R, samt hur du tolkar resultaten.

Vad är Kruskal–Wallis-testet?

Kruskal–Wallis-testet är en icke-parametrisk metod för att jämföra tre eller fler oberoende grupper. Det omvandlar alla observationer till rangordningar och jämför dessa rangordningar mellan grupper i stället för att arbeta med råvärden.

Du kan se det som en utvidgning av Mann–Whitney U-testet, som jag också har skrivit om.

Mann–Whitney U gör samma rangbaserade jämförelse, men bara för två grupper. Kruskal–Wallis-testet skalar upp det till tre eller fler, så när du har flera grupper och inte kan använda ANOVA är det här testet du ska välja.

Eftersom det arbetar med rangordningar snarare än råvärden förutsätter det inte att dina data följer någon särskild fördelning. Det gör det användbart med verkliga data, som sällan följer en och samma fördelning perfekt.

När ska du använda Kruskal–Wallis-testet

Kruskal–Wallis-testet passar utmärkt när du arbetar med:

  • Tre eller fler oberoende grupper som du vill jämföra
  • Ordinala eller kontinuerliga data såsom Likert-skattningar eller mätdata
  • Icke-normalfördelade data på grund av snedhet, extremvärden, små stickprov eller annat som ANOVA inte hanterar
  • Små stickprov där normalitet är svår att verifiera

Här är ett enkelt exempel.

Föreställ dig att du vill jämföra provresultat mellan tre olika klasser. Resultaten är snedfördelade och stickproven är små, så ANOVA är inget bra val. Kruskal–Wallis kräver inte normalitet, så det fungerar här. Det talar om huruvida minst en klass presterade annorlunda än de andra utan att göra antaganden som dina data inte uppfyller.

Kruskal–Wallis kontra ANOVA

Båda testen jämför grupper, men de gör det på olika sätt.

ANOVA jämför gruppers medelvärden och förutsätter att dina data är normalfördelade med ungefär lika varianser. När de antagandena stämmer är det det bättre valet – det har högre statistisk styrka och resultaten är lättare att tolka.

Kruskal–Wallis jämför gruppers fördelningar med hjälp av rangordningar. Det bryr sig inte om normalitet eller lika varianser. Det gör det mer flexibelt, men du tappar viss statistisk styrka på köpet.

Här är en snabb jämförelsetabell:

ANOVA jämfört med Kruskal–Wallis-test

ANOVA jämfört med Kruskal–Wallis-test

Om dina data är normalfördelade, använd ANOVA. Om de inte är det – eller om du inte kan verifiera att de är det – använd Kruskal–Wallis.

Formeln för Kruskal–Wallis-testet

Kruskal–Wallis-testet kokar ner till en enda teststatistika, H. Här är formeln:

Kruskal–Wallis-formel

Kruskal–Wallis-formel

Här är förklaringen av komponenterna:

  • N – totalt antal observationer över alla grupper

  • k – antal grupper

  • n_i – antal observationer i grupp i

  • R_i – summan av rangordningar tilldelade grupp i

Formeln mäter hur mycket rangsummorna för varje grupp avviker från vad du skulle förvänta dig om alla grupper vore identiska. Ett stort H betyder att grupperna skiljer sig, och ett litet H betyder att de inte skiljer sig nämnvärt.

När du har H jämför du det mot en chi-två-fördelning med k - 1 frihetsgrader för att få ett p-värde.

Så fungerar Kruskal–Wallis-testet

Det finns fyra steg för att utföra Kruskal–Wallis-testet:

  1. Slå ihop alla grupper: Ta alla observationer från varje grupp och kombinera dem till ett enda dataset
  2. Rangordna alla observationer: Sortera de sammanslagna data från minst till störst och tilldela rangordningar. Det minsta värdet får rang 1, nästa får rang 2, och så vidare. Om två värden är lika delar de medelvärdet av de rangplatser de skulle ha haft.
  3. Beräkna rangsummor: Dela upp rangordningarna i sina ursprungliga grupper. Summera rangordningarna för varje grupp. Detta är dina rangsummor – R_i i formeln
  4. Beräkna teststatistikan: Sätt in rangsummorna i H-formeln. Om grupperna är lika kommer deras rangsummor vara nära varandra och H blir litet. Om en grupp konsekvent får högre eller lägre rangordningar växer H sig större

Och det var allt!

Du ser att testet inte bryr sig om de faktiska värdena, utan bara om deras inbördes ordning.

Kruskal–Wallis i Python

Pythons scipy-bibliotek har en inbyggd funktion för Kruskal–Wallis-testet, så du behöver inte implementera formeln för hand. Låt oss gå igenom ett exempel.

Säg att du jämför provresultat mellan tre klasser. Så här kör du testet:

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-utdata

Python-utdata

P-värdet är under 0,05, vilket betyder att minst en klass skiljer sig från de andra. Tänk bara på att testet inte talar om vilken – du behöver ett post hoc-test för det, vilket jag tar upp i nästa avsnitt.

Kruskal–Wallis i R

Precis som i Python finns en inbyggd funktion i R för detta test. Vi använder samma scenario med provresultat.

# 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-utdata

R-utdata

Utdata är desamma som i Python – samma H-statistika, samma p-värde. Med p < 0,05 förkastar du nollhypotesen och drar slutsatsen att minst en grupp skiljer sig.

Hur du tolkar Kruskal–Wallis-resultat

Nollhypotesen i Kruskal–Wallis-testet är att alla grupper har samma fördelning. P-värdet talar om huruvida du ska förkasta den. Så här tolkar du det:

  • p < 0,05: Minst en grupp skiljer sig från de andra, så förkasta nollhypotesen
  • p ≥ 0,05: Det finns inga starka bevis för att grupperna skiljer sig, så förkasta inte nollhypotesen

Tröskeln 0,05 är en konvention. Beroende på ditt område eller hur viktiga slutsatserna är kan du använda en striktare gräns som 0,01 eller en friare som 0,10.

Kom ihåg att testet inte talar om vilken grupp som skiljer sig. Ett signifikant resultat betyder bara att grupperna inte alla är likadana. Du vet att något pågår, men inte var. För att ta reda på vilka par som driver skillnaden behöver du ett post hoc-test.

Post hoc-tester efter Kruskal–Wallis

Testet talar om att minst en grupp skiljer sig, men inte vilken grupp som faktiskt är annorlunda. Om du har tre grupper och p < 0,05 kan det vara A mot B, A mot C, B mot C eller någon kombination. Du behöver göra ett post hoc-test för att få dessa parvisa jämförelser.

Dunns test är det vanligaste valet. Det gör parvisa jämförelser mellan alla grupper och justerar p-värdena för att ta hänsyn till multipla jämförelser – utan den justeringen skulle du öka risken för ett falskt positivt resultat. Ju fler jämförelser du gör, desto högre är risken att hitta ett "signifikant" resultat av en ren slump.

Dunns test i Python

Du behöver biblioteket scikit_posthocs för detta. Om du inte har det, installera det med pip install scikit-posthocs.

Därifrån är beräkningen enkel:

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 test i Python

Dunns test i Python

Varje ruta visar det justerade p-värdet för det paret. Här är det bara B mot C (p = 0,004) som passerar tröskeln 0,05, så de två grupperna skiljer sig. A mot B (p = 0,167) och A mot C (p = 0,607) gör det inte, vilket betyder att klass A inte skiljer sig statistiskt från någon av de andra två klasserna.

Dunns test i R

Börja med att installera biblioteket vid behov med kommandot 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 test i R

Dunns test i R

Resultaten matchar Python, som väntat. Endast B mot C är signifikant, medan A mot B och A mot C inte är det. Klass B och klass C ligger bakom skillnaden som upptäcktes av Kruskal–Wallis-testet.

Antaganden i Kruskal–Wallis-testet

Kruskal–Wallis är mer flexibelt än ANOVA, men har ändå tre antaganden du behöver kontrollera innan du kör det:

  • Oberoende stickprov: Observationer i en grupp påverkar inte observationer i en annan. Om dina data är parade eller upprepade mätningar är testet inte rätt val
  • Ordinala eller kontinuerliga data: Testet kräver data som går att rangordna. Nominala kategorier (som färger eller etiketter) kan inte rangordnas, så de fungerar inte här
  • Liknande fördelningsformer: Om du vill tolka resultaten som en jämförelse av medianer snarare än bara fördelningar behöver grupperna ha ungefär samma form. Om formerna skiljer sig mycket kan du fortfarande jämföra fördelningar, men median-tolkningen håller inte

Om du bryter mot de två första antagandena är testresultaten inte giltiga. Det tredje antagandet är något mjukare, eftersom det påverkar hur du tolkar resultaten, inte om du kan köra testet överhuvudtaget.

När du inte bör använda Kruskal–Wallis-testet

Det finns tre fall där ett annat test passar bättre:

  • Dina data är parade eller upprepade mätningar: Om samma individer förekommer i flera grupper, använd i stället Friedmans test. Det är det icke-parametriska alternativet för beroende stickprov. Att använda Kruskal–Wallis på parade data ignorerar sambandet mellan observationer och kan leda till fel slutsatser
  • Dina data uppfyller ANOVAs antaganden: Om dina data är normalfördelade med ungefär lika varianser är ANOVA det bättre valet. Det har högre statistisk styrka, vilket betyder att det bättre upptäcker verkliga skillnader när de finns
  • Dina stickprov är stora: Med stora stickprov tenderar parametriska metoder att fungera väl även när data inte är perfekt normala. Centrala gränsvärdessatsen gör sitt, och ANOVA ger mer tillförlitliga resultat än den rangbaserade metoden. Om du arbetar med hundratals eller tusentals observationer per grupp är Kruskal–Wallis inte testet för dig

Slutsats

Kruskal–Wallis-testet jämför tre eller fler oberoende grupper när dina data inte följer den normalfördelning som krävs av tester som ANOVA. Det är möjligt eftersom det bygger på rangordningar i stället för råvärden.

Det är dock inte en ersättning för ANOVA. Om dina data är normala är ANOVA det bättre testet eftersom det har större statistisk styrka. Om dina data däremot är parade, använd Friedmans test. Som alltid beror rätt test på dina data.

När förutsättningarna är de rätta är Kruskal–Wallis-testet ett pålitligt och rakt på sak-val. Kör testet, kontrollera p-värdet och följ upp med Dunns test om du behöver veta vilka grupper som ligger bakom skillnaden.

Är dina statistikkunskaper lite ringrostiga? Ta vår Introduktion till statistik och kom i kapp på en enda eftermiddag.

Kruskal–Wallis-test: Vanliga frågor

Vad används Kruskal–Wallis-testet till?

Kruskal–Wallis-testet används för att jämföra tre eller fler oberoende grupper när du inte kan anta att dina data följer en normalfördelning. Det är ett icke-parametriskt alternativ till ANOVA som bygger på rangordnade data i stället för råvärden. Du har nytta av det när fördelningar är snedvridna eller data är ordinala.

Vad betyder ett signifikant Kruskal–Wallis-resultat?

Ett signifikant resultat – vanligtvis p < 0,05 – betyder att minst en grupp skiljer sig från de andra. Det talar inte om vilka grupper som skiljer sig, bara att de inte alla är likadana. För att ta reda på vilka par som ligger bakom skillnaden behöver du följa upp med ett post hoc-test som Dunns test.

Vilka är antagandena i Kruskal–Wallis-testet?

Testet kräver oberoende stickprov, vilket innebär att observationer i en grupp inte påverkar observationer i en annan. Dina data behöver vara ordinala eller kontinuerliga – något du kan rangordna. Om du vill tolka resultaten som en jämförelse av medianer bör grupperna också ha liknande fördelningsformer.

Vad är skillnaden mellan Kruskal–Wallis-testet och Mann–Whitney U-testet?

Mann–Whitney U-testet jämför två oberoende grupper, medan Kruskal–Wallis-testet utvidgar angreppssättet till tre eller fler grupper. Båda bygger på rangordnade data och förutsätter inte normalitet. Om du bara har två grupper är Mann–Whitney U rätt val – Kruskal–Wallis är dess motsvarighet för flera grupper.

När ska du använda Dunns test efter Kruskal–Wallis?

Kör Dunns test när ditt Kruskal–Wallis-resultat är signifikant och du behöver veta vilka specifika par av grupper som skiljer sig. Det genomför parvisa jämförelser mellan alla grupper och justerar p-värdena för att minska risken för falskt positiva. I Python gör scikit_posthocs.posthoc_dunn() detta, och i R får du samma funktionalitet med paketet dunn.test.

Ämnen

Lär dig med DataCamp

course

Introduction to Statistics in R

4 timmar
128.6K
Grow your statistical skills and learn how to collect, analyze, and draw accurate conclusions from data.
Se detaljerRight Arrow
Starta kursen
Se merRight Arrow