Kolmogorov Smirnov Test结果异常求助:数据正态性与测试结果不符
KS检验结果与QQ图矛盾的排查求助
我按照Sam Mason的建议修改了高斯参数相关代码,但Kolmogorov-Smirnov检验的结果仍不符合预期。从QQ图判断,数据应该近似服从正态分布,附上更新后的代码及数据文件,恳请协助排查问题。
数据文件:Z079_test_mc.csv
可能的问题点及修正后的代码
import pandas as pd import numpy as np from scipy import stats # 原代码遗漏该导入,运行会直接报错 alpha = 0.05 df = pd.read_csv("Z079_test_mc.csv") columns = df.columns with open('matrix.txt', 'a') as f: for col in columns: print([col]) # 提取一维无缺失值数据:避免原代码中二维数组导致的检验逻辑异常 data = df[col].dropna().values # 使用样本标准差(ddof=1,除以n-1),更贴合统计检验的样本假设 mean_val = np.mean(data) std_val = np.std(data, ddof=1) # 传入一维数据执行KS检验 stat, p_val = stats.kstest(data, stats.norm.cdf, args=(mean_val, std_val)) print('Statistics', stat, 'p-value', p_val) if p_val < alpha: result = '原假设可被拒绝' print(f"{result}\n") f.write(f"{col},Kolmogorov Smirnov\n ,{stat},{p_val},{result}\n") else: result = '原假设不可被拒绝' print(result) f.write(f"{col},Kolmogorov Smirnov\n ,{stat},{p_val},{result}\n")
关键修正说明
- 补全模块导入:原代码未导入
scipy.stats,运行会直接抛出NameError - 数据维度修正:
df[[col]]返回的是DataFrame,其values为二维数组,而kstest要求输入一维数据,改用df[col].dropna().values获取正确格式的样本数据 - 标准差计算修正:默认
np.std计算的是总体标准差(除以n),针对样本数据应使用ddof=1计算样本标准差,符合统计检验的前提假设 - 代码可读性优化:简化变量命名与文件写入逻辑,降低维护成本
额外排查建议
- KS检验对样本量极度敏感:若样本量极大,即使数据与正态分布仅有微小偏差,也可能导致p值小于显著性水平而拒绝原假设
- 细化QQ图分析:重点观察尾部数据的拟合情况,KS检验对尾部偏差的敏感度远高于视觉判断
- 交叉验证检验结果:尝试Shapiro-Wilk检验(适用于小样本)或Anderson-Darling检验,对比不同方法的结论是否一致
内容的提问来源于stack exchange,提问作者NotAnotherName
相关产品推荐
相关产品推荐

