参数统计方法通常指那些假设数据样本呈高斯分布的方法。
在应用机器学习中,我们需要比较数据样本,特别是样本的均值。也许是为了查看一种技术在多个数据集上的表现是否优于另一种技术。为了量化这个问题并解释结果,我们可以使用参数假设检验方法,例如学生 t 检验和 ANOVA。
在本教程中,您将发现参数统计显著性检验,它们量化了两个或更多数据样本均值之间的差异。
完成本教程后,您将了解:
- 学生 t 检验用于量化两个独立数据样本均值之间的差异。
- 配对学生 t 检验用于量化两个相关数据样本均值之间的差异。
- ANOVA 和重复测量 ANOVA 用于检查 2 个或更多数据样本均值之间的相似性或差异。
通过我的新书《机器学习统计学》启动您的项目,书中包含**分步教程**和所有示例的**Python 源代码**文件。
让我们开始吧。
- 2018年5月更新:改进了关于拒绝与未能拒绝统计检验的表述。

Python 中参数统计显著性检验的介绍
图片由 nestor ferraro 拍摄,保留部分权利。
教程概述
- 参数统计显著性检验
- 测试数据
- 学生 t 检验
- 配对学生 t 检验
- 方差分析检验
- 重复测量方差分析检验 (Repeated Measures ANOVA Test)
需要机器学习统计学方面的帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
参数统计显著性检验
参数统计检验假设数据样本来自特定的总体分布。
它们通常指假设高斯分布的统计检验。由于数据通常符合这种分布,因此参数统计方法更为常用。
我们可能会对两个或更多数据样本提出的一个典型问题是它们是否具有相同的分布。参数统计显著性检验是那些假设数据来自相同高斯分布的统计方法,即具有相同均值和标准差的数据分布:分布的参数。
一般来说,每个检验都会计算一个检验统计量,需要结合一些统计学背景和对统计检验本身的深入了解来解释。检验还会返回一个 p 值,可用于解释检验结果。p 值可以被认为是观察到两个数据样本的概率,前提是基本假设(零假设)是这两个样本来自具有相同分布的总体。
p 值可以在选定的显著性水平(称为 alpha)的背景下解释。alpha 的常用值为 5% 或 0.05。如果 p 值低于显著性水平,则检验表明有足够的证据拒绝零假设,并且样本可能来自具有不同分布的总体。
- **p <= alpha**:拒绝零假设,分布不同。
- **p > alpha**:未能拒绝零假设,分布相同。
测试数据
在我们查看具体的参数显著性检验之前,让我们首先定义一个测试数据集,我们可以用它来演示每个检验。
我们将生成从不同分布中抽取的两个样本。每个样本将从高斯分布中抽取。
我们将使用 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 |
学生 t 检验
学生 t 检验是一种统计假设检验,用于检验两个已知具有高斯分布的独立数据样本是否具有相同的高斯分布,该检验以使用笔名“_Student_”的 William Gosset 命名。
最常用的 t 检验之一是独立样本 t 检验。当您想要比较两个独立样本在一个给定变量上的均值时,您会使用此检验。
— 第 93 页,《通俗统计学》,第三版,2010 年。
该检验的假设或零假设是两个总体的均值相等。拒绝此假设表明有足够的证据表明总体的均值不同,进而表明分布不相等。
- **未能拒绝 H0**:样本分布相等。
- **拒绝 H0**:样本分布不相等。
学生 t 检验可以通过 ttest_ind() SciPy 函数在 Python 中使用。该函数接受两个数据样本作为参数,并返回计算出的统计量和 p 值。
我们可以在测试问题上演示学生 t 检验,期望该检验能够发现两个独立样本之间分布的差异。完整的代码示例如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 学生 t 检验 from numpy.random import seed from numpy.random import randn from scipy.stats import ttest_ind # 为随机数生成器设置种子 seed(1) # 生成两个独立样本 data1 = 5 * randn(100) + 50 data2 = 5 * randn(100) + 51 # 比较样本 stat, p = ttest_ind(data1, data2) print('统计量=%.3f, p=%.3f' % (stat, p)) # 解释 alpha = 0.05 如果 p > alpha: print('分布相同 (未能拒绝H0)') else: print('分布不同 (拒绝H0)') |
运行示例计算生成的学生 t 检验数据样本,并打印统计量和 p 值。
统计量的解释发现样本均值不同,显著性至少为 5%。
1 2 |
统计量=-2.262,p=0.025 不同分布(拒绝 H0) |
配对学生 t 检验
我们可能希望比较以某种方式相关的两个数据样本之间的均值。
例如,数据样本可能表示对同一对象的两次独立测量或评估。这些数据样本是重复的或相关的,被称为配对样本或重复测量。
由于样本不是独立的,我们不能使用学生 t 检验。相反,我们必须使用该检验的修改版本,该版本纠正了数据样本相关的这一事实,称为配对学生 t 检验。
相关样本 t 检验也用于比较单个因变量上的两个均值。然而,与独立样本检验不同,相关样本 t 检验用于比较单个样本或两个匹配或配对样本的均值。
— 第 94 页,《通俗统计学》,第三版,2010 年。
该检验被简化了,因为它不再假设观测之间存在变异,即观测是在同一受试者或受试者进行治疗之前和之后成对进行的。
该检验的默认假设或零假设是样本均值之间没有差异。拒绝零假设表明有足够的证据表明样本均值不同。
- **未能拒绝 H0**:配对样本分布相等。
- **拒绝 H0**:配对样本分布不相等。
配对学生 t 检验可以使用 ttest_rel() SciPy 函数在 Python 中实现。与非配对版本一样,该函数接受两个数据样本作为参数,并返回计算出的统计量和 p 值。
我们可以在测试数据集上演示配对学生 t 检验。尽管样本是独立的,而不是配对的,但为了演示目的,我们可以假装观测是配对的并计算统计量。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 配对学生 t 检验 from numpy.random import seed from numpy.random import randn 从 scipy.stats 导入 ttest_rel # 为随机数生成器设置种子 seed(1) # 生成两个独立样本 data1 = 5 * randn(100) + 50 data2 = 5 * randn(100) + 51 # 比较样本 stat, p = ttest_rel(data1, data2) print('统计量=%.3f, p=%.3f' % (stat, p)) # 解释 alpha = 0.05 如果 p > alpha: print('分布相同 (未能拒绝H0)') else: print('分布不同 (拒绝H0)') |
运行示例会计算并打印检验统计量和 p 值。结果的解释表明样本具有不同的均值,因此具有不同的分布。
1 2 |
统计量=-2.372,p=0.020 不同分布(拒绝 H0) |
方差分析检验
有时我们可能会有多个独立的数据样本。
我们可以对数据样本的每种组合进行成对的学生 t 检验,以了解哪些样本具有不同的均值。如果我们只关心所有样本是否具有相同的分布,这可能会很繁琐。
为了回答这个问题,我们可以使用方差分析检验,简称 ANOVA。ANOVA 是一种统计检验,假设 2 个或更多组的均值相等。如果证据表明情况并非如此,则拒绝零假设,并且至少一个数据样本具有不同的分布。
- **未能拒绝 H0**:所有样本分布相等。
- **拒绝 H0**:一个或多个样本分布不相等。
重要的是,该检验只能判断所有样本是否相同;它无法量化哪些样本不同或不同程度如何。
单向方差分析(one-way ANOVA)的目的是比较两个或更多组(自变量)在一个因变量上的均值,以查看组均值之间是否存在显著差异。
— 第 105 页,《通俗统计学》,第三版,2010 年。
该检验要求数据样本呈高斯分布,样本独立,并且所有数据样本具有相同的标准差。
ANOVA 检验可以使用 f_oneway() SciPy 函数在 Python 中执行。该函数接受两个或更多数据样本作为参数,并返回检验统计量和 f 值。
我们可以修改我们的测试问题,使其包含两个具有相同均值的样本和第三个具有略微不同均值的样本。然后我们期望该检验能够发现至少一个样本具有不同的分布。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 方差分析检验 from numpy.random import seed from numpy.random import randn 从 scipy.stats 导入 f_oneway # 为随机数生成器设置种子 seed(1) # 生成三个独立样本 data1 = 5 * randn(100) + 50 data2 = 5 * randn(100) + 50 data3 = 5 * randn(100) + 52 # 比较样本 stat, p = f_oneway(data1, data2, data3) print('统计量=%.3f, p=%.3f' % (stat, p)) # 解释 alpha = 0.05 如果 p > alpha: print('分布相同 (未能拒绝H0)') else: print('分布不同 (拒绝H0)') |
运行示例会计算并打印检验统计量和 p 值。
p 值的解释正确地拒绝了零假设,表明一个或多个样本均值不同。
1 2 |
统计量=3.655,p=0.027 不同分布(拒绝 H0) |
重复测量方差分析检验 (Repeated Measures ANOVA Test)
我们可能有多个以某种方式相关或依赖的数据样本。
例如,我们可以在不同的时间段对一个受试者重复相同的测量。在这种情况下,样本将不再独立;相反,我们将有多个配对样本。
我们可以多次重复成对的学生 t 检验。或者,我们可以使用一个单一的检验来检查所有样本是否具有相同的均值。可以使用 ANOVA 检验的一个变体,经过修改以检验超过 2 个样本。这个检验称为重复测量 ANOVA 检验。
默认假设或零假设是所有配对样本具有相同的均值,因此具有相同的分布。如果样本表明情况并非如此,则拒绝零假设,并且一个或多个配对样本具有不同的均值。
- **未能拒绝 H0**:所有配对样本分布相等。
- **拒绝 H0**:一个或多个配对样本分布不相等。
然而,重复测量 ANOVA 比配对 t 检验有许多优点。首先,使用重复测量 ANOVA,我们可以检查在两个以上时间点测量过的因变量上的差异,而使用独立 t 检验,我们只能比较两个时间点上因变量的分数。
— 第 131 页,《通俗统计学》,第三版,2010 年。
不幸的是,在撰写本文时,SciPy 中没有可用的重复测量 ANOVA 检验版本。希望这个检验很快就会添加。
我提到这个检验是为了完整性,以防您在项目中需要它并且能够寻找并找到替代实现。
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 更新所有示例以对具有相同分布的数据样本进行操作。
- 根据每个检验的要求和行为,为选择这三个统计显著性检验中的每一个创建一个流程图。
- 考虑机器学习项目中比较数据样本的 3 种情况,假设样本呈非高斯分布,并建议每种情况下可以使用的检验类型。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 《通俗统计学》,第三版,2010 年。
API
- numpy.random.seed() API
- numpy.random.randn() API
- scipy.stats.ttest_ind() API
- scipy.stats.ttest_rel() API
- scipy.stats.f_oneway() API
文章
总结
在本教程中,您学习了参数统计显著性检验,它们量化了两个或更多数据样本均值之间的差异。
具体来说,你学到了:
- 学生 t 检验用于量化两个独立数据样本均值之间的差异。
- 配对学生 t 检验用于量化两个相关数据样本均值之间的差异。
- ANOVA 和重复测量 ANOVA 用于检查两个或更多数据样本均值之间的相似性或差异。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
感谢您精彩而富有洞察力的文章。我总是觉得它们超级有用且结构良好。
关于重复测量 ANOVA,有一个名为 pyvttbl 的 Python 包可以做到。它只适用于 Python 2,不幸的是代码没有积极维护。但仍然有效,这里有一个进行重复测量 ANOVA 的教程:https://www.marsja.se/repeated-measures-anova-using-python/
太棒了,谢谢你的提示。
非常感谢,这篇文章真的很有帮助。您能澄清一下统计量如何解释吗?
值 -2.262 是否意味着两个总体的均值相差 2.262?
因为在示例中它们只应该相差 1?
谢谢
据我所知,我们无法像您建议的那样直接理解统计量。
它是一个来自特定分布(例如学生 t 分布)的值,可以与临界值进行比较以解释检验。
嗨,Jason,
谢谢这篇好文章!
在 ANOVA 代码片段中,写成
stat, f_value = f_oneway(data1, data2, data3)
而不是
stat, p = f_oneway(data1, data2, data3)
祝好,
Elie
为什么?函数返回统计量和 p 值
https://docs.scipy.org.cn/doc/scipy/reference/generated/scipy.stats.f_oneway.html
嗨 Jason!好文章。
我有一个问题:我们可以像这样切换假设中的问题吗?
未能拒绝 H0:样本分布不相等。
拒绝 H0:样本分布相等。
你为什么想改变测试的解释?
如果你愿意,你可以改变测试本身。
嗨 Jason。让我澄清一下。比如说,我有两组从两个数据集中得到的精度值。现在,我想看看这些集合之间的差异是否显著。我的 H0 和 H1 会是什么?我这样设置 H0 和 H1 的原因是什么?是否存在这样设置假设的规范?
如果你想检查变量之间是否存在关系,你可以使用相关性检验,如皮尔逊相关系数。
如果你想检查分布是否不同(例如它们的均值),你可以使用差异检验,如学生 t 检验。
你不需要设置 H0/H1,检验本身会做出这些假设(例如 H0 表示没有相关性或没有差异)。
嗨,Jason,
我有不同样本在四种不同分类方法下的准确性数据,我想量化哪种分类方法更好,或者好多少。或者对于第一种分类方法,任何分类方法比其余三种好多少。
这篇文章会给你一些关于使用方法的想法
https://machinelearning.org.cn/statistical-significance-tests-for-comparing-machine-learning-algorithms/
你好 Jason,
感谢您的文章。我处理了不同时间点的已处理和未处理样本数据。我想创建一个图表,并在图表上标明统计显著性。您能帮我吗?
你到底遇到了什么问题?
对于 X、Y、Z
如果 X 和 Y 的配对 t 检验是“未能拒绝”———->1
并且 X 和 Z 的配对 t 检验是“未能拒绝”——–>2
另一方面,
Y 和 Z 的配对 t 检验是“拒绝”———>3
这是否意味着 X、Y 或 Z 的值存在问题?
这可能表明您的数据样本太小,无法进行有用的推断?
你是对的,数据量确实很小。谢谢
感谢这篇精彩的文章,它清晰地解释了比较样本均值的不同检验。关于双向 ANOVA 检验,最近的文章(例如这篇:https://www.statology.org/two-way-anova-python/)提到了 anova_lm() 函数,并建议使用它。任何关于这方面的见解都会有所帮助。
谢谢你。