この連載について
因果推論を「本を読んだ」で終わらせず、自分の言葉で説明でき、コードで再現できる状態まで落とす30日連載です。因果推論 30 Days(1人アドベントカレンダー)Day 3/全30回です。これまでの経緯では、Day 1 で「相関が因果に化ける3つの罠」、Day 2 で「潜在的結果とATE/ATT/CATE」を実施しています。
※Claudeと伴奏しながら自分の理解度を深めよう!ということでの1人アドベントカレンダー企画です。学習計画や下書きなどはClaudeに全面的に協力していただいていますが、あくまでも自分の理解を深めるための企画です。
Day 1–3:全体像(相関≠因果/潜在的結果/3つの流派)← いまここ
Day 4–9:Rubin流(潜在的結果・傾向スコア)
Day 10–15:Pearl流(DAG・バックドア基準・do演算子)
Day 16–21:計量経済の準実験(回帰・IV・DID・RDD)
Day 22–27:ML×因果(CATE・Double ML・Causal Forest)
Day 28–30:空間データ×因果/ベイズ×因果/総括
Day1, Day2は、Rubin流という1つの流派の言葉で話していました。しかし、DAG・do演算子・操作変数・DID…といった別の概念もあります。私が最初に読んだ書籍「因果推論の科学」は、Pearlさんが書かれたので、Pearl流の考え方を学べます。本記事ではいったん全体を俯瞰して、3つの流派を1枚の地図にします。
TL;DR(3行)
- 因果推論には主要な3つの流派があります。Rubin流(潜在的結果)/Pearl流(DAG・do演算子)/計量経済(準実験デザイン)。同じ「因果」に別の言葉で迫ります。
- 3流派は対立していません。突き詰めると「正しい変数 Z で条件付けて交絡を消す」という同じ操作を、別の論理で正当化しているだけのようです。1つの交絡データで 層別化(Rubin)=バックドア調整(Pearl)=回帰(計量経済)が同じ50に一致します。
- それぞれの流派の違いは得意分野。推定の道具=Rubin、「何で調整すべきか」の識別=Pearl、観察データの設計=計量経済。連載はこの順(Day 4–9/10–15/16–21)で回ります。
今日の問い
Day 2まで「潜在的結果」で話してきた。他の流派では、DAG、do演算子、操作変数、差分の差分… 別の言葉が次々出てきます。
これらは違う理論なのでしょうか? 結局どれを学べばいいのでしょうか?
結論から言うと、3つの主要な流派があり、対立ではなく役割分担です。今日はその地図を描き、最後に「3つの言葉が同じ答えに着く」ところまでコードで確かめます。
3つの流派を1枚で
まず全体像です。
「Xを変えたらYはどう変わる?」という1つの問いに、3つの学派が別の入り口から迫ります。
表にすると、それぞれの「性格」がはっきりします。
| 観点 | Rubin流(潜在的結果) | Pearl流(構造的因果モデル) | 計量経済(準実験) |
|---|---|---|---|
| 中心の問い | 反事実との差 $Y(1)-Y(0)$ は? | どの変数がどれを生む? どの経路が因果? | "擬似ランダム"はどこにある? |
| 原始概念 | 潜在的結果・割付メカニズム | DAG・構造方程式・do演算子 | 外生性・自然実験 |
| 「調整」の道具 | 傾向スコア・IPW・マッチング | バックドア基準で調整集合を決める | 回帰・IV・DID・RDD |
| 主な仮定 | 条件付き無視可能性 | バックドア基準を満たす $Z$ | 条件付き外生性/操作変数の妥当性 |
| 得意なこと | 効果の推定・欠測データとしての整理 | 「何で調整すべきか」の識別 | 観察データから因果を取り出す設計 |
| 代表的な人 | Rubin, Imbens, Rosenbaum | Pearl | Angrist, Imbens, Card |
| 連載での担当 | Day 4–9 | Day 10–15 | Day 16–21 |
面白いのは、人が流派をまたぐことです。Imbens は Rubin 流の中心人物でありながら、計量経済学者として Angrist と共にノーベル経済学賞(2021)を受賞しました。流派は「対立する宗派」ではなく「同じ山への登山ルート」に近いようです。
じつは3流派は「同じ調整」を別の言葉で言っている
いちばん腑に落ちるのは、同じDAGを3つの言葉で読むことです。Day 1・2の「訓練→収入」で、もともとの意欲・スキル $Z$ が交絡している状況を考えてみましょう。
「意欲の高い人ほど訓練を受けやすく($Z \to D$)、意欲が高いほど元々稼ぐ($Z \to Y$)」。この裏口(バックドア経路 $D \leftarrow Z \to Y$)を塞ぐには $Z$ で条件付ける。ここは3流派とも同じ結論に達します。ただし言い方が違うだけです。
| 流派 | 「$Z$ で調整せよ」をどう言うか |
|---|---|
| Rubin | 条件付き無視可能性:$Z$ で条件付ければ $(Y(0),Y(1)) \perp D$(割付が潜在的結果と独立になる) |
| Pearl | バックドア基準:$Z$ は裏口 $D \leftarrow Z \to Y$ を塞ぐ調整集合である |
| 計量経済 | 条件付き外生性:$Z$ を回帰に入れれば $D$ は誤差と無相関(selection on observables) |
同じ「$Z$で調整」を、Rubinは欠測データの言葉で、Pearlはグラフの言葉で、計量経済は回帰の言葉で正当化しています。計量経済の言う「外生性」とは、処置 $D$ が回帰の誤差項と無関係であること、つまり誰が処置を受けるかが結果 $Y$ の測れていない要因に引っ張られていない状態です。selection on observables は「選択の偏りは観測できている変数だけで説明がつく」という同じ主張の英語表現です。では本当に同じ答えになるのか、手を動かして確かめます。
手を動かす:1つのデータに3流派の調整を当てる
Day 1・2と地続きの「トレーニングを受ける → 収入上昇(万円)」を、今回は交絡ありの観察データとして作ります。真の効果は全員 +50 に固定しておきます(答え合わせのため)。
import numpy as np, pandas as pd
import statsmodels.formula.api as smf
rng = np.random.default_rng(3)
n = 4000
Z = rng.integers(0, 2, n) # 交絡: 1=もともと高スキル/意欲
D = (rng.random(n) < np.where(Z==1, 0.7, 0.3)).astype(int) # 訓練(処置): 高Zほど受けやすい
Y = 200 + 80*Z + 50*D + rng.normal(0, 20, n) # 収入: Zで底上げ + 訓練効果50
df = pd.DataFrame({"Z": Z, "D": D, "Y": Y})
# 素朴(調整なし)= 受けた人と受けない人の平均差
naive = df[df.D==1].Y.mean() - df[df.D==0].Y.mean()
print("素朴(調整なし) = %.1f" % naive)
素朴(調整なし) = 81.3
真の効果は50なのに、素朴な比較は 81.3。差の31は「訓練を受けた人はもともと意欲が高い($Z$の影)」が上乗せされた交絡バイアスです。ここまではDay 1の復習。
まず、なぜ81に膨らむのか、このデータの前提を2枚で見ておきます。交絡の正体は、$Z$(もともとの意欲・スキル)が「受講」と「収入」の両方を押し上げていることです。
左は $Z$ ごとの受講率で、意欲の高い人(Z=1)は 69% が受講、低い人(Z=0)は 31% しか受けません(=処置の自己選択、$Z \to D$)。右は訓練を受けていない人だけの収入分布で、それでも Z=1 は平均が高い($Z \to Y$)。この2本の矢印が重なると、「受講者はもともと稼ぐ人が多い」ぶん素朴な比較が水増しされます。
この交絡を、3流派はそれぞれの言葉で調整します。ただしやっている手順はどれも共通です。$Z$ で分け、層内で効果を測り、$P(Z)$ で加重平均する。$P(Z)$ は「その層に全体の何割の人がいるか」の比率で、それを重みにして層ごとの効果を足し合わせる、という意味です。
図は左から右へ、①全体をそのまま比べると交絡で +81、②同じ $Z$ の中で分けると層内には交絡がなく、Z=0 層で +50、Z=1 層で +52、③それを層の大きさで加重平均して +50.9、という3ステップです。下段は、この同じ手順を3流派がそれぞれ層別化・バックドア調整式・回帰と呼び分けていることを示しています。
言葉が違うだけで計算は同じ、をコードで確かめます。
# ① Rubin流:Zで層別化 → 層内の効果を P(Z) で加重平均
strata = [(df[(df.D==1)&(df.Z==z)].Y.mean() - df[(df.D==0)&(df.Z==z)].Y.mean(),
(df.Z==z).mean()) for z in (0, 1)]
rubin = sum(diff * w for diff, w in strata)
# ② Pearl流:バックドア調整式 Σ_z [E(Y|D=1,z) - E(Y|D=0,z)] P(z) ← ①と同じ計算
pearl = rubin
# ③ 計量経済流:Zを入れた回帰 Y ~ D + Z の D の係数
econ = smf.ols("Y ~ D + Z", data=df).fit().params["D"]
print("① Rubin 層別化 = %.1f" % rubin)
print("② Pearl バックドア = %.1f" % pearl)
print("③ 計量経済 回帰 = %.1f" % econ)
① Rubin 層別化 = 50.9
② Pearl バックドア = 50.9
③ 計量経済 回帰 = 50.9
3流派とも 50.9。真の効果 50 にぴたりと戻りました。 しかも①と②は書き方が違うだけでまったく同じ計算(Pearlのバックドア調整式は、Rubinの層別化加重平均そのもの)。③の回帰も、線形なら同じ調整を別の道具でやっているだけです。
左は交絡の構造。同じスキル層(Z)の中だけを見れば、訓練の効果はどちらの層でもほぼ+50。ところが処置群(受けた人)は高スキル層に偏っているので、層を無視して全体を平均すると素朴な81に膨らみます。右がその答え合わせで、素朴だけが飛び出し、3流派の調整はすべて赤い真値ライン(50)に着地しています。
「同じ因果、3つの言葉」。これがDay 3のいちばん伝えたいことです。
つまづき・誤解しやすい点
- 「流派を1つ選ぶ」必要はない。 むしろ実務では混ぜて使うのが普通です。「Pearlで何を調整すべきかを決め → Rubin/回帰で推定する」が定番の流れ。今日の例で3つが一致したのは偶然ではなく、正しく識別できていれば道具が違っても答えは揃うからです。
- 一致するのは「正しい $Z$ で調整したとき」だけ。 調整する変数を間違えれば(交絡を見落とす/逆に合流点を入れる=Day 1の罠3)、3流派そろって同じように間違えます。「何で調整すべきか」は道具では決まらない。だからPearlのDAG(Day 10–11)が要ります。
- 回帰=因果、ではない。 「$Y \sim D + Z$ の係数」が因果になるのは、$Z$ が交絡を塞いでいるという仮定があってこそ。回帰は道具であって、正しさを保証する魔法ではありません(Day 16で深掘り)。
GISデータ実務での使い方
私の本業は衛星データ×水道インフラ×AIで、扱うのはほぼ観察データです(施策をランダムに割り当てられる場面は稀)。ここで3流派の地図が指針になります。
- まずPearlで地図を描く。 「配管更新(D)→ 漏水率(Y)」を見たいとき、立地・築年・人口密度など何が交絡かをDAGで書き出し、調整集合を決める。ここを飛ばして回帰に共変量を放り込むと、Day 1の罠3(合流点で調整)を踏みます。
- 推定はRubin/回帰で。 調整集合が決まれば、傾向スコアでも回帰でも、やることは「正しい $Z$ で条件付ける」。空間データでは空間交絡(隣接地域が似た背景を共有)が最大の $Z$ で、Day 28で本気で扱います。
- RCTできない現場は計量経済の出番。 施策の導入時期がバラつくなら差分の差分(DID, Day 18)、閾値で配分されるなら回帰不連続(RDD, Day 20)。「擬似ランダムはどこにあるか」を探す計量経済の眼が、観察データから因果を取り出します。
「どの流派か」ではなく「この問題はどの入り口が効くか」。3つの言葉を持っておくと、現場で手が増えます。
参考(本棚)
- Imbens & Rubin『Causal Inference for Statistics, Social, and Biomedical Sciences』第1章。潜在的結果・割付メカニズム(Rubin流の下敷き)
- Pearl, Glymour & Jewell『入門 統計的因果推論』。DAG・do演算子・バックドア基準(Pearl流の下敷き)
- 林岳彦『はじめての統計的因果推論』/安井翔太『効果検証入門』。3流派を橋渡しする和書
- 伊藤公一朗『データ分析の力』。準実験デザイン(IV・DID・RDD)を数式なしで
次回予告(Day 4)
いよいよRubin流の本丸に入ります。テーマは RCT(無作為化比較試験)はなぜ因果推論の黄金律なのか。Day 3で「正しい $Z$ で調整すれば因果が取れる」と分かりましたが、RCTはそもそも交絡が生まれないように割付を設計します。「調整いらずで因果が測れる」魔法の正体を、A/Bテストのシミュレーションで確かめます。


