假设检验
问题
什么是假设检验?p 值是什么意思?如何判断结果是否显著?
答案
假设检验是推断统计的核心,用于判断"观察到的差异是真实存在的,还是纯属随机波动"。这是 A/B 测试 的理论基础。
假设检验流程
核心概念
| 概念 | 定义 | 通俗解释 |
|---|---|---|
| H₀(零假设) | 无差异/无效果 | "AB 两组没区别" |
| H₁(备择假设) | 有差异/有效果 | "AB 两组有区别" |
| p 值 | 在 H₀ 成立时,观察到当前或更极端结果的概率 | "如果真没区别,出现这么大差异的概率" |
| α(显著性水平) | 拒绝 H₀ 的阈值,通常 0.05 | "我能接受 5% 的误判概率" |
| 统计显著 | p < α | "差异大到不太可能是巧合" |
p 值的常见误解
- ❌ "p = 0.03 说明 H₁ 成立的概率是 97%"
- ✅ p = 0.03 的正确含义:"如果 H₀ 为真,出现这么大差异的概率只有 3%"
- p 值不是效果大小,p < 0.05 只说明统计显著,不一定有业务显著性
两类错误
| 错误类型 | 定义 | 通俗解释 | 严重程度 |
|---|---|---|---|
| I 类错误(α) | H₀ 对但拒绝了 | "没有效果却说有效果"(假阳性) | 浪费资源 |
| II 类错误(β) | H₁ 对但没拒绝 | "有效果却说没效果"(假阴性) | 错失机会 |
| 统计功效(1-β) | 正确拒绝错误 H₀ 的概率 | "有效果时能检测出来的概率" | 越高越好 |
常用检验方法
| 检验 | 适用场景 | 示例 |
|---|---|---|
| z 检验 | 比较均值,大样本(n>30),σ 已知 | 比较两组转化率 |
| t 检验 | 比较均值,小样本或 σ 未知 | 比较 AB 两组的用户消费额 |
| 卡方检验 | 比较分类变量的分布 | 不同渠道的用户构成是否有差异 |
| ANOVA | 比较 3 组以上的均值 | 3 个版本的设计哪个效果好 |
| Mann-Whitney U | 比较两组,数据不符合正态 | 两组用户的停留时长 |
t 检验
独立样本 t 检验
from scipy import stats
import numpy as np
# A 组和 B 组的付费金额
group_a = np.array([50, 55, 60, 45, 70, 65, 55, 50, 60, 55])
group_b = np.array([60, 65, 70, 55, 75, 80, 70, 65, 75, 60])
# 独立样本 t 检验
t_stat, p_value = stats.ttest_ind(group_a, group_b)
print(f"t 统计量: {t_stat:.3f}")
print(f"p 值: {p_value:.4f}")
if p_value < 0.05:
print("✅ 差异显著(p < 0.05),拒绝 H₀")
else:
print("❌ 差异不显著(p >= 0.05),不能拒绝 H₀")
卡方检验
卡方独立性检验
from scipy import stats
import pandas as pd
# 两个渠道的用户付费情况
data = pd.DataFrame({
'渠道': ['A', 'A', 'B', 'B'],
'是否付费': ['是', '否', '是', '否'],
'人数': [120, 880, 150, 850]
})
# 构建列联表
contingency = pd.crosstab(
pd.Series(['A']*1000 + ['B']*1000),
pd.Series(['付费']*120 + ['未付费']*880 + ['付费']*150 + ['未付费']*850)
)
chi2, p_value, dof, expected = stats.chi2_contingency(contingency)
print(f"卡方统计量: {chi2:.3f}, p 值: {p_value:.4f}")
比例检验(A/B 测试最常用)
两组比例检验
from statsmodels.stats.proportion import proportions_ztest
# A 组: 1000 人中 50 人转化; B 组: 1000 人中 65 人转化
count = np.array([50, 65])
nobs = np.array([1000, 1000])
z_stat, p_value = proportions_ztest(count, nobs, alternative='two-sided')
print(f"z 统计量: {z_stat:.3f}, p 值: {p_value:.4f}")
单侧检验 vs 双侧检验
| 类型 | H₁ | 适用场景 |
|---|---|---|
| 双侧检验 | μ_A ≠ μ_B | 不确定方向,常用 |
| 单侧检验 | μ_A > μ_B 或 μ_A < μ_B | 明确预期方向 |
面试建议
除非明确知道方向,否则默认用双侧检验。单侧检验的 p 值是双侧的一半,更容易"显著",但假设更强。
常见面试问题
Q1: p 值是什么?p < 0.05 意味着什么?
答案:
- p 值 = 在零假设(无差异)成立时,观察到当前或更极端结果的概率
- p < 0.05 意味着"如果真没区别,出现这种结果的概率小于 5%",我们认为差异不太可能是随机的,拒绝零假设
- 注意:p 值不是"结论成立的概率",也不反映效果大小
Q2: 统计显著和业务显著的区别?
答案:
- 统计显著(p < 0.05):差异不太可能是随机的
- 业务显著:差异大到值得采取行动
- 例子:转化率从 5.00% 提升到 5.02%,有 10 万样本可能 p < 0.05,但 0.02% 的提升可能不值得投入资源
- 看 p 值的同时,必须看效应量(effect size)
Q3: α = 0.05 的含义?为什么选 0.05?
答案:
- α = 0.05 表示我们接受 5% 的 I 类错误概率(把无效果误判为有效果)
- 0.05 是惯例,不是铁律,可根据场景调整:
- 医学试验通常 α = 0.01(误判代价高)
- 探索性分析可以 α = 0.10(更宽松)
- 有些公司要求同时满足 p < 0.05 和 效应量的最小阈值
Q4: 如何选择检验方法?
答案:
Q5: 什么是统计功效?如何提高功效?
答案:
- 统计功效 = 1 - β = 当真实存在差异时,正确检测出来的概率
- 通常要求功效 ≥ 80%
- 提高功效的方法:(1) 增大样本量;(2) 增大效应量;(3) 提高 α(代价是更多假阳性);(4) 降低数据方差