因果推論モデルはどこまで現実と整合的か?
総研大 統計科学コースの平元です。アドベントカレンダーを書くことになったので因果推論において個人的に気になってたことを検証します。
はじめに
DID(Difference-in-Differences)や Synthetic control method(SCM)は、
因果推論の文脈で頻繁に登場する定番ツールで、私も研究で日常的に使っています。
先日 SCM についてベイズ統計寄りの方と話していたところ、
「でもそれって頻度論ですよね?」
と指摘され、血涙を流すことになりました。
そこで本記事では、
- DID の背後にある 平行トレンド仮定
- SCM の背後にある 因子モデル(ファクターモデル)
が、実際のデータとどれくらい整合的かを見ていきます。
ここでは「政策介入」は登場しません。あくまで
「モデルが想定する時系列パターンはデータをどれくらい説明できるか?」
を確認するのが目的です。
DID / SCM について
DID:共通トレンド + 地域ごとの定数シフト
DID では次のようなモデルを想定します:
$Y_{it} = \mu + \alpha_i + \delta_t + \beta D_{it} + \varepsilon_{it}$
今回は介入の有無は考えないので、介入ダミー (D_{it}) を落とした
$Y_{it} = \mu + \alpha_i + \delta_t + \varepsilon_{it}$
だけに注目します。ここで$Y_{it}$は観測値で、式の右辺の項は観測できないパラメータです。
このモデルの意味はシンプルで、
- すべての地域が 同じ時間トレンド ($\delta_t$) に従って動き
- 地域ごとの差は 水準(定数シフト) ($\alpha_i$) だけ
という世界観です。
DID の平行トレンド仮定は、ざっくり言うと
「介入が無ければ、各地域の時系列は“だいたい平行”に動く」
という前提に相当します。
この仮定の下では、定数シフト ($\alpha_i$) は固定効果として簡単に処理できるので、
- 「処置が無かった場合の軌道(反実仮想)」を
- 対照群の共通トレンド + 定数シフト から推定できる
――というのが DID の主張です。
SCM:共通因子 × 地域ごとの感度(因子モデル)
次に SCM です。
SCM の背後では、次のような因子モデル(interactive fixed effects)がよく仮定されます:
$Y_{it} = \mu + \alpha_i + \delta_t + \lambda_t^\top \mu_i + \varepsilon_{it}$
- ($\lambda_t \in \mathbb{R}^r$):時点ごとに変動する 共通因子
- ($\mu_i \in \mathbb{R}^r$):各地域の 因子への感度(負荷)
つまり、
「時間軸には 1 本のトレンドだけではなく、少数の共通因子があり、
各ユニットはそれらの因子の組み合わせで異なる軌道を描く」
という世界観です。
SCM 本体では、
- treated(処置ユニット)の ($\mu_{\text{treated}}$) を
- donor(対照群)の ($\mu_j$) の 凸結合 で近似できると仮定し、
- その重みを前処置データから推定します。
ここではアルゴリズムの細部には踏み込まず、
この因子モデルそのものがデータにどれくらい当てはまっているかに注目します。
モデルの整理
ここで一度、モデルを並べて整理してみます。それぞれのモデルは
- DID:
$Y_{it} = \mu + \alpha_i + \delta_t + \varepsilon_{it}$
- SCM の因子モデル:
$Y_{it} = \mu + \alpha_i + \delta_t + \lambda_t^\top \mu_i + \varepsilon_{it}$
のように書けます。
両者の違いは、まさに ($\lambda_t^\top \mu_i$) の有無 です。
- DID:
すべてのユニットが同じトレンド ($\delta_t$) を共有し、違いは水準 ($\alpha_i$) だけ - SCM:
共通因子 ($\lambda_t$) は共有しつつ、
「それをどれだけ受けるか」が ($\mu_i$) によってユニットごとに異なる
という関係になっています。
言い換えると、
DID は「ユニットごとのトレンドの違いは許容しない」世界、
SCM は「少数の因子を通じて、ユニットごとのトレンドの違いを許容する」世界
です。
ただし、SCM の因子モデルも万能ではありません。
($\mu_i$) は時間を通じて固定で、時間で変動するのはあくまで共通因子 ($\lambda_t$) 側だけ、というのはそれなりに強い制約にも見えます。このあたりが、実データに当てはめたときにどう振る舞うかを、これ以降で見ていきます。
実データの推定方針
DID / SCM では、通常は各パラメータをすべて明示的に推定するわけではありません。
とはいえ、これらの手法を適用するためには、
「背後で仮定しているモデルが、少なくとも前処置期間のデータに対してそこそこ当てはまっている」
ことが望まれます。
そこで今回は、DID / SCM が暗黙に想定しているモデルを明示的に推定し、
- DID:2-way fixed effects モデル
- SCM:低ランク因子モデル(ファクターモデル)
について、実際の精度(R²)を確認し、
「因果推論のモデルはどこまで実データと整合的か?」
を眺めてみます。
データ:福井県の月別・市区町村別人口
推定に用いるデータは、福井県の 月別・市区町村別人口 データです。
理由はシンプルで、他の都道府県に比べて圧倒的に整備されているからです。
- 期間:おおよそ 1980 年 〜 2025 年 10 月
- 単位:市区町村 × 月
データは以下から取得できます:
https://www.pref.fukui.lg.jp/doc/toukei-jouhou/zinnkou/jinkou.html
トレンドをざっくり見る
まずは素朴に、いくつかの市の人口推移を見てみます。
たとえば敦賀市・坂井市・鯖江市の人口の推移を重ねると、
パッと見でも「完全に平行とは言い難い」印象を受けます(人によるかもしれませんが)。

