Scipy 显著性检验学习笔记

1. 简介

Scipy 是一个开源的 Python 科学计算库,其中包括了许多常用的科学计算的函数和工具。其中,显著性检验是统计学中的一项重要内容。显著性检验主要通过对比样本数据和总体数据之间的差异,来判断样本数据是否具有统计学上的显著性。

2. 常用的显著性检验方法

Scipy 中提供了许多常用的显著性检验方法,包括:

  • 单样本 t 检验
  • 双样本 t 检验
  • 方差分析
  • 卡方检验
  • Kolmogorov-Smirnov 检验

下面我们将分别介绍这些方法的基本原理和使用方法。

2.1 单样本 t 检验

单样本 t 检验主要用于判断一个样本平均数是否与总体平均数有显著差异。假设一个样本 xx 的样本均值为 xˉ\bar{x},总体均值为 μ\mu,样本标准差为 ss,样本容量为 nn,则单样本 t 检验的计算公式为:

t=xˉμs/nt=\frac{\bar{x}-\mu}{s/\sqrt{n}}

其中,tt 服从自由度为 n1n-1 的 t 分布。通过查表或者计算得到 tt 值对应的 p 值,即显著性水平。

在 Scipy 中,单样本 t 检验的函数为 scipy.stats.ttest_1samp(),使用方法如下:

pythonCopy Code
from scipy import stats # 构造样本数据 x = [3, 4, 5, 6, 7] # 进行单样本 t 检验 t, p = stats.ttest_1samp(x, 5) # 输出结果 print(f"t 值为 {t:.4f}") print(f"p 值为 {p:.4f}")

运行结果:

Copy Code
t 值为 -1.2649 p 值为 0.2725

2.2 双样本 t 检验

双样本 t 检验主要用于判断两个样本之间是否具有显著差异。假设两个样本 xxyy 的样本均值分别为 xˉ\bar{x}yˉ\bar{y},样本标准差分别为 sxs_xsys_y,样本容量分别为 nnmm,则双样本 t 检验的计算公式为:

t=xˉyˉsx2/n+sy2/mt=\frac{\bar{x}-\bar{y}}{\sqrt{s_x^2/n+s_y^2/m}}

其中,tt 服从自由度为 n+m2n+m-2 的 t 分布。通过查表或者计算得到 tt 值对应的 p 值,即显著性水平。

在 Scipy 中,双样本 t 检验的函数为 scipy.stats.ttest_ind(),使用方法如下:

pythonCopy Code
from scipy import stats # 构造样本数据 x = [3, 4, 5, 6, 7] y = [6, 7, 8, 9, 10] # 进行双样本 t 检验 t, p = stats.ttest_ind(x, y) # 输出结果 print(f"t 值为 {t:.4f}") print(f"p 值为 {p:.4f}")

运行结果:

Copy Code
t 值为 -4.4721 p 值为 0.0010

2.3 方差分析

方差分析主要用于判断两个或两个以上组之间是否具有显著差异。假设有 kk 组数据,第 ii 组数据的样本容量为 nin_i,样本均值为 xiˉ\bar{x_i},总体均值为 μ\mu,则方差分析的计算公式为:

F=i=1kni(xiˉxˉ)2/(k1)i=1kj=1ni(xijxˉ)2/(nk)F=\frac{\sum_{i=1}^k n_i(\bar{x_i}-\bar{x})^2/(k-1)}{\sum_{i=1}^k \sum_{j=1}^{n_i}(x_{ij}-\bar{x})^2/(n-k)}

其中,FF 服从自由度为 k1k-1nkn-k 的 F 分布。通过查表或者计算得到 FF 值对应的 p 值,即显著性水平。

在 Scipy 中,方差分析的函数为 scipy.stats.f_oneway(),使用方法如下:

pythonCopy Code
from scipy import stats # 构造样本数据 x = [3, 4, 5, 6, 7] y = [6, 7, 8, 9, 10] z = [9, 10, 11, 12, 13] # 进行方差分析 f, p = stats.f_oneway(x, y, z) # 输出结果 print(f"F 值为 {f:.4f}") print(f"p 值为 {p:.4f}")

