← 中文资源

简体中文版本

检验 A/B 结果的统计显著性

根据对照组与实验组的转化数据计算相对提升和双比例 z 分数,并按两倍标准差阈值标记显著性。

阅读英文原文

任务

从对照组的访问者与转化数、实验组的访问者与转化数出发,计算相对提升和双比例 z 分数,并在 |z| 达到 2 时判定显著。

契约

  • 输入:JSON 对象:{ control: { visitors, conversions }, variant: { visitors, conversions } }
  • 输出:JSON 对象:{ liftPercent, zScore, significant }

样例

  1. 输入 {"control":{"visitors":1000,"conversions":100},"variant":{"visitors":1000,"conversions":100}} -> 期望 {"liftPercent":0,"zScore":0,"significant":false}。两组数据完全一致时,提升为零,z 分数也为零。
  2. 输入 {"control":{"visitors":5000,"conversions":250},"variant":{"visitors":5000,"conversions":300}} -> 期望 {"liftPercent":20,"zScore":2.193,"significant":true}。百分之二十的相对提升越过了两倍标准差阈值。

参考实现

function solve({ control, variant }) {
      const p1 = control.conversions / control.visitors;
      const p2 = variant.conversions / variant.visitors;
      const pooled = (control.conversions + variant.conversions) / (control.visitors + variant.visitors);
      const se = Math.sqrt(pooled * (1 - pooled) * (1 / control.visitors + 1 / variant.visitors));
      const zScore = se === 0 ? 0 : +(((p2 - p1) / se)).toFixed(3);
      return {
        liftPercent: +(((p2 - p1) / p1) * 100).toFixed(2),
        zScore,
        significant: Math.abs(zScore) >= 1.96,
      };
    }

为什么有效

仅凭噪声范围内的微小提升就上线实验,会摧毁团队对实验结论的信任。把阈值写清楚并用计算出来的证据支撑,才能把结果与猜测区分开。

标准误要使用合并比例(pooled proportion);用未合并的版本会把显著性门槛算低。