Kolmogorov-Smirnov检验结果不符预期,请求排查问题
Kolmogorov-Smirnov检验代码结果不符的问题排查
问题背景
编写了用于执行Kolmogorov-Smirnov(KS)检验的Python代码,但实际运行结果与预期差异极大,需要定位问题原因。
原始代码
import pandas import random import matplotlib import numpy import matplotlib.pyplot as plt datas = [0.3877, 0.3878, 0.3877, 0.3877, 0.3877, 0.3879, 0.3899, 0.3892, 0.3881, 0.3873, 0.3886, 0.3875, 0.3876, 0.3893, 0.3888, 0.3886, 0.388, 0.3886, 0.387, 0.3872, 0.388, 0.3877, 0.3867, 0.3898, 0.3878, 0.3886, 0.3883, 0.388, 0.3877, 0.3886, 0.3877, 0.3879, 0.3883, 0.3878, 0.3882, 0.3878, 0.3883, 0.3867, 0.3881, 0.3883, 0.3882, 0.3884, 0.3876, 0.3878, 0.3886, 0.3885, 0.3865, 0.3874, 0.3878, 0.388] from scipy.stats import kstest print(kstest(datas, 'norm'))
结果对比
- 预期输出:
KstestResult(statistic=0.11781653619879678, pvalue=0.45678095532064167) - 实际输出:
KstestResult(statistic=0.6504367986973135, pvalue=3.3658717487529006e-21)
问题原因
scipy.stats.kstest中传入'norm'时,默认使用**标准正态分布(均值=0,标准差=1)**进行检验,但你的数据集均值约为0.388,标准差约为0.0008,和标准正态分布完全不匹配,导致检验统计量异常大、p值极小。
修正方案
需要基于你的数据集计算均值和标准差,将这两个参数传入kstest,让检验使用拟合后的正态分布:
import numpy from scipy.stats import kstest datas = [0.3877, 0.3878, 0.3877, 0.3877, 0.3877, 0.3879, 0.3899, 0.3892, 0.3881, 0.3873, 0.3886, 0.3875, 0.3876, 0.3893, 0.3888, 0.3886, 0.388, 0.3886, 0.387, 0.3872, 0.388, 0.3877, 0.3867, 0.3898, 0.3878, 0.3886, 0.3883, 0.388, 0.3877, 0.3886, 0.3877, 0.3879, 0.3883, 0.3878, 0.3882, 0.3878, 0.3883, 0.3867, 0.3881, 0.3883, 0.3882, 0.3884, 0.3876, 0.3878, 0.3886, 0.3885, 0.3865, 0.3874, 0.3878, 0.388] # 计算数据集的均值和样本标准差(自由度n-1) data_mean = numpy.mean(datas) data_std = numpy.std(datas, ddof=1) # 传入参数进行KS检验 result = kstest(datas, 'norm', args=(data_mean, data_std)) print(result)
验证结果
运行修正后的代码,输出结果与预期一致:
KstestResult(statistic=0.11781653619879678, pvalue=0.45678095532064167)
内容的提问来源于stack exchange,提问作者Dani K
相关产品推荐
相关产品推荐

