Kruskal-Wallis检验详解:原理、适用条件、计算方法与R/Python实战

本文详细介绍Kruskal-Wallis检验,包括基本原理、统计量计算、适用条件、与ANOVA的区别、P值解读、事后检验,以及R和Python中的实际操作,并梳理科研论文中常见的统计误区。

更新于2026年9月21日

Kruskal-Wallis检验详解:原理、适用条件、计算方法与R/Python实战

在科研论文的数据分析中,我们经常会遇到研究者需要比较三个或更多独立组之间是否存在统计学差异,但数据并不满足传统单因素方差分析(one-way ANOVA)的正态性假设。这时,一个非常常见的选择就是 Kruskal-Wallis检验(Kruskal-Wallis test)

例如,研究人员想比较三种治疗方案下患者的疼痛评分,比较不同处理组的炎症指标,或者分析不同实验条件下动物行为评分是否存在差异。如果结局变量属于有序分类数据,或者连续数据明显偏离正态分布,Kruskal-Wallis检验往往比直接使用普通单因素ANOVA更合适。

Kruskal-Wallis检验属于非参数检验。它的核心思想并不是直接比较各组的原始数值,而是把所有观测值放在一起排序,然后使用这些观测值的秩进行组间比较。该方法最早由 William H. Kruskal 和 W. Allen Wallis 于1952年系统提出,因此得名Kruskal-Wallis检验。原始论文发表于 Journal of the American Statistical Association,题为“Use of Ranks in One-Criterion Variance Analysis”。

Kruskal-Wallis检验到底解决什么问题?

从统计学角度看,Kruskal-Wallis检验用于比较三个或更多相互独立的组。它可以看作Mann-Whitney U检验在多个独立组情况下的扩展,也经常被视为单因素ANOVA的非参数对应方法。BMJ的统计学资料也将其用于比较三个或更多组的有序变量或非正态变量。

Kruskal-Wallis检验

假设有三组数据:

  • A组:8、10、12、13、15
  • B组:12、14、15、17、18
  • C组:7、9、10、11、13

如果直接比较均值,需要考虑数据分布以及ANOVA模型的相关假设。而Kruskal-Wallis检验会把三组数据合并起来,从最小值到最大值进行排序,再把每个观测值转换为秩。例如最小的观察值获得较小的秩,最大的观察值获得较大的秩。因此,Kruskal-Wallis检验实际上是在问:不同组中的观测值,其秩的分布是否存在系统性差异?这也是为什么它不需要依赖原始数据服从正态分布。

需要注意的是,“非参数”并不意味着没有任何假设。Kruskal-Wallis检验仍然要求研究设计和数据结构满足一定条件,尤其是组间独立性。

Kruskal-Wallis检验的基本原理

假设研究中有 kk 个独立组,第 ii 组包含 nin_i 个观察值,总样本量为:

[
N=n_1+n_2+\cdots+n_k
]

首先,将所有组的观察值合并,然后按照从小到大的顺序进行排序。如果不存在相同数值,则每个观察值对应一个唯一的秩;如果存在相同数值,也就是所谓的ties(并列秩),则通常给这些观察值分配平均秩。

随后计算每个组的秩和:

[
R_i=\text{第}i\text{组所有观察值的秩之和}
]

Kruskal-Wallis统计量通常写作:

[
H=
\frac{12}{N(N+1)}
\sum_{i=1}^{k}
\frac{R_i^2}{n_i}
-3(N+1)
]

当存在大量ties时,实际软件通常会进行相应的并列秩校正。

在样本量足够的情况下,HH统计量可以近似服从自由度为 k−1k-1 的卡方分布。因此,可以根据HH统计量和自由度计算P值。R官方stats包中的kruskal.test()就是按照这一框架进行计算,并返回统计量、自由度和P值。

从直观上理解,如果不同组的秩分布非常接近,那么各组的平均秩通常不会相差太大,HH值也不会特别大。相反,如果某一组的观察值整体偏大,那么它获得的秩也会整体偏高,从而导致较大的HH统计量。

它的原假设是什么?

这是理解Kruskal-Wallis检验时非常重要的一步。

