構造的因果モデル(SCM)とは?構造方程式・介入・反事実をわかりやすく解説

「アイスの売上が増えると水難事故が増える」——このデータには確かに相関があります。でも、アイスを禁止すれば事故は減るでしょうか? もちろん減りません。裏に「気温」という共通の原因があるだけです。相関を見ているだけでは「もし〜したらどうなるか」には答えられないのです。

この「もし〜したら」を数学的に扱う枠組みが、Judea Pearlの 構造的因果モデル(Structural Causal Model, SCM) です。SCMは、因果推論で出てくる因果グラフ(DAG)・do演算・反事実といった概念を、すべて生み出す土台となるフレームワークです。本記事では、その中核である「構造方程式」から出発して、介入・反事実までを一気に見通します。

SCMを理解すると、次のことができるようになります。

  • 相関と因果を厳密に区別できる — 「見る」と「する」の違いを数式で扱える
  • 介入や反事実に答えられる — 「この施策を打ったら?」「もしあのとき違う選択をしていたら?」を計算できる

本記事の内容

  • SCMの3要素(DAG・構造方程式・外生ノイズ)
  • 構造方程式が因果グラフを生む仕組み
  • 介入 do(x) = 構造方程式への「手術」
  • 因果のはしご(関連・介入・反事実)と反事実の計算手順
  • 交絡で相関と因果が食い違う様子のPython実計算

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

構造的因果モデルとは — 3つの要素

SCMは、世界の因果のしくみを次の3つの要素で表します。

SCMの3要素:DAG+構造方程式+外生ノイズ

  1. 因果グラフ(DAG): 「誰が誰の原因か」を矢印で表した有向非巡回グラフ
  2. 構造方程式: 各変数を「その親+ノイズ」の関数として書いた式
  3. 外生ノイズ $U$: モデルに明示していない外部の要因(個体差や偶然)

ポイントは、これらが揃うと「見る(観測)」「する(介入)」「もし〜だったら(反事実)」のすべてに答えられることです。単なる相関分析や予測モデルには無い、この表現力がSCMの価値です。

なお、外生ノイズ $U$ が互いに独立だと仮定するSCMをマルコフ的SCMと呼び、このときDAGの構造と確率分布がきれいに対応します(隠れた共通原因が無い状態)。逆に2つの変数のノイズが相関している場合は、その背後に未観測の共通原因があることを意味し、図では両端矢印の点線などで表します。まずは中心となる構造方程式から見ていきましょう。

構造方程式 — 「:=」は因果の向きを持つ

SCMでは、各変数を次のような構造方程式で定義します。たとえば $X$ が $Y$ の原因なら、

$$ \begin{equation} Y := \beta X + U_Y \end{equation} $$

と書きます。ここで注目すべきは、等号「=」ではなく代入「:=」を使う点です。

構造方程式の:=は因果の向きを持つ

普通の等式 $Y = \beta X + U_Y$ は $X = (Y – U_Y)/\beta$ と解き直せて、左右が対称です。しかし構造方程式の「:=」は「$X$ が $Y$ を決める」という非対称な代入を意味します。プログラムの代入文のように、右辺(原因)が左辺(結果)を生成する向きを持つのです。だから「$X$ を変えれば $Y$ が変わる」が、その逆は成り立ちません。この非対称性こそが因果の向きを表現しています。

そして、この構造方程式の集まりが、自動的に因果グラフ(DAG)を決めます。

構造方程式とDAGは表裏一体

各構造方程式の右辺に現れる変数が、左辺の変数の「親(直接の原因)」です。親から子へ矢印を引けば、DAGができあがります。

構造方程式とDAGは表裏一体

図の例では、$Z := aX + U_Z$ なので $X \to Z$、$Y := bX + cZ + U_Y$ なので $X \to Y$ と $Z \to Y$、という矢印が引かれます。つまりDAGは構造方程式の「絵」であり、両者は同じ情報を別の形で表しているにすぎません。DAGを見れば依存関係の構造が一目でわかり、構造方程式を見れば具体的な生成過程がわかる、という関係です。

