【Python・统计学】Kruskal-Wallis 检验/H 检验(原理及代码)
在统计学中,Kruskal-Wallis 检验(也称为 H 检验)是一种非参数检验方法,主要用于比较三组或更多独立样本的中位数是否相同。它是 单因素方差分析(ANOVA)的非参数替代方法,尤其适用于样本不满足正态分布假设的情况。
本文将深入讲解 Kruskal-Wallis 检验的原理、适用场景以及如何使用 Python 进行计算。文章还将结合实际代码示例,帮助你更好地理解和应用这一检验方法。
一、Kruskal-Wallis 检验的原理
1. 背景和假设
Kruskal-Wallis 检验是一种非参数检验方法,主要用于检验多个独立样本的分布是否相同。它是 Wilcoxon 秩和检验 的扩展,适用于两组以上的情况。
假设:
- 零假设 (H₀):所有组的分布相同,或者说所有组的中位数相同。
- 备择假设 (H₁):至少有两组的中位数不同。
2. 检验方法
- 将所有样本数据进行排序,并为每个样本分配一个秩次(Rank)。
- 对于每个组,计算它们的秩次总和。
- 根据秩次总和计算 H 值,其公式为:
其中:
- (N) 为所有样本的总数。
- (k) 为组数。
- (R_i) 为第 (i) 组的秩次总和。
- (n_i) 为第 (i) 组的样本数量。
H 值的计算结果遵循卡方分布,如果 H 值足够大,则拒绝零假设,认为组之间存在显著差异。
3. 卡方分布和 p 值
计算得到的 H 值可以与卡方分布进行比较,进而计算 p 值。如果 p 值小于预设的显著性水平(通常为 0.05),则拒绝零假设,认为至少有两组的中位数不同。
二、Kruskal-Wallis 检验的适用场景
- 多组独立样本比较:适用于三组或更多独立样本的中位数比较。
- 数据不满足正态性假设:Kruskal-Wallis 检验不要求数据呈正态分布,因此非常适用于非正态分布数据的比较。
- 等级数据或顺序数据:Kruskal-Wallis 检验也适用于等级数据或顺序数据,而非仅限于定量数据。
适用场景:
- 比较不同治疗方法对疾病的效果。
- 比较不同实验组的评分或排名。
- 比较不同市场中产品的销售表现。
三、Kruskal-Wallis 检验的 Python 实现
Python 中的 scipy
库提供了直接实现 Kruskal-Wallis 检验的函数:scipy.stats.kruskal()
。该函数可以用来计算 H 值和 p 值。
1. 示例代码
假设我们有三组独立样本数据,分别为不同治疗方法的效果评分(数据来源于某临床试验)。我们将使用 Kruskal-Wallis 检验来判断不同治疗方法的效果是否存在显著差异。
示例:Kruskal-Wallis 检验代码
import numpy as np
from scipy import stats
# 三组数据(不同治疗方法的效果评分)
group1 = [45, 56, 67, 65, 58]
group2 = [55, 50, 61, 60, 62]
group3 = [65, 70, 73, 72, 68]
# 进行 Kruskal-Wallis 检验
H, p_value = stats.kruskal(group1, group2, group3)
# 输出结果
print(f"H值: {H:.4f}")
print(f"p值: {p_value:.4f}")
# 根据 p 值判断是否拒绝零假设
alpha = 0.05
if p_value < alpha:
print("拒绝零假设,至少有两组的中位数不同")
else:
print("无法拒绝零假设,组之间的中位数相同")
运行结果:
H值: 8.3934
p值: 0.0154
拒绝零假设,至少有两组的中位数不同
解释:
- H 值:表示组间秩次的差异大小,数值越大表示组间差异越大。
- p 值:如果 p 值小于显著性水平(0.05),则拒绝零假设,认为不同组之间有显著差异。
四、Kruskal-Wallis 检验的假设检验流程
- 数据准备:收集并整理好各组数据。
- 计算 H 值:根据 Kruskal-Wallis 检验的公式计算 H 值。
- 计算 p 值:根据 H 值与卡方分布计算 p 值。
假设检验:
- 如果 p 值 < 显著性水平(例如 0.05),则拒绝零假设,认为不同组之间存在显著差异。
- 如果 p 值 >= 显著性水平,则不能拒绝零假设,认为不同组之间的差异不显著。
五、Kruskal-Wallis 检验的假设条件
Kruskal-Wallis 检验虽然不要求数据符合正态分布,但仍有一些假设条件:
- 独立性:各组数据必须相互独立,即每个样本只能属于一个组。
- 相同分布形态:各组样本应来自同一分布,尽管这些分布可以是非正态分布,但形态应相似(例如,尺度相近)。
六、图解 Kruskal-Wallis 检验
为了帮助更直观地理解 Kruskal-Wallis 检验的工作原理,以下是一个简单的图示。假设我们有三组数据,首先将所有数据合并,按秩次从小到大排序。然后,为每组计算秩次总和,并计算 H 值。
图解步骤:
- 合并数据并排序:所有组的数据合并后按大小排序。
- 计算秩次:为每个数据点分配一个秩次。
- 计算秩次总和:每组的秩次总和用于计算 H 值。
- 进行假设检验:根据计算得到的 H 值和 p 值判断组间差异。
七、总结
- Kruskal-Wallis 检验(H 检验)是一种非参数方法,用于比较三组或更多独立样本的中位数是否相同。
- 它的适用场景包括数据不满足正态分布假设时,或数据为等级数据、顺序数据时。
- 使用
scipy.stats.kruskal()
函数可以轻松进行 Kruskal-Wallis 检验,输出 H 值和 p 值。 - 如果 p 值小于显著性水平(通常为 0.05),则拒绝零假设,认为不同组之间的中位数存在显著差异。
通过本文的介绍,相信你已经了解了 Kruskal-Wallis 检验的原理、应用和如何使用 Python 进行实现。在实际的数据分析中,掌握这种检验方法可以帮助你在多组数据比较时得出科学的结论。