相関と因果関係 — 「相関は因果を意味しない」を正しく理解する

「アイスクリームの売上が伸びると、水難事故が増える」——これは実際のデータで確認できる、ほぼ間違いのない事実です。では、アイスの販売を規制すれば水難事故は減るのでしょうか?もちろん減りません。両者を結びつけているのは「気温」という第三の要因であって、アイスが事故を起こしているわけではないからです。

この単純な例は、データ分析でもっとも頻繁に犯される過ちの核心を突いています。二つの量に相関があっても、一方が他方の原因とは限らないのです。「相関は因果を意味しない(correlation does not imply causation)」という有名な警句は、統計を学ぶ誰もが最初に叩き込まれる教訓です。しかし、この言葉を「知っている」ことと、現実のデータの前で「正しく使える」ことの間には、深い溝があります。

この区別は、抽象的な学問の話ではありません。新薬は本当に効くのか(医療)、最低賃金の引き上げは雇用を減らすのか(経済政策)、広告は売上を伸ばしたのか、それとも売れる時期に広告を打っただけなのか(ビジネス意思決定)——こうした問いはすべて「相関ではなく因果」を問うています。因果を取り違えれば、効かない薬に大金を投じ、害のある政策を推進し、無駄な広告費を垂れ流すことになります。

本記事の内容

  • 「相関 ≠ 因果」が成り立つ理由と、相関が生じる4つのパターン
  • 交絡変数(confounder)・疑似相関・逆因果・選択バイアスの正体
  • シンプソンのパラドックス——全体と部分で結論が真逆になる現象
  • 因果を主張するための条件(ランダム化比較試験RCTと反事実)
  • 因果ダイアグラム(DAG)入門とバックドア基準のさわり
  • 観察データから因果に迫る手法(傾向スコア・操作変数・差分の差法)の概観
  • Pythonで交絡をシミュレーションし、調整前後で偽の相関が消えることを確認

前提知識

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

相関と因果は何が違うのか

まず言葉の意味を、直感的なイメージから固めておきましょう。相関とは、「二つの量が一緒に動く傾向」のことです。気温が上がるとアイスが売れる、身長が高い人は体重も重い傾向がある——こうした「連動」を数値化したのが相関係数です。相関は、二つの変数を眺めて散布図を描けば、データだけから測れます。

一方の因果は、もっと強い主張です。「$X$ が $Y$ の原因である」とは、「もし $X$ を(他の条件を変えずに)人為的に動かしたら、$Y$ が変わる」という意味です。鍵は「動かしたら」という介入(intervention) の発想です。アイスの売上を強制的に増やしても水難事故は増えません。だからアイスは事故の原因ではない——これが因果の判定です。

相関は「見ているだけ(observation)」で測れますが、因果は本来「いじってみる(intervention)」ことでしか確かめられません。ここに両者の決定的な違いがあります。観察されたデータからは、せいぜい「一緒に動いている」ことしか分かりません。それが「片方がもう片方を動かしている」のか、それとも「裏で別の何かが両方を動かしている」のかは、データを眺めるだけでは区別がつかないのです。

イメージとしては、相関は「二つの影が同じように揺れている」のを見ているようなものです。影が連動して揺れていても、片方の影がもう片方を揺らしているとは限りません。風(共通の原因)が両方を揺らしているのかもしれない。因果を知るには、片方の影を手でつかんで止めてみて、もう片方も止まるかどうかを確かめる必要があるのです。

ここまでで「相関は見れば分かるが、因果は介入しないと分からない」という骨格をつかみました。では、なぜ因果がなくても相関は生まれてしまうのか。その「相関が生じる仕組み」を整理していきましょう。

直感を養う — アイス消費と水難事故

抽象論に入る前に、冒頭の例を実際のデータで体感しましょう。気温という隠れた要因を仕込んだ人工データを作り、「素朴に見たときの相関」と「気温で色分けしたときの真相」を並べて見ます。

下の図は、その典型的な姿です。

アイス消費と水難事故の疑似相関。左は素朴な散布図で強い正の相関、右は気温で色分けすると両方が暑い日に集中していることが見える

左の散布図では、アイス売上と水難事故の間にきれいな正の相関($r \approx 0.79$)が見えます。回帰直線も右肩上がりです。この図だけを見せられたら、「アイスが水難を引き起こしている」という結論に飛びつきたくなるかもしれません。しかし右の図で点を気温(青=寒い、赤=暑い)で塗り分けると、真相が見えてきます。アイスがよく売れ、かつ水難事故が多いのは、すべて「暑い日(赤い点)」なのです。気温という共通の原因が、両方を同時に押し上げていただけでした。

