この記事は、出た推定値を会議に出す前に、何をどの順で確かめるかを決める回です。因果の主張はデータからは検証できない仮定の上に立つので、「有意でした」だけでは因果効果と言い切れません。26 日分の道具を手法選定フローと 15 項目のチェックリストの 1 枚に畳み、悪い調整の事故を合成データで再現します。
登場人物
遠藤顧問: データ分析の社外顧問。答えを言わずに問いで返す/さくら: データアナリスト 1 年目。数字を出すのは速いが、相関を因果と読み違える
1. 1 文で言うと
1 文で言うと
分析を出す前の総点検は、手法選定フローで道具を決め、設計・調整・推定・解釈の 15 項目で「確かめられるものを確かめ、確かめられないものを明示する」ことです。チェックリストは儀式ではなく「どの仮定を買ったかの申告」です。
- 今日の数字: 無作為割付で 1.00 だった効果が、善意の調整 1 つで 0.00 に消えました。
2. 今日の問い
今日の問い
「推定値は3.2で、統計的に有意でした」。数字は出た。
この数字を会議に出す前に、何をどの順で確かめれば、胸を張って「因果効果」と言えるのか?
読み終えたら、15 項目のチェックリストが合格判定ではなく、買った仮定の申告になる理由を説明できます。
答えを先に言うと、「すべて確かめれば因果と言い切れる」ようなリストは存在しません。Day 6 の非交絡性も、Day 17 の除外制約も、Day 18 の平行トレンドも、データからは検証できないからです。だからこのチェックリストの目的は合格判定ではありません。自分がどの検証できない仮定を買ったのかを、自覚して申告できる状態を作ることです。飛行機の離陸前チェックが「翼は落ちない」を証明しないのと同じで、確かめられるものを確かめ、確かめられないものを明示する。それが因果推論の報告の作法です。
3.1 で道具の選び方、3.2 で 15 項目、4 で悪い調整の再現、5 で当てる順番を確かめます。前の回から使うのは次の 2 つです。
- Day 6(非交絡性): 割付を決める変数をそろえれば比べてよい、という検証できない仮定
- Day 11(d分離とバックドア): 調整してよい変数と悪い調整を、DAG から決める基準
3. 概念
先に、手元の道具との違いを置きます。A/B テストなら、無作為に分けた 2 群を比べれば因果効果になり、確かめる点は割付が無作為だったかに絞れます。回帰や予測モデルなら、手元の変数を入れて精度や有意性を見れば足ります。今日の場面は、出た推定値を因果効果として会議に出してよいかで、問われるのは、どの仮定を買ったかです。精度や有意性の数字は、その仮定が検証できないことまでは教えてくれません。そこで今日は、確かめる順番を決める道具を置きます。
3.1 手法選定フロー、まずどの道具かを決める
チェックリストの前に、そもそもどの道具を選ぶかです。分岐は3つしかありません。「処置を自分で割り付けられるか」「交絡をすべて観測できていると信じられるか」「信じられないなら、外生の割付の断片が転がっていないか」。この順で聞きます。
このフローで大事なのは、矢印を進むたびに買う仮定が変わることです。左上の RCT は設計が仮定を保証してくれる世界、右下へ行くほど「検証できない何か」を信じる量が増えます。どの箱に着地したかは、どの仮定を買ったかの申告そのものです。
なお「誰に効くか」を問う異質効果の系譜(CATE・メタラーナー・Causal Forest・アップリフト、Day 22〜26)は、このフローで着地した識別戦略の上に乗る話です。識別が壊れていれば、どんな高級な学習器も壊れた効果を精密に推定するだけです。
3.2 チェックリスト、4 カテゴリ × 15 項目
この小節が今日の主役です。15 項目を工程の順に読み、各項目が「どの仮定を買ったかの申告」の問いになっていることを押さえます。
分析の工程順に、設計 → 調整 → 推定 → 解釈の4カテゴリに分けます。各項目の「破ると何が起きるか」は、ほぼすべて本連載で実際に数値で見せたものです。各項目の末尾に添えた該当 Day が総索引を兼ねます。先に全体を 1 枚で見ておきます。
設計(データを見る前に決める4項目)
-
1. 推定対象(estimand)を1つ言えるか。ATE・ATT・CATE・LATE のどれの話か(該当 Day 2, 8, 21, 22)
- 破ると: 手法ごとに違う量を答えているのに1つの「効果」として混ぜて報告する。LATE 2.07 と ATE 3.19 は同じデータの別の量
-
2. RCT にできないか、部分的にでも実験を仕込めないか検討したか(該当 Day 4, 5)
- 破ると: 実験できたはずの場面で、買わなくてよい仮定(非交絡性)を買う。RCT なら引き算がそのまま因果
-
3. 処置の定義は1つか。SUTVA(干渉なし・処置のバージョン違いなし)は成り立つか(該当 Day 2, 8, 28)
- 破ると: 「個体の処置効果」の定義自体が崩れる。隣へ効果が漏れる空間データが典型
-
4. 割付メカニズムを言葉で説明できるか。誰が、なぜ処置を受けたのか(該当 Day 6)
- 破ると: 交絡の当たりがつかず、調整のしようがない。自己選択を放置した素朴な引き算は 4.92(真値3.0)
調整(何で条件付けるかを決める4項目)
-
5. 因果の仮定を DAG に描いて宣言したか。矢印の「無い」ところも仮定だと自覚しているか(該当 Day 10)
- 破ると: 調整セット選びが勘と声の大きさで決まる。仮定が図になっていないと、そもそも議論も反証もできない
-
6. 調整セットはバックドア基準を満たすか。中間変数・合流点・M字を入れていないか(該当 Day 11, 16)
- 破ると: 中間変数で効果が 0.00 に消え、合流点で -0.75 に符号反転し、M字では真の効果ゼロが -0.40 の「効果」に化ける
-
7. オーバーラップはあるか。傾向スコアが 0 や 1 に貼りついた領域はないか(該当 Day 6, 7, 8)
- 破ると: 比較相手のいない領域を外挿で語る。IPW では最大重み 16.7(1人で16.7人分)のような裾が推定を支配する
-
8. 処置後の変数で条件付け・サンプル絞り込みをしていないか(該当 Day 10, 11, 16)
- 破ると: 選択バイアス。回帰に入れるだけでなく、「稼働中の設備だけ」「回答者だけ」と絞る操作も同じ事故を起こす
推定(数字の出し方を点検する4項目)
-
9. 調整が効いた証拠(バランス診断、SMD 目安 0.1)を出したか(該当 Day 7, 8)
- 破ると: 調整したつもりの数字に根拠がない。マッチングでは SMD 2.43 → 0.08 まで潰して初めて比較の土台に乗る
-
10. 推定量やスペックを変えても答えが大きく動かないか確かめたか(該当 Day 8, 15)
- 破ると: スペック1本の数字を握って報告する。同じマッチングでもスペック次第で +2,202 が +513 まで動いた
-
11. 使ったデザイン固有の診断を出したか(第1段階F・プレトレンド・事前適合・バンド幅感度・密度検査)(該当 Day 17, 18, 19, 20)
- 破ると: 弱い操作変数は F≈2 で真値1.0が中央値 1.56 に歪み、RDD はバンド幅次第で -0.03〜+0.10 まで動く。診断なしの点推定は読めない
-
12. 機械学習を推定に使うなら、その作法(残差化・交差適合・標本分割)を踏んだか(該当 Day 16, 24, 25)
- 破ると: 正則化と過学習の癖がそのまま効果推定のバイアスになる。FWL の「残差×残差」が作法の背骨
解釈(報告の書き方を点検する3項目)
-
13. 検証できない仮定(非交絡性・除外制約・平行トレンド)を報告に明記したか(該当 Day 6, 17, 18)
- 破ると: 読み手が、仮定を買ったことに気づかないまま結論だけ受け取る。真値ゼロでも X 調整後 +2.15、95%CI はゼロから遠く、見かけは「明確な効果」
-
14. その仮定がどれだけ破れたら結論が覆るか(感度分析)を数字にしたか(該当 Day 9)
- 破ると: 「仮定が正しければ」の但し書きが宙に浮く。E-value 2.35 のような耐性の数字が、仮定と結論の間を埋める
-
15. その効果が「誰の・どこの」効果かを守って書いたか。射程の外へ外挿していないか(該当 Day 20, 21, 22)
- 破ると: RDD の効果はカットオフの際だけ、LATE はコンプライヤーだけ、ATT は共通サポート内だけ。射程を超えた瞬間、根拠のない数字になる
15項目のうち、設計の1番と解釈の15番は対になっています。始める前に「どの量を推定するのか」を決め、書き終わる前に「その量の射程を守れたか」を確かめる。この往復が崩れた報告は、途中の推定がどれだけ精密でも読めません。
4. 手を動かす
4.1 悪い調整は 3 行で起きる
コードは今日はこれだけです。チェックリスト6番(悪い調整)が、どれほどあっけなく起きるかを見ます。処置はコイン投げ、つまり完全な RCT で、真の効果は 1.0 です。そこに「処置と結果の両方から矢印が刺さる変数 $c$」を1つ、善意で調整に加えます。
コード
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
rng = np.random.default_rng(27)
N = 100_000
w = rng.binomial(1, 0.5, N) # 処置はコイン投げ(RCT相当)
y = 1.0 * w + rng.normal(0, 1, N) # 真の効果 τ = 1.0
c = w + y + rng.normal(0, 1, N) # 合流点:処置と結果の両方から矢印が刺さる
d = pd.DataFrame({"w": w, "y": y, "c": c})
print("そのまま = %.2f (真値 1.00)" % smf.ols("y ~ w", d).fit().params["w"])
print("cを調整 = %.2f" % smf.ols("y ~ w + c", d).fit().params["w"])
出力
そのまま = 1.00 (真値 1.00)
cを調整 = 0.00
RCT のきれいな 1.00 が、変数を1つ足しただけで 0.00 に消えました。せっかくの無作為割付も、合流点(Day 10・11)への条件付け1つで台なしです(チェックリスト 6 番の −0.75 は Day 11 の別データでの値で、壊れ方の大きさはデータしだいです)。「とりあえず手元の変数を全部入れる」が因果推論で通用しない理由が、この数行に詰まっています。チェックリストの調整カテゴリは、この事故を出荷前に捕まえるためにあります。
成り立つ場合と成り立たない場合
| 調整の仮定(バックドア基準) | データに出るもの | 今日の数字の読み方 |
|---|---|---|
| 成り立つ(c を入れない) | そのままの推定が 1.00 で、真値 1.00 と一致する | 1.00 を効果と読める |
| 成り立たない(合流点 c を入れた) | 調整すると推定が 0.00 に消える | 0.00 は「効果が無い」ではなく、調整の事故と読む |
5. 判断の基準
15 項目は、分析の最後に同じ重さで一度に当てるものではありません。どこから当てるかを、工程の順に 3 つの問いに絞りました。上から順にたどり、最初に右へ出たところが、いまやることです。
- Q1 は設計の 4 項目で、データを見る前にしか書けません。 チェックは分析の後にやるものではありません。推定値を見てから estimand を選び直すのは、Day 22 で扱ったサブグループ漁りと同型の事故を、分析の入口で起こしていることになります。Imbens & Rubin が「設計は結果を見ずに済ませよ」と繰り返すのは、まさにこの順序の話です。
- Q2 は調整の 4 項目で、DAG を描いてから決めます。 調整セットを手元の変数から選ぶと、4.1 のように善意の 1 変数が RCT の効果まで消します。矢印の「無い」ところまで仮定として図にしておけば(5番)、バックドア基準(6番)も処置後の変数(8番)も図の上で点検できます。オーバーラップ(7番)だけは、傾向スコアの分布を描いてデータで確かめます。
- Q3 は推定と解釈の 7 項目で、報告に書くものです。 項目の重みは均等ではありません。デザインごとに命綱が違います。操作変数なら除外制約(13番)、DID なら平行トレンド(13番と11番のプレトレンド)、RDD なら操作の痕跡(11番の密度検査)、傾向スコア系ならオーバーラップ(7番)。15項目を薄くなぞるより、自分のデザインの命綱1本を深く点検するほうが、報告の質は上がります。
注記 「15項目すべてに合格=因果の証明」ではありません。チェックリストが確かめられるのは手続きと診断だけで、芯にある非交絡性(Day 6)や除外制約(Day 17)は原理的に検証できません。全項目に丸が付いた状態は「因果が証明された」ではなく、「どの仮定を買ったかを自覚し、耐性まで開示した」という状態です。それでも、そこまで書かれた報告と書かれていない報告の間には、実務上大きな差があります。
自分の仕事に当てるなら、次の問いから始められます。いま報告しようとしている推定値のうち、設計の 4 項目をデータを見る前に書き残してあるものはどれでしょうか。
6. 確認問題
問 1(自分の言葉で説明する) チェックリストの 15 項目に全部丸が付いたとき、言えることと言えないことを、本文を見ずに 2 文で説明してください。
答えと解説
模範解答: 因果の主張は、非交絡性・除外制約・平行トレンドのような、データからは検証できない仮定の上に立つので、15 項目が確かめられるのは手続きと診断までです。全部に丸が付いても因果の証明ではなく、どの仮定を買ったかを自覚し、耐性まで開示した状態だと言えます。
次の 2 点のどちらかが抜けたら不十分です。
- 検証できない仮定が、全部に丸が付いたあとも残ること
- 丸が付いた状態は証明ではなく、買った仮定の申告であること
詰まったら 2 の答えの段落と 3.2 に戻ってください。
問 2(別の場面へ移す) ある小売アプリで、割引券を無作為に半数の会員へ配りました。ところが券を実際に使った会員は、配られた会員の 40% だけでした。券を使った会員について、購入額が 1 人あたり +500 円増えたと推定し、報告に「この施策は、全会員に平均 +500 円の効果がある」と書きました。チェックリストの観点で、最も適切な直し方はどれでしょうか。
- ア 無作為割付なので、全会員に平均 +500 円と書いてよい
- イ 標本が小さいので、+500 円は偶然と書き直す
- ウ +500 円は券を使った会員の効果なので、「誰の効果か」を限って書き直す(15 番)
- エ 券を使った会員を分析から除いて、推定し直す(8 番)
答えと解説
ウ。+500 円は、割付どおりに券を使った会員だけの効果で、全会員の効果ではありません。15 番の「射程の外へ外挿していないか」に当たり、始める前に推定対象を決める 1 番とも対になっています。
- ア(割付を効果の射程と読む読み違い): 無作為に割り付けても、効果が届く範囲は券を使った会員までです。
- イ(根拠のない読み違い): 標本の大きさは問題文のどこにも出ていません。直すべきは大きさではなく、書き方です。
- エ(絞り込みと取り違える読み違い): 8 番は処置後の変数で絞り込む事故の項目で、問題の核は誰の効果かの書き方です。
問 3(出力を読む) 4.1 のコードは、処置をコイン投げで割り付けた合成データ(真の効果 1.0)です。出力は次のとおりでした。読み方として正しいものはどれでしょうか。
そのまま = 1.00 (真値 1.00)
cを調整 = 0.00
ア $c$ は交絡なので、調整後の 0.00 が本当の効果である イ 標本が小さいので、偶然 0.00 になった ウ RCT では調整しても推定値は変わらないはずなので、計算の誤りである エ $c$ は処置と結果の両方から矢印が刺さる合流点で、そこで条件付けたせいで効果が消えた
答えと解説
エ。$c$ は処置と結果の両方のあとに決まる変数です。そこで条件付けると、処置と結果の間に見かけの関係が入り込み、真の効果 1.0 が 0.00 に消えます(チェックリスト 6 番、Day 10・11)。
ア: 処置はコイン投げなので交絡はありません。そのままの 1.00 が真値と一致しています。イ: N は 100,000 で、偶然でここまでずれる大きさではありません。ウ: RCT でも、処置のあとに決まる変数で調整すれば推定値は壊れます。だから「とりあえず手元の変数を全部入れる」が通用しません。
7. おわりに
分析を出す前の総点検は、手法選定フローで道具を決め、設計・調整・推定・解釈の 15 項目で「確かめられるものを確かめ、確かめられないものを明示する」ことです。チェックリストは儀式ではなく「どの仮定を買ったかの申告」です。全部に丸が付いても証明ではなく、確かめたものと信じたものを分けて書いた、という印です。最後に確かめます。15 項目に全部丸が付いたとき言えることと言えないことを、本文を見ずに 2 文で言えますか。詰まったら 2 の答えの段落と 3.2 に戻ってください。
8. 参考(本棚)
- Imbens & Rubin『Causal Inference for Statistics, Social, and Biomedical Sciences』。設計を推定に先行させる思想で、設計カテゴリの下敷き
- Pearl『入門 統計的因果推論』。DAG・バックドア・悪い調整で、調整カテゴリの下敷き
- Matheus Facure『Causal Inference in Python』。デザイン固有の診断の実務で、推定カテゴリの下敷き
- 安井翔太『効果検証入門』。セレクションバイアスと報告の実務視点
- T・エドワード・デイマー『誤謬論入門』。良い議論の条件。チェックリストを「相手を落とす道具」でなく「自分の議論を強くする道具」として使う姿勢はここから
- 本文のコードは合成データです。乱数シードを含めコピペで再現できます
この記事の位置づけ
因果推論を「本を読んだ」で終わらせず、自分の言葉で説明でき、コードで再現できる状態まで落とす 30 日連載の Day 27 です。
図は縦が分析の工程、横が流派です。この記事は 5 つの系統に共通する土台「落とし穴チェックリスト」で、工程は「④ 検証して報告する(仮定の耐性と見せ方)」です(図の横長の黒い札)。前提になるのは Day 9(感度分析)・Day 11(d分離とバックドア)・Day 15(DoWhyの4ステップ)。ここで覚える考え方や道具は Day 30(総括と地図の描き直し) で再登場します。
9. 次回予告(Day 28)
Day 28(空間データ)
チェックリストの3番(SUTVA)と7番(オーバーラップ)が同時に壊れる場所が、私の主戦場である空間データです。隣り合う自治体は似た未観測要因を共有し(空間交絡)、施策の効果は境界を越えて漏れます(空間干渉)。そのとき「個体の処置効果」という定義自体がどう書き直しになるのか。次回Day 28は、仕上げの3日間の初日として、格子状の合成空間データで何がどう壊れ、どこまで救えるのかを真値を握った状態で確かめます。この連載の独自性の核になる回です。













