显著性检验
问题
如何判断 A/B 实验结果是否「统计显著」?p 值和置信区间怎么解读?
答案
检验流程
比例指标检验(Z 检验)
适用于转化率、点击率等 0/1 指标:
其中 (合并比例)
import numpy as np
from scipy import stats
def z_test_proportions(n_c, x_c, n_t, x_t):
"""双比例 Z 检验"""
p_c = x_c / n_c # 对照组转化率
p_t = x_t / n_t # 实验组转化率
p_pool = (x_c + x_t) / (n_c + n_t) # 合并比例
# 标准误
se = np.sqrt(p_pool * (1 - p_pool) * (1/n_c + 1/n_t))
# Z 统计量
z = (p_t - p_c) / se
# 双尾 p 值
p_value = 2 * (1 - stats.norm.cdf(abs(z)))
# 95% 置信区间(差值)
se_diff = np.sqrt(p_c*(1-p_c)/n_c + p_t*(1-p_t)/n_t)
ci = (p_t - p_c - 1.96*se_diff, p_t - p_c + 1.96*se_diff)
return {
"p_control": p_c,
"p_treatment": p_t,
"lift": (p_t - p_c) / p_c,
"z_stat": z,
"p_value": p_value,
"ci_95": ci
}
# 示例
result = z_test_proportions(
n_c=10000, x_c=500, # 对照组 10000 人,500 转化
n_t=10000, x_t=550 # 实验组 10000 人,550 转化
)
print(f"转化率提升: {result['lift']:.1%}")
print(f"p 值: {result['p_value']:.4f}")
print(f"95% CI: [{result['ci_95'][0]:.4f}, {result['ci_95'][1]:.4f}]")
均值指标检验(t 检验)
适用于客单价、时长等连续指标:
from scipy.stats import ttest_ind
# Welch's t 检验(不假设等方差)
t_stat, p_value = ttest_ind(
treatment_values,
control_values,
equal_var=False # Welch's t(推荐)
)
p 值正确解读
p 值的常见误解
| 错误说法 | 正确理解 |
|---|---|
| p=0.03 说明有 3% 概率 H₀ 为真 | p 值不是 H₀ 为真的概率 |
| p=0.03 说明效应有 97% 概率存在 | p 值不是效应存在的概率 |
p<0.05 说明效果很大 | p 值不反映效应大小 |
p>0.05 说明没有效果 | 只能说"没有足够证据拒绝 H₀" |
正确定义:p 值 = 假设 H₀ 为真时,观测到当前或更极端结果的概率。
置信区间
置信区间比 p 值提供更多信息:
| 信息 | p 值 | 置信区间 |
|---|---|---|
| 效果方向 | 需看统计量符号 | 直接看正负 |
| 效果大小 | ❌ | ✅ 点估计 |
| 不确定性 | ❌ | ✅ 区间宽度 |
| 显著性 | p < 0.05 | 区间不包含 0 |
示例:购买转化率提升 = 0.5%, 95% CI = [0.1%, 0.9%]
解读:
- 实验组比对照组高 0.5 个百分点
- 真实提升大概率在 0.1% ~ 0.9% 之间
- 区间不包含 0 → 统计显著(p < 0.05)
效应量(Effect Size)
| 指标 | 公式 | 解读 |
|---|---|---|
| Cohen's d | 0.2 小 / 0.5 中 / 0.8 大 | |
| 相对提升(Lift) | 业务最关心的 | |
| 绝对差异 | 直观的百分点差异 |
统计显著 ≠ 业务显著
- 大样本量下,微小差异(如 0.01%)也可能 p < 0.05
- 需同时报告效应量和置信区间
- 决策标准:统计显著 AND 业务有意义
常见面试问题
Q1: 实验结果 p=0.06,该怎么决策?
答案:
- 不能简单判为"不显著就放弃"
- 看置信区间:如果 CI 接近但未排除 0(如 [-0.001, 0.012]),说明效应可能存在但证据不足
- 看效应量:业务上有意义吗?
- 考虑 Power:样本量是否足够?可能是 Type II Error(漏检)
- 选择:继续积累数据、或设计更灵敏的实验
Q2: 实验做了多个指标,其中一个 p<0.05,能算显著吗?
答案:不能。这是多重比较问题:
- 测 20 个指标,期望有 1 个偶然显著(5% × 20 = 1)
- 需要做校正:
- Bonferroni:α' = 0.05 / 指标数(保守)
- BH(Benjamini-Hochberg):控制 FDR(推荐)
- 或者预先注册主指标,其他作为探索性分析
Q3: 如何向非技术人员解释 p 值?
答案:
假设新功能其实没有效果,我们做这个实验看到这么大差异的可能性只有 3%。这个概率非常小,所以我们有信心认为新功能确实有效。
核心要点:
- 把 p 值翻译成"在巧合的可能性"
- 避免说"有 X% 概率有效"
- 用具体数字(如 95% 的信心水平)帮助理解
Q4: Z 检验和 t 检验怎么选?
答案:
| 场景 | 选择 |
|---|---|
| 比例指标(转化率) | Z 检验 |
| 均值指标,大样本 | Z 检验或 t 检验(结果几乎一样) |
| 均值指标,小样本 | t 检验(更保守) |
| 两组方差不等 | Welch's t 检验(不假设等方差) |
实践中,样本量通常足够大,两种检验差异不大。Welch's t 是最保险的选择。