この例が教えてくれるのは、強い相関係数は因果の証拠にはまったくならないということです。$r = 0.79$ という大きな値も、第三の変数を見落とせば完全に誤読してしまいます。では、因果がないのに相関が生まれる仕組みには、どんなパターンがあるのでしょうか。次に、それを体系的に分類します。

相関が生じる4つの理由

二つの変数 $X$ と $Y$ に相関が観測されたとき、その背後にありうる理由は、大きく4つに整理できます。下の図に、それぞれを因果ダイアグラム(矢印が「原因→結果」を表す図)でまとめました。

相関が生じる4つの理由。(1)直接因果X→Y、(2)逆因果Y→X、(3)交絡X←Z→Y、(4)選択バイアスX→S←YでSを選ぶ、の4つのDAG

4つのパターンを順に見ていきましょう。

  1. 直接因果($X \to Y$): $X$ が本当に $Y$ を引き起こしている、私たちが知りたい関係です。$X$ に介入すれば $Y$ が変わります。「薬を飲むと熱が下がる」がこれにあたります。これだけが「因果」と呼べる相関です。

  2. 逆因果($Y \to X$): 因果の向きが逆で、実は $Y$ が $X$ の原因です。原因と結果を取り違えると、相関の解釈を誤ります。「傘を持つ人は雨に遭いやすい」を「傘が雨を降らせる」と読むのがこの間違いです。

  3. 交絡($X \leftarrow Z \to Y$): 第三の変数 $Z$ が $X$ と $Y$ の両方を同時に動かしています。$X$ と $Y$ の間に直接の因果はないのに、共通原因 $Z$ を通じて相関が生まれます。アイスと水難事故(共通原因=気温)がこれです。

  4. 選択バイアス($X \to S \leftarrow Y$): $X$ と $Y$ がともに影響する「合流点(collider)」$S$ があり、その $S$ で標本を選別すると、本来無関係な $X$ と $Y$ に偽の相関が現れます。これは少し直感に反するので、後で詳しく扱います。

このうち(1)だけが因果で、(2)〜(4)はいずれも「因果がないのに相関が生まれる」ケースです。データ分析の仕事の大半は、観測された相関がこの4つのどれなのかを見極めることだ、と言っても過言ではありません。

そして、もう一つ大事なパターンが残っています。それは偶然です。何の関係もない二つの量が、たまたまサンプルの中で連動して見えることがあります。これを疑似相関と呼びます。まずは交絡から、それぞれを掘り下げていきましょう。

交絡変数 — もっとも厄介な相関の源

交絡とは何か

4つのパターンの中で、実務でもっとも頻繁に問題になるのが交絡(confounding) です。交絡変数(confounder)とは、$X$ と $Y$ の両方の原因になっている第三の変数のことです。先ほどの気温がまさにそれでした。

交絡の構造を、因果ダイアグラムで見ておきましょう。

交絡のDAG。気温Zがアイス売上Xと水難事故Yの両方の原因になっており、XとYの間の相関は因果ではなく共通原因によるもの

図のように、交絡変数 $Z$ から $X$ へ、そして $Z$ から $Y$ へと、二本の矢印が出ています。$X$ と $Y$ の間には因果の矢印が一本もないのに、共通原因 $Z$ を経由する「裏の道」を通って、両者は連動してしまいます。観測される相関(図の破線)は、この裏道がもたらす見せかけの関係なのです。

交絡が相関を生むしくみ

なぜ共通原因があると相関が生まれるのか、簡単なモデルで確かめましょう。交絡変数 $Z$ が次のように $X$ と $Y$ を線形に動かすとします。

$$ \begin{align} X &= a Z + \varepsilon_X \\ Y &= b Z + \varepsilon_Y \end{align} $$

ここで $\varepsilon_X, \varepsilon_Y$ は互いに独立な雑音(平均ゼロ)で、$Z$ とも独立とします。$X$ から $Y$ への直接の因果項はどこにもありません($Y$ の式に $X$ は入っていない)。つまり真の因果効果はゼロです。それでも $X$ と $Y$ の共分散を計算すると、

$$ \mathrm{Cov}(X, Y) = \mathrm{Cov}(aZ + \varepsilon_X,\ bZ + \varepsilon_Y) $$

となります。共分散は線形なので各項に分配でき、$\varepsilon_X, \varepsilon_Y$ が $Z$ とも互いとも独立であることから、雑音を含む項はすべて消えます。残るのは $Z$ どうしの項だけです。

$$ \mathrm{Cov}(X, Y) = ab\,\mathrm{Var}(Z) $$

