Curso
Comparar vários grupos é simples quando seus dados seguem uma distribuição normal. O problema é que, na prática, a maioria dos dados não segue.
Se o seu teste padrão é o ANOVA, você pode chegar a conclusões equivocadas, já que ele assume normalidade. Quando isso não acontece — pense em dados assimétricos ou amostras pequenas — é preciso outra abordagem.
O teste de Kruskal-Wallis é essa alternativa. Ele é um método não paramétrico ao ANOVA e funciona com postos (ranks) em vez de valores brutos, então a normalidade não é requisito.
Neste artigo, vou explicar o conceito, a matemática por trás, como rodar em Python e R e como interpretar os resultados.
O que é o teste de Kruskal-Wallis?
O teste de Kruskal-Wallis é um método não paramétrico para comparar três ou mais grupos independentes. Ele transforma todas as observações em postos e compara esses postos entre grupos, em vez de trabalhar com os valores brutos.
Você pode pensar nele como uma extensão do teste U de Mann-Whitney, sobre o qual também já escrevi.
O Mann-Whitney U faz a mesma comparação baseada em postos, mas apenas para dois grupos. O Kruskal-Wallis amplia isso para três ou mais. Então, quando você tem múltiplos grupos e não pode usar ANOVA, é ele que deve usar.
Como trabalha com postos e não com valores brutos, ele não assume nenhuma distribuição específica. Isso o torna útil com dados do mundo real, que quase nunca seguem perfeitamente um tipo de distribuição.
Quando usar o teste de Kruskal-Wallis
O teste de Kruskal-Wallis é uma ótima pedida quando você lida com:
- Três ou mais grupos independentes que você quer comparar
- Dados ordinais ou contínuos como avaliações em escala Likert ou dados de medições
- Distribuições não normais por assimetria, outliers, amostras pequenas ou qualquer coisa que o ANOVA não lide bem
- Tamanhos de amostra pequenos em que é difícil verificar normalidade
Aqui vai um exemplo simples.
Imagine que você quer comparar notas de prova entre três turmas. As notas são assimétricas e as amostras pequenas, então o ANOVA não é uma boa escolha. O teste de Kruskal-Wallis não exige normalidade, então funciona aqui. Ele vai indicar se pelo menos uma turma teve desempenho diferente das outras, sem depender de suposições que seus dados não sustentam.
Kruskal-Wallis vs. ANOVA
Ambos comparam grupos, mas de maneiras diferentes.
O ANOVA compara as médias dos grupos e assume dados normalmente distribuídos com variâncias aproximadamente iguais. Quando essas suposições são verdadeiras, ele é a melhor opção — é mais poderoso estatisticamente e os resultados são mais fáceis de interpretar.
O Kruskal-Wallis compara as distribuições dos grupos usando postos. Ele não se importa com normalidade nem com variâncias iguais. Isso o torna mais flexível, mas você perde um pouco de poder estatístico no processo.
Aqui vai uma tabela comparativa rápida:

ANOVA comparado ao teste de Kruskal-Wallis
Se seus dados são normais, use ANOVA. Se não são — ou você não consegue verificar — use Kruskal-Wallis.
Fórmula do teste de Kruskal-Wallis
O teste de Kruskal-Wallis se resume a uma estatística de teste, H. Veja a fórmula:

Fórmula de Kruskal-Wallis
Aqui está a explicação dos componentes:
-
N- número total de observações em todos os grupos -
k- número de grupos -
n_i- número de observações no grupoi -
R_i- soma dos postos atribuídos ao grupoi
A fórmula mede o quanto as somas de postos de cada grupo se desviam do que seria esperado se todos os grupos fossem idênticos. Um H grande indica que os grupos são diferentes, e um H pequeno sugere que não são tão diferentes assim.
Depois de calcular H, compare-o com a distribuição qui-quadrado com k - 1 graus de liberdade para obter o p-valor.
Como funciona o teste de Kruskal-Wallis
São quatro etapas para realizar o teste de Kruskal-Wallis:
- Combine todos os grupos: junte todas as observações de cada grupo em um único conjunto de dados
- Rankeie todas as observações: ordene do menor para o maior e atribua postos. O menor valor recebe posto 1, o próximo posto 2 e assim por diante. Se dois valores forem iguais, eles recebem a média dos postos que ocupariam
- Calcule as somas de postos: separe os postos de volta nos grupos originais e some-os por grupo. Essas são as suas somas de postos —
R_ina fórmula - Calcule a estatística do teste: substitua as somas de postos na fórmula de
H. Se os grupos forem semelhantes, as somas de postos serão próximas eHserá pequeno. Se um grupo receber postos consistentemente maiores ou menores,Haumenta
E é isso!
Perceba que o teste não liga para os valores em si, mas para a posição relativa deles em relação ao todo.
Teste de Kruskal-Wallis em Python
A biblioteca scipy do Python tem uma função pronta para o teste de Kruskal-Wallis, então você não precisa implementar a fórmula na mão. Vamos a um exemplo.
Suponha que você esteja comparando notas de prova entre três turmas. Veja como rodar o teste:
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}")

