任务
从对照组的访问者与转化数、实验组的访问者与转化数出发,计算相对提升和双比例 z 分数,并在 |z| 达到 2 时判定显著。
契约
- 输入:JSON 对象:{ control: { visitors, conversions }, variant: { visitors, conversions } }
- 输出:JSON 对象:{ liftPercent, zScore, significant }
样例
- 输入
{"control":{"visitors":1000,"conversions":100},"variant":{"visitors":1000,"conversions":100}}-> 期望{"liftPercent":0,"zScore":0,"significant":false}。两组数据完全一致时,提升为零,z 分数也为零。 - 输入
{"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);用未合并的版本会把显著性门槛算低。