$\mathrm{Var}(Z) > 0$ なので、$a$ と $b$ がともにゼロでない限り、共分散はゼロになりません。$a, b$ が同符号なら正の相関、異符号なら負の相関が生じます。直接の因果がまったくないのに、共通原因 $Z$ の分散がそのまま $X$–$Y$ の相関に化けているのです。これが交絡の数学的な正体です。

交絡をどう扱うか

交絡の解決策は、原理的にはシンプルです。交絡変数 $Z$ を一定に保って(条件付けて)から、$X$ と $Y$ の関係を見るのです。気温が同じ日どうしで比べれば、アイス売上と水難事故の見せかけの相関は消えるはずです。

この「$Z$ を一定に保つ」操作には、いくつかのやり方があります。$Z$ の値ごとにデータを分けて見る層別(stratification)、回帰モデルに $Z$ を説明変数として加える回帰調整、そして $Z$ を取り除いた純粋な関係を測る偏相関係数などです。いずれも「共通原因を取り除いてから関係を測る」という同じ思想に基づいています。交絡を制御する具体的な方法は、交絡バイアスとその制御法で詳しく扱っています。

ただし、ここには大きな落とし穴があります。交絡変数を見落とせば、調整のしようがないのです。気温という変数を測定していなければ、いくら頑張っても見せかけの相関を除けません。「観測されていない交絡(unobserved confounder)」こそ、観察データから因果を主張する最大の敵です。後で見る操作変数法は、まさにこの問題に立ち向かう手法です。

交絡は「裏の共通原因」が相関を生むパターンでした。次は、共通原因すら存在しない、純粋に偶然から生まれる「疑似相関」を見ていきます。

疑似相関 — 偶然が生む見せかけの関係

偶然のいたずら

疑似相関(spurious correlation) という言葉は、広い意味では「因果のない相関」全般を指しますが、狭くは「何の関係もない二つの量が、たまたま連動して見える」ケースを指します。とくに時系列データでは、両方が時間とともに増加(または減少)するトレンドを持っていれば、中身がまったく無関係でも高い相関係数が出てしまいます。

下の図は、互いに独立に生成した二本のランダムウォーク(毎年ランダムに増減する系列)です。

疑似相関の時系列例。無関係な2つの系列が共通の上昇トレンドだけで高い相関を示す

二つの系列は、生成過程上まったく無関係です。それぞれ独立な乱数で動かしているだけで、片方がもう片方に影響を与える仕組みは一切ありません。それでも、両方ともゆるやかな上昇トレンドを持つせいで、グラフはそっくりな形になり、相関係数は非常に高い値になります。「ニコラス・ケイジの年間出演本数とプール溺死者数」のような、笑ってしまう疑似相関の実例が世の中に多数存在するのは、まさにこのためです。

なぜトレンドが偽の相関を生むのか

直感的には、こうです。相関係数は「二つの量が平均からどちらの向きにずれるか」が一致する度合いを測ります。両方の系列が時間とともに右肩上がりなら、系列の前半は両方とも平均より下、後半は両方とも平均より上に来ます。すると「ずれの向き」が自動的に一致し、中身の細かい動きと無関係に高い相関が出てしまうのです。

この罠を避けるには、トレンドそのものを取り除く(差分を取る、トレンドを回帰で除去する)といった前処理が欠かせません。時系列における相関と因果のより踏み込んだ扱いは、多変量時系列の相関と因果で、相互相関やグレンジャー因果として解説しています。

疑似相関は「偶然」が生む見せかけでした。次は、相関は本物でも向きを取り違える逆因果と、サンプルの選び方が生む選択バイアスを見ていきます。

逆因果と選択バイアス

逆因果 — 原因と結果が逆

逆因果(reverse causation) は、$X$ と $Y$ の間に確かに因果関係はあるのに、その向きを逆に解釈してしまう間違いです。下の図がその典型です。

逆因果の概念図。「傘を持つと雨が降る」という誤った解釈と、「雨予報だから傘を持つ」という正しい解釈(雨→傘)の対比

「傘を持っている人ほど雨に遭う」という相関は実在します。しかし「傘が雨を降らせる」わけではありません。正しくは「雨が降りそうだから傘を持つ」、つまり因果は雨→傘の向きです。原因と結果を取り違えると、まったく逆の結論にたどり着いてしまいます。

実務での逆因果はもっと巧妙です。たとえば「警察官が多い地域ほど犯罪が多い」というデータから「警察官が犯罪を増やす」と結論するのは明らかな誤りで、実際は「犯罪が多いから警察官を多く配置する」という逆向きの因果が働いています。横断データ(ある一時点のスナップショット)では、$X$ と $Y$ のどちらが先かが分からないため、逆因果を見抜くのはとくに困難です。

選択バイアス — サンプルの選び方が生む偽相関

