为何scipy.stats.kstest的p值随样本量增大而降低?
关于scipy.stats.kstest检验泊松分布的样本量与p值矛盾问题
我正在研究时间序列事件,希望证明其并非随机生成事件,因此尝试使用scipy中的kstest方法。但在检验泊松分布时遇到了困惑:
代码1(样本量n=100)
from scipy.stats import poisson, kstest noPts = 100 lambdaPoisson = 10 my_data = poisson.rvs(size = noPts, mu = lambdaPoisson) ks_statistic, p_value = kstest(my_data, 'poisson', args=(lambdaPoisson,0)) print(ks_statistic, p_value)
输出:
0.18677614630310613 0.0015821590670650476
代码2(样本量n=1000)
from scipy.stats import poisson, kstest noPts = 1000 lambdaPoisson = 10 my_data = poisson.rvs(size = noPts, mu = lambdaPoisson) ks_statistic, p_value = kstest(my_data, 'poisson', args=(lambdaPoisson,0)) print(ks_statistic, p_value)
输出:
0.13477614630310608 2.6511802749311937e-16
我原本认为样本量越大,poisson.rvs生成的数据与kstest检验的泊松分布统计匹配度越高,KS统计量确实变小了,但p值却变得极小,导致拒绝原假设。由于数据是用同一参数的泊松分布生成的,我对此感到困惑,想知道哪里出错了。
问题原因解释
这不是代码错误,而是统计检验的本质特性导致的:
- 原假设的局限性:KS检验的原假设是“样本严格来自指定的理论分布”,但实际中,哪怕是用
poisson.rvs生成的样本,也只是理论分布的有限次抽样结果,不可能和理论分布完全重合。样本量越大,检验的灵敏度越高,哪怕极其微小的偏差都会被检测出来,进而得到极小的p值。 - p值的统计意义:p值衡量的是“原假设成立时,观测到当前样本或更极端样本的概率”。当样本量n增大时,样本累积分布函数(CDF)会更接近理论CDF,但检验统计量的方差会随n增大而减小——同样大小的KS统计量,在大样本下对应的p值会急剧降低。也就是说,大样本下检验对任何微小偏离都极其敏感。
- 离散分布的适配问题:KS检验最初是为连续分布设计的,泊松分布作为离散分布,用KS检验时的近似p值本身存在偏差,大样本下这种偏差带来的微小差异会被进一步放大,导致p值变得极小。
正确的使用思路
如果你想用KS检验证明你的时间序列不是随机泊松事件,应该:
- 用真实的时间序列数据而非模拟泊松数据进行检验
- 不要仅依赖p值大小,结合KS统计量(效应量)和业务场景判断偏差是否有实际意义——大样本下即使p值极小,若KS统计量很小,说明实际偏差可能可以忽略
内容的提问来源于stack exchange,提问作者Koohong Kang
相关产品推荐
相关产品推荐

