【Python・统计学】Kruskal-Wallis 检验/H 检验(原理及代码)

【Python・统计学】Kruskal-Wallis 检验/H 检验(原理及代码)

在统计学中,Kruskal-Wallis 检验(也称为 H 检验)是一种非参数检验方法,主要用于比较三组或更多独立样本的中位数是否相同。它是 单因素方差分析(ANOVA)的非参数替代方法,尤其适用于样本不满足正态分布假设的情况。

本文将深入讲解 Kruskal-Wallis 检验的原理、适用场景以及如何使用 Python 进行计算。文章还将结合实际代码示例,帮助你更好地理解和应用这一检验方法。


一、Kruskal-Wallis 检验的原理

1. 背景和假设

Kruskal-Wallis 检验是一种非参数检验方法,主要用于检验多个独立样本的分布是否相同。它是 Wilcoxon 秩和检验 的扩展,适用于两组以上的情况。

假设:

  • 零假设 (H₀):所有组的分布相同,或者说所有组的中位数相同。
  • 备择假设 (H₁):至少有两组的中位数不同。

2. 检验方法

  • 将所有样本数据进行排序,并为每个样本分配一个秩次(Rank)。
  • 对于每个组,计算它们的秩次总和。
  • 根据秩次总和计算 H 值,其公式为:
\[ H = \frac{12}{N(N+1)} \sum_{i=1}^{k} \frac{R_i^2}{n_i} - 3(N+1) \]

其中:

  • (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 检验的假设检验流程

  1. 数据准备:收集并整理好各组数据。
  2. 计算 H 值:根据 Kruskal-Wallis 检验的公式计算 H 值。
  3. 计算 p 值:根据 H 值与卡方分布计算 p 值。
  4. 假设检验

    • 如果 p 值 < 显著性水平(例如 0.05),则拒绝零假设,认为不同组之间存在显著差异。
    • 如果 p 值 >= 显著性水平,则不能拒绝零假设,认为不同组之间的差异不显著。

五、Kruskal-Wallis 检验的假设条件

Kruskal-Wallis 检验虽然不要求数据符合正态分布,但仍有一些假设条件:

  1. 独立性:各组数据必须相互独立,即每个样本只能属于一个组。
  2. 相同分布形态:各组样本应来自同一分布,尽管这些分布可以是非正态分布,但形态应相似(例如,尺度相近)。

六、图解 Kruskal-Wallis 检验

为了帮助更直观地理解 Kruskal-Wallis 检验的工作原理,以下是一个简单的图示。假设我们有三组数据,首先将所有数据合并,按秩次从小到大排序。然后,为每组计算秩次总和,并计算 H 值。

图解步骤:

  1. 合并数据并排序:所有组的数据合并后按大小排序。
  2. 计算秩次:为每个数据点分配一个秩次。
  3. 计算秩次总和:每组的秩次总和用于计算 H 值。
  4. 进行假设检验:根据计算得到的 H 值和 p 值判断组间差异。

七、总结

  • Kruskal-Wallis 检验(H 检验)是一种非参数方法,用于比较三组或更多独立样本的中位数是否相同。
  • 它的适用场景包括数据不满足正态分布假设时,或数据为等级数据、顺序数据时。
  • 使用 scipy.stats.kruskal() 函数可以轻松进行 Kruskal-Wallis 检验,输出 H 值和 p 值。
  • 如果 p 值小于显著性水平(通常为 0.05),则拒绝零假设,认为不同组之间的中位数存在显著差异。

通过本文的介绍,相信你已经了解了 Kruskal-Wallis 检验的原理、应用和如何使用 Python 进行实现。在实际的数据分析中,掌握这种检验方法可以帮助你在多组数据比较时得出科学的结论。

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日