
spss 与 python 的 kolmogorov-smirnov(ks)检验常因默认假设不同而产生显著差异:spss 默认执行参数未知的 lilliefors 校正版 ks 检验,而 scipy 的 `kstest` 默认检验是否服从**指定参数**(如标准正态分布),二者原假设和统计量计算逻辑本质不同。
在实际数据分析中,当使用 KS 检验评估变量(如 age 或 height)的正态性时,若直接调用 scipy.stats.kstest(data, 'norm') 或 kstest(data, norm(loc=0, scale=1).cdf),你实际上是在检验数据是否来自标准正态分布(均值为 0、标准差为 1)。但原始数据 age 的均值约为 7.5、标准差约 1.6,显然严重偏离标准正态——这导致 KS 统计量极大(如 0.9999997)、p 值极小(~1e-282),结果虽“正确”,却毫无实际意义,因为它检验的是一个明显错误的零假设。
而 SPSS 在“探索”或“单样本 KS”对话框中执行的并非标准 KS 检验,而是 Lilliefors 检验(Lilliefors’ correction to KS test):它仍使用 KS 统计量,但将正态分布的均值和标准差从样本中估计(即 loc=data.mean(), scale=data.std(ddof=1)),并采用专门校正后的临界值或 p 值表(或蒙特卡洛模拟)来判断显著性。这才是真正用于“检验数据是否服从某个正态分布”的实用方法。
✅ 正确做法(Python 中复现 SPSS 的逻辑):
from scipy import stats
import numpy as np
# 原始 age 数据
age = np.array([8,8,8,8,10,9,8,7,6,5,7,7,7,8,6,6,9,10,10,9,9,5,7,6,6,5,8,6,5,6,6,9,6,8,10,10,6,6,7,5,6,7,10])
# 方法1:使用 stats.gof(推荐,SciPy 1.12+)
res = stats.goodness_of_fit(stats.norm, age, statistic='ks', random_state=42)
print(f"Lilliefors KS statistic: {res.statistic:.4f}") # ≈ 0.190
print(f"p-value (Monte Carlo): {res.pvalue:.3f}") # ≈ 0.000–0.001
# 方法2:手动实现(兼容旧版 SciPy)
def lilliefors_test(x, alpha=0.05, n_sim=1000):
x = np.asarray(x)
n = len(x)
mu, sigma = x.mean(), x.std(ddof=1)
# 计算经验 CDF 与拟合正态 CDF 的最大偏差
x_sorted = np.sort(x)
cdf_fitted = stats.norm.cdf(x_sorted, loc=mu, scale=sigma)
ecdf = np.arange(1, n+1) / n
ks_stat = np.max(np.abs(cdf_fitted - ecdf))
# 粗略 p 值估计(实际应查 Lilliefors 表或模拟)
# 此处仅示意:真实应用请使用 statsmodels.stats.diagnostic.lilliefors
return ks_stat
print(f"Manual Lilliefors stat: {lilliefors_test(age):.4f}") # ≈ 0.190⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- scipy.stats.kstest 永远不自动估计分布参数;若需检验“是否服从正态分布(参数未知)”,必须显式使用 goodness_of_fit(..., statistic='ks') 或第三方库(如 statsmodels.stats.diagnostic.lilliefors)。
- 对小样本(n Shapiro-Wilk 检验(scipy.stats.shapiro),其统计功效更高且专为正态性设计:
shapiro_stat, shapiro_p = stats.shapiro(age) print(f"Shapiro-Wilk: W={shapiro_stat:.4f}, p={shapiro_p:.4f}") # 更稳健的正态性判断 - SPSS 的 sig. 列显示 0.000 并非精确为 0,而是
总结:差异根源不在代码错误,而在统计思想——检验“是否服从标准正态” vs “是否服从某正态分布”是两个不同问题。选择合适的方法,才能让检验结果真正服务于研究目标。










