为什么需要 A/B 测试

产品经理和运营每天都在做判断:「这个按钮换个颜色会不会更好」「文案改成这样转化率会不会更高」。如果全靠直觉上线,你永远不知道是改动起了作用,还是大盘本身在波动。A/B 测试用小流量、随机分组的方式,把「感觉」变成「可验证的因果」。

它的核心只有一句话:只改变一个变量,随机把用户分成对照组与实验组,再比较两组在同一指标上的差异是否显著。随机分组保证了组间可比,单一变量保证了差异可归因。

没有随机分组的「前后对比」,只是时间先后,不是因果证据。上线前后各取一段数据对比,得到的常常是错觉。
本文核心知识点
  • 假设三要素对象、改动、预期指标与幅度。
  • 样本量由基线转化率、最小可检测效应与显著性水平共同决定。
  • 显著性P 值判断差异是否可能只是噪声,置信区间给出差异范围。
  • 停止规则事先约定,避免提前叫停带来的假阳性。
A/B 测试示意:左右并列的两块玻璃面板、顶部分流线与中间的平衡秤杆,蓝色扁平科技插画
分流的本质是公平比较:两组用户尽可能像,唯一的差别就是你想要验证的那个改动。

提出一个好假设:假设三要素

实验的起点是假设。多数团队的假设太模糊,导致实验做完也不知道该学到什么。一个好假设应该包含三要素:对象(对谁)、改动(改什么)、预期指标与幅度(期望提升多少)。

  • 对象:新注册用户,还是老用户复购?人群不同,结论不一定通用。
  • 改动:例如把结算页的支付方式前置到首屏。
  • 预期:结算完成率相对提升 5% 以上,并写清观察周期。

把模糊的想法写成「如果……那么……」的句式:「如果对首次下单用户默认勾选常用支付方式,那么结算完成率将提升 5%」。写不出来的,说明还没想清楚要验证什么,这时候跑实验只是浪费流量。

实验设计:样本量、分流与指标

样本量是实验设计里最容易被忽略、又最关键的一步。样本太小,真实存在的差异可能根本测不出来;样本太大,则是对流量与时间成本的浪费。

它由三个量共同决定:基线转化率、你希望检测到的最小提升幅度(MDE),以及显著性水平与统计功效。

# 双样本比例检验所需的每组样本量(近似公式)
import math

def sample_size(p0, mde_rel, alpha=0.05, power=0.80):
    # p0: 基线转化率; mde_rel: 相对提升幅度
    p1 = p0 * (1 + mde_rel)
    z_alpha = 1.96 if abs(alpha - 0.05) < 1e-9 else 1.64
    z_beta  = 0.84 if abs(power - 0.80) < 1e-9 else 1.28
    p_bar = (p0 + p1) / 2
    n = (z_alpha + z_beta) ** 2 * 2 * p_bar * (1 - p_bar) / (p1 - p0) ** 2
    return math.ceil(n)

print(sample_size(0.10, 0.10))   # 基线 10%,希望相对提升 10%
print(sample_size(0.10, 0.05))   # 想检测更小的提升,样本量会明显变大

分流要保证随机与独立:同一个用户在整个实验期间必须始终落在同一组,否则跨组污染会让结果失效。指标则要提前锁定:主指标只设一个,其余作为辅助指标与护栏指标。不要在实验结束后挑一个涨了的指标当成结论——那是数据窥探,几乎总能「找到」显著。

显著性、P 值与置信区间

显著性回答的是「两组差异有多大概率只是随机噪声」。约定俗成取显著性水平 α = 0.05,即当两组其实没有差别时,观测到当前差异的概率小于 5%,才认为差异显著。

与 P 值配套的是置信区间:它不仅告诉你「有没有差异」,还告诉你「差异大概落在什么范围」。一个显著但区间很宽的提升,实际决策时要比数字看起来更谨慎。

-- 读取实验各组的分母、分子,再交给统计脚本计算显著性
SELECT
  g.variant,
  COUNT(DISTINCT g.user_id)                       AS users,
  COUNT(DISTINCT e.user_id)                       AS conversions,
  ROUND(COUNT(DISTINCT e.user_id) * 1.0
        / COUNT(DISTINCT g.user_id), 4)           AS conv_rate
FROM experiment_assign AS g
LEFT JOIN events AS e
  ON e.user_id = g.user_id AND e.event_name = 'order_paid'
WHERE g.experiment_id = 'exp_settle_pay_2026h1'
GROUP BY g.variant;

一个容易踩的坑是「边跑边看」:实验期间反复查看数据,看到显著就停。这会让假阳性率远高于 5%。正确做法是事先算好所需样本量或实验周期,到点再看结论。

用户运营:把实验变成策略

A/B 测试的产出不只是一次结论,更是一套可复用的运营策略。把验证有效的改动沉淀成规则,再按人群精细化,让每个有效的改动持续产生收益。

  • 把通过实验的改动写进产品与运营规范,避免下次再从零验证。
  • 对效果随时间衰减的改动定期重测:用户会习惯,边际收益会下降。
  • 用实验积累用户偏好,反过来指导文案、权益与触达节奏的设计。

运营场景里,可测的东西非常多:推送文案、权益力度、触达时机、落地页结构。只要指标可定义、流量可分,就值得用一次小实验替代一次拍脑袋。