Saída em Python
O p-valor ficou abaixo de 0,05, o que indica que pelo menos uma turma teve notas diferentes das demais. Lembre-se de que o teste não diz qual — para isso você precisará de um teste post hoc, que explico na próxima seção.
Teste de Kruskal-Wallis em R
Assim como em Python, o R tem uma função nativa para esse teste. Vamos usar o mesmo cenário das notas.
# 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)

Saída em R
A saída é igual à do Python — mesma estatística H, mesmo p-valor. Com p < 0,05, você rejeita a hipótese nula e conclui que pelo menos um grupo difere.
Como interpretar os resultados do Kruskal-Wallis
A hipótese nula do teste de Kruskal-Wallis é que todos os grupos têm a mesma distribuição. O p-valor indica se você deve rejeitá-la. Veja como interpretar:
- p < 0,05: pelo menos um grupo difere dos demais, então rejeite a hipótese nula
- p >= 0,05: não há evidências fortes de que os grupos diferem, então não rejeite a hipótese nula
O limiar 0,05 é uma convenção. Dependendo da área ou do risco envolvido, você pode usar um limiar mais rigoroso, como 0,01, ou mais flexível, como 0,10.
Lembre que o teste não diz qual grupo é diferente. Um resultado significativo só indica que nem todos os grupos são iguais. Para identificar quais pares estão por trás da diferença, você precisa de um teste post hoc.
Testes post hoc após Kruskal-Wallis
O teste mostra que pelo menos um grupo difere, mas não qual deles. Com três grupos e p < 0,05, pode ser A versus B, A versus C, B versus C ou alguma combinação. Você precisa realizar um teste post hoc para comparar os pares.
O teste de Dunn é a escolha mais comum. Ele executa comparações pareadas entre todos os grupos e ajusta os p-valores para levar em conta múltiplas comparações — sem esse ajuste, você aumenta a chance de falso positivo. Quanto mais comparações, maior o risco de encontrar um resultado “significativo” por acaso.
Teste de Dunn em Python
Você vai precisar da biblioteca scikit_posthocs. Se não tiver, instale com pip install scikit-posthocs.
A partir daí, o cálculo é simples:
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)

Teste de Dunn em Python
Cada célula mostra o p-valor ajustado para aquele par. Aqui, apenas B versus C (p = 0,004) cruza o limiar de 0,05, então esses dois grupos diferem. A versus B (p = 0,167) e A versus C (p = 0,607) não diferem, o que indica que a turma A não é estatisticamente diferente das outras duas.
Teste de Dunn em R
Para começar, instale a biblioteca se preciso com o 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")

