Corso
Confrontare più gruppi è semplice quando i dati seguono una distribuzione normale. Il problema è che la maggior parte dei dati reali non lo fa.
Se usi ANOVA come test predefinito, rischi di arrivare a conclusioni sbagliate, perché assume che i dati seguano una distribuzione normale. Quando non è così — pensa a dati asimmetrici o campioni piccoli — serve un approccio diverso.
Il test di Kruskal-Wallis è proprio questo approccio diverso. È un’alternativa non parametrica all’ANOVA e lavora su ranghi invece che su valori grezzi, quindi non richiede la normalità.
In questo articolo ti spiego il concetto, la matematica alla base, come eseguirlo in Python e R e come interpretarne i risultati.
Cos’è il test di Kruskal-Wallis?
Il test di Kruskal-Wallis è un metodo non parametrico per confrontare tre o più gruppi indipendenti. Converte tutte le osservazioni in ranghi e confronta questi ranghi tra i gruppi invece di lavorare con i valori grezzi.
Puoi vederlo come un’estensione del test U di Mann-Whitney, di cui ho scritto anche in passato.
Il test di Mann-Whitney fa lo stesso confronto basato sui ranghi, ma solo per due gruppi. Il test di Kruskal-Wallis lo estende a tre o più: quindi, quando hai più gruppi e non puoi usare ANOVA, è quello che dovresti usare.
Poiché lavora sui ranghi e non sui valori grezzi, non presume che i dati seguano una particolare distribuzione. È ciò che lo rende utile con i dati reali, che raramente seguono perfettamente un unico tipo di distribuzione.
Quando usare il test di Kruskal-Wallis
Il test di Kruskal-Wallis è l’ideale quando stai lavorando con:
- Tre o più gruppi indipendenti da confrontare
- Dati ordinali o continui come valutazioni su scala Likert o misurazioni
- Distribuzioni non normali dovute a asimmetrie, outlier, campioni piccoli o qualsiasi cosa che l’ANOVA non gestisce
- Campioni piccoli per cui è difficile verificare la normalità
Ecco un esempio semplice.
Immagina di voler confrontare i voti d’esame di tre classi diverse. I voti sono asimmetrici e i campioni sono piccoli, quindi l’ANOVA non è una buona scelta. Il test di Kruskal-Wallis non richiede normalità, quindi funziona qui. Ti dirà se almeno una classe ha ottenuto risultati diversi dalle altre senza fare assunzioni che i tuoi dati non possono supportare.
Test di Kruskal-Wallis vs. ANOVA
Entrambi i test confrontano gruppi, ma lo fanno in modo diverso.
L’ANOVA confronta le medie dei gruppi e presume che i dati siano normalmente distribuiti con varianze approssimativamente uguali. Quando queste assunzioni sono vere, è la scelta migliore: è più potente dal punto di vista statistico e i risultati sono più facili da interpretare.
Il test di Kruskal-Wallis confronta le distribuzioni dei gruppi usando i ranghi. Non si preoccupa di normalità o varianze uguali. Questo lo rende più flessibile, ma perdi un po’ di potenza statistica nel processo.
Ecco una rapida tabella di confronto:

ANOVA rispetto al test di Kruskal-Wallis
Se i tuoi dati sono normalmente distribuiti, usa ANOVA. Se non lo sono — o non puoi verificarlo — usa Kruskal-Wallis.
Formula del test di Kruskal-Wallis
Il test di Kruskal-Wallis si riduce a un’unica statistica di test, H. Ecco la formula:

Formula di Kruskal-Wallis
Ecco la spiegazione dei componenti:
-
N- numero totale di osservazioni in tutti i gruppi -
k- numero di gruppi -
n_i- numero di osservazioni nel gruppoi -
R_i- somma dei ranghi assegnati al gruppoi
La formula misura quanto le somme dei ranghi di ciascun gruppo si discostano da quanto ci si aspetterebbe se tutti i gruppi fossero identici. Un H grande indica che i gruppi sono diversi, mentre un H piccolo indica che non sono così diversi.
Una volta ottenuto H, lo confronti con una distribuzione chi-quadrato con k - 1 gradi di libertà per ottenere un p-value.
Come funziona il test di Kruskal-Wallis
Ci sono quattro passaggi per eseguire il test di Kruskal-Wallis:
- Combina tutti i gruppi: Prendi tutte le osservazioni di ogni gruppo e uniscile in un unico dataset
- Classifica tutte le osservazioni: Ordina i dati combinati dal più piccolo al più grande e assegna i ranghi. Il valore più piccolo ottiene rango 1, il successivo rango 2 e così via. Se due valori sono uguali, condividono la media dei ranghi che avrebbero occupato.
- Calcola le somme dei ranghi: Separa i ranghi nei loro gruppi originali. Somma i ranghi per ciascun gruppo. Queste sono le tue somme dei ranghi —
R_inella formula - Calcola la statistica di test: Inserisci le somme dei ranghi nella formula di
H. Se i gruppi sono simili, le loro somme dei ranghi saranno vicine eHsarà piccolo. Se un gruppo ottiene costantemente ranghi più alti o più bassi,Hcresce
E questo è tutto!
Come vedi, il test non si cura dei valori effettivi, ma solo della loro posizione relativa rispetto a tutto il resto.
Test di Kruskal-Wallis in Python
La libreria scipy di Python ha una funzione integrata per il test di Kruskal-Wallis, quindi non devi implementare la formula a mano. Vediamo un esempio.
Supponiamo che tu stia confrontando i voti d’esame tra tre classi. Ecco come eseguire il test:
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}")

