从手动实验到实验平台

团队刚开始做 A/B 测试时,通常是「手动实验」:产品经理想个假设,让研发改个开关,运营手动圈一批用户,数据同学跑个报表。跑一两个实验没问题,跑几十个就开始乱——实验相互干扰、样本重叠、口径不一致、结论没人记录。当实验成为常态,就需要一个「实验平台」来承接:统一分流、统一指标、统一报表、统一管理。

实验平台不是工具,是把「拍脑袋决策」替换成「可证伪的实验文化」的基础设施。

下面把实验平台的核心环节拆开讲,每一环都是工程化要解决的具体问题。

手动实验的三个失控点
  • 样本重叠多实验共用用户,结果互相污染。
  • 口径不一同一个指标,各算各的。
  • 结论丢失跑完不记录,下回重做一遍。

分流机制:用户怎么分组

实验平台的第一块地基是「分流」。原则有三条:随机、稳定、互斥。随机保证实验组和对照组在统计上可比;稳定保证同一个用户在整个实验期间始终看到同一个版本(防止他反复横跳);互斥保证不同实验占用的用户不重叠,避免一个用户同时被两个实验影响。工程上常用「用户 ID 哈希分层」实现稳定分流,用「实验域」实现互斥。

下面这段小脚本,演示了基于哈希的分流原理。

# 稳定分流(简化示意)
import hashlib

def bucket(user_id, salt, n):
    h = hashlib.md5((user_id + salt).encode()).hexdigest()
    return int(h, 16) % n

print("用户落在实验组:", bucket("user-1001", "exp-13", 2))
发光分流漏斗分两路管道接对比柱状条、旁有开关齿轮的实验平台扁平插画
分流是实验的地基,随机、稳定、互斥三条原则缺一不可。

指标与样本量设计

实验开始前,先回答两个问题:看什么指标、要多少样本。指标要分「主指标」和「护栏指标」:主指标回答「改版有没有用」,比如转化率、留存;护栏指标防止「捡了芝麻丢西瓜」,比如人均时长骤降、投诉率上升。样本量则取决于预期效果大小和方差——想检测出 1% 的提升,需要的样本远大于检测 5% 的提升。

下面这段小脚本,演示了样本量估算的最简逻辑。

# 样本量估算(简化)
import math

def sample_size(effect, base, alpha=0.05, power=0.8):
    z_a = 1.96
    z_b = 0.84
    p = (base + effect) / 2
    return int((2 * p * (1 - p) * (z_a + z_b) ** 2) / effect ** 2)

print("检测 1% 提升需样本:", sample_size(0.01, 0.10))
print("检测 5% 提升需样本:", sample_size(0.05, 0.10))

样本不够就跑实验,是统计上最常见的翻车方式。

统计显著性:别急着下结论

实验最大的陷阱是「过早下结论」。上线三天看到转化率涨了 0.5 个点,就急着全量——样本太少,波动远大于效果,这个数字很可能只是噪声。标准做法是:预估样本量,跑够周期,看置信区间与 p 值,同时观察多个指标的一致性。还要警惕「多重比较」:指标看得越多,越容易碰到一个假阳性。

下面这段小脚本,演示了用置信区间判断结果是否可靠的基本思路。

# 置信区间(简化示意)
import math

def ci(p, n):
    se = math.sqrt(p * (1 - p) / n)
    return (p - 1.96 * se, p + 1.96 * se)

print("对照组 95% CI:", ci(0.100, 10000))
print("实验组 95% CI:", ci(0.105, 10000))

两个区间没有重叠,才敢说「有显著差异」。