選択バイアス(selection bias) は、4パターンの中でもっとも直感に反する現象です。$X$ と $Y$ がそれぞれ独立に、ある結果 $S$(合流点、collider)に影響しているとき、$S$ の値で標本を選別すると、無関係だったはずの $X$ と $Y$ に相関が生まれてしまいます。

具体例で見ましょう。俳優の「演技力 $X$」と「容姿 $Y$」が、母集団全体ではまったく無関係(独立)だとします。しかし、映画俳優になれるのは「演技力 + 容姿」の総合点が高い人だけだとしましょう。この「映画俳優」という集団だけを観察すると、何が起きるでしょうか。

選択バイアスの散布図。母集団全体ではXとYは無相関だが、合流点で選別された集団だけ見ると負の相関が現れる

左の図が母集団全体です。演技力と容姿の間には相関がありません($r \approx 0$)。ところが右の図で「映画俳優(総合点が高い人)」だけを抜き出すと、両者の間に負の相関が現れます。理由はこうです。俳優として選ばれた集団の中で、演技力が低いのに残っている人は、その分容姿が良いはずです(でないと総合点が足りず選ばれない)。逆に容姿がいまひとつな俳優は、演技力が抜群なはずです。こうして「演技力が高いと容姿が低い」という偽の負の相関が生まれます。

この現象は「合流点での条件付け(collider conditioning)」と呼ばれ、医学研究で深刻な誤りを生むことが知られています。「入院患者だけを対象にした研究」「アンケートに回答した人だけのデータ」など、何らかの基準で選ばれた標本を扱うときは、つねに選択バイアスを疑う必要があります。交絡とは逆に、選択バイアスは合流点で『条件付けてはいけない』という点に注意してください。交絡変数は調整すべきですが、合流点を調整するとかえって偽相関を作ってしまうのです。

逆因果も選択バイアスも、相関の「解釈」を狂わせる罠でした。次は、全体と部分で結論が真逆になるという、さらに衝撃的な現象——シンプソンのパラドックスを扱います。

シンプソンのパラドックス

全体と部分で結論が逆転する

シンプソンのパラドックス(Simpson’s paradox) は、交絡が引き起こすもっとも劇的な現象です。データを全体で見たときの傾向と、適切なグループに分けて見たときの傾向が、完全に逆向きになることがあるのです。

人工データで見てみましょう。「週あたりの運動量 $X$」と「病気リスク $Y$」の関係を考えます。常識的には、運動するほど病気リスクは下がる(負の相関)はずです。

シンプソンのパラドックスの散布図。各年齢群の中では運動量が増えるほど病気リスクが下がる(負)が、全体の回帰直線は右肩上がり(正)になる

図を見ると、年齢群(若年・中年・高齢)ごとに分けたとき、どの群でも運動量が増えるほど病気リスクが下がっています(各群の細い回帰直線はすべて右肩下がり)。これは私たちの常識通りです。ところが、群を無視して全体を一本の回帰直線(黒い破線)で見ると、右肩上がりになり、「運動するほど病気リスクが高い」という真逆の結論が出てしまいます(全体の相関 $r \approx +0.9$)。

なぜ逆転するのか

カラクリは交絡変数「年齢」にあります。このデータでは、高齢な群ほど運動量も多く(健康意識が高い人が運動を続けている)、かつ病気リスクも高い(加齢の影響)という設定です。年齢が $X$(運動量)と $Y$(病気リスク)の両方を押し上げる共通原因、すなわち交絡変数になっているのです。

全体をまとめて見ると、各群の「位置」が年齢によって右上にずれていく効果(交絡)が、群内の本来の負の関係を覆い隠し、上塗りしてしまいます。結果として、見かけ上は正の相関に転じます。ここで「年齢で層別する=交絡を調整する」と、各群の中に隠れていた真の負の関係が姿を現すわけです。

シンプソンのパラドックスが教えてくれる実践的な教訓は明快です。集計データの相関を鵜呑みにせず、適切な交絡変数で層別して確認せよ。そして「どの層別が正しいのか」を決めるには、データだけでは足りず、因果の構造についての知識(どれが原因でどれが結果か) が必要になります。同じ数字でも、年齢を交絡とみなすか合流点とみなすかで、調整すべきか否かの結論が変わるからです。

ここまで「相関が因果でない理由」を尽くしてきました。では逆に、どうすれば「これは因果だ」と胸を張って言えるのでしょうか。その黄金律を次に見ます。

因果を示すには — RCTと反事実

反事実という考え方

因果を厳密に定義する鍵は反事実(counterfactual) です。「ある人に薬を飲ませたら治った」という観察だけでは、薬が効いたとは言えません。なぜなら「もしその人が薬を飲まなかったら、どうなっていたか」が分からないからです。この「実際には起きなかったもう一つの世界」が反事実です。

