跳至主要内容

Python T 检验入门

通过本教程学习如何在 Python 中执行 t 检验。了解单样本检验、双样本检验、配对 t 检验与 Welch 检验等不同类型及其使用时机。
· 13分钟 阅读

使用 AI 探索

在当今数据驱动的世界中,企业无法仅凭直觉做出关键决策。相反,他们需要借助假设检验等统计技术,用扎实的数据为行动背书。t 检验就是其中一种常见方法,它可以帮助您比较两个组的均值,判断它们是否在统计学上存在差异。

但在实践中如何应用 t 检验,又该如何解读结果?在本教程中,我们将探讨这些问题。具体来说,我们会以一个评估企业新功能成效的场景为例,演示如何在 Python 及其强大的库中使用 t 检验并分析输出结果。

完成本教程后,您将对 t 检验有扎实的理解,并能自信地将其应用到自己的数据中。

本教程将介绍不同类型的 t 检验——单样本检验、双样本检验、配对 t 检验和 Welch 检验——它们的应用以及各自的使用时机。  

术语解释

在深入了解 t 检验之前,我们先快速认识一些相关术语,它们将帮助您更牢固地把握这一统计检验的概念。

假设检验

假设检验是先提出一个假设(原假设),再尝试寻找证据予以否定的过程。原假设代表现状,备择假设与原假设相对立。

例如,我们可以通过假设检验判断企业新上线的功能是否获得了良好的客户反馈,并体现在成功指标上。想进一步学习,请参阅我们的假设检验课程。

P 值 

P 值是在原假设为真时,获得与观测结果同样极端或更极端结果的概率。较小的 P 值表明在原假设成立的前提下,出现观测结果的概率非常低。

显著性水平

显著性水平(记作 alpha,α)是在原假设为真时却将其拒绝的概率,也称为第一类错误(Type 1 error)。

统计显著性

统计显著性表示对“观测结果并非偶然产生”的信心。需要注意的是,统计显著性并不必然意味着实际意义显著,因为在实践中该结果的影响可能仍然很小。如果样本并不能准确代表整体总体,抽样误差也可能导致统计显著性。

t 检验的前提假设

理解统计检验的前提假设对于确保结果准确可靠至关重要,t 检验也不例外。若违背其假设,可能得出误导性的结论,适得其反。下面详细介绍 t 检验的四个假设:

独立性

首先,独立性要求各观测值不受数据中任何隐含因素影响,且不随时间相关。为确保独立性,可对相关样本采用多种处理技术,详见德州大学奥斯汀分校的说明。

同分布 

其次,离群点或异常记录会降低 t 统计量并增大数据方差,进而影响拒绝原假设的概率。因此,必须识别并理解异常行为背后的原因,判断其是合理数据还是错误数据。请教领域专家有助于理解数据的真实行为。

正态分布 

第三,t 检验仅在数据近似正态分布时有效。偏态数据可能导致错误地拒绝原假设。然而,在样本量有限时,检验正态性并不容易。在此情况下,可使用不依赖分布假设的非参数检验,或通过数据变换来纠正以实现近似正态。

方差齐性 

最后,为使 t 检验成立,被比较的两个总体应具有相等方差。这可以通过 Q-Q 图进行图形化检验。

了解了 t 检验的假设后,我们将通过一个 Python 示例来探索不同类型的 t 检验。完成本教程后,您将具备执行 t 检验并自信解读其结果的必要知识。

单样本 t 检验 

单样本 t 检验是一种统计假设检验,用于判断未知总体均值(μ)是否不等于某个声明值。

t-test equation

其中,

x = 样本均值

𝝁 = 总体均值

S = 样本标准差

n = 样本中的观测数量

t = t 统计量

我们用一个例子来理解。某公司声称其生产的轴承直径为 10 cm(原假设),您决定审计该说法是否属实。您从全市多家门店收集了 21 个轴承并测量其直径。您需要基于测量结果判断该公司的说法是否为假(备择假设)。

检验设计如下:

原假设:            H0 : x  = 𝝁

备择假设:  Ha : x  ≠ 𝝁 

T-test flow diagram

要宣布该声明为假,您需要在统计上证明样本测得的直径与公司声称的 10 cm 不同。由于样本量为 21(小于 30),我们使用 t 检验。此处样本均值为 11 cm,标准差为 1 cm。

Python 中的单样本 t 检验示例

我们使用 scipy.stats.ttest_1samp() 函数学习如何在 Python 中进行单样本 t 检验。

import numpy as np  
from scipy import stats  

# Population Mean 
mu = 10

# Sample Size
N1 = 21

# Degrees of freedom  
dof = N1 - 1

# Generate a random sample with mean = 11 and standard deviation = 1
x = np.random.randn(N1) + 11

# Using the Stats library, compute t-statistic and p-value
t_stat, p_val = stats.ttest_1samp(a=x, popmean = mu)
print("t-statistic = " + str(t_stat))  
print("p-value = " + str(p_val)) 
t-statistic = 4.689539773390642
p-value = 0.0001407967502139183

结果解读

t 统计量为 4.69,在 t 分布中距离 0 的均值相当远。要量化这种极端程度,我们参考 P 值(在术语部分已介绍)。该 P 值小于默认的 0.05 显著性水平,表明出现如此极端结果的概率接近于零,因此可以拒绝原假设。

请注意,显著性水平应在实验开始时设定。

另一种思路

我们不使用 ttest_1samp() 函数来完成单样本 t 检验。此时的 t 统计量由“样本均值与总体均值之差”除以标准误得到,正如前文所述。

  • 首先计算样本均值(x_bar)
  • 接着以自由度为 1 计算样本标准差(表示样本的标准差)。
  • 用样本标准差除以样本量的平方根,得到标准误。
  • 使用前述的单样本 t 统计量公式。
  • 计算 P 值,以确定 t 统计量的显著性。
