在应用机器学习中,我们经常需要确定两个数据样本是否具有相同或不同的分布。
我们可以使用统计显著性检验来回答这个问题,这些检验可以量化样本具有相同分布的可能性。
如果数据不具有常见的高斯分布,我们必须求助于非参数版本的显著性检验。这些检验的运作方式类似,但是是免分布的,要求在执行检验之前,先将实数值数据转换为秩数据。
在本教程中,您将了解非参数统计检验,您可以使用这些检验来确定数据样本是否来自具有相同或不同分布的总体。
完成本教程后,您将了解:
- Mann-Whitney U 检验用于比较独立数据样本:学生 t 检验的非参数版本。
- Wilcoxon 符号秩检验用于比较配对数据样本:配对学生 t 检验的非参数版本。
- Kruskal-Wallis H 检验和 Friedman 检验用于比较两个以上的数据样本:ANOVA 和重复测量 ANOVA 检验的非参数版本。
用我的新书《机器学习统计学》,启动您的项目,包括所有示例的分步教程和 Python 源代码文件。
让我们开始吧。
- 2018年5月更新:改进了关于拒绝与未能拒绝统计检验的表述。

Python 中非参数统计显著性检验简介
照片由 Jirka Matousek 拍摄,保留部分权利。
教程概述
本教程分为6个部分;它们是
- 非参数统计显著性检验
- 测试数据
- Mann-Whitney U 检验
- Wilcoxon 符号秩检验
- Kruskal-Wallis H 检验
- Friedman 检验
需要机器学习统计学方面的帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
非参数统计显著性检验
非参数统计是指那些不假设数据具有特定分布的方法。
通常,它们指的是不假设高斯分布的统计方法。它们最初是为序数或区间数据开发的,但在实践中,也可以用于对数据样本中的实值观测值进行排序,而不是对观测值本身进行操作。
关于两个或多个数据集的一个常见问题是它们是否不同。具体来说,它们的集中趋势(例如均值或中位数)之间的差异是否具有统计显著性。
对于不具有高斯分布的数据样本,可以通过使用非参数统计显著性检验来回答这个问题。这些检验的原假设通常是假设两个样本都来自具有相同分布的总体,因此具有相同的人口参数,例如均值或中位数。
如果在对两个或多个样本进行显著性检验后,原假设被拒绝,这表明有证据表明样本来自不同的总体,反过来,样本对总体参数(如均值或中位数)的估计之间的差异可能是显著的。
这些检验通常用于模型技能得分的样本,以确认机器学习模型之间的技能差异是显著的。
通常,每个检验都会计算一个检验统计量,必须结合一些统计学背景和对统计检验本身的更深入了解来解释。检验还会返回一个p值,可用于解释检验结果。p值可以被认为是,在两个样本来自具有相同分布的总体这一基本假设(原假设)下,观察到这两个数据样本的概率。
p值可以在选定的显著性水平(称为 alpha)的背景下进行解释。alpha 的一个常用值是5%或0.05。如果p值低于显著性水平,那么检验表明有足够的证据拒绝原假设,并且样本很可能来自具有不同分布的总体。
- p <= alpha:拒绝 H0,分布不同。
- p > alpha:未能拒绝 H0,分布相同。
测试数据集
在我们查看特定的非参数显著性检验之前,让我们首先定义一个测试数据集,我们可以用它来演示每个检验。
我们将生成两个从不同分布中抽取的样本。为了简单起见,我们将从高斯分布中抽取样本,尽管如前所述,我们在本教程中回顾的检验适用于我们不知道或不假设任何特定分布的数据样本。
我们将使用 randn() NumPy 函数在每个样本中生成100个高斯随机数样本,均值为0,标准差为1。第一个样本中的观测值被缩放为均值为50,标准差为5。第二个样本中的观测值被缩放为均值为51,标准差为5。
我们期望统计检验能够发现样本来自不同的分布,尽管每个样本100个观测值的小样本量会给这个决策增加一些噪音。
完整的代码示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 生成高斯数据样本 from numpy.random import seed from numpy.random import randn from numpy import mean from numpy import std # 为随机数生成器设置种子 seed(1) # 生成两组单变量观测值 data1 = 5 * randn(100) + 50 data2 = 5 * randn(100) + 51 # 总结 print('data1: mean=%.3f stdv=%.3f' % (mean(data1), std(data1))) print('data2: mean=%.3f stdv=%.3f' % (mean(data2), std(data2))) |
运行该示例会生成数据样本,然后计算并打印每个样本的均值和标准差,确认它们的分布不同。
1 2 |
data1: mean=50.303 stdv=4.426 data2: mean=51.764 stdv=4.660 |
Mann-Whitney U 检验
Mann-Whitney U 检验是一种非参数统计显著性检验,用于确定两个独立样本是否来自具有相同分布的总体。
该检验以 Henry Mann 和 Donald Whitney 的名字命名,但有时也被称为 Wilcoxon-Mann-Whitney 检验,也以 Frank Wilcoxon 的名字命名,他也开发了该检验的一个变体。
将两个样本合并并一起进行排序。其策略是确定来自两个样本的值在排序中是随机混合的,还是在合并时聚集在两端。随机的排序意味着两个样本没有差异,而一个样本值的聚集则表明它们之间存在差异。
— 第58页,《非统计学家的非参数统计学:分步方法》,2009年。
默认假设或原假设是数据样本的分布之间没有差异。拒绝该假设表明样本之间可能存在某些差异。更具体地说,该检验确定从一个样本中随机选择的任何观测值大于或小于另一个分布中的样本的可能性是否相等。如果违反了这一点,则表明分布不同。
- 未能拒绝H0:样本分布相等。
- 拒绝H0:样本分布不相等。
为了使检验有效,它要求每个数据样本中至少有20个观测值。
我们可以使用 mannwhitneyu() SciPy 函数在 Python 中实现 Mann-Whitney U 检验。该函数将两个数据样本作为参数。它返回检验统计量和p值。
下面的示例演示了在测试数据集上进行的 Mann-Whitney U 检验。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Mann-Whitney U 检验 from numpy.random import seed from numpy.random import randn from scipy.stats import mannwhitneyu # 为随机数生成器设置种子 seed(1) # 生成两个独立样本 data1 = 5 * randn(100) + 50 data2 = 5 * randn(100) + 51 # 比较样本 stat, p = mannwhitneyu(data1, data2) print('Statistics=%.3f, p=%.3f' % (stat, p)) # 解释 alpha = 0.05 if p > alpha: print('分布相同 (未能拒绝 H0)') else: print('分布不同 (拒绝 H0)') |
运行该示例会对数据集进行检验,并打印出统计量和p值。
p值强烈表明样本分布是不同的,这符合预期。
1 2 |
统计量=4025.000, p=0.009 分布不同 (拒绝 H0) |
Wilcoxon 符号秩检验
在某些情况下,数据样本可能是配对的。
出现这种情况的原因有很多,例如,样本是相关的或以某种方式匹配的,或者代表了同一技术的两次测量。更具体地说,每个样本是独立的,但来自同一个总体。
机器学习中配对样本的例子可能是在不同数据集上评估的相同算法,或在完全相同的训练和测试数据上评估的不同算法。
样本不是独立的,因此不能使用 Mann-Whitney U 检验。相反,应使用Wilcoxon 符号秩检验,也称为 Wilcoxon T 检验,以 Frank Wilcoxon 的名字命名。它相当于配对学生 T 检验,但用于秩数据而不是具有高斯分布的实值数据。
Wilcoxon 符号秩检验是一种非参数统计程序,用于比较两个配对或相关的样本。Wilcoxon 符号秩检验的参数等效检验有多种名称,如学生 t 检验、配对 t 检验、配对样本 t 检验或相关样本 t 检验。
— 第38-39页,《非统计学家的非参数统计学:分步方法》,2009年。
检验的默认假设,即原假设,是两个样本具有相同的分布。
- 未能拒绝H0:样本分布相等。
- 拒绝H0:样本分布不相等。
为了使检验有效,它要求每个数据样本中至少有20个观测值。
Wilcoxon 符号秩检验可以使用 wilcoxon() SciPy 函数在 Python 中实现。该函数将两个样本作为参数,并返回计算出的统计量和p值。
下面的完整示例演示了对测试问题计算 Wilcoxon 符号秩检验。这两个样本在技术上不是配对的,但为了演示此显著性检验的计算,我们可以假装它们是配对的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Wilcoxon 符号秩检验 from numpy.random import seed from numpy.random import randn from scipy.stats import wilcoxon # 为随机数生成器设置种子 seed(1) # 生成两个独立样本 data1 = 5 * randn(100) + 50 data2 = 5 * randn(100) + 51 # 比较样本 stat, p = wilcoxon(data1, data2) print('Statistics=%.3f, p=%.3f' % (stat, p)) # 解释 alpha = 0.05 if p > alpha: print('分布相同 (未能拒绝 H0)') else: print('分布不同 (拒绝 H0)') |
运行该示例会计算并打印统计量和结果。
p值的解释强烈表明样本来自不同的分布。
1 2 |
统计量=1886.000, p=0.028 分布不同 (拒绝 H0) |
Kruskal-Wallis H 检验
在使用显著性检验时,如 Mann-Whitney U 和 Wilcoxon 符号秩检验,数据样本之间的比较必须成对进行。
如果您有许多数据样本,并且只对两个或多个样本是否具有不同分布感兴趣,这可能会效率低下。
Kruskal-Wallis 检验是单因素方差分析(ANOVA)的非参数版本。它以该方法的开发者 William Kruskal 和 Wilson Wallis 的名字命名。该检验可用于确定两个以上的独立样本是否具有不同的分布。它可以被认为是 Mann-Whitney U 检验的推广。
默认假设或原假设是所有数据样本都来自同一分布。具体来说,所有组的总体中位数是相等的。拒绝原假设表明有足够的证据表明一个或多个样本主导另一个样本,但检验并未指出是哪些样本或主导了多少。
当 Kruskal-Wallis H 检验得出显著结果时,那么至少有一个样本与其他样本不同。然而,该检验并未指明差异发生在哪里。此外,它也未指明发生了多少差异。为了确定样本对之间的特定差异,研究人员可能会使用样本对比或事后检验来分析特定样本对的显著差异。Mann-Whitney U 检验是执行各个样本集之间样本对比的有用方法。
— 第100页,《非统计学家的非参数统计学:分步方法》,2009年。
- 未能拒绝H0:所有样本分布都相等。
- 拒绝H0:一个或多个样本分布不相等。
每个数据样本必须是独立的,具有5个或更多观测值,并且数据样本的大小可以不同。
我们可以将测试问题更新为3个数据样本,而不是2个,其中两个样本具有相同的样本均值。考虑到有一个样本不同,我们期望检验能够发现差异并拒绝原假设。
1 2 3 4 |
# 生成三个独立样本 data1 = 5 * randn(100) + 50 data2 = 5 * randn(100) + 50 data3 = 5 * randn(100) + 52 |
Kruskal-Wallis H 检验可以使用 kruskal() SciPy 函数在 Python 中实现。它将两个或更多的数据样本作为参数,并返回检验统计量和p值作为结果。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Kruskal-Wallis H 检验 from numpy.random import seed from numpy.random import randn from scipy.stats import kruskal # 为随机数生成器设置种子 seed(1) # 生成三个独立样本 data1 = 5 * randn(100) + 50 data2 = 5 * randn(100) + 50 data3 = 5 * randn(100) + 52 # 比较样本 stat, p = kruskal(data1, data2, data3) print('Statistics=%.3f, p=%.3f' % (stat, p)) # 解释 alpha = 0.05 if p > alpha: print('分布相同 (未能拒绝H0)') else: print('分布不同 (拒绝H0)') |
运行示例会计算检验并打印结果。
p值的解释正确地拒绝了所有样本具有相同分布的原假设。
1 2 |
统计量=6.051, p=0.049 分布不同 (拒绝 H0) |
Friedman 检验
和前一个例子一样,我们可能有超过两个不同的样本,并且我们感兴趣的是所有样本是否具有相同的分布。
如果样本以某种方式配对,例如重复测量,那么 Kruskal-Wallis H 检验就不合适了。相反,可以使用Friedman 检验,以 Milton Friedman 的名字命名。
Friedman 检验是重复测量方差分析(repeated measures ANOVA)的非参数版本。该检验可以被认为是 Kruskal-Wallis H 检验推广到两个以上样本的情况。
默认假设或原假设是多个配对样本具有相同的分布。拒绝原假设表明一个或多个配对样本具有不同的分布。
- 未能拒绝H0:配对样本分布相等。
- 拒绝H0:配对样本分布不相等。
该检验假定有两个或更多的配对数据样本,每组样本数在10个或以上。
Friedman 检验是一种非参数统计程序,用于比较两个以上相关的样本。该检验的参数等效检验是重复测量方差分析(ANOVA)。当 Friedman 检验得出显著结果时,至少有一个样本与其他样本不同。
— 第79-80页,《非统计学家的非参数统计学:分步方法》,2009年。
我们可以使用 friedmanchisquare() SciPy 函数在 Python 中实现 Friedman 检验。该函数将要比较的数据样本作为参数,并返回计算出的统计量和p值。
这个显著性检验可以在上一节中使用的测试数据集的相同变体上进行演示。即三个样本,其中两个具有相同的总体均值,一个具有略微不同的均值。尽管样本不是配对的,但我们期望检验能够发现并非所有样本都具有相同的分布。
完整的代码示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Friedman 检验 from numpy.random import seed from numpy.random import randn from scipy.stats import friedmanchisquare # 为随机数生成器设置种子 seed(1) # 生成三个独立样本 data1 = 5 * randn(100) + 50 data2 = 5 * randn(100) + 50 data3 = 5 * randn(100) + 52 # 比较样本 stat, p = friedmanchisquare(data1, data2, data3) print('Statistics=%.3f, p=%.3f' % (stat, p)) # 解释 alpha = 0.05 if p > alpha: print('分布相同 (未能拒绝H0)') else: print('分布不同 (拒绝H0)') |
运行该示例会对三个数据样本进行检验,并打印检验统计量和p值。
对p值的解释正确地表明,至少有一个样本具有不同的分布。
1 2 |
统计量=9.360, p=0.009 分布不同 (拒绝 H0) |
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 更新所有示例,使其对具有相同分布的数据样本进行操作。
- 根据每个统计显著性检验的要求和行为,创建一个用于选择检验的流程图。
- 考虑在机器学习项目中比较数据样本的3个案例,假设样本为非高斯分布,并建议在每种情况下可以使用的检验类型。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 非统计学家的非参数统计学:分步方法, 2009.
API
- numpy.random.seed() API
- numpy.random.randn() API
- scipy.stats.mannwhitneyu() API
- scipy.stats.wilcoxon() API
- scipy.stats.kruskal() API
- scipy.stats.friedmanchisquare() API
文章
- 维基百科上的非参数统计
- 维基百科上的配对差异检验
- 维基百科上的Mann-Whitney U检验
- 维基百科上的Wilcoxon符号秩检验
- 维基百科上的Kruskal-Wallis单因素方差分析
- 维基百科上的Friedman检验
总结
在本教程中,您了解了可用于确定数据样本是否来自具有相同或不同分布总体的非参数统计检验。
具体来说,你学到了:
- Mann-Whitney U 检验用于比较独立数据样本:学生 t 检验的非参数版本。
- Wilcoxon 符号秩检验用于比较配对数据样本:配对学生 t 检验的非参数版本。
- Kruskal-Wallis H 检验和 Friedman 检验用于比较两个以上的数据样本:ANOVA 和重复测量 ANOVA 检验的非参数版本。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
感谢这篇很棒的文章,有一个疑问,我们如何确定一个样本是否服从正态分布?在这些检验中,我们都在比较两个分布,但请问如何知道其中任何一个是否是正态分布。
好问题,这里有一系列方法
https://machinelearning.org.cn/a-gentle-introduction-to-normality-tests-in-python/
看到“接受H0”后我就不往下读了。
谢谢,我会修改措辞的。
感谢这篇很棒的文章。对于右偏数据(如ARPU),您会建议对数据运行u检验,还是进行大量的抽样模拟并对均值的标准误运行t检验(这将服从正态分布)?这里详细描述了该方法:http://blog.analytics-toolkit.com/2017/statistical-significance-non-binomial-metrics-revenue-time-site-pages-session-aov-rpu/
或许可以试试看?
你好 Yoav,
您引用的博客文章中的模拟只是为了说明中心极限定理的观点(很久以前就已证明),根据我所做的模拟,即使对于相对较小的样本量(每组30-40个观测值),该定理也同样适用。您可以对每个特定情况应用t检验,而无需任何模拟。
此外,像 Mann-Whitney 秩检验这样的非参数检验,只有在t检验的假设成立时,才会评估与t检验相同的内容(均值或中位数的差异),否则它是一种检验随机差异的方法,更难解释和沟通。
祝好,
Georgi
嗨,Jason,感谢这篇有启发性的文章。我在想,我是否可以对两组数据应用Wilcoxon检验,每组数据都是对同一变量的测量,但一组是通过仪器,另一组是通过模型。它们是时间序列数据,并且按小时配对。
时间间隔之间可能存在的自相关性可能会成为一个问题。
也许可以咨询一下统计学家。
你真是个大好人!
天啊,我不知道你是怎么做到的——创造出所有这些能满足我多方面数据科学需求的贴切主题。但是,谢谢你,Jason Brownlee。谢谢!
谢谢,很高兴它们能帮到你!
有趣的文章!
我正在对同一个数据集,使用30个不同的种子,比较两种不同的机器学习方法。因此,我为每种方法得到了30个AUC值。
Wilcoxon 符号秩检验是比较这两种方法的好方法吗?
嗯,也许可以用学生t检验
https://machinelearning.org.cn/statistical-significance-tests-for-comparing-machine-learning-algorithms/
如果这对项目至关重要,请咨询统计学家。
为什么你只使用p值?统计值不重要吗?没有像t表那样的东西可以用来比较吗?
p值是对临界值(统计值)的一种解释。
在仔细阅读文档后,我使用了r2py,并将R中的stats.wilcox.test()移植到Python中,因为存在近似误差和正态近似问题。scipy版本只返回双边值,并且没有实现less和greater这两个备择假设。对于少量测试(少于20个)也存在问题,这就是10折交叉验证的情况。
感谢分享。
我觉得下面这一点极具误导性
未能拒绝 H0:样本分布相等。
这些检验从来不会得出分布相等的结论,而仅仅是我们不能肯定地说它们不相等。未能拒绝可能是由于统计功效低,也就是说:你的分布可能不同,但以你拥有的数据量,我们无法确定。
是的,你说得对。我旨在为常见用法提供一个简化的解释。
或者,我们可以说“样本分布很可能来自同一个总体”。
嗨,Jason,
很棒的教程。我有一些问题,因为我没有统计学背景
1. 我正在使用来自10折交叉验证(CV测试分数)的分类器性能分数(如准确率)作为样本分布。我这样做对吗?
2. 在我的情况下,非参数检验最合适吗?
很好的问题!
我建议阅读这篇关于这个确切主题的文章
https://machinelearning.org.cn/statistical-significance-tests-for-comparing-machine-learning-algorithms/
嗨,Jason,
感谢这篇精彩的教程。
我想知道在执行Kruskal-Wallis检验后,如何进行事后Bonferroni校正,以便找出哪些组在统计上存在差异。
我已经在 Matlab 中使用以下函数完成了这个操作
[results,means] = multcompare(stats,’CType’,’bonferroni’)
其中‘stats’是从Kruskal-Wallis检验中获取的值。
先谢谢您了。
不确定,抱歉。也许检查一下API,看看是否提供了这个功能,或者可以尝试自己用Python实现它?
https://en.wikipedia.org/wiki/Bonferroni_correction
嗨,Jason,
感谢这篇好文章。有没有什么算法可以将一个现有的(例如,偏斜的)分布划分为2-3个分布,并使用例如Mann-Whitney U检验来验证它们是否来自同一分布?
我正在考虑,例如,在为训练神经网络划分数据集时,我们希望训练集、验证集和测试集是相似的。
我不知道关于划分样本然后再对其进行检验的方法。为什么不直接对它进行检验呢?
感谢超清晰的解释,
只是一个小评论,我认为这个检验实际上是用于小样本(<20)的,当你有更多的点时,它就表现得像已知参数的正态分布了(详情见维基百科),所以我想你或许应该从这篇精彩的文章中移除那个要求。
祝好!
感谢分享!
嗨,Jason,
一篇信息量非常大的文章,帮助我学到了很多!
在 Python 中有没有办法计算 Wilcoxon 符号秩检验的置信区间?我看到一个简单的R实现,但在 Python 中没有。有什么线索吗?
谢谢
谢谢!
抱歉,我没有例子。
别担心,Jason。这促使我更深入地寻找解决方案,最终我找到了一个。
由于Python中没有现成的解决方案,我遵循了研究并创建了一个小函数。我决定围绕这个解决方案写一篇文章,以便其他人如果需要可以使用,并且我在致谢中提到了你,因为这篇文章是我开始思考这个问题的原因之一。
如果您将来有机会看一看,非常希望得到您对该解决方案的专家意见:https://towardsdatascience.com/prepare-dinner-save-the-day-by-calculating-confidence-interval-of-non-parametric-statistical-29d031d079d0
谢谢
干得好!
当我包含分类数据时,我应该将它转换为数值数据并使用Mann-Whitney U检验吗?
这听起来不合适,考虑对分类数据使用卡方检验
https://machinelearning.org.cn/chi-squared-test-for-machine-learning/
如果我们有一对样本(A和B),且数据是二维的(‘x’行和‘y’列),我们该怎么做?
我正在尝试用样本A训练一个机器学习模型,然后用一个不同的样本B来测试这个模型。我试图了解这两个样本在统计上有多大差异,并看看模型是否真的好,或者是否需要重新训练。
好问题,但很难回答。
一种方法可能是查看每对变量,看它们在样本之间是否有差异,或者每对输入变量与目标变量,看它们在样本之间是否有差异。后者听起来是合适的。
你好,
非常感谢您信息丰富的博客!
我可以在 Python 中对“不等 N”使用 wilcoxon 检验吗?
此致,
– Mahmoud Sabri
谢谢。
Wilcoxon 是一个配对检验。凭直觉我会说不行。也许你可以查阅文献来确认。
嗨,Jason,一如既往地感谢你精彩的博客文章!你有没有关于如何在python中为这些检验(特别是Kruskal-Wallis)计算效应大小的指导?谢谢!
这可能有助于作为第一步
https://machinelearning.org.cn/effect-size-measures-in-python/
嗨 Jason,非常感谢这个很棒的教程。我需要您在一个小困惑上给予指导。我正在10个数据集上测试5个不同分类器的性能(通过增加数据集大小)。我有一个分类器(行)和数据集(列)的准确率值表格。我想使用Friedman检验来检查分类器的性能之间是否存在显著差异。我应该将行(5个样本)还是列(10个样本)传递给friedmanchisquare函数?
每个算法在一个数据集上的得分样本应该提供给函数。
你好,
感谢这个很棒的概述。我正在进行一个Friedman检验。
我得到的p值为0.000和‘分布不同 (拒绝 H0)’
我想知道,我是否可以访问完整的p值。
谢谢你的帮助。
是的,它直接从函数返回。
嗨 Jason,感谢这篇文章。如果有两个配对的非参数样本,大小不同,请问可以用哪种检验来比较均值?这和Wilcoxon符号秩检验的情况完全一样,但Wilcoxon符号秩检验只能用于比较大小相同的两个样本数据集。
如果样本没有配对,可以考虑Mann-Whitney U检验。
嗨 Jason,谢谢。问题就在这里,因为样本是配对的、相关的。我也找不到可以应用于这种情况的检验... 无论如何,谢谢你。
如果样本是配对的,那么每个样本中的数量将是相同的,你可以使用“Wilcoxon 符号秩检验”。
我理解mannwhitneyu只接受大样本量。因此,它是否已经使用正态分布来近似检验统计量了?
不,它不是,它是一种基于秩的方法。
很棒的文章!关于解释数据有个问题。假设您对配对数据运行了Wilcoxon符号秩检验,并且分布A和B来自同一总体的原假设被拒绝了。那么,是否可以有效地说,由于分布A和B不同(根据检验),均值较低的分布(比如A)是属于一个总体均值低于分布B所属总体的总体?如果这不成立,您会如何设置一个检验来验证这一点?
谢谢!
如果原假设被拒绝,样本可能来自不同的总体,例如具有不同的分布。
关于样本/分布的均值,我们不能说太多,因为它们是秩检验。
一直很喜欢你的文章,并且关注你的网站好几年了,我知道很多人也一样。
只是一个问题——这个条件看起来是对的,但我不确定为什么它没有产生正确的答案。
if p > alpha
print('分布相同 (未能拒绝 H0)')
else
print('分布不同 (拒绝 H0)')
例如——p值肯定小于0.05,那么这意味着我们不能拒绝H0。但结果会打印出拒绝H0。
统计量=9.360, p=0.009
分布不同 (拒绝 H0)
谢谢!
也许你的代码中有bug/拼写错误,在条件判断之前确认你的p值和alpha值。
谢谢。当我们处理两个极端偏斜的分布时(比如说这是一个A/B测试),并且每个组中超过95%的观测值为零,而其余的都是右尾分布(比如工资或购买金额),我们该怎么办?在这里,当我模拟结果时,当每个样本的均值不同但相差不远时,拒绝原假设的情况非常罕见(Mann-Whitney检验)。
我不确定这是否正确,但当你说极端偏斜时,在我听来它不是高斯分布。大多数统计方法都希望数据是高斯分布,或者至少近似于它。所以一个想法可能是在应用检验之前对数据进行转换。例如,取对数是一个常见的技巧。
很棒的文章!谢谢你。有没有非参数检验可以确定两个数组是否来自同一个总体,并且需要的样本少于20个?
嗨,伊丽莎白...你可能会对以下内容感兴趣
https://machinelearning.org.cn/parametric-and-nonparametric-machine-learning-algorithms/
“Friedman检验可以被认为是Kruskal-Wallis H检验推广到两个以上样本的情况”,这不应该是Wilcoxon符号秩检验的推广吗?
PS - 很棒的文章,非常有帮助
感谢您的反馈!您可能是对的……提出这个问题的依据是什么?
我正在处理来自消防队的数据。这个数据集包含很多信息,比如日期、消防队代码,以及每个消防队/每次事故到达火灾现场所花费的时间测量。
我想比较到达火灾现场所花费的平均时间,并找出哪个消防队花费的时间最多,哪个最少。这些信息是为了了解消防队之间的基础设施情况,以便进行改进。每个消防队花费的时间之间没有正态分布。
我做了一些非参数检验,发现不同消防队花费的时间之间存在差异,我的问题是:我可以用哪种检验来知道哪个均值大于另一个?
嗨,Sandra...我无法就你正在考虑的数据集发表意见。你对教程中介绍的代码清单或概念有任何具体问题吗?
嗨 James,
您知道Wilcoxon检验是否可以作为单样本t检验的非参数替代方法吗?我有五个ROC AUC值(来自5折交叉验证),我想检验AUC中位数是否不为0.5。在这种情况下,“x”将是AUC值,而y将是[0.5, 0.5, 0.5, 0.5, 0.5]。这对您来说有意义吗?
感谢您与我们分享您的知识!
祝好。
嗨,Luiz...你可能会对以下讨论感兴趣
https://stats.stackexchange.com/questions/387152/wilcoxon-signed-rank-test-or-one-sample-t-test
谢谢你,James。
对于Kruskall Wallis检验,如果自变量的每个组内的数据分布/形状不同,我们该怎么办?我读到因为这个原因你不能比较中位数,而应该看均值。但是scipy实现的Kruskall Wallis不允许我们在均值和中位数之间进行选择。