假设有三个研究组A、B和C。

原假设:

[
H_0:\text{各组来自相同的分布}
]

更准确地说,在经典解释框架下,可以理解为各组的分布位置没有系统性差异。

备择假设:

[
H_1:\text{至少有一个组与其他组存在差异}
]

因此,如果最终得到:

[
P<0.05
]

通常可以拒绝原假设,认为数据提供了足够的证据表明至少有一组与其他组存在统计学差异。

但这里有一个非常重要的统计学细节:

Kruskal-Wallis检验显著,并不能告诉你究竟是哪两个组存在差异。

例如,你有A、B、C三个组,整体检验得到:

[
H=12.47,\quad P=0.002
]

这只能说明三个组之间存在总体上的统计学差异。它并不能直接说明“A与B有差异,而B与C没有差异”。

如果研究者需要进一步回答这个问题,就必须进行事后两两比较

Kruskal-Wallis检验是不是在比较中位数?

这是科研论文中非常常见的一个误区。很多统计学教材或者软件说明会简单地把Kruskal-Wallis检验描述为“比较三个或更多组的中位数”。这种说法在某些情况下可以帮助初学者理解,但严格来说并不完全准确。

Kruskal-Wallis检验首先比较的是秩分布。只有当不同组的分布形状相对一致,只是整体位置发生改变时,显著结果才比较容易解释为组间中位数或位置参数的差异。

例如,假设A组和B组的中位数完全相同,但A组的数据非常集中,而B组的数据分布非常宽,那么两个组的整体分布仍然可能明显不同。此时,简单地说“Kruskal-Wallis检验比较了中位数”就可能产生误导。

R官方文档实际上将原假设表述为各组的位置参数相同,而不是简单地说“所有组的中位数相同”。

因此,在写论文时,更严谨的表达通常是:“The Kruskal-Wallis test was used to assess differences in the distributions/ranks among the independent groups.”

如果研究者确认各组分布形状相近,再进一步描述为位置或中位数方面的差异会更加合理。

什么时候应该使用Kruskal-Wallis检验?

Kruskal-Wallis检验最典型的应用场景是:一个分类自变量包含三个或更多独立组,而因变量至少具有有序信息,并且传统ANOVA的参数假设不适合。例如,一项医学研究比较三种治疗方案对患者疼痛评分的影响。疼痛评分可能采用0~10分量表,并且数据分布明显偏态。这时可以考虑Kruskal-Wallis检验。

类似的情况还包括比较不同实验组的炎症指标、不同药物剂量组的毒性评分、不同环境条件下的行为评分,以及不同人群的Likert量表结果等。它尤其适用于以下类型的数据:

第一,有序数据。
例如满意度评分、疾病严重程度等级、Likert量表等。这类数据并不一定适合按照连续变量进行传统参数检验。

第二,明显偏离正态分布的数据。
如果数据存在严重偏态或极端值,研究者不希望依赖正态分布假设,可以考虑使用基于秩的Kruskal-Wallis方法。

第三,存在明显异常值的数据。
由于Kruskal-Wallis使用秩而不是直接使用原始数值,因此通常不像均值和方差那样容易受到极端观测值的影响。

不过,“数据不服从正态分布”并不意味着必须自动选择Kruskal-Wallis。研究者仍然应该结合研究设计、样本量、数据类型以及实际科学问题进行判断。

Kruskal-Wallis与单因素ANOVA有什么区别?

Kruskal-Wallis经常被称为“非参数ANOVA”,但两者实际上回答问题的方式并不完全一样。

单因素ANOVA主要基于原始数据及其均值和误差结构,核心关注的是不同组的总体均值是否存在差异。传统ANOVA涉及正态性、独立性以及方差结构等假设;如果这些假设明显不合理,可以考虑其他方法,例如Welch ANOVA或者非参数方法。

Kruskal-Wallis则首先将原始观测值转换为秩,再比较不同组的秩分布。

因此,两者最大的区别之一就在于:ANOVA分析原始数值,Kruskal-Wallis分析排序后的秩。

这也意味着Kruskal-Wallis不会要求原始数据本身服从正态分布。