Output Python
Il p-value è inferiore a 0,05, il che significa che almeno una classe ha ottenuto risultati diversi dalle altre. Tieni solo a mente che il test non ti dice quale — per quello serve un test post hoc, che vedremo nella prossima sezione.
Test di Kruskal-Wallis in R
Come in Python, anche R ha una funzione integrata per questo test. Usiamo lo stesso scenario dei voti d’esame.
# 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)

Output R
L’output è lo stesso ottenuto in Python: stessa statistica H, stesso p-value. Con p < 0,05 rifiuteresti l’ipotesi nulla e concluderesti che almeno un gruppo è diverso.
Come interpretare i risultati di Kruskal-Wallis
L’ipotesi nulla del test di Kruskal-Wallis è che tutti i gruppi abbiano la stessa distribuzione. Il p-value ti dice se rifiutarla. Ecco come interpretarlo:
- p < 0,05: Almeno un gruppo differisce dagli altri, quindi rifiuta l’ipotesi nulla
- p >= 0,05: Non ci sono prove solide che i gruppi differiscano, quindi non rifiutare l’ipotesi nulla
La soglia 0,05 è una convenzione. A seconda del tuo ambito o dell’importanza dell’analisi, potresti usare una soglia più rigida come 0,01 o più permissiva come 0,10.
Ricorda che questo test non ti dirà quale gruppo è diverso. Un risultato significativo significa solo che i gruppi non sono tutti uguali. Sai che c’è una differenza, ma non dove. Per scoprire quali coppie guidano la differenza, ti serve un test post hoc.
Test post hoc dopo Kruskal-Wallis
Il test ti dice che almeno un gruppo differisce, ma non quale. Se hai tre gruppi e p < 0,05, potrebbe essere A contro B, A contro C, B contro C o una combinazione. Devi eseguire un test post hoc per ottenere questi confronti a coppie.
Il test di Dunn è la scelta più comune. Esegue confronti a coppie tra tutti i gruppi e aggiusta i p-value per tener conto dei confronti multipli — senza questo aggiustamento, aumenteresti la probabilità di un falso positivo. Più confronti esegui, maggiore è il rischio di trovare un risultato “significativo” per puro caso.
Test di Dunn in Python
Per questo ti serve la libreria scikit_posthocs. Se non ce l’hai, installala con pip install scikit-posthocs.
Da lì, il calcolo è semplice:
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)

Test di Dunn in Python
Ogni cella mostra il p-value aggiustato per quella coppia. Qui, solo B contro C (p = 0,004) scende sotto la soglia di 0,05, quindi quei due gruppi differiscono. A contro B (p = 0,167) e A contro C (p = 0,607) no, il che significa che la classe A non è statisticamente diversa da nessuna delle altre due.
Test di Dunn in R
Per iniziare, installa la libreria se necessario con il comando 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")

