スモークテストを判定し MVP の範囲を切る
目標
スモークテストの結果をウィルソン区間で判定し(チャネル別・全体・見知らぬ人のチャネルだけ)、保留のチャネルの必要な標本を計算したうえで、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。
- ウィルソン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が予算以下になるなら入れ、超えるなら飛ばして、次のものを見る。
- 比率・区間は小数第4位まで、RICEは第2位まで。
ステップ
/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(4つのチャネルの合計)とcold(newsletter_friendsを除いた3つのチャネルの合計)それぞれの、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を除いた3つのチャネルの、事前注文と訪問者を足したものです。比率を平均せず、数を足してください。
保留なら、あと何人必要か
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を書く。
決定は、知人のチャネルを除いた判定で行います。次の試験チャネルは、必要な追加の訪問者が最も少ない、保留のチャネルです。