【Python・统计学】Mann-Whitney U检验/Wilcoxon秩和检验(原理及代码)

前言

自学笔记,分享给对统计学原理不太清楚但需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文不涉及公式讲解(文科生小白友好体质)~(部分定义等来源于知乎百度等)

本文重点:Mann-Whitney U检验(也称Wilcoxon秩和检验)

1.定义和相关背景

2.应用条件

【3.数据实例以及Python代码

1.定义和相关背景

   秩和检验(rank sum test)又称顺序和检验,它是一种非参数检验(nonparametric test)。它不依赖于总体分布的具体形式,应用时可以不考虑被研究对象为何种分布以及分布是否已知,因而实用性较强

   在总体分布任意的情形下,检验配对的试验数据所在总体的分布位置有无显著差异,往往可以利用符号检验的方法实现。但是符号检验只考虑差数的正负号,而不考虑差数的绝对值差异,会导致部分试验信息损失,结果较为粗略。为了避免符号检验方法的这一缺陷,Wilcoxon提出了一种改进方法,称为Wilcoxon秩和检验(rank sum test)。这种方法同时考虑了差异的方向和差异的大小,较之符号检验更为有效。而对于成组的试验数据所在总体的分布位置有无差异,也可以采用类似的方法进行检验。

   秩和检验是通过将所有观察值(或每对观察值差的绝对值)按照从小到大的次序排列,每一观察值(或每对观察值差的绝对值)按照次序编号,称为秩(或秩次)。对两组观察值(配对设计下根据观察值差的正负分为两组)分别计算秩和进行检验。除了比较各对数据差的符号外,这种方法还进一步比较了各对数据差值大小的秩次高低,因此其检验效率较符号检验为高。

2.应用条件

  1. 两个独立的样本(即不存在配对关系)。
  2. 数据至少是有序的(ordinal level),不要求满足正态分布或方差齐性。
  3. 适用于样本量较小(n1,n2<30)或数据分布严重偏离正态的情况。

补充:关于参数检验非参数检验的使用条件想请参考以下两个说明:

【统计学】参数检验和非参数检验的使用条件(图表说明)icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/138028274

【统计学】参数检验和非参数检验的区别和基本统计学icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/137423304

3.数据实例以及Python代码

下面是一个比较两种英语教学方法在提高学生成绩方面是否有显著差异的例子。

假设想要比较两种英语教学方法(Method A和Method B)的效果。我们随机选择了30名学生,15名接受Method A教学,15名接受Method B教学,并在学期末进行了统一的英语测试(满分100分)。我们想要检验这两种教学方法是否有显著的差异。

数据如下:

Method A: 85, 92, 78, 88, 90, 82, 86, 93, 80, 91, 84, 89, 79, 87, 83

Method B: 80, 85, 75, 82, 88, 78, 83, 90, 77, 86, 81, 84, 76, 79, 87

import numpy as np
from scipy import stats

# 数据
method_a = [85, 92, 78, 88, 90, 82, 86, 93, 80, 91, 84, 89, 79, 87, 83]
method_b = [80, 85, 75, 82, 88, 78, 83, 90, 77, 86, 81, 84, 76, 79, 87]

# 输出数据的基本统计量
print("Method A:")
print(f"Mean: {np.mean(method_a)}")
print(f"Median: {np.median(method_a)}")
print(f"Standard Deviation: {np.std(method_a)}")

print("\nMethod B:")
print(f"Mean: {np.mean(method_b)}")
print(f"Median: {np.median(method_b)}")
print(f"Standard Deviation: {np.std(method_b)}")

# 进行Mann-Whitney U检验
statistic, p_value = stats.mannwhitneyu(method_a, method_b)

print(f"\nMann-Whitney U Test:")
print(f"U statistic: {statistic}")
print(f"P-value: {p_value}")

# 根据p值判断是否存在显著差异
alpha = 0.05
if p_value < alpha:
    print("Reject the null hypothesis: The two teaching methods have significantly different effects on students' English scores.")
else:
    print("Fail to reject the null hypothesis: The two teaching methods do not have significantly different effects on students' English scores.")

结果:

Method A:
Mean: 85.8
Median: 86.0
Standard Deviation: 4.912513675534162

Method B:
Mean: 82.06666666666666
Median: 82.0
Standard Deviation: 4.574691887420385

Mann-Whitney U Test:
U statistic: 65.0
P-value: 0.03326989436731352
Reject the null hypothesis: The two teaching methods have significantly different effects on students' English scores.

  从输出结果可以看出,Method A组的平均分和中位数都高于Method B组。Mann-Whitney U检验的p值为0.0333,小于显著性水平0.05,因此我们拒绝原假设,认为这两种教学方法对学生英语成绩的影响存在显著差异。

  • 35
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Mann-Whitney U Test(Mann-Whitney-Wilcoxon Test)也称为Wilcoxon Rank-Sum Test,是一种非参数检验方法,用于比较两个独立样本的中位数是否相等。 原理: 对于两组样本,将它们合并并按照大小排序,然后将每个样本的排序位置相加,得到两个和U1和U2。然后比较U1和U2的大小,根据U1和U2的大小关系,可以判断两个样本的中位数是否相等。 - 如果U1<U2,则第一个样本的中位数比第二个样本的中位数小。 - 如果U1>U2,则第一个样本的中位数比第二个样本的中位数大。 - 如果U1=U2,则两个样本的中位数相等。 使用Python实现Mann-Whitney U Test: Python中可以使用scipy库中的mannwhitneyu()函数来进行Mann-Whitney U Test。函数的语法如下: scipy.stats.mannwhitneyu(x, y, use_continuity=True, alternative=None) - x, y:两个独立的样本数据。 - use_continuity:默认为True,表示使用连续校正。如果为False,则不进行连续校正。 - alternative:默认为None,表示检验双侧假设。如果为“less”,则检验左侧假设;如果为“greater”,则检验右侧假设。 函数返回值为Mann-Whitney U Test的统计量和p值。如果p值小于显著性水平,则拒绝原假设,即两个样本的中位数不相等。如果p值大于显著性水平,则接受原假设,即两个样本的中位数相等。 示例代码: import numpy as np from scipy.stats import mannwhitneyu # 生成两个样本数据 x = np.random.normal(loc=5, scale=1, size=100) y = np.random.normal(loc=6, scale=1, size=100) # 进行Mann-Whitney U Test statistic, pvalue = mannwhitneyu(x, y) # 输出结果 print("Mann-Whitney U Test:") print("statistic:", statistic) print("pvalue:", pvalue) # 判断两个样本的中位数是否相等 if pvalue < 0.05: print("Reject the null hypothesis: the medians are different.") else: print("Accept the null hypothesis: the medians are equal.")

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值