そこで、各市町村の人口を「最初の時点 = 100」となるよう正規化し、
全地域を一枚のグラフに重ねてみると、次のような傾向が見て取れます:
- 1980 年代には多くの市町村で人口が増加し、
一時的に 110〜120 まで伸びる自治体もある。 - しかし 2000 年代以降は、ほぼすべての自治体で右下がり。
- 下がり方が緩やかな市もあれば、
かなり急激に減少する小さな町もある。 - 勾配がほぼ平行な自治体もある一方で、
途中から急に傾きが変わる自治体も目立つ。
つまり、
- 「ざっくり見れば、みんな減少傾向」という意味では共通トレンドがありそうだが、
- 減り方(勾配)は自治体によってかなりバラバラで、
DID の「共通トレンド+定数シフト」だけで説明するには心許ない
という感触になります。
人口が突然跳ねたりするのは都市再編とかそういうアレだと思います。
モデルの当てはまりを比較する
ここからは、介入なしの人口パネルに対して
-
DID:2-way fixed effects モデル
$Y_{it} = \mu + \alpha_i + \delta_t + \varepsilon_{it}$ -
SCM:因子モデル(ファクターモデル)
$Y_{it} = \mu + \alpha_i + \delta_t + \lambda_t^\top \mu_i + \varepsilon_{it}$
の 2 つを当てはめ、どちらがどれだけデータを説明できているか を R² で比較します。
このR²は予測ではなく、訓練データに対しどれだけよく適合できているかを見ている点についてはご注意ください。
データ全体のR²
| region | R2_did | R2_scm |
|---|---|---|
| 0.99 | 1.00 |
市町村別 R²
DIDのモデル、SCMのモデル(因子モデル)実際に推定したのがこちらです。
| region | R2_did | R2_scm |
|---|---|---|
| あわら市 | 0.20 | 0.96 |
| おおい町 | -14.35 | 0.87 |
| 勝山市 | 0.76 | 0.88 |
| 南越前町 | -2.05 | 0.89 |
| 坂井市 | 0.22 | 0.42 |
| 大野市 | 0.84 | 0.84 |
| 小浜市 | -0.14 | 0.85 |
| 敦賀市 | 0.85 | 0.92 |
| 永平寺町 | -5.40 | 0.92 |
| 池田町 | -28.88 | 0.73 |
| 福井市 | 0.78 | 0.93 |
| 福井県 | 0.21 | 1.00 |
| 美浜町 | -3.71 | 0.80 |
| 若狭町 | -0.37 | 0.95 |
| 越前市 | 0.87 | 0.88 |
| 越前町 | 0.47 | 0.92 |
| 高浜町 | -14.33 | 0.88 |
| 鯖江市 | -5.51 | 0.04 |
いずれの手法においても、データ全体ではよく説明することが可能です。
しかしながら都市別での結果を見ると、
- DID は 勝山市・敦賀市・越前市などは 0.7〜0.8 程度 とそこそこの当てはまり。一方で おおい町・池田町・高浜町・鯖江市 などは R² が −10〜−30 と、「その市の平均値だけ出しておくモデルよりもはるかに悪い」結果になっています。
これは、「DID のモデルは、全体で見るとよく推定できているが、全く合っていない自治体がいくつか存在する」ことを意味します。
因果効果の推定においては、「全く合っていない自治体」が処置ユニットでなければ大事故にはならない(かもしれない)ですが、少なくとも懸念事項にはなりそうです。
一方で SCM 側の因子モデルでは、多くの市町村で R² ≈ 0.7〜0.95 と、ユニット別トレンド項を追加した効果が出ています。鯖江市だけ極端に低いものの、少なくとも DID よりは大幅に改善されています。
因果推論モデルはどこまで実データと整合的だったか?
今回、福井県の月別・市区町村別人口データを使って、
DID のモデル(共通トレンド + 定数シフト)
SCM のモデル(少数の共通因子 + ユニット別の感度)
が、どの程度データを説明できるかを R² ベースで眺めました。結果を市町村別 R² で見ると、
- DID(2-way FE)は、全体で高い寄与率を持つが、一部の自治体で R² が −10〜−30 と壊滅的。
- 同じデータに因子モデルを当てると、rank=1 でも多くの自治体で 0.8〜0.95 程度。
このことから少なくとも今回のデータに関しては、「DID が仮定するモデルより、SCM の因子モデルの方が、
福井県の人口パネルには整合的そうだ」
というのが素直な結論になります。
しかしながら、この結果はあくまで福井県の人口データにおいての結果であり、DID一般を否定するものではありません。福井県の人口データは共通トレンド(全国的な人口減少)もありつつ、高齢化・合併・ベッドタウン化などで自治体ごとにかなり違う形のトレンドを取ります。つまり、「全部同じトレンドで動いてレベルだけ違う」という DID のモデルには、あまり優しくないデータです。
今回の結果はあくまで、福井県の人口データにおいてDIDのモデルでは説明が難しいユニットが存在するというのみであり、実際の因果推論においてどの手法が適切かは全く別の問題であることに注意してください。
おわりに
今回はDID や SCM が仮定しているモデルが、人口データとどれだけ整合的かを確認しました。データとモデルの整合性の確認という一手間を入れておくと、後から血涙を流す確率が少し減るかもしれません。