# Sample Mean
x_bar = x.mean()

# Standard Deviation  
std = np.std(x, ddof=1)

# Standard Error
ste = std/np.sqrt(N1)

# Calculating the T-Statistics  
t_stat = (x_bar - mu) / ste

# p-value of the t-statistic
p_val = 2*(1 - stats.t.cdf(abs(t_stat), df = dof))
print("t-statistic = " + str(t_stat))  
print("p-value = " + str(p_val)) 
t-statistic = 4.689539773390642
p-value = 0.0001407967502139183

如何在 Python 中进行双样本 t 检验

我们将示例扩展为:公司新建了另一家工厂生产相同的轴承。我们需要判断两家工厂生产的轴承尺寸是否不同。此情形使用双样本检验。此处 t 统计量定义如下。

Two sample t-test equation

其中,

X1= 第一组样本均值

X2 = 第二组样本均值

S1 = 第一组样本标准差

S2 = 第二组样本标准差

N1 = 第一组样本量

N2 = 第二组样本量

Python 中的双样本 t 检验示例

设第一家工厂提供了 21 个样本,样本直径均值为 10.5 cm;第二家工厂提供了 25 个样本,样本直径均值为 9.5 cm。两组样本的标准差均为 1 cm。

# Sample Sizes
N1, N2 = 21, 25

# Degrees of freedom  
dof = min(N1,N2) - 1

# Gaussian distributed data with mean = 10.5 and var = 1  
x = np.random.randn(N1) + 10.5

# Gaussian distributed data with mean = 9.5 and var = 1  
y = np.random.randn(N2) + 9.5

## Using the internal function from SciPy Package  
t_stat, p_val = stats.ttest_ind(x, y)  
print("t-statistic = " + str(t_stat))  
print("p-value = " + str(p_val))
t-statistic = 3.18913308431476
p-value = 0.0026296199823557754

结果解读

参考 P 值 0.0026(小于 0.05 的显著性水平),我们拒绝“两个工厂轴承尺寸相同”的原假设。

如何在 Python 中进行配对 t 检验

将上述结果反馈给公司后,公司决定通过引入新的铸造机改进制造工艺。在其中一家工厂开展试点,并通过比较两组各 25 个轴承(新设备引入前与引入后)的样本,评估新铸造机是否导致轴承直径发生变化。

两组的样本均值分别为 10.5 cm 和 9.9 cm。

Python 中的配对 t 检验示例

让我们进行配对 t 检验,以验证该变化在统计学上是否显著。

# Sample Sizes
N = 25

# Degrees of freedom  
dof = N - 1

# Gaussian distributed data with mean = 10.5 and var = 1  
x = np.random.randn(N) + 10.5

# Gaussian distributed data with mean = 9.9 and var = 1  
y = np.random.randn(N) + 9.9

t_stat, p_val = stats.ttest_rel(x,y)
print("t-statistic = " + str(t_stat))  
print("p-value = " + str(p_val))
t-statistic = 3.446152658909739
p-value = 0.0021043953630465787

结果解读

较小的 P 值表明应当拒绝原假设,即“引入新铸造机后轴承直径没有变化”。

配对 t 检验的注意事项

配对 t 检验的假设建立在“配对差值”上,而非原始观测值。因此,需要确保各配对差值呈对称分布,且不包含离群点。

如何在 Python 中进行 Welch 检验

在第一家工厂的新铸造机试点成功后,公司希望在第二家工厂试点一台新的研磨机。该设备虽能生产高精度轴承,但会受温度变化和电力波动影响。公司需要比较第一家工厂的 21 个样本与第二家工厂的 25 个样本,以判断两家工厂的轴承是否存在差异。

Welch 检验的 Python 示例

第一家工厂样本的直径均值为 9.9 cm,标准差为 1 cm;第二家工厂样本的直径均值为 10 cm,标准差为 3 cm。由于两组样本标准差不同,我们将使用 Welch 检验。

# Sample Sizes
N1, N2 = 21, 25

# Degrees of freedom  
dof = min(N1,N2) - 1

# Gaussian distributed data with mean = 9.9 and var = 1  
x = np.random.randn(N1) + 9.9

# Gaussian distributed data with mean = 10 and var = 3
y = 3*np.random.randn(N2) + 10

## Using SciPy Package  
t_stat, p_val = stats.ttest_ind(x, y, equal_var = False) 
print("t-statistic = " + str(t_stat))  
print("p-value = " + str(p_val))
t-statistic = 1.3828843424092643
p-value = 0.17753505304053804

结果解读

观测到的 P 值大于 0.05 的显著性水平,这表明我们未能拒绝原假设,即两家工厂的轴承在统计学上可视为相同。由于第二家工厂样本的标准差较高,我们无法完全确信结果;因此需要收集更多样本,以便执行 z 检验。

Welch 检验的注意事项 

与其他 t 检验不同,Welch 检验适用于总体方差不相等的情况。

结论

只有用正确的方法提出问题并分析数据,数据才能揭示影响业务决策的真实规律。这要求对不同统计检验有扎实理解,明确何时采用何种方法。本文聚焦 t 检验,并阐述其前提假设,如观测值的独立同分布与正态性等。

除了快速回顾假设检验外,本文还通过示例系统介绍了不同类型的 t 检验。我们强烈建议您动手在 Python 中实践 t 检验,并评估在您的实验中应采用哪一种方法来判断统计显著性。

参考与推荐资源:

主题