Teste de Dunn em R
Os resultados batem com os do Python, como esperado. Apenas B versus C é significativo, enquanto A versus B e A versus C não são. As turmas B e C explicam a diferença detectada pelo teste de Kruskal-Wallis.
Pressupostos do teste de Kruskal-Wallis
O teste de Kruskal-Wallis é mais flexível que o ANOVA, mas ainda tem três pressupostos que você precisa verificar antes de rodá-lo:
- Amostras independentes: as observações de um grupo não influenciam as de outro. Se seus dados são pareados ou de medidas repetidas, este teste não é o ideal
- Dados ordinais ou contínuos: o teste precisa de dados ranqueáveis. Categorias nominais (como cores ou rótulos) não podem ser ordenadas, então não servem
- Formatos de distribuição semelhantes: se você quiser interpretar os resultados como comparação de medianas (e não apenas de distribuições), os grupos devem ter formatos aproximadamente iguais. Se as formas diferirem muito, ainda dá para comparar distribuições, mas a interpretação por mediana não vale
Se você violar os dois primeiros pressupostos, os resultados não serão válidos. O terceiro é mais brando: afeta a interpretação, não a possibilidade de rodar o teste.
Quando não usar o teste de Kruskal-Wallis
Há três situações em que outro teste é mais indicado:
- Seus dados são pareados ou de medidas repetidas: se os mesmos indivíduos aparecem em vários grupos, use o teste de Friedman. Ele é o equivalente não paramétrico para amostras dependentes. Usar Kruskal-Wallis em dados pareados ignora a relação entre observações e pode levar a conclusões erradas
- Seus dados atendem aos pressupostos do ANOVA: se os dados são normais e com variâncias aproximadamente iguais, o ANOVA é a melhor escolha. Ele é mais poderoso estatisticamente, ou seja, detecta melhor diferenças reais quando elas existem
- Suas amostras são grandes: com amostras grandes, métodos paramétricos tendem a funcionar bem mesmo sem normalidade perfeita. O teorema central do limite ajuda, e o ANOVA geralmente traz resultados mais confiáveis que a abordagem por postos. Se você trabalha com centenas ou milhares de observações por grupo, o Kruskal-Wallis não é o teste ideal
Conclusão
O teste de Kruskal-Wallis compara três ou mais grupos independentes quando seus dados não seguem a normalidade exigida por testes como o ANOVA. Isso é possível porque ele trabalha com postos, não com valores brutos.
Dito isso, ele não substitui o ANOVA. Se seus dados são normais, o ANOVA é a melhor opção porque tem mais poder estatístico. Por outro lado, se seus dados são pareados, use o teste de Friedman. Como sempre, o teste certo depende dos seus dados.
Quando as condições se encaixam, o teste de Kruskal-Wallis é uma escolha confiável e direta. Rode o teste, verifique o p-valor e, se precisar saber quais grupos explicam a diferença, complemente com o teste de Dunn.
Está se sentindo enferrujado em estatística? Faça nosso curso de Introduction to Statistics e volte ao ritmo em uma tarde.
Perguntas frequentes sobre o teste de Kruskal-Wallis
Para que serve o teste de Kruskal-Wallis?
O teste de Kruskal-Wallis é usado para comparar três ou mais grupos independentes quando você não pode assumir que os dados seguem uma distribuição normal. É uma alternativa não paramétrica ao ANOVA que trabalha com postos em vez de valores brutos. Ele é útil quando as distribuições são assimétricas ou quando os dados são ordinais.
O que significa um resultado significativo no Kruskal-Wallis?
Um resultado significativo — tipicamente p < 0,05 — indica que pelo menos um grupo difere dos demais. Ele não informa quais grupos são diferentes, apenas que não são todos iguais. Para descobrir quais pares explicam a diferença, siga com um teste post hoc como o teste de Dunn.
Quais são os pressupostos do teste de Kruskal-Wallis?
O teste exige amostras independentes — as observações de um grupo não podem influenciar as de outro. Seus dados precisam ser ordinais ou contínuos, isto é, passíveis de ranqueamento. Se você quiser interpretar os resultados como comparação de medianas, os grupos também devem ter formatos de distribuição semelhantes.
Qual a diferença entre o teste de Kruskal-Wallis e o teste U de Mann-Whitney?
O teste U de Mann-Whitney compara dois grupos independentes, enquanto o teste de Kruskal-Wallis estende essa abordagem para três ou mais grupos. Ambos trabalham com postos e não assumem normalidade. Se você só tem dois grupos, use Mann-Whitney U — o Kruskal-Wallis é o equivalente para múltiplos grupos.
Quando usar o teste de Dunn após Kruskal-Wallis?
Rode o teste de Dunn quando o resultado do Kruskal-Wallis for significativo e você precisar saber quais pares de grupos diferem. Ele realiza comparações pareadas entre todos os grupos e ajusta os p-valores para reduzir a chance de falsos positivos. Em Python, scikit_posthocs.posthoc_dunn() faz isso; em R, o pacote dunn.test oferece a mesma funcionalidade.