各個体 $i$ に対して、処置を受けた場合の結果 $Y_i(1)$ と、受けなかった場合の結果 $Y_i(0)$ という二つの潜在的結果(potential outcomes) を考えます。個体 $i$ にとっての因果効果は、その差として定義されます。

$$ \tau_i = Y_i(1) – Y_i(0) $$

ここに因果推論の根本問題があります。一人の個体について、私たちは $Y_i(1)$ か $Y_i(0)$ のどちらか一方しか観測できません。薬を飲んだ人については $Y_i(1)$ しか分からず、飲まなかった世界の $Y_i(0)$ は永遠に観測不可能です。だから個体ごとの因果効果 $\tau_i$ は、原理的に測れないのです。

そこで実務では、集団全体での平均処置効果(ATE) を狙います。

$$ \mathrm{ATE} = \mathbb{E}[Y(1) – Y(0)] = \mathbb{E}[Y(1)] – \mathbb{E}[Y(0)] $$

「全員が処置を受けた世界の平均結果」と「全員が受けなかった世界の平均結果」の差です。個体レベルの反事実は観測できなくても、二つのグループを比べることで、平均としての因果効果なら推定できる——これが因果推論の突破口です。

ランダム化比較試験(RCT)

問題は、「処置を受けた人」と「受けなかった人」を素朴に比べてはいけないことです。薬を飲む人は、もともと健康に気をつかう人かもしれません(交絡)。両グループは処置以外の点でも異なっている可能性があるのです。

この問題を一撃で解決するのがランダム化比較試験(RCT: Randomized Controlled Trial) です。アイデアは驚くほど単純で、誰が処置を受けるかをコイン投げ(ランダム)で決めるだけです。

RCTの構造図。対象集団をランダムに処置群と対照群に割り付けることで、群間の交絡変数が平均的に等しくなり、結果の差が純粋な因果効果になる

ランダムに割り付けると、年齢・健康意識・遺伝など、あらゆる交絡変数が二つのグループで平均的に等しくなります。観測できる変数も、できない変数も、ひっくるめて均される点が決定的です。処置を受けるかどうかが「コイン投げ」だけで決まり、ほかの何にも依存しないので、結果に差が出たならそれは処置のせい、つまり純粋な因果効果だと言い切れます。数式で言えば、ランダム化によって処置 $X$ が潜在的結果 $\{Y(0), Y(1)\}$ から独立になり、

$$ \mathbb{E}[Y(1)] = \mathbb{E}[Y \mid X = 1], \quad \mathbb{E}[Y(0)] = \mathbb{E}[Y \mid X = 0] $$

が成り立ちます。観測できない反事実の平均を、観測できる各群の平均で置き換えられるようになるのです。

RCTは「因果を示す黄金律(gold standard)」と呼ばれます。新薬の承認に臨床試験が必須なのも、まさにこの威力ゆえです。ただしRCTには弱点もあります。倫理的に介入できない場合(「喫煙させる実験」は不可能)、コストや時間がかかりすぎる場合、そもそも介入が物理的に無理な場合(過去の経済政策など)には使えません。そこで、すでに集まっている観察データから因果に迫る手法が必要になります。その土台となるのが、次に見る因果ダイアグラムです。

因果ダイアグラム(DAG)入門

矢印で因果構造を描く

観察データから因果を論じるには、まず「世界の因果構造についての仮定」を明示する必要があります。そのための言語が因果ダイアグラム、正式には有向非巡回グラフ(DAG: Directed Acyclic Graph) です。すでに本記事の図で何度も使ってきた、あの「丸と矢印」の図です。

DAGのルールはシンプルです。

  • ノード(丸) は変数を表す。
  • 有向辺(矢印) $A \to B$ は「$A$ が $B$ の直接の原因」を表す。
  • 非巡回(acyclic): 矢印をたどって元のノードに戻る閉路は作れない(自分が自分の原因にはなれない)。

DAGの強力さは、「どの変数を調整すれば因果効果が正しく測れるか」を、図を眺めるだけで判定できる点にあります。そのためにまず、矢印のつながり方(経路)には三つの基本形があることを押さえます。

  • 連鎖(chain): $A \to B \to C$。$B$ は $A$ の効果を $C$ に伝える中継点(媒介変数)。
  • 分岐(fork): $A \leftarrow B \to C$。$B$ は共通原因、すなわち交絡変数
  • 合流(collider): $A \to B \leftarrow C$。$B$ は共通結果、すなわち合流点

ここまでに見てきた交絡は分岐、選択バイアスは合流に対応します。重要なのは、分岐の $B$(交絡)は調整すべきだが、合流の $B$(合流点)は調整してはいけないという非対称性です。DAGはこの判断を機械的に下せるようにしてくれます。