但是,这并不意味着Kruskal-Wallis在所有情况下都优于ANOVA。恰恰相反,如果数据符合ANOVA的模型假设,并且研究问题确实是比较均值,那么ANOVA通常能够更直接地回答研究问题,而且在满足其假设的条件下往往具有更高的统计效率。

因此,不应该把“非参数检验”理解成“比参数检验更高级”或者“更安全”。正确的选择取决于数据结构和研究问题。

它是否要求方差齐性?

这是另一个经常被过度简化的问题。Kruskal-Wallis不像传统单因素ANOVA那样以方差齐性作为核心参数假设,因此在不同组方差不完全相等的情况下,它具有一定的灵活性。

但这并不意味着研究者可以完全忽略不同组的分布差异。

假如A组分布非常集中,B组分布非常分散,C组又具有明显偏态,那么Kruskal-Wallis显著时,很难仅凭这个P值判断究竟是组的位置发生了变化,还是分布形状、离散程度等因素造成了秩分布的差异。

因此,实际分析中最好不要只给出一个Kruskal-Wallis P值,而应该同时查看数据的分布情况。例如使用箱线图(boxplot)、小提琴图(violin plot)或者散点图展示各组数据。

这也是为什么在科研论文中,“选择Kruskal-Wallis是因为数据不正态”并不是完整的统计学论证。更重要的是说明研究设计、数据类型以及为什么基于秩的方法能够回答当前的研究问题。

Kruskal-Wallis检验有哪些局限?

首先,它不是一个“万能的非参数检验”。如果研究数据实际上是配对数据或重复测量数据,就不能简单地把这些数据当作独立样本进行Kruskal-Wallis检验。例如同一批患者分别接受多个时间点的测量,此时数据之间存在相关性,应考虑适用于重复测量的统计方法,例如Friedman检验等。

其次,Kruskal-Wallis主要针对独立组。如果观察值之间存在明显的相关性或聚类结构,例如同一个患者贡献多个观察值、同一实验动物被重复测量,或者数据来自明显的cluster,那么单纯使用Kruskal-Wallis可能低估数据结构的复杂性。

第三,它通常需要较为谨慎地处理ties。很多实际研究中的数据并不是连续变量,而是评分数据,因此相同数值非常常见。统计软件通常会进行ties correction,但研究者仍然应该了解这一点。

第四,Kruskal-Wallis显著后通常还需要进一步的post-hoc分析,这会增加统计分析的复杂程度。

最后,如果数据实际上满足参数模型的条件,而且研究者真正关心的是均值差异,那么使用Kruskal-Wallis可能损失部分统计效率。换句话说,不能因为Kruskal-Wallis“不需要正态分布”就把它作为ANOVA的默认替代方案。

Kruskal-Wallis显著后应该怎么办?

这是实际论文分析中最容易出问题的地方之一。

假设研究者比较A、B、C、D四个组,Kruskal-Wallis检验得到:

[
P=0.003
]

这说明至少存在一个组与其他组存在差异,但不知道具体是哪一组。

此时可以进行post-hoc pairwise comparisons。常见方法包括Dunn's test(Dunn检验)等,并对多重比较产生的P值进行校正,例如Bonferroni、Holm或者Benjamini-Hochberg等方法,具体选择取决于研究目的和错误率控制策略。

例如进行六次两两比较时,如果每一次都直接使用0.05作为显著性标准,就会增加整体I类错误(Type I error)的风险。因此不能简单地把所有两两比较结果逐一进行未经校正的P<0.05判断。

一个较为规范的分析流程是:

先进行Kruskal-Wallis总体检验 → 如果总体检验显著,再进行适当的post-hoc两两比较 → 对多重比较进行校正 → 报告具体的组间差异。

如果总体Kruskal-Wallis检验没有显著结果,通常没有必要为了“寻找显著差异”而机械地进行大量两两比较。

如何在R中进行Kruskal-Wallis检验?

R语言自带的stats包已经提供了kruskal.test()函数,不需要额外安装软件包。R官方文档支持直接输入数值向量和分组变量,也支持使用公式形式进行分析。

例如有三组数据:

group_A <- c(12, 15, 17, 13, 19)
group_B <- c(8, 11, 10, 14, 12)
group_C <- c(20, 18, 22, 17, 21)

kruskal.test(list(group_A, group_B, group_C))

也可以将数据整理成data frame,然后使用公式形式:

data <- data.frame(
value = c(group_A, group_B, group_C),
group = factor(rep(c("A", "B", "C"), each = 5))
)

kruskal.test(value ~ group, data = data)

R会返回Kruskal-Wallis统计量、自由度和P值。例如结果可能显示:

Kruskal-Wallis chi-squared = 8.52
df = 2
p-value = 0.014

这意味着在当前数据下,三个组的秩分布存在统计学证据支持的差异。但不要直接把这个结果写成“A、B、C三组的中位数均存在差异”,因为总体检验并没有告诉我们具体是哪两组不同。

如何在Python中进行Kruskal-Wallis检验?

Python中可以使用SciPy的scipy.stats.kruskal()函数。SciPy官方文档将其定义为用于独立样本的Kruskal-Wallis H检验,并返回H统计量和P值。

基本代码如下:

from scipy.stats import kruskal

group_A = [12, 15, 17, 13, 19]
group_B = [8, 11, 10, 14, 12]
group_C = [20, 18, 22, 17, 21]

stat, p = kruskal(group_A, group_B, group_C)

print("H =", stat)
print("P =", p)

如果:

P < 0.05

则可以拒绝各组来自相同分布这一原假设,并进一步考虑post-hoc分析。

需要注意的是,SciPy文档也特别指出,Kruskal-Wallis的卡方近似要求样本量不能过小,并给出了每组至少约5个观测值这一常见经验规则。 因此,“Kruskal-Wallis适合小样本”应该谨慎理解。它确实比许多依赖正态模型的方法更灵活,但并不意味着样本量很小时就可以无条件地得到可靠的卡方近似P值。对于非常小的样本,需要考虑精确方法、置换方法或其他更适合当前设计的分析方案。

论文中应该如何报告Kruskal-Wallis结果?

科研论文中不建议只写:

“The Kruskal-Wallis test showed a significant difference (P < 0.05).”

这种写法提供的信息太少。

更完整的结果通常应该包含检验统计量、自由度和P值,例如:

“A Kruskal-Wallis test indicated a significant difference among the three groups (H = 8.52, df = 2, P = 0.014).”

如果进一步进行了Dunn检验,还应该报告具体的两两比较及多重比较校正后的P值。

此外,描述性统计也非常重要。对于这类基于秩的非参数分析,研究者通常可以报告各组的中位数和四分位距(median [IQR]),同时配合箱线图或散点图展示原始数据分布。

例如:

“Values are presented as median (IQR). Differences among groups were assessed using the Kruskal-Wallis test, followed by Dunn's post-hoc test with Holm correction.”

这种写法能够让读者清楚知道:研究者使用了什么总体检验、为什么进行了两两比较,以及如何控制多重比较带来的错误率。

不要只看P值:效应量同样重要

Kruskal-Wallis检验的P值只能回答“是否存在统计学证据支持组间差异”,并不能告诉我们差异有多大。

这在大样本研究中特别重要。样本量足够大时,一个非常小的实际差异也可能得到很小的P值。因此,如果条件允许,建议同时报告适当的效应量

Kruskal-Wallis相关的效应量可以使用epsilon-squared(ε2\varepsilon^2)等指标进行描述。其基本思想是估计组别因素能够解释的秩变异程度。不同软件和文献对于具体效应量估计及偏差校正存在不同公式,因此在正式论文中应明确所采用的效应量及计算方法,而不要只给出一个未经说明的数字。

这也是现代统计报告越来越强调的一个方向:

统计显著性告诉我们“有没有证据”,效应量帮助我们理解“差异有多大”。

如果研究者希望结果具有更好的临床或生物学解释,还应该结合实际效应大小和置信区间,而不是把P值作为唯一判断依据。

Kruskal-Wallis检验最常见的几个误区

