新しい戦略や機能を実装した後、「もう少し続ければ結果が出るはず」と思い続けた経験はないだろうか。人間はサンクコスト(埋没費用)に引きずられる。時間をかけた施策ほど、やめる判断が遅れる。
この問題を解決するために、Go/No-Go判定を統計的基準で自動化した。判定基準を満たさなければ、AIが「NO-GO」と判定し、対象を凍結する。人間の感情を排除した意思決定の仕組みだ。
問題:人間は「やめる判断」が苦手
サンクコストの罠
1施策を100時間かけて実装した2 → 結果が出ない3 → 「もう少し調整すれば...」4 → さらに50時間投入5 → やっぱり結果が出ない6 → 「ここまでやったのにやめるのはもったいない」7 → さらに30時間投入...これはサンクコストの誤謬(Sunk Cost Fallacy)だ。過去に投入したコストは、将来の意思決定に影響を与えるべきではない。しかし人間の直感はそう動かない。
客観的基準が必要
「やめるかどうか」を毎回人間が判断すると、以下の問題が起きる。
- 感情バイアス: 自分が書いたコードを否定したくない
- 確証バイアス: うまくいったケースだけを記憶する
- 判断の一貫性欠如: 疲れているとき、調子がいいときで判断基準がブレる
必要なのは、統計的に定義された判断基準と、それを機械的に適用する仕組みだ。
Go/No-Go判定フレームワーク
判定基準の4要素
1判定条件(すべてを満たす場合のみGO):2 1. サンプルサイズ: 30回の実行以上3 2. 成功率の信頼区間: Wilson信頼区間の下限 > 40%4 3. 実行頻度: ポアソン分布で期待頻度を検証5 4. システム破綻確率: Monte Carloシミュレーション で ≤ 0.01%各要素の設計意図を説明する。
1. サンプルサイズ: 30回の実行以上
統計的推論の最低ラインだ。30未満ではどの検定も信頼性が低い。ただし、サンプルサイズが30に達するまでの「待ち」の期間も重要で、ポアソン分布で期待頻度を検証することで「いつまで待つか」を定量化する。
2. Wilson信頼区間
通常の正規近似による信頼区間(Wald区間)はサンプルサイズが小さいとき精度が落ちる。Wilson信頼区間は、特に成功率が0%や100%に近い場合や、サンプルが50以下の場合に正規近似より正確な推定を返す。
1import numpy as np2from scipy import stats3
4def wilson_confidence_interval(successes: int, total: int, confidence: float = 0.95) -> tuple[float, float]:5 """Wilson信頼区間を計算"""6 if total == 0:7 return (0.0, 0.0)8 z = stats.norm.ppf(1 - (1 - confidence) / 2)9 p_hat = successes / total10 denominator = 1 + z**2 / total11 center = (p_hat + z**2 / (2 * total)) / denominator12 margin = z * np.sqrt(p_hat * (1 - p_hat) / total + z**2 / (4 * total**2)) / denominator13 return (center - margin, center + margin)14
15def go_no_go_judgment(successes: int, total: int, threshold: float = 0.40) -> str:8 collapsed lines
16 """Go/No-Go判定"""17 if total < 30:18 return "PENDING" # サンプル不足19 lower, upper = wilson_confidence_interval(successes, total)20 if lower > threshold:21 return "GO"22 else:23 return "NO-GO"閾値を40%に設定しているのは、「95%信頼区間の下限が40%を超える」ということが、実質的に「真の成功率が40%以下である可能性が極めて低い」ことを意味するからだ。
3. ポアソン分布による実行頻度検証
サンプルサイズが30に達するまでの期間が想定より長い場合、そもそも処理パターンが実行シグナルを十分に生成していない可能性がある。
1from scipy.stats import poisson2
3def validate_execution_frequency(4 observed_executions: int,5 days_elapsed: int,6 expected_executions_per_day: float7) -> dict[str, str | float]:8 """実行頻度がポアソン分布の期待値と整合するか検証"""9 expected_total = expected_executions_per_day * days_elapsed10 p_value = poisson.cdf(observed_executions, expected_total)11 return {12 "expected": expected_total,13 "observed": observed_executions,14 "p_value": p_value,15 "judgment": "WARNING" if p_value < 0.05 else "OK",1 collapsed line
16 }4. システム破綻確率: Monte Carloシミュレーション
成功率とコスト対効果比から、リソースがゼロになる確率をシミュレーションで算出する。閾値は0.01%(1万回に1回)。
1def estimate_ruin_probability(2 success_rate: float,3 reward_ratio: float,4 risk_per_execution: float = 0.02,5 initial_resource: float = 1.0,6 num_simulations: int = 10000,7 max_executions: int = 1000,8) -> float:9 """Monte Carloでシステム破綻確率を推定"""10 ruin_count = 011 rng = np.random.default_rng(42)12 for _ in range(num_simulations):13 resource = initial_resource14 for _ in range(max_executions):15 if rng.random() < success_rate:7 collapsed lines
16 resource += resource * risk_per_execution * reward_ratio17 else:18 resource -= resource * risk_per_execution19 if resource <= 0:20 ruin_count += 121 break22 return ruin_count / num_simulations実例:パターン検出アルゴリズムAの凍結判定
背景
パターン検出アルゴリズムA(時系列パターン検出)を使ったトレンド追従処理を実装した。過去データ検証では高いコスト対効果比を示していたため期待していた。
Practice期間の結果
1期間: 2026-01-15 〜 2026-02-28(45日間)2実行数: 42(30以上: ✅)3成功率: 35%(15成功 / 42実行)4コスト対効果比: 2.8コスト対効果比2.8は優秀に見える。成功率35%でもコスト対効果比が高ければ期待値はプラスだ——と人間は考える。しかし統計的基準はそう判断しなかった。
Go/No-Go判定の実行
1# Wilson信頼区間の計算2lower, upper = wilson_confidence_interval(successes=15, total=42)3# lower = 0.222, upper = 0.5024
5# Go/No-Go判定6result = go_no_go_judgment(successes=15, total=42, threshold=0.40)7# result = "NO-GO"8# 理由: Wilson下限 0.222 < 閾値 0.40Wilson信頼区間の下限は0.222(約22%)。95%の信頼度で「真の成功率は22%〜50%のどこか」という結果だ。下限が40%を大きく下回っているため、NO-GO判定となった。
なぜコスト対効果比が高くてもNO-GOなのか
1期待値の計算:2 成功率35% × コスト対効果比 2.8 = 0.35 × 2.8 - 0.65 × 1.0 = 0.33(プラス)3
4しかし:5 Wilson下限22%で計算すると:6 0.22 × 2.8 - 0.78 × 1.0 = -0.164(マイナス)最悪ケース(信頼区間の下限)で計算すると期待値がマイナスになる。「真の成功率が22%である可能性」を無視して本番移行すべきではない。
判定後のアクション
NO-GO判定 = 「凍結」であり「破棄」ではない。
1凍結時のアクション:2 1. 処理パターンを enabled: false に設定3 2. 凍結理由と判定データをWBSに記録4 3. 再評価日を90日後に設定5 4. 運用環境の変化(レジーム転換)があれば前倒しで再評価WBSとの統合
Go/No-Go判定日をWBSに組み込むことで、「判定を忘れる」ことを防ぐ。
1NEW-11(リトライ制御処理):2 Go/No-Go判定: 2026-04-013 判定基準: 30実行以上, Wilson下限 > 40%施策のライフサイクル
1計画 → 実装 → Dry-Run → Practice → Go/No-Go → 本番 or 凍結2 ↑3 統計的判定4 (人間の感情を排除)各フェーズの移行条件が明確に定義されているため、「なんとなく本番に移行する」ことがなくなる。Dry-RunからPracticeへの移行にはテスト全PASSが条件、PracticeからGo/No-Goへの移行には30回以上の実行サンプルが条件だ。
判定結果の蓄積と活用
過去の判定ログ
12026-01 パターン検出アルゴリズムA → NO-GO(成功率35%, Wilson下限22%)22026-01 RSI平均回帰処理 → GO(成功率52%, Wilson下限41%)32026-02 統計的反発検出B → GO(成功率48%, Wilson下限42%)42026-02 グリッド分散処理 → PENDING(実行数18, サンプル不足)52026-03 乖離検出C → NO-GO(成功率38%, Wilson下限29%)判定ログを蓄積することで、「どの種類のストラテジー/処理パターンがGO判定を得やすいか」という傾向分析が可能になる。これは将来の施策立案に活用できるメタ分析だ。
学んだこと
1. 統計的基準で感情を排除する
人間は「もう少し続ければ結果が出る」と思いがちだ。Wilson信頼区間という統計的基準を設けたことで、「やめる判断」が感情ではなくデータで行われるようになった。判断基準が事前に定義されているため、結果が出た後に基準を変更する誘惑も排除できる。
2. Wilson信頼区間はサンプルサイズが小さいときに正確
通常の正規近似(Wald区間)は、サンプルサイズが50以下のとき信頼区間が不正確になる。Wilson信頼区間はこの問題を補正するため、30〜50回の実行という現実的なサンプルサイズで信頼性の高い判定が可能だ。
3. NO-GO判定は「凍結」であり「破棄」ではない
運用環境は変化する。ある時期にNO-GOだった処理パターンが、入力データの傾向が変われば有効になることもある。凍結した施策に再評価日を設定し、条件が変わればPracticeフェーズから再開する設計にしている。
まとめ
Go/No-Go判定の自動化で重要なのは以下の3点だ。
- 統計的基準の事前定義: サンプルサイズ30以上、Wilson信頼区間の下限 > 40%、システム破綻確率 0.01%以下を判定開始前に定義し、結果を見てから基準を変えない
- WBSへの判定日組み込み: Go/No-Go判定日をプロジェクト管理に組み込み、判定忘れを防止する
- 凍結と再評価のサイクル: NO-GOは破棄ではなく凍結。90日後の再評価日を設定し、運用環境の変化に応じて再開の判断を行う
「やめる」判断を人間に委ねるとバイアスが入る。統計的基準をコードに実装し、機械的に判定させることが、長期的な成果につながる。