4. 实验指标设计:核心指标、代理指标、统计显著性、最小样本量计算

指标设计这事儿,说简单也简单,说复杂能让你掉一层皮。我见过太多团队,实验做了一堆,最后发现选的指标根本反映不了业务真实变化。嗯,今天咱们就把这块掰开揉碎讲清楚。

4.1 核心指标 vs 代理指标:你得知道自己在测什么

先问个问题:你为什么要做这个实验?

说白了,你想知道某个改动到底有没有带来业务价值。那什么能代表「业务价值」?这就是核心指标要回答的事。

核心指标:直接衡量业务目标的北极星指标。比如电商的 GMV、社交产品的 DAU、SaaS 的续费率。

代理指标:当核心指标观测成本太高或周期太长时,用来「近似」核心指标的替代指标。

举个例子。我在做推荐系统优化时,核心指标其实是「用户长期留存率」。但等一个月看留存?黄花菜都凉了。所以我们用「点击率」和「人均播放时长」作为代理指标。注意,代理指标必须和核心指标有强相关性,否则就是自欺欺人。

维度 核心指标 代理指标
定义 直接衡量业务目标 间接反映业务目标
观测周期 长(周/月/季度) 短(天/小时)
因果链路 直接因果 相关关系
风险 观测延迟大 可能偏离真实目标
典型场景 LTV、GMV、留存率 CTR、转化率、页面停留时长

我曾经踩过一个坑:用「页面停留时长」作为代理指标来优化内容推荐。结果实验组停留时长显著提升,但用户满意度反而下降了。后来一查,是因为推荐的内容太难懂,用户被迫花更多时间理解——这根本不是我们想要的效果。

所以记住:代理指标选不好,实验做得越漂亮,业务死得越惨。

4.2 统计显著性:别被随机波动骗了

实验组比对照组高了 2%,你就觉得改动有效?别急,这 2% 可能是随机波动。

统计显著性(p-value)就是帮我们判断:观察到的差异,到底是真实效果,还是抽样误差导致的偶然现象。

我个人习惯用这个标准流程:

  1. 设定零假设 H₀:实验组和对照组没有差异(μ₁ = μ₂)
  2. 设定备择假设 H₁:实验组和对照组有差异(μ₁ ≠ μ₂)
  3. 计算 p-value:在 H₀ 为真的前提下,观察到当前结果(或更极端结果)的概率
  4. 做出判断:如果 p-value < 显著性水平 α(通常取 0.05),拒绝 H₀,认为差异显著

你想想看,α=0.05 意味着什么?意味着即使实验没效果,每做 20 次实验,也会有 1 次「碰巧」显著。这就是第一类错误(假阳性)。

小技巧:如果你的实验涉及多个指标,记得做多重比较校正。我常用的方法是 Bonferroni 校正——把 α 除以指标个数。比如测 5 个指标,α 就设为 0.01。虽然保守了点,但能有效控制假阳性。

4.3 最小样本量计算:实验要做多久才够

这是实操中最容易被忽视的问题。样本量不够,实验跑再久也得不到可靠结论。

最小样本量的计算公式长这样:

n = (Z_α/2 + Z_β)² × 2σ² / δ²

其中:
- Z_α/2:显著性水平对应的 Z 值(α=0.05 时取 1.96)
- Z_β:统计功效对应的 Z 值(β=0.2 时取 0.84,功效=0.8)
- σ²:指标的方差
- δ:最小可检测效应量(MDE,Minimum Detectable Effect)

看着有点晕?没关系,我一般直接用 Python 算:

import scipy.stats as stats
import numpy as np

def min_sample_size(effect_size, alpha=0.05, power=0.8):
    """
    计算双样本 t 检验的最小样本量(每组)
    
    Parameters:
    - effect_size: 标准化效应量(Cohen's d)
    - alpha: 显著性水平
    - power: 统计功效
    
    Returns:
    - n: 每组所需样本量
    """
    z_alpha = stats.norm.ppf(1 - alpha / 2)
    z_beta = stats.norm.ppf(power)
    
    n = (2 * (z_alpha + z_beta) ** 2) / (effect_size ** 2)
    return int(np.ceil(n))

# 示例:想检测 0.2 个标准差的效应量
print(min_sample_size(effect_size=0.2))
# 输出:393

这里有几个关键点:

  • 效应量越小,需要的样本量越大。想检测 0.1% 的转化率提升?准备好几百万样本吧。
  • 方差越大,需要的样本量越大。这就是为什么收入类指标比转化率指标难做——收入方差太大了。
  • 统计功效通常设为 0.8。意思是如果真实效果存在,你有 80% 的概率能检测出来。剩下 20% 就是第二类错误(假阴性)。

我曾经犯过一个错误:在某个推荐算法实验中,我算出来每组需要 10 万样本,但当时流量只够跑 3 万。我心想「先跑着看看趋势」,结果跑了两周,p-value 一直在 0.06 到 0.12 之间晃悠,既不能确认有效也不能确认无效。白白浪费了两周流量。

所以我的建议是:样本量不够,宁可不做,也别做半吊子实验。

4.4 指标设计的完整流程

把上面这些串起来,我一般按这个步骤走:

  1. 明确业务目标:这次实验到底想提升什么?
  2. 选定核心指标:找到最能代表业务目标的那个数字
  3. 设计代理指标:如果核心指标观测周期太长,找相关性强的代理指标
  4. 确定效应量:和业务方对齐,多大的提升才算「有意义」
  5. 计算样本量:根据效应量、方差、显著性水平、功效,算出所需样本量
  6. 预估实验时长:样本量 ÷ 日均流量 = 最少需要跑的天数
  7. 设定显著性水平:默认 0.05,多指标时做校正

下面这张图把整个流程串起来了:

实验指标设计流程 1. 明确业务目标 2. 选定核心指标 3. 设计代理指标 4. 确定效应量 (MDE) 5. 计算最小样本量 关键参数 • α = 0.05(显著性) • β = 0.2(功效 0.8) • δ = 最小可检测效应 • σ² = 指标方差 公式: n = (Z_α/2 + Z_β)² × 2σ² / δ² 避坑提醒: • 样本不够宁可不做 • 多指标要校正 α • 代理指标要验证相关性 • 效应量别拍脑袋定

4.5 实操中的几个避坑点

最后分享几个我这些年攒下来的经验:

  • 效应量别拍脑袋。我见过产品经理说「提升 1% 就算有效」,结果算出来样本量要跑三个月。这时候要么降低效应量预期,要么接受更长的实验周期。
  • 方差估算要保守。用历史数据估算方差时,我习惯取过去 30 天的 90 分位值,而不是平均值。这样算出来的样本量更保险。
  • 别忘了做 AA 检验。实验开始前,先跑一组 AA 实验(两组都用旧版本),验证分桶是否均匀、指标是否有系统性偏差。我遇到过好几次 AA 实验就显著的情况——后来发现是分桶逻辑有 bug。
  • 关注实际显著性,别只看统计显著性。p-value 再小,如果效应量只有 0.01%,对业务来说可能毫无意义。统计显著 ≠ 业务显著。

我的个人习惯:每次实验上线前,我都会写一份「实验设计文档」,里面包含核心指标、代理指标、效应量、样本量、实验时长、显著性水平。这份文档会发给团队 review 一遍。别嫌麻烦——这一步能拦住 80% 的实验设计问题。