このSCMがあると、ただ観測するだけでなく「介入」を表現できます。ここがSCMの真骨頂です。

介入 do(x) — 構造方程式への「手術」

「もし全員に $X = x$ を強制したら?」という介入を、SCMは do演算子 $do(X=x)$ で表します。その正体は、構造方程式への手術(surgery)です。

介入do(X=x)は構造方程式への手術

具体的には、$X$ を決めていた構造方程式を消して、$X = x$ という定数で置き換えます。グラフで言えば、$X$ に入ってくる矢印をすべて切り落とすことに相当します。こうすると、$X$ はもはや他の変数(特に交絡 $U$)の影響を受けず、外から固定された値になります。

この「手術」が効くのは、観測でデータを眺めるのとは本質的に違うからです。

「見る」と「する」は違う — 条件付け vs 介入

ここがSCMで最も重要な区別です。$P(y \mid x)$(条件付け)と $P(y \mid do(x))$(介入)はまったく別物です。

条件付けと介入の違い

  • $P(y \mid x)$ は「$X$ が $x$ だった個体を選んで $Y$ を見る」こと。交絡 $U$ の影響が混ざるので、これは相関です
  • $P(y \mid do(x))$ は「全員の $X$ を強制的に $x$ にする」こと。$X$ への矢印を切るので $U$ の影響が断たれ、純粋な因果効果になります

冒頭のアイスと水難事故の例で言えば、$P(\text{事故} \mid \text{アイス高}) $ は相関で高く出ますが、$P(\text{事故} \mid do(\text{アイス高}))$ は変わらない(アイスを配っても事故は増えない)。この違いを、実際に数値で確かめてみましょう。

交絡デモ — 相関はあるのに因果はゼロ

共通原因 $U$ が $X$ と $Y$ の両方を押し上げる、純粋な交絡の状況をシミュレーションします。構造方程式は次の通りで、$X$ から $Y$ への真の因果効果はゼロ($\beta = 0$)に設定します。

import numpy as np
rng = np.random.default_rng(0)
N = 500
U = rng.normal(0, 1, N)                              # 共通原因(交絡)
X = 1.5*U + rng.normal(0, 0.5, N)                    # X := 1.5U + noise
Y = 0.0*X + 1.5*U + rng.normal(0, 0.5, N)            # Y := 0*X + 1.5U + noise (真の効果0)

slope_obs = np.polyfit(X, Y, 1)[0]                   # 観測回帰 Y~X
A = np.c_[X, U, np.ones(N)]                          # U で調整(重回帰 Y~X+U)
slope_adj = np.linalg.lstsq(A, Y, rcond=None)[0][0]
print(slope_obs, slope_adj)   # -> 0.917, -0.027

交絡:相関はあるが因果効果はゼロ

散布図を見ると、$X$ と $Y$ には強い正の相関があり、素朴に回帰すると傾き 0.92 が得られます。「$X$ を増やせば $Y$ が増える」と早合点しそうです。しかし真の因果効果はゼロ。色(共通原因 $U$)を見ると、$U$ が大きい点ほど $X$ も $Y$ も大きく、$U$ が両方を押し上げているだけだとわかります。

観測相関0.92 vs 因果効果0

SCMが交絡の構造を教えてくれるので、共通原因 $U$ で調整($do$ に相当)すると、推定される効果は約 −0.03 とほぼゼロに戻ります。観測の傾き 0.92 は完全に交絡由来だったわけです。どの変数を調整すべきか(バックドア基準)を教えてくれるのが、SCMとDAGの役割です。

SCMが扱えるのは介入だけではありません。さらに上の段、「反事実」にも答えられます。

因果のはしご — SCMは3段すべてに答えられる

Pearlは因果の問いを3段の「はしご」で整理しました。SCMは、この3段すべてに答えられる唯一の枠組みです。

