大样本下应优先用scipy.stats.norm做z检验;若总体标准差已知则直接使用,若仅知样本标准差且n>50,可用s/√n作为标准误;ttest_1samp虽可用但略保守,且需显式指定popmean=mu0。

大样本下该用 scipy.stats.norm 还是 scipy.stats.ttest_1samp?
大样本(通常 n > 30)做单样本均值检验时,scipy.stats.ttest_1samp 仍可工作,但它的 t 分布假设在样本量大时会过度保守——t 统计量虽趋近正态,但自由度计算和尾部概率仍按 t 分布算,轻微偏宽。更直接的做法是手动计算 z 统计量并查标准正态分布:scipy.stats.norm.cdf 或 scipy.stats.norm.ppf。前提是总体标准差已知或可用样本标准差近似(中心极限定理支持)。若你只有样本标准差且 n ≥ 50,z 检验结果与 t 检验差异通常小于 0.5%,但代码更透明、无自由度隐含逻辑。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 若总体标准差
sigma已知 → 直接用norm做 z 检验 - 若仅知道样本标准差
s且 n > 50 → 仍可用norm,把标准误设为s / np.sqrt(n) - 若坚持用
ttest_1samp,注意它默认检验均值是否等于 0;要检验是否等于mu0,必须传参popmean=mu0,否则结果完全错误
scipy.stats.kstest 对大样本太敏感?怎么调
kstest 的 K-S 统计量在大样本下极易拒绝原假设——哪怕分布差异极微小(如均值偏移 0.01 个标准差),p 值也会趋近 0。这不是 bug,而是检验统计量本身的性质:其功效随 √n 增长。对百万级数据,kstest 很少给出“不显著”,容易误导你认为分布“不同”,而实际业务中可能完全可接受。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先画直方图 + 累积分布曲线对比,肉眼判断差异是否实质相关
- 改用更鲁棒的检验:比如
scipy.stats.anderson(Anderson-Darling)对尾部更敏感,但返回临界值表而非单一 p 值,需手动比对 - 若必须用
kstest,可考虑降采样到 5000–10000 点再跑——不是为了“凑显著”,而是让检验结论匹配业务容忍度 - 避免对标准化后的数据反复调用
kstest(如每列都检),多重检验问题会放大假阳性;应提前决定检验维度,或用statsmodels.stats.multitest.multipletests
两样本大样本检验:别直接套 ttest_ind 默认参数
scipy.stats.ttest_ind 默认启用 equal_var=True,即假设两组方差齐性。但大样本下,Levene 检验几乎总拒绝方差相等假设,而 ttest_ind 却仍强行用合并方差公式,导致标准误估计偏差。正确做法是始终设 equal_var=False,此时它退化为 Welch’s t 检验——不依赖方差齐性,且在大样本下渐近等价于 z 检验。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 无论样本量多大,只要两组标准差差异超过 2 倍,就强制
equal_var=False - 如果两组 n₁ 和 n₂ 都 > 100,可直接用 z 检验:计算
(mean1 - mean2) / np.sqrt(s1**2/n1 + s2**2/n2),再喂给norm.cdf - 注意
ttest_ind默认是双侧检验;若只关心 A 是否显著大于 B,要用alternative='greater',不能靠事后除 2 改 p 值
内存不够跑大样本检验?绕过全量加载的 trick
Scipy 函数本身不处理流式数据,但大样本常意味着无法一次性 np.loadtxt 或 pd.read_csv 到内存。这时不能硬扛,得从统计量源头拆解:均值、方差、计数可增量更新,K-S 检验的累积分布也可用分箱近似。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 对均值/方差检验:用 Welford 算法边读边算
mean和m2(二阶中心矩),最后导出n,mean,std再代入 z 公式 - 对分布检验:用
numpy.quantile在内存允许范围内抽 10000–50000 点,或用scipy.stats.binned_statistic分 200+ 等宽箱,比较两组的累计频次比例 - 避免在 pandas 中用
df.sample(frac=1).head(N)重排再取样——IO 开销大;改用基于行号的均匀采样(如只读第 0、100、200… 行)
真正卡住的往往不是 Scipy 函数本身,而是你怎么把数据喂给它。大样本检验的边界不在算法,而在你愿不愿意把统计量计算逻辑从“调包”下沉到“手算中间值”。


