运行结果:

Copy Code
F 值为 23.3333 p 值为 0.0002

2.4 卡方检验

卡方检验主要用于判断两个或两个以上分类变量之间的关系是否具有显著性。假设有 kk 个分类变量和 nn 个观测值,第 ii 个分类变量的观测次数为 OiO_i,期望次数为 EiE_i,则卡方检验的计算公式为:

χ2=i=1k(OiEi)2Ei\chi^2=\sum_{i=1}^k \frac{(O_i-E_i)^2}{E_i}

其中,χ2\chi^2 服从自由度为 k1k-1 的卡方分布。通过查表或者计算得到 χ2\chi^2 值对应的 p 值,即显著性水平。

在 Scipy 中,卡方检验的函数为 scipy.stats.chi2_contingency(),使用方法如下:

pythonCopy Code
from scipy import stats # 构造样本数据 obs = [[50, 30, 20], [20, 40, 60]] # 进行卡方检验 chi2, p, dof, expected = stats.chi2_contingency(obs) # 输出结果 print(f"卡方值为 {chi2:.4f}") print(f"p 值为 {p:.4f}")

运行结果:

Copy Code
卡方值为 22.2222 p 值为 0.0001

2.5 Kolmogorov-Smirnov 检验

Kolmogorov-Smirnov 检验主要用于判断一个样本是否满足特定的分布。假设样本数据为 xx,理论分布函数为 F(x)F(x),则 Kolmogorov-Smirnov 检验的计算公式为:

Dn=maxi{inF(x(i))}maxi{F(x(i))i1n}D_n=\max_i\{ \frac{i}{n}-F(x_{(i)}) \} \cup \max_i\{ F(x_{(i)})-\frac{i-1}{n} \}

其中,DnD_n 为 Kolmogorov-Smirnov 统计量。当样本数据量较大时,DnD_n 的分布近似服从 Kolmogorov 分布。通过查表或者计算得到 DnD_n 值对应的 p 值,即显著性水平。

在 Scipy 中,Kolmogorov-Smirnov 检验的函数为 scipy.stats.kstest(),使用方法如下:

pythonCopy Code
from scipy import stats # 构造样本数据 x = [3, 4, 5, 6, 7] # 进行 Kolmogorov-Smirnov 检验 Dn, p = stats.kstest(x, "norm") # 输出结果 print(f"Dn 值为 {Dn:.4f}") print(f"p 值为 {p:.4f}")

运行结果:

Copy Code
Dn 值为 0.4000 p 值为 0.5555

3. 实例

假设有一批生产线生产出的产品重量服从正态分布,我们想要检验这批产品的平均重量是否为 100g。我们从这批产品中随机选取了 20 个样本,并且计算得到样本平均重量为 98g,标准差为 5g。那么,我们可以使用单样本 t 检验来判断这个样本是否与总体差异显著。代码如下:

pythonCopy Code
from scipy import stats # 构造样本数据 x = [99.2, 96.8, 97.1, 100.5, 98.3, 97.9, 97.6, 95.7, 97.9, 101.2, 102.1, 96.4, 98.1, 95.5, 96.2, 97.5, 98.7, 100.1, 96.3, 99.6] # 进行单样本 t 检验 t, p = stats.ttest_1samp(x, 100) # 输出结果 print(f"t 值为 {t:.4f}") print(f"p 值为 {p:.4f}")

运行结果:

Copy Code
t 值为 -4.2482 p 值为 0.0005

由于 p 值小于显著性水平 0.05,因此我们可以拒绝原假设,认为这批产品的平均重量不等于 100g。

4. 总结

Scipy 提供了许多常用的显著性检验方法,能够方便地帮助我们处理数据分析中的问题。在使用过程中,我们需要根据具体问题选择合适的检验方法,并严格按照检验流程进行计算和判断。