パス(経路)が「開く」「閉じる」

二つの変数の間に相関(統計的依存)が流れるかどうかは、両者をつなぐ「パス」が開いている(open)閉じている(blocked) かで決まります。

  • 連鎖 $A \to B \to C$ と分岐 $A \leftarrow B \to C$ では、中間の $B$ を条件付けると経路が閉じる(相関の流れが止まる)。交絡 $B$ を調整すると偽相関が消えるのはこのためです。
  • 合流 $A \to B \leftarrow C$ では、逆に何もしなければ経路は閉じており、$B$(または $B$ の子孫)を条件付けると経路が開く。選択バイアスで偽相関が生まれるのはこのためです。

この「経路を開閉する」という視点から、因果効果を正しく測るための一般的な規準が導かれます。それがバックドア基準です。

バックドア基準のさわり

裏口を塞ぐ

$X$ から $Y$ への因果効果を、観察データから正しく推定したいとします。問題は、$X$ と $Y$ の間には、因果の経路($X \to Y$)以外に、交絡を経由する「裏の経路」が存在しうることです。この裏の経路をバックドアパス(裏口経路) と呼びます。

バックドア基準のDAG。X→Yの因果経路(推定したい)と、交絡Zを経由する裏口経路X←Z→Y。Zで調整すると裏口経路が塞がれる

図では、$X \to Y$ という推定したい因果経路(緑)のほかに、$X \leftarrow Z \to Y$ という裏口経路(オレンジ)があります。この裏口経路は分岐($Z$ が交絡)なので、今は開いていて、偽の相関を流し込んでいます。素朴に $X$ と $Y$ の相関を測ると、因果効果に裏口の偽相関が混ざってしまいます。

バックドア基準(backdoor criterion) は、「$X$ から出る矢印で始まらないすべての裏口経路を塞ぐような変数集合 $Z$ を見つけ、それで条件付けよ」という規準です。図の例では、交絡 $Z$ を調整(条件付け)すれば、分岐の中間点 $Z$ で裏口経路が閉じ、残るのは純粋な因果経路 $X \to Y$ だけになります。こうして、

$$ P(Y \mid \mathrm{do}(X)) = \sum_z P(Y \mid X, Z = z)\, P(Z = z) $$

という調整化公式(adjustment formula) が使え、介入 $\mathrm{do}(X)$ の効果を観察データから計算できます。ここで $\mathrm{do}(X)$ は「$X$ を人為的に固定する」という介入を表す記号です。この記号と背後の理論については、do計算と介入の形式化で詳しく扱っています。

バックドア基準のポイントは、「調整すべき変数(交絡)と、調整してはいけない変数(合流点・媒介変数)を、DAGの構造から峻別できる」ことです。とにかく手元の変数を全部モデルに突っ込めばよい、という素朴な発想は、合流点を調整して偽相関を作り込むなど、かえって有害になりえます。何を調整すべきかは、データではなく因果の仮定(DAG) が決めるのです。

DAGとバックドア基準は「何を調整すべきか」を教えてくれます。では、それを実際の推定にどう落とし込むのか。観察データ向けの代表的な手法を概観しましょう。

観察データで因果に迫る手法の概観

RCTができない状況で因果効果を推定するために、統計学・計量経済学はさまざまな道具を発展させてきました。本記事はそれらの入り口なので、ここでは「どんなときに何を使うか」を地図として示し、詳細は各専門記事に譲ります。

  • 傾向スコア法(propensity score): 観測された交絡変数がすべて分かっているとき、「処置を受ける確率(傾向スコア)」が等しい個体どうしを比較する(マッチング)か、その逆数で重み付け(IPW)することで、交絡を調整します。バックドア基準を実装する代表的な手法です。詳しくは傾向スコア法の理論 — マッチングとIPWへ。

  • 操作変数法(instrumental variables): 観測されていない交絡があってお手上げのとき、「処置 $X$ には影響するが、結果 $Y$ には $X$ を通じてしか影響しない」第三の変数(操作変数)を使って因果効果を取り出します。2段階最小二乗法として実装されます。詳しくは操作変数法の理論と2段階最小二乗法へ。

  • 差分の差法(DID: Difference-in-Differences): 政策などの介入の前後で、処置を受けた群と受けなかった群の変化の差を比べます。「介入がなければ両群は平行に推移したはず」という平行トレンド仮定が鍵です。詳しくは差の差法(DID)の理論と平行トレンド仮定へ。

  • 回帰不連続デザイン(RDD): ある閾値(たとえば点数の合格ライン)の前後で処置が切り替わる状況を利用し、閾値のすぐ上と下を比べてほぼ実験のような比較を実現します。詳しくは回帰不連続デザイン(RDD)の理論へ。

  • 合成コントロール法: 比較対象(対照群)が一つしかないとき、複数の対照候補を重み付けして「もし介入がなかったらどうなっていたか」という反事実を人工的に合成します。詳しくは合成コントロール法の理論へ。

