📑 查看全课大纲(第 28 / 41 节)
- 1.数理统计中的基本概念
- 2.统计量与抽样分布(一)
- 3.统计量与抽样分布(二)
- 4.次序统计量
- 5.充分统计量与完备统计量
- 6.统计中常用分布族(一)
- 7.统计中常用分布族(二)
- 8.矩估计
- 9.极大似然估计
- 10.无偏估计与一致最小方差无偏估计(一)
- 11.无偏估计与一致最小方差无偏估计(二)
- 12.完备统计量
- 13.CR不等式及有效估计
- 14.相合估计
- 15.置信区间
- 16.正态总体参数的置信区间
- 17.大样本置信区间
- 18.Fisher显著性检验
- 19.正态总体参数的假设检验(一)
- 20.正态总体参数的假设检验(二)
- 21.似然比检验
- 22.Neyman-Pearson基本引理
- 23.一致最优势检验
- 24.无偏检验与一致最优势无偏检验
- 25.正态概率纸检验
- 26.拟合优度检验
- 27.列联表的独立性检验
- 28.Kolmogorov检验
- 29.正态性检验
- 30.Bayes统计
- 31.先验分布的确定
- 32.Bayes统计推断
- 33.统计判决理论
- 34.Minimax准则
- 35.非参数统计
- 36.符号检验
- 37.Wilcoxon符号秩检验
- 38.抽样调查
- 39.简单随机抽样
- 40.分层随机抽样
- 41.整群随机抽样
Kolmogorov检验
约 18 分钟
Kolmogorov检验
小象实战讲义 · 数据科学的统计基础
在数据科学实践中,我们常常需要判断一组观测数据是否服从某个特定的理论分布。例如,检验一组测量误差是否服从正态分布,或者检验一组随机数是否来自均匀分布。本节介绍的 Kolmogorov检验(又称K-S检验)是一种基于经验分布函数的非参数检验方法,它直接比较样本经验分布函数与理论分布函数之间的最大偏差,从而对总体的分布做出判断。学完本节,你将掌握K-S检验的原理、步骤及其与卡方拟合优度检验的区别,并能使用Python(SciPy)对实际数据进行分布拟合检验。
💡 核心导读
- 检验目标:检验样本是否来自一个完全已知的连续型分布(分布函数不含任何未知参数)。
- 核心思想:基于经验分布函数是总体分布函数的优良估计这一事实,构造衡量两者差异的统计量。
- 关键统计量:,即经验分布函数与理论分布函数之间的最大绝对偏差。
- 检验原理:当原假设成立(样本来自)时,应较小。若过大,则拒绝原假设。
- 应用对比:K-S检验适用于小样本、连续分布且分布完全已知的情形,是卡方拟合优度检验的有力补充。
从经验分布函数到Kolmogorov检验
经验分布函数:总体分布的“镜子”
设是来自总体分布函数的独立同分布样本。经验分布函数 定义为: 其中为示性函数,当时取值为1,否则为0。是一个阶梯函数,在每一个样本点处跳跃。
根据格列文科定理,当时,有 这意味着经验分布函数以概率1一致收敛于总体分布函数,是的优良估计。
对于固定的,是的无偏且相合估计。由中心极限定理可知, 这为后续构造检验统计量提供了理论基础。
Kolmogorov检验的基本原理
我们关心如下假设检验问题: 其中是一个完全已知的连续型分布函数(不含任何未知参数)。
既然是的优良估计,那么当成立时,与的差异应该很小。很自然地,我们可以用两者之间的最大绝对偏差来衡量这种差异: 被称为Kolmogorov-Smirnov统计量。它是一个仅与样本量有关的随机变量。
检验的拒绝域构造为: 其中临界值由给定的显著性水平决定,满足。直观上,如果观测到的值过大,说明经验分布与理论分布偏离太远,我们有理由拒绝“样本来自”的原假设。
检验统计量的分布与拒绝域
的精确分布与计算
在成立且连续的前提下,的精确分布已被导出,但其表达式较为复杂,通常通过递推关系或统计软件进行计算。对于任意,精确概率可以通过算法求得。
在实际应用中,我们通常关注其大样本渐近分布。Kolmogorov在1933年证明了以下重要定理:
定理(Kolmogorov分布):若连续且成立,则当时, 其中是Kolmogorov分布函数,其表达式为: 当时,。
由于的取值范围为,在实际使用渐近公式时,我们通常用以下近似: 并且有:
- 当时,
- 当时,
临界值的确定与检验步骤
给定显著性水平(如0.05),临界值满足,即。因此, 其中是Kolmogorov分布的分位数,可通过查表或软件获得。
Kolmogorov检验的实施步骤:
- 提出假设: vs 。
- 计算统计量:基于样本观测值,计算。
- 确定拒绝域:对于给定的,查Kolmogorov检验临界值表得,或计算p值。
- 做出决策:若(或p值 ),则拒绝;否则不拒绝。
的实用计算公式
由于是阶梯函数,是连续增函数,的计算可以简化为只需求解有限个点上的差值。将样本按升序排列得到次序统计量,则 其中,。更简洁的公式为:
实例演示与Python实现
例题:均匀分布检验
在显著性水平下,检验以下10个数据是否来自区间上的均匀分布:
分析:待检验分布()是完全已知的连续分布,且样本量较小,适合使用Kolmogorov检验。
手工计算步骤:
- 将数据排序:。
- 计算(因为均匀分布的分布函数为)。
- 计算。
- 找出最大的作为。
计算过程如下表所示:
| 1 | 0.06 | 0.1 | 0.0 | 0.04 | 0.06 | 0.06 |
| 2 | 0.12 | 0.2 | 0.1 | 0.08 | 0.02 | 0.08 |
| 3 | 0.18 | 0.3 | 0.2 | 0.12 | -0.02 | 0.12 |
| 4 | 0.26 | 0.4 | 0.3 | 0.14 | -0.04 | 0.14 |
| 5 | 0.33 | 0.5 | 0.4 | 0.17 | -0.07 | 0.17 |
| 6 | 0.39 | 0.6 | 0.5 | 0.21 | -0.11 | 0.21 |
| 7 | 0.44 | 0.7 | 0.6 | 0.26 | -0.16 | 0.26 |
| 8 | 0.53 | 0.8 | 0.7 | 0.27 | -0.17 | 0.27 |
| 9 | 0.72 | 0.9 | 0.8 | 0.18 | -0.08 | 0.18 |
| 10 | 0.92 | 1.0 | 0.9 | 0.08 | 0.02 | 0.08 |
最大差值(发生在处)。
- 查表决策:查Kolmogorov检验临界值表,当时,临界值。由于,故不拒绝,认为该样本可以认为来自分布。
Python实现
使用SciPy库可以方便地进行Kolmogorov检验。scipy.stats模块中的kstest函数专门用于此检验。
import numpy as np
from scipy import stats
# 样本数据
data = np.array([0.12, 0.18, 0.06, 0.33, 0.72, 0.92, 0.44, 0.39, 0.26, 0.53])
# 执行Kolmogorov检验,检验是否服从均匀分布 U(0,1)
# 'uniform'指定分布类型,args=(0, 1)指定均匀分布的区间起点和长度
statistic, p_value = stats.kstest(data, 'uniform', args=(0, 1))
print("Kolmogorov-Smirnov检验结果")
print(f"检验统计量 D_n = {statistic:.4f}")
print(f"P值 = {p_value:.4f}")
# 在显著性水平 alpha=0.1 下做出决策
alpha = 0.1
if p_value < alpha:
print(f"由于P值({p_value:.4f}) < α({alpha}),拒绝原假设,认为样本不来自U(0,1)分布。")
else:
print(f"由于P值({p_value:.4f}) ≥ α({alpha}),不拒绝原假设,认为样本可以来自U(0,1)分布。")
# 验证:手动计算D_n并与SciPy结果比较
sorted_data = np.sort(data)
n = len(data)
i_over_n = np.arange(1, n+1) / n
i_minus1_over_n = np.arange(0, n) / n
# 理论分布函数值(U(0,1))
F0 = sorted_data # 因为F0(x)=x
# 计算两个方向的差值
diff1 = np.abs(i_over_n - F0)
diff2 = np.abs(F0 - i_minus1_over_n)
# 取最大值
D_manual = np.max(np.column_stack((diff1, diff2)))
print(f"\n手动计算的 D_n = {D_manual:.4f}")
print(f"与SciPy结果一致: {np.isclose(statistic, D_manual)}")运行上述代码,输出结果如下:
Kolmogorov-Smirnov检验结果
检验统计量 D_n = 0.2700
P值 = 0.3891
由于P值(0.3891) ≥ α(0.1),不拒绝原假设,认为样本可以来自U(0,1)分布。
手动计算的 D_n = 0.2700
与SciPy结果一致: TrueSciPy计算得到的p值为0.3891,远大于0.1,因此不拒绝原假设,结论与手工查表一致。
Kolmogorov检验的深入讨论与比较
与卡方拟合优度检验的比较
Kolmogorov检验与卡方拟合优度检验是两种常用的分布检验方法,各有其适用范围和优缺点:
分布类型:
- K-S检验:要求是连续分布且完全已知(不含未知参数)。
- 卡方检验:可用于连续或离散分布,且允许含有未知参数(需先估计)。
样本信息利用:
- K-S检验:基于经验分布函数,利用了样本的全部顺序信息,没有信息损失。
- 卡方检验:需将数据分组,损失了组内信息,且分组方式可能影响检验结果。
样本量要求:
- K-S检验:适用于小样本情况。
- 卡方检验:通常要求样本量较大(如),且每组的期望频数不能太小。
检验功效:
- 当为完全已知的连续分布时,K-S检验通常比卡方检验更有效(功效更高)。
多维扩展:
- K-S检验:难以直接推广到高维数据。
- 卡方检验:处理高维列联表时与一维情形类似,具有一定优势。
重要注意事项与扩展
未知参数问题:若含有未知参数(如检验是否服从,但未知),标准的K-S检验不适用,因为此时的分布会发生变化。此时应使用卡方拟合优度检验,或使用针对特定分布(如正态分布、指数分布)修正的K-S检验(如Lilliefors检验)。
两样本K-S检验:K-S检验可推广到比较两个独立样本是否来自同一分布。设,,检验。构造统计量: 其中和分别为两个样本的经验分布函数。该检验称为两样本K-S检验或Smirnov检验。
其他基于经验分布的统计量:除了,还可构造其他衡量与差异的统计量,如:
- Cramér-von Mises统计量:
- Anderson-Darling统计量: 这些统计量对分布尾部的差异更为敏感。
📝 动手练一练
单样本K-S检验练习
某工厂生产一种零件,其长度规格要求服从正态分布。现随机抽取15个零件,测得长度(单位:mm)如下:10.12, 9.98, 10.05, 10.21, 9.92, 10.08, 10.15, 9.89, 10.03, 10.18, 9.95, 10.11, 10.02, 9.97, 10.09在显著性水平下,使用Python的K-S检验判断这批零件的长度是否服从指定正态分布。
参考答案:
import numpy as np from scipy import stats data = np.array([10.12, 9.98, 10.05, 10.21, 9.92, 10.08, 10.15, 9.89, 10.03, 10.18, 9.95, 10.11, 10.02, 9.97, 10.09]) # 注意:K-S检验要求分布完全已知,这里均值和方差已给定 # 新版SciPy推荐传入冻结分布的cdf函数('norm'+args写法在新版本中会报错) stat, p = stats.kstest(data, stats.norm(loc=10.0, scale=0.2).cdf) print(f"K-S统计量: {stat:.4f}") print(f"P值: {p:.4f}") if p < 0.05: print("拒绝H0,零件长度不服从N(10.0, 0.2^2)分布。") else: print("不拒绝H0,零件长度可以认为服从N(10.0, 0.2^2)分布。")两样本K-S检验练习
有两台机器生产同种零件,从两台机器各抽取产品测量其直径(单位:mm):
- 机器A:10.1, 10.3, 9.8, 10.0, 10.2, 9.9, 10.1, 10.0, 9.7, 10.2
- 机器B:10.0, 10.1, 10.2, 9.9, 10.3, 10.0, 9.8, 10.2, 10.1, 9.9
使用两样本K-S检验()判断两台机器生产的零件直径分布是否相同。
参考答案: ```python machine_a = np.array([10.1, 10.3, 9.8, 10.0, 10.2, 9.9, 10.1, 10.0, 9.7, 10.2]) machine_b = np.array([10.0, 10.1, 10.2, 9.9, 10.3, 10.0, 9.8, 10.2, 10.1, 9.9])
# 两样本K-S检验
stat, p = stats.ks_2samp(machine_a, machine_b)
print(f"两样本K-S统计量: {stat:.4f}")
print(f"P值: {p:.4f}")
if p < 0.05:
print("拒绝H0,两台机器生产的零件直径分布不同。")
else:
print("不拒绝H0,两台机器生产的零件直径分布无显著差异。")
```本章小结
本节深入讲解了Kolmogorov检验的原理与应用,以下是核心要点回顾:
要点回顾:
- 检验目标:判断样本是否来自一个完全已知的连续型分布。
- 核心工具:基于经验分布函数与理论分布函数的最大绝对偏差构造检验统计量。
- 检验决策:当过大(超过临界值或p值过小)时,拒绝“样本来自”的原假设。
- 分布理论:的精确分布复杂,但大样本下有Kolmogorov渐近分布。
- 实践工具:Python的SciPy库提供了
kstest函数,可方便地进行单样本和两样本K-S检验。
行动清单:
- 掌握适用条件:面对分布检验问题时,首先判断是否连续且完全已知,以决定是否适用K-S检验。
- 学会Python实现:熟练使用
scipy.stats.kstest和scipy.stats.ks_2samp函数进行单样本和两样本检验。 - 理解检验逻辑:不仅能运行代码,更要理解K-S统计量的几何意义——它是两个分布函数曲线之间的最大垂直距离。
- 对比方法优劣:明确K-S检验与卡方拟合优度检验的适用场景,在实际问题中选择合适的方法。
Kolmogorov检验以其直观的几何解释和对小样本的适用性,成为分布检验中的重要工具。然而,务必牢记其核心限制:要求理论分布完全已知且连续。当分布含有未知参数时,需要考虑使用修正的K-S检验或其他方法。
— 小象教研组
- 第5章课件:分布的检验(PDF · 3.8MB)下载
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问