因果のはしご

  • 第1段 関連(見る) $P(y\mid x)$: 「$X$ を観測したら $Y$ は?」。相関・予測。データを眺めるだけで答えられる
  • 第2段 介入(する) $P(y\mid do(x))$: 「$X$ を操作したら $Y$ は?」。因果効果。実験やdo演算が必要
  • 第3段 反事実(もし〜) $P(y_{x’}\mid x, y)$: 「実際は $X=x$ だったが、もし $X=x’$ だったら $Y$ は?」。個体レベルの反実仮想

重要なのは、下の段の情報だけでは上の段に答えられないことです。相関データ(第1段)をいくら集めても介入効果(第2段)はわからない。SCMは構造方程式を持つからこそ、上の段に踏み込めます。最上段の反事実は、特に独特な計算をします。

反事実の計算 — 推論・介入・予測の3ステップ

反事実(「もしあのとき $X$ が違っていたら、この人の $Y$ はどうなっていたか」)は、次の3ステップで計算します。

反事実の3ステップ

  1. 推論(Abduction): 実際に観測した事実から、その個体の外生ノイズ $U$ を推定する
  2. 介入(Action): 構造方程式を $do(X=x’)$ で書き換える(反事実の条件を入れる)
  3. 予測(Prediction): 推定した $U$ をそのまま使って、$Y$ を計算し直す

肝はステップ1です。介入(第2段)が「集団全体」の話なのに対し、反事実は「その個体固有の事情($U$)」を観測から復元してから介入を当てる。だから「この患者がもし投薬されていたら」という個体レベルの問いに答えられるのです。これはSCMにしかできない芸当で、潜在結果モデルの $Y_{x}$ とも対応します。

簡単な数値例で見てみましょう。$Y := 2X + U_Y$ というモデルで、ある個体が $X=1, Y=5$ と観測されたとします。①推論:$5 = 2\cdot 1 + U_Y$ より、この個体の $U_Y = 3$ と判明します。②介入:「もし $X=4$ だったら」を考え、③予測:同じ $U_Y=3$ を使って $Y = 2\cdot 4 + 3 = 11$。「この個体に限れば、$X$ を4にしていれば $Y$ は11だった」と言えるわけです。集団平均ではなく、その個体の $U_Y$ を引き継ぐのがポイントです。

最後に、SCMが因果推論全体のどこに位置するかを整理します。

SCMは因果推論の統一フレームワーク

SCMは因果推論の統一フレームワーク

これまで別々に学ぶことの多い概念——DAG/d分離(構造の表現)、do演算/バックドア基準(介入の識別)、反事実(個体の反実仮想)——は、すべてSCMという1つの土台から導かれます。さらに、ルービンの潜在結果モデル(反事実を $Y_x$ で表す枠組み)ともSCMは数学的に等価であることが知られています。つまりSCMは、因果推論のさまざまな道具立てを生み出す共通の生成器なのです。個々の手法を学ぶ前にSCMを押さえておくと、全体が一本の線でつながります。

まとめ

本記事では、構造的因果モデル(SCM)を解説しました。

  • SCMの3要素: 因果グラフ(DAG)・構造方程式・外生ノイズ $U$
  • 構造方程式: 各変数を「親+ノイズ」の関数で定義。代入「:=」は因果の向きを持つ非対称な関係で、DAGと表裏一体
  • 介入 $do(x)$: $X$ の構造方程式を消して定数に置き換える「手術」。$X$ への矢印を切る
  • 見る vs する: $P(y\mid x)$(条件付け=相関)と $P(y\mid do(x))$(介入=因果)は別物。交絡があると食い違う(実計算で相関0.92 vs 因果0)
  • 因果のはしご: 関連・介入・反事実の3段。SCMは3段すべてに答えられる
  • 反事実: 推論($U$推定)→介入→予測の3ステップ。個体レベルの反実仮想に答える
  • SCMはDAG・do演算・反事実・潜在結果を統一する土台

「相関は因果ではない」とよく言われますが、SCMはその先へ進み、いつ・どうすれば相関から因果を取り出せるかを厳密に教えてくれる枠組みです。

次のステップとして、以下の記事も参考にしてください。