ttest_ind直接用于业务指标(如转化率)多数不适用,因数据常非正态、方差不齐、样本量不等;应优先选用卡方检验、Z检验或Welch’s t-test,并严格验证前提条件。

直接用 ttest_ind 做两组业务指标的T检验,多数情况不适用
业务数据(比如订单转化率、人均停留时长、客单价)通常不服从正态分布,且A/B组样本量常不等、方差不齐——而 ttest_ind 默认假设两组独立、同方差、近似正态。强行调用会显著抬高假阳性风险,尤其当转化率这类稀疏指标样本量小或偏态严重时,p值完全不可信。
实操建议:
- 先用
scipy.stats.shapiro或直方图+Q-Q图粗看单组是否近似正态;更稳妥的做法是跳过正态检验,直接上非参数方法 - 用
ttest_ind(a, b, equal_var=False)显式关闭方差齐性假设(即 Welch’s t-test),比默认更鲁棒 - 若指标是比率型(如点击率、转化率),优先用
scipy.stats.binomtest(单样本)或scipy.stats.chi2_contingency(卡方检验,适用于2×2列联表)
转化率类指标别硬套 ttest_ind,改用卡方或 Z 检验更合理
比如实验组1000人中有120人下单(转化率12%),对照组950人中有95人下单(10%)。把这看作两个二项分布样本,本质是频数比较,不是连续变量均值比较。
推荐做法:
立即学习“Python免费学习笔记(深入)”;
- 构造 2×2 表:
[[120, 880], [95, 855]](成功/失败),传给scipy.stats.chi2_contingency - 或用
statsmodels.stats.proportion.proportions_ztest,它直接支持双样本比率Z检验,结果更贴近业务直觉(还能返回效应量) - 避免把转化率数值数组(如
[0,1,0,0,1,...])喂给ttest_ind——虽语法通过,但统计前提崩坏
当真要用 ttest_ind 时,必须检查和处理三件事
仅在确认指标近似连续、每组 n > 30、且无极端离群值时才考虑。即便如此,仍需手动干预:
- 用
scipy.stats.levene(a, b)检查方差齐性:p equal_var=False - 对明显右偏的数据(如客单价),先做
np.log1p(a)再检验,比生用原始值更稳 - 样本量悬殊时(如 A 组 5000,B 组 500),
ttest_ind的自由度计算会失真,建议加nan_policy='omit'并人工剔除异常值
效应量比 p 值更重要,ttest_ind 不返回,得自己算
p
必须补一手:
- 均值差:直接
np.mean(a) - np.mean(b) - Cohen’s d:用
(np.mean(a)-np.mean(b)) / np.sqrt(((len(a)-1)*np.var(a, ddof=1) + (len(b)-1)*np.var(b, ddof=1)) / (len(a)+len(b)-2)) - 95% 置信区间:可用
scipy.stats.t.interval(0.95, df, loc=diff, scale=se),其中se是标准误
没效应量和置信区间的显著性结论,基本等于没结论。业务同学看不懂 p 值,但能理解“提升 12%±3%,95% 把握在 9%-15% 之间”。


