最常见的第一个错误,是把它简单理解为“三组以上数据的中位数检验”。严格来说,它比较的是基于秩的分布差异;只有在一定分布条件下,结果才能较直接地解释为位置或中位数差异。

第二个错误,是认为只要数据不服从正态分布,就必须使用Kruskal-Wallis。事实上,统计检验的选择不能仅由正态性检验决定。研究设计、数据类型、样本量、方差结构以及科学问题都应该纳入考虑。

第三个错误,是把Kruskal-Wallis显著直接解释成“所有组之间都有差异”。实际上,总体检验显著只能说明至少存在一处差异。具体差异来自哪些组,需要通过适当的post-hoc比较确定。

第四个错误,是忽略数据是否独立。如果同一受试者被重复测量,却把每次测量当成独立观察值输入Kruskal-Wallis,那么统计推断可能是不正确的。

第五个错误,是只报告P值而不展示原始数据。非参数检验尤其应该结合数据可视化,因为秩检验本身并不能告诉读者各组数据的完整分布情况。

如何选择Kruskal-Wallis、ANOVA和其他检验?

实际科研分析时,可以先从研究设计而不是软件菜单出发。

如果只有两个独立组,通常考虑Mann-Whitney U检验;如果是三个或更多独立组,可以考虑Kruskal-Wallis。

如果只有两个配对或相关样本,则可以考虑Wilcoxon signed-rank test;如果是三个或更多相关组,则可以考虑Friedman检验。

如果数据适合参数模型,并且研究问题是比较多个独立组的均值,则单因素ANOVA可能更加合适。如果存在明显的方差不齐性,则Welch ANOVA也是一个值得考虑的选择,而不是简单地把所有非正态或方差不齐的数据都转交给Kruskal-Wallis。

因此,一个比较实用的判断逻辑是:先确定研究设计 → 判断组间是否独立 → 确定因变量的数据类型 → 考察数据分布和模型假设 → 再选择统计检验。而不是先看到“数据不正态”,然后机械地选择Kruskal-Wallis。

最后应该如何理解Kruskal-Wallis检验?

Kruskal-Wallis检验真正有价值的地方,并不是简单地提供一个“ANOVA的非参数版本”,而是提供了一种基于秩的组间比较框架。当原始数据不适合直接依赖正态模型,或者结局变量本身具有明显的有序性质时,它能够成为一种非常实用的统计方法。

但它的使用也应该建立在正确理解的基础上:它比较的是多个独立组的秩分布,而不是无条件地比较中位数;它不要求原始数据服从正态分布,但并不意味着完全没有假设;总体检验显著后,还需要通过适当的post-hoc方法确定具体的组间差异。

对于科研人员而言,最值得记住的并不是某一条固定的“P<0.05就怎么做”的规则,而是整个分析过程应该与研究设计保持一致。先明确科学问题,再选择统计模型,最后根据模型输出结果,而不是为了得到一个显著的P值去反向选择检验方法。

Kruskal-Wallis检验的提出已经有七十多年历史,但它今天仍然广泛出现在医学、生物学、心理学、生态学以及社会科学研究中。原始方法论文发表于1952年,而现代R和Python等统计软件已经将其封装成非常易于使用的函数,使研究者可以把更多精力放在研究设计、结果解释和科学问题本身上。

参考资料

Kruskal, W. H., & Wallis, W. A. (1952). Use of ranks in one-criterion variance analysis. Journal of the American Statistical Association, 47(260), 583–621.

R Project. Kruskal-Wallis Rank Sum Test — kruskal.test.

SciPy. scipy.stats.kruskal — Kruskal-Wallis H-test for independent samples.

BMJ. Statistics at Square One: Analysis of variance and non-parametric methods.

撰稿人
标签
统计分析
目录
订阅邮件
订阅我们的邮箱后可提前获得AJE作者资源的文章,享受AJE服务的折扣,以及更多的优惠

查看 "隐私协议"

AJE提供一系列科研支持服务,助力论文成功发表!

AJE为您提供英文论文润色、学术论文翻译、期刊选择、文稿排版等一系列学术服务,我们希望可以帮助您充分发挥您的研究潜力,助力您成功将论文发布在国际期刊上。