第4章:实验设计与随机化

说到A/B测试,很多人第一反应就是“切分流量,跑个实验”。但真正上手你就知道,分流量这件事没那么简单。我曾经在团队里见过一个惨痛的案例:测新推荐算法,结果实验组和对照组的数据在几个维度上天然不平衡,最后折腾两周才发现是随机化没做好。嗯,这一章我们就来把实验设计和随机化的门道聊透。

4.1 实验设计的三要素

不管你做的是界面改版、模型迭代还是运营策略,A/B测试的核心骨架都一样。说白了,就三样东西:

  • 实验假设:你想验证什么?比如“新版注册流程能提高转化率5%”
  • 实验变量:你改了什么?比如按钮颜色、推荐算法版本
  • 指标:你怎么衡量效果?比如点击率、留存率、GMV

我个人的习惯是,在写第一行代码之前,先把这三样东西写进一个文档里。别觉得多余——很多实验做着做着就忘了当初要测什么,回过头来发现指标都没对齐。

一个小技巧:实验假设写清楚“从X变成Y,预期提升Z%”。这样后面计算样本量、判断显著性时才有据可依。

4.2 随机化:不是随便分一分就行

随机化的目标只有一个——让实验组和对照组在除实验变量之外的所有维度上都可比。如果随机化没做好,实验结果就是假的。

4.2.1 简单随机化

最简单的方法,给每个用户一个随机数,模2分两组。但这么做有个坑:样本量小的时候,两组可能天然不平衡。

# 伪代码示例:简单随机分组
user_id = 10086
group = "treatment" if hash(user_id) % 2 == 0 else "control"

为什么会有问题?你想想看,如果活跃用户集中在奇数ID上,简单随机就可能把活跃度因素带进实验里。我在一个日活几百万的项目里遇到过,分组后对照组的新用户占比明显偏高,就是因为没有考虑分层。

4.2.2 分层随机化

分层随机化的思路很简单:先把用户按重要特征分层(比如新老用户、付费等级、地区),然后在每一层内独立做随机化。这样能保证层内两组分布一致。

分层维度 层内用户数 实验组 对照组
新用户 10,000 5,000 5,000
老用户-低付费 20,000 10,000 10,000
老用户-高付费 5,000 2,500 2,500

当然,分层也不是越多越好。我记得有一次分层维度加到十几个,结果有的层里只有几十个人,随机化成了笑话。你想想看,一个层里总共30个人,随机分配后两组各15人,稍微波动一下差异就很大。

注意:分层维度的选择要有业务含义。如果不知道哪些因素重要,可以用历史数据做一次特征重要性分析,或参考行业经验。别拍脑袋乱分层。

4.2.3 区组随机化

区组随机化是另一种常用的技术,特别适合时间序列上的实验。比如你按天或按小时做实验,每个时间窗口内保证两组样本数尽量均衡。

具体做法:把用户按到达时间顺序,每n个人组成一个区组,在区组内做随机分配。比如每10人一个区组,区组内随机分配5人去实验组,5人去对照组。

# 区组随机化示例(块大小=10)
def assign_group(user, block_size=10):
    block_id = user.seq_id // block_size
    # 区组内打乱顺序
    perm = np.random.permutation(block_size)
    is_treatment = perm[user.seq_id % block_size] < block_size // 2
    return "treatment" if is_treatment else "control"

这么做的好处是时刻保证两组样本量相近,不会出现“前面2小时全是实验组,后面2小时全是对照组”的尴尬局面。

4.3 样本量计算:别太小,也别太大

样本量太小,实验没统计学功效——明明有效果,检测不出来。样本量太大,小到没业务意义的效果也被判定显著,浪费资源。

常用的公式是(假设显著性水平α=0.05,统计功效1-β=0.8):

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

# 其中:
# σ²:指标方差(可从前序数据中估算)
# δ:最小可检测效应 (如转化率提升0.5%)
# Z_α/2 = 1.96,Z_β = 0.84

举个例子:老用户转化率是10%,你想检测到提升1个百分点的效果(δ=0.01)。假设转化率的方差≈0.09(伯努利分布方差 p*(1-p)=0.09)。

n = 2 * (1.96 + 0.84)² * 0.09 / (0.01)²
  ≈ 2 * 7.84 * 0.09 / 0.0001
  ≈ 14,112

也就是说,每组至少需要14,112个用户。如果日活跃用户只有1万,那这个实验可能需要跑3-4天才能累积够样本。

实操经验:我一般会多算20%的样本量,应对用户流失、系统异常等不可控因素。另外,如果实验周期太长(比如超过两周),要考虑季节性因素——用户行为在周中和周末可能差异很大。

4.4 随机化的常见坑

  • 网络效应干扰:有些功能有社交属性,比如你在好友圈里改了推荐算法,好友之间会互相影响。这时候简单按用户ID随机化会“污染”对照组。解决方案:按社交集群随机化(如按班级、按小区)。
  • 用户重复进入实验:同一个用户如果多次进入同一实验,既会被记录多次,又会稀释效果。我之前做过一个活动页的A/B测试,忘了给每个用户打实验标签,结果用户每天进来都被当成新样本……数据完全乱了。
  • 随机化后的数据漂移:有些特征在你随机化时是均衡的,但实验跑着跑着两边就偏了。比如实验组提升了用户体验,导致用户留存变好,那么后期两组用户画像就可能分化。这是正常的,但分析时要注意方法(如增量分析)。

4.5 本章核心流程全景图

实验设计与随机化核心流程 定义假设与指标 随机化方法选择 · 简单随机化 · 分层随机化 · 区组随机化 样本量计算 · 显著性 α = 0.05 · 统计功效 1-β = 0.8 · 最小可检测效应 δ 随机化执行与监控 效果分析与决策 需要持续监控 随机化均匀性

这张图概括了本章的核心逻辑:从定义假设出发,选择随机化方法并计算样本量,然后执行并监控,最后做效果分析。每一步之间都有反馈——比如发现随机化不均,你可能需要回到方法选择重新设计。

小结

实验设计不是纸上谈兵。我建议你在实际项目中至少花20%的时间在实验设计阶段,把随机化方案、样本量估算、监控指标都写清楚。别急着上线跑实验,前期磨刀不误砍柴工。