これらの手法はどれも、結局のところ「観測された相関から、交絡や選択バイアスの寄与をいかに取り除き、純粋な因果効果に近づくか」という同じ目標を、異なる仮定のもとで追求しています。手法選びの本質は、自分のデータでどんな仮定なら現実的に正当化できるかを見極めることにあります。因果推論の全体像は因果推論入門からたどると整理しやすいでしょう。

理屈はここまでです。最後に、もっとも基本的な「交絡の調整」を、Pythonでシミュレーションして体感しましょう。

Pythonでの実装 — 交絡をシミュレーションする

偽の相関を作り出す

まず、真の因果効果がゼロなのに、交絡変数のせいで偽の相関が生まれる状況を人工データで作ります。先ほどのモデル $X = aZ + \varepsilon_X$、$Y = bZ + \varepsilon_Y$($Y$ に $X$ の項はない=因果ゼロ)をそのまま実装します。

import numpy as np

# 再現性のためseedを固定
rng = np.random.default_rng(20)
n = 5000

# 交絡変数 Z(例: 運動習慣)
Z = rng.normal(0, 1, n)

# Z が X と Y の両方を動かす。X→Y の直接効果はゼロ
a, b = 1.2, 2.0
X = a * Z + rng.normal(0, 0.6, n)            # Z → X
Y = b * Z + 0.0 * X + rng.normal(0, 0.6, n)  # Z → Y, X の真の効果は 0

# 素朴な相関
r_naive = np.corrcoef(X, Y)[0, 1]
print(f"調整前の相関 r(X, Y) = {r_naive:.3f}")
print(f"理論値 Cov(X,Y)=ab·Var(Z)={a*b:.2f}(正の相関が出るはず)")

このコードを実行すると、調整前の相関 r(X, Y) = 0.852 のように、強い正の相関が出力されます。$Y$ の式に $X$ の項を入れていない(真の因果効果はゼロ)にもかかわらず、です。これは先ほど導いた $\mathrm{Cov}(X, Y) = ab\,\mathrm{Var}(Z)$ の通りで、共通原因 $Z$ の分散がそっくり $X$–$Y$ の相関に化けていることを、数値が裏付けています。

交絡を調整して偽相関を消す

次に、交絡変数 $Z$ を調整すると、この偽の相関が消えることを確かめます。$X$ と $Y$ をそれぞれ $Z$ で回帰し、その残差どうしの関係を見ます(これは偏相関を計算する Frisch–Waugh の手法です)。残差は「$Z$ で説明できない部分」なので、$Z$ の影響を取り除いた純粋な $X$–$Y$ 関係を表します。

import numpy as np

def residualize(target, covariate):
    """covariate で target を回帰し、残差(covariate で説明できない成分)を返す"""
    slope, intercept = np.polyfit(covariate, target, 1)
    return target - (slope * covariate + intercept)

# X, Y をそれぞれ Z で回帰して残差を取る
X_res = residualize(X, Z)
Y_res = residualize(Y, Z)

# 残差どうしの相関 = Z で調整した後の相関(偏相関)
r_adjusted = np.corrcoef(X_res, Y_res)[0, 1]
print(f"調整前の相関 r(X, Y)        = {r_naive:.3f}")
print(f"Z で調整後の相関 r(X⊥Z, Y⊥Z) = {r_adjusted:.3f}")

実行すると、Z で調整後の相関 ≈ 0.00 となり、偽の相関がきれいに消えます。$Z$ を取り除くことで、$X$ と $Y$ の間に直接の因果がない(真の効果ゼロ)という事実が、データから正しく回復されたのです。「とにかく相関を見る」と $0.85$ という大きな値に騙されますが、交絡を調整すれば真実が見えます。

調整前後を可視化する

この劇的な変化を、散布図で目に見える形にしましょう。

import numpy as np
import matplotlib.pyplot as plt

# 日本語フォント設定
import matplotlib
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
    if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
        plt.rcParams["font.family"] = cand
        break
plt.rcParams["axes.unicode_minus"] = False

fig, axes = plt.subplots(1, 2, figsize=(13, 5.2))