Test di Dunn in R
I risultati coincidono con Python, come prevedibile. Solo B contro C è significativo, mentre A contro B e A contro C no. Le classi B e C sono quelle alla base della differenza rilevata dal test di Kruskal-Wallis.
Assunzioni del test di Kruskal-Wallis
Il test di Kruskal-Wallis è più flessibile dell’ANOVA, ma ha comunque tre assunzioni da verificare prima di eseguirlo:
- Campioni indipendenti: Le osservazioni in un gruppo non influenzano quelle in un altro. Se i tuoi dati sono appaiati o a misure ripetute, questo test non è adatto
- Dati ordinali o continui: Il test richiede dati che possano essere ordinati. Categorie nominali (come colori o etichette) non sono ordinabili, quindi non funzionano qui
- Forme di distribuzione simili: Se vuoi interpretare i risultati come confronto delle mediane e non solo delle distribuzioni, i gruppi dovrebbero avere forme approssimativamente uguali. Se le forme differiscono molto, puoi comunque confrontare le distribuzioni, ma l’interpretazione sulla mediana non vale
Se violi le prime due assunzioni, i risultati del test non saranno validi. La terza è più morbida, perché incide su come interpreti i risultati, non sulla possibilità di eseguire il test.
Quando non dovresti usare il test di Kruskal-Wallis
Ci sono tre casi in cui un test diverso sarebbe più adatto:
- I tuoi dati sono appaiati o a misure ripetute: Se gli stessi soggetti compaiono in più gruppi, usa il test di Friedman. È l’equivalente non parametrico progettato per campioni dipendenti. Usare Kruskal-Wallis su dati appaiati ignora la relazione tra osservazioni e può portare a conclusioni errate
- I tuoi dati rispettano le assunzioni dell’ANOVA: Se i dati sono normalmente distribuiti con varianze approssimativamente uguali, l’ANOVA è la scelta migliore. È più potente dal punto di vista statistico, quindi rileva meglio le differenze reali quando esistono
- Le dimensioni campionarie sono grandi: Con campioni grandi, i metodi parametrici tendono a funzionare bene anche quando i dati non sono perfettamente normali. Il teorema del limite centrale fa la sua parte e l’ANOVA ti darà risultati più affidabili rispetto all’approccio basato sui ranghi. Se lavori con centinaia o migliaia di osservazioni per gruppo, Kruskal-Wallis non è il test giusto per te
Conclusione
Il test di Kruskal-Wallis confronta tre o più gruppi indipendenti quando i dati non seguono la distribuzione normale richiesta da test come l’ANOVA. Questo è possibile perché lavora sui ranghi invece che sui valori grezzi.
Detto ciò, non è un sostituto di ANOVA. Se i dati sono normali, l’ANOVA è il test migliore perché ha più potenza statistica. D’altra parte, se i dati sono appaiati, usa il test di Friedman. Come sempre, il test giusto dipende dai tuoi dati.
Quando le condizioni sono quelle giuste, il test di Kruskal-Wallis è una scelta affidabile e lineare. Devi eseguirlo, controllare il p-value e proseguire con il test di Dunn se vuoi sapere quali gruppi sono responsabili della differenza.
Le tue conoscenze di statistica sono un po’ arrugginite? Segui il nostro corso Introduzione alla Statistica e rimettiti in carreggiata in un pomeriggio.
FAQ sul test di Kruskal-Wallis
A cosa serve il test di Kruskal-Wallis?
Il test di Kruskal-Wallis si usa per confrontare tre o più gruppi indipendenti quando non puoi assumere che i dati seguano una distribuzione normale. È un’alternativa non parametrica all’ANOVA che lavora su dati in rango invece che su valori grezzi. È utile quando le distribuzioni sono asimmetriche o i dati sono ordinali.
Cosa significa un risultato significativo del test di Kruskal-Wallis?
Un risultato significativo — tipicamente p < 0,05 — significa che almeno un gruppo differisce dagli altri. Non ti dice quali gruppi sono diversi, solo che non sono tutti uguali. Per scoprire quali coppie sono alla base della differenza, devi proseguire con un test post hoc come quello di Dunn.
Quali sono le assunzioni del test di Kruskal-Wallis?
Il test richiede campioni indipendenti, cioè le osservazioni in un gruppo non devono influenzare quelle in un altro. I dati devono essere ordinali o continui — qualcosa che puoi ordinare. Se vuoi interpretare i risultati come confronto delle mediane, i gruppi dovrebbero anche avere forme di distribuzione simili.
Qual è la differenza tra il test di Kruskal-Wallis e il test U di Mann-Whitney?
Il test U di Mann-Whitney confronta due gruppi indipendenti, mentre il test di Kruskal-Wallis estende questo approccio a tre o più gruppi. Entrambi lavorano su dati in rango e non assumono normalità. Se hai solo due gruppi, il test di Mann-Whitney è la scelta giusta — Kruskal-Wallis è il suo equivalente per più gruppi.
Quando dovresti usare il test di Dunn dopo Kruskal-Wallis?
Esegui il test di Dunn quando il risultato di Kruskal-Wallis è significativo e ti serve sapere quali specifiche coppie di gruppi differiscono. Esegue confronti a coppie tra tutti i gruppi e aggiusta i p-value per ridurre il rischio di falsi positivi. In Python, scikit_posthocs.posthoc_dunn() lo fa, e in R il pacchetto dunn.test offre la stessa funzionalità.
