判定冒烟测试并裁剪 MVP 范围
目标
用 Wilson 区间判定烟雾测试的结果(各渠道、整体、仅陌生渠道),计算待定渠道所需的样本,然后用 RICE 把 MVP 范围裁剪到预算之内,并确定“要不要做、要不要再检验、做什么”。
为什么重要
假设要写成可能出错的数字,才能检验;而检验结果,要连是谁参与的也考虑进去,才能读懂。熟人渠道的高转化率,和容易做的功能的高得分,都是最常见的两种错觉。
材料
/opt/fixtures/founder/mvp/smoke.csv—channel,visitors,signups,preorders(newsletter_friends 是熟人、订阅者,其余是陌生访客)/opt/fixtures/founder/mvp/hypothesis.json—statement, metric, threshold, budget_person_months/opt/fixtures/founder/mvp/features.csv—feature,reach,impact,confidence_pct,effort_pm
定义
- 预购率 = preorders ÷ visitors,注册率 = signups ÷ visitors。
- Wilson 95% 区间:与前一模块(fv-problem)的公式相同,z =
NormalDist().inv_cdf(0.975)。 - 判定:下限 ≥ threshold →
"pass",上限 < threshold →"fail",其余为"insufficient"。 n_needed(p, threshold):按 n = 1, 2, … 200000 的顺序,k = round(p·n)所得区间脱离 threshold(下限 ≥ 或上限 <)的第一个 n,没有则为 None。- RICE = reach × impact × (confidence_pct ÷ 100) ÷ effort_pm。
- 范围:按 RICE 降序(相同则按 feature 名称顺序)逐个查看,如果累计 effort_pm 不超过预算就放入,超出就跳过,继续看下一个。
- 比率和区间保留到小数点后第四位,RICE 保留到第二位。
步骤
- 在
/root/founder/mvp/rates.json中,为每个渠道写入signup_rate、preorder_rate。 - 在
/root/founder/mvp/mvp.py中创建wilson(k, n)→[low, high]和verdict(k, n, threshold)。 - 在
/root/founder/mvp/verdict.json中,为每个渠道写入low、high、verdict。 - 在
/root/founder/mvp/pooled.json中,为all(四个渠道之和)和cold(去掉 newsletter_friends 的三个渠道之和)分别写入preorders, visitors, low, high, verdict。 - 在
mvp.py中加入n_needed(p, threshold),并在/root/founder/mvp/sample.json中,为每个判定为 insufficient 的渠道写入n_needed(以该渠道的预购率为准)和extra_visitors(n_needed − visitors)。 - 在
/root/founder/mvp/rice.json中,为每个功能写入 RICE 得分。 - 在
/root/founder/mvp/scope.json中写入included(按放入顺序)、effort(合计人月)、excluded(按跳过顺序)。 - 在
/root/founder/mvp/plan.json中写入go_build(cold 判定是否为 pass)、cold_verdict、next_test_channel(insufficient 的渠道中 extra_visitors 最少的渠道)、scope_if_go(第 7 步的 included)。
参考
- 常见错误:用混入了熟人受众的判定来作决定,把比率(点估计)与基准直接比较,把 confidence 直接乘以 80,在超出预算的功能处停下来(应当跳过它,继续看下一个)。
各渠道的注册率和预购率
在 /root/founder/mvp/rates.json 中,为每个渠道写入 signup_rate、preorder_rate。
分母都是访客数。注册率高,预购率也可能很低——假设的指标是预购率。
用区间来判定的函数
在 /root/founder/mvp/mvp.py 中创建 wilson(k, n) 和 verdict(k, n, threshold)。
wilson 就是上一模块的公式。verdict 在下限 ≥ 基准时为 pass,上限 < 基准时为 fail,其余为 insufficient。
各渠道的判定
在 /root/founder/mvp/verdict.json 中,为每个渠道写入 low、high、verdict。
基准是 hypothesis.json 的 threshold。不要把点估计与基准直接比较。
去掉熟人渠道后重新判定
在 /root/founder/mvp/pooled.json 中,为 all 和 cold 分别写入 preorders、visitors、low、high、verdict。
cold 是把去掉 newsletter_friends 的三个渠道的预购和访客相加得到的。不要把比率取平均,要把数量相加。
如果待定,还需要多少人
在 mvp.py 中加入 n_needed(p, threshold),并在 /root/founder/mvp/sample.json 中,为每个 insufficient 的渠道写入 n_needed、extra_visitors。
让 n 从 1 开始增加,每次用 k = round(p·n) 重新计算区间,在第一个脱离基准的 n 处停下来。上限是 200000。
RICE 得分
在 /root/founder/mvp/rice.json 中,为每个功能写入 RICE 得分。
confidence_pct 是百分数,要除以 100 再相乘。effort 是人月。
预算之内的范围
在 /root/founder/mvp/scope.json 中写入 included、effort、excluded。
按得分降序查看,但超出的功能要跳过,继续看下一个功能。得分相同的按名称顺序。
要不要做、要不要再检验、做什么
在 /root/founder/mvp/plan.json 中写入 go_build、cold_verdict、next_test_channel、scope_if_go。
决定以去掉熟人渠道后的判定为准。下一个检验渠道,是所需追加访客最少的待定渠道。