# 左: 調整前(偽の正相関)
ax = axes[0]
ax.scatter(X, Y, s=8, color="#ff7f0e", alpha=0.4)
c1, c0 = np.polyfit(X, Y, 1)
xs = np.linspace(X.min(), X.max(), 50)
ax.plot(xs, c0 + c1 * xs, color="#cc4400", lw=2.4)
ax.set_xlabel("サプリ摂取量 X"); ax.set_ylabel("健康スコア Y")
ax.set_title(f"調整前: 偽の相関 r={r_naive:.2f}(真の効果は0)")
ax.grid(alpha=0.3)

# 右: Z で調整後(相関が消える)
ax = axes[1]
ax.scatter(X_res, Y_res, s=8, color="#2ca02c", alpha=0.4)
c1, c0 = np.polyfit(X_res, Y_res, 1)
xs = np.linspace(X_res.min(), X_res.max(), 50)
ax.plot(xs, c0 + c1 * xs, color="#1a7a1a", lw=2.4)
ax.set_xlabel("X の残差(Z を除去)"); ax.set_ylabel("Y の残差(Z を除去)")
ax.set_title(f"Z で調整後: 相関は消える r={r_adjusted:.2f}")
ax.grid(alpha=0.3)

plt.tight_layout()
plt.savefig("adjustment.png", dpi=130, bbox_inches="tight")
plt.show()

交絡の調整前後の比較。調整前は偽の正相関があるが、Zで調整すると相関が消える

左の散布図は調整前で、はっきりとした右肩上がりの偽相関が見えます。右の散布図は $Z$ で調整した後の残差プロットで、点は雲のように広がり、回帰直線はほぼ水平です。理論で予言した「共通原因を取り除けば偽の相関は消える」が、視覚的にも確認できました。この一連の操作こそ、傾向スコア法や回帰調整が裏でやっていることの最小モデルです。

観測されない交絡という限界

最後に、この方法の前提を確認しておきましょう。上のコードがうまくいったのは、交絡変数 $Z$ を観測できていたからです。もし $Z$ を測定していなければ、residualize に渡すものがなく、偽相関を取り除くすべがありません。

import numpy as np

# Z を「観測できなかった」場合をシミュレート
# 手元には X と Y しかない → 偽相関 0.85 をそのまま信じてしまう
r_only_xy = np.corrcoef(X, Y)[0, 1]
print(f"Z が観測できない場合に手元にある相関: {r_only_xy:.3f}")
print("→ 交絡を調整できず、'X が Y を強く動かす' と誤読する危険")

この出力は、調整前と同じ 0.85 程度です。つまり、観測されていない交絡があると、いくら統計を駆使しても因果は識別できないのです。これこそが、RCTが黄金律とされ、観測されない交絡に対処する操作変数法のような手法が編み出されてきた根本理由です。「どの変数を測っておくべきか」という研究デザインの段階での判断が、後の因果推論の成否を決めるのです。

まとめ

本記事では、「相関は因果を意味しない」という警句の中身を、相関が因果以外から生まれる仕組みと、因果に迫るための考え方の両面から解説しました。

  • 相関 ≠ 因果: 相関は「一緒に動く」ことしか言わない。因果は「介入したら変わる」という、より強い主張である。
  • 相関が生じる4つの理由: 直接因果・逆因果・交絡・選択バイアス。さらに偶然による疑似相関も加わる。因果と呼べるのは直接因果だけ。
  • 交絡: 共通原因 $Z$ が $X$ と $Y$ を同時に動かすと、$\mathrm{Cov}(X,Y)=ab\,\mathrm{Var}(Z)$ により、因果ゼロでも相関が生まれる。観測できる交絡は調整で除けるが、観測されない交絡は最大の敵。
  • 選択バイアスとシンプソンのパラドックス: 合流点で選別すると偽相関が生まれ、交絡を無視して集計すると全体と部分で結論が逆転する。何を調整すべきかは因果構造(DAG)が決める。
  • 因果を示すには: 反事実 $Y_i(1)-Y_i(0)$ が根本問題。ランダム化(RCT)は処置を交絡から独立にし、各群の平均で反事実を置き換えられるようにする黄金律。
  • DAGとバックドア基準: 因果ダイアグラムで「裏口経路を塞ぐ変数集合」を見つければ、調整化公式で観察データから介入効果を計算できる。
  • 観察データの手法: 傾向スコア・操作変数・差分の差法・RDD・合成コントロールは、それぞれ異なる仮定のもとで交絡を取り除き因果に迫る。

Pythonのシミュレーションでは、真の因果効果がゼロでも交絡が強い偽相関を生むこと、そして交絡変数を調整すればその相関が消えることを、数値とグラフの両方で確認しました。「相関を見たら、まず交絡・逆因果・選択バイアスを疑う」——この習慣こそ、医療・経済・ビジネスのあらゆる意思決定で、データに騙されないための最初の防壁です。

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