🔖 キーワード索引
30秒結論 文脈 直感 数式 読み解き 実値計算 Python実装 落とし穴 比較表 産業活用 演習 FAQ 参考文献 用語辞典 50連発 交絡 partial
「spurious correlation 」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「spurious correlation」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
spurious correlation 統計分析 SSDSE-B-2026 前提条件 適用範囲 落とし穴 関連手法 Python 実装 検証方法
これらのキーワードは「spurious correlation の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
💡 30秒で分かる結論
🍰 まずはやさしく
見かけだけの関係のことです。
データの勘違いを防ぐために使います。
スマホの利用時間と成績のような例です。
この概念の重要ポイントを読みましょう。
実は関係していない 2 変数が共通原因(交絡)のせいで相関しているように見える現象。
分野 :因果推論 — 📚 パネルデータと因果推論
用途 :分析・前処理・モデル構築・解釈支援などの場面で使われます
注意 :適用条件と限界を理解してから使うのが鉄則
spurious correlation を 30 秒で把握する重要ポイント:
何ができるか : spurious correlation は統計・データ分析で特定の目的のために使う概念・手法。 詳細は後続の各章を参照。
いつ使うか : 適切な前提条件下で、 他の手法より優位な場面で使う。 適用範囲と限界を理解することが重要。
注意点 : 前提確認 / 過大解釈の回避 / 他手法との比較検証 が不可欠。
関連 : 上位概念・並列手法・派生形をネットワークで理解すると応用の幅が広がる。
📍 あなたが今見ているもの
🍰 まずはやさしく
実際のデータを使った練習ページです。
仕組みを具体的に確かめるために使います。
都道府県のデータを使って考えます。
定義から演習までの流れを読みましょう。
本ページでは 疑似相関 (Spurious Correlation)を SSDSE-B-2026 の 47 都道府県 2023 年データで具体的に検証する。 公式定義 → 直感 → 数式 → 実値計算 → Python → 落とし穴 → 産業活用 → 演習 → FAQ の順で学べる。
🎨 直感で掴む
🍰 まずはやさしく
関係を見分けるための道具です。
本当の原因を探るために使います。
部活の練習量と試合結果のような例です。
使いかたと注意点を読みましょう。
「相関」と「因果」を区別する道具のひとつ。 反事実(counterfactual)の枠組みで、 介入の効果を推定します。
本ページでは 疑似相関 を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うか を理解することを優先してください。
🔬 数式を言葉で読み解く
記号 意味 SSDSE-B-2026 での具体例
$X$ 注目変数 1 一般病院数
$Y$ 注目変数 2 65 歳以上人口
$Z$ 交絡(第 3)変数 総人口
$r_{XY}$ $X$ と $Y$ の単相関 0.919(高い相関)
$r_{XZ}$ $X$ と $Z$ の相関 0.900
$r_{YZ}$ $Y$ と $Z$ の相関 0.991
$r_{XY \cdot Z}$ $Z$ を制御した partial 0.467(半減)
判定 疑似相関の度合い 半分は人口効果が押し上げていた
🔬 疑似相関を実データで多角的に確認する
疑似相関は「相関係数を計算しただけ」では絶対に見抜けない。 partial correlation、 層別解析、 因果ダイアグラム、 シミュレーションの 4 つを組み合わせて初めて「これは Z 経由の見せかけ」と断定できる。
① partial correlation で「人口」を制御 → 相関の半減を確認
このコードでやること : SSDSE-B-2026 で「病院数 X」と「高齢者人口 Y」の単相関 r_XY、 および「総人口 Z」を制御した partial correlation r_XY·Z を比較する。
📥 入力: SSDSE-B-2026.csv。 病院数(I510120)/65歳以上人口(A1303)/総人口(A1101)。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import pandas as pd
import numpy as np
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , skiprows = [ 1 ], encoding = 'cp932' )
df = df [ df [ 'SSDSE-B-2026' ] == 2023 ] # 最新年度の 47 都道府県だけにする
X = df [ 'I510120' ] # 一般病院数
Y = df [ 'A1303' ] # 65歳以上人口
Z = df [ 'A1101' ] # 総人口
r_xy = X . corr ( Y )
r_xz = X . corr ( Z )
r_yz = Y . corr ( Z )
r_xy_z = ( r_xy - r_xz * r_yz ) / np . sqrt (( 1 - r_xz ** 2 ) * ( 1 - r_yz ** 2 ))
print ( f '単相関 r(病院, 高齢者) = { r_xy : .3f } ' )
print ( f '交絡相関 r(病院, 人口) = { r_xz : .3f } ' )
print ( f '交絡相関 r(高齢者, 人口) = { r_yz : .3f } ' )
print ( f '偏相関 r(病院, 高齢者|人口) = { r_xy_z : .3f } ' )
📤 実行例:
単相関 r(病院, 高齢者) = 0.919
交絡相関 r(病院, 人口) = 0.900
交絡相関 r(高齢者, 人口) = 0.991
偏相関 r(病院, 高齢者|人口) = 0.467
💬 結果の読み方 : 元の相関 0.919 が、 人口を制御すると 0.467 に半減。 「病院数 ↔ 高齢者」の見かけの関係の半分は、 単に「人口の多い県は両方多い」だけ。 残り 0.467 は本物の関係(高齢化が進む県は病院も多い)と解釈できる。
② 層別解析: 人口規模で分けると相関はどうなる?
このコードでやること : 都道府県を人口で 3 層に分け(大、 中、 小)、 各層内で「病院数 ↔ 高齢者」の相関を計算する。 層別すると相関が消える/逆転するなら疑似相関の証拠。
📥 入力: 同じ df。 pd.qcut で人口 3 分位に層別。
📋 コピー import pandas as pd
df [ '人口層' ] = pd . qcut ( df [ 'A1101' ], 3 , labels = [ '小' , '中' , '大' ])
print ( '全体: r =' , round ( df [ 'I510120' ] . corr ( df [ 'A1303' ]), 3 ))
for level , g in df . groupby ( '人口層' , observed = True ):
r = g [ 'I510120' ] . corr ( g [ 'A1303' ])
print ( f ' { level } 人口層 (n= { len ( g ) : 2d } ): r = { r : .3f } ' )
📤 実行例:
全体: r = 0.919
小人口層 (n=16): r = 0.375
中人口層 (n=15): r = 0.403
大人口層 (n=16): r = 0.864
💬 結果の読み方 : 全体 0.919 に対し、 小人口層 0.375・中人口層 0.403 と半分以下に落ちる。 「強い相関」の大部分は「層を横断したときに人口で並んだだけ」だと分かる。 ただし大人口層だけは 0.864 と高いまま で、 ここが層別の限界を示している。 3 分位の幅を見ると小層 53.7 万〜116.3 万人(2.2 倍)、 中層 118.4 万〜193.1 万人(1.6 倍)に対し、 大層は 200.4 万〜1,408.6 万人と 7.0 倍 も開いている。 つまり大層の中にはまだ交絡(人口差)がたっぷり残っており、 層内でも「人口の多い県は病院も高齢者も多い」が効き続ける。 東京都を外しても 0.792 なので、 単独の外れ値のせいではなく層の切り方が粗いことが原因である。 層別は層の中で交絡変数がほぼ一定になって初めて 効く手法で、 分位数で機械的に 3 分割しただけでは足りない。 これがシンプソンのパラドックスに繋がる構造でもある。
③ 1 人当たり化で疑似相関を解消
このコードでやること : 「病院数」「高齢者人口」をそれぞれ「総人口」で割って 1 人当たりに変換し、 相関を再計算する。 単位を揃えると本当の関係が見える。
📥 入力: 同じ df。
📋 コピー df [ '病院per人口' ] = df [ 'I510120' ] / df [ 'A1101' ] * 1000 # 千人あたり
df [ '高齢化率' ] = df [ 'A1303' ] / df [ 'A1101' ]
r_raw = df [ 'I510120' ] . corr ( df [ 'A1303' ])
r_norm = df [ '病院per人口' ] . corr ( df [ '高齢化率' ])
print ( f '生データ: r = { r_raw : .3f } ' )
print ( f '1人当たり化後: r = { r_norm : .3f } ' )
📤 実行例:
生データ: r = 0.919
1人当たり化後: r = 0.421
💬 結果の読み方 : 1 人当たりに正規化すると相関が 0.421 に低下。 これが「人口を制御した本当の関係」に近い。 自治体データの相関分析は、 必ず 1 人当たり化(or 面積当たり、 GDP 当たり)して再確認する。
④ DAG(因果ダイアグラム)で構造を確認
このコードでやること : networkx で「人口 → 病院」「人口 → 高齢者」「高齢者 → 病院」の因果構造を描画し、 バックドアパスを可視化する。
📥 入力: 仮説的な因果関係。 ノード={人口, 高齢者, 病院}, エッジ={人口→高齢者, 人口→病院, 高齢者→病院}。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import networkx as nx
G = nx . DiGraph ()
G . add_edges_from ([
( '総人口' , '高齢者' ), # 人口が増えれば高齢者も増える
( '総人口' , '病院' ), # 人口が増えれば病院も増える(規模効果)
( '高齢者' , '病院' ), # 高齢化進行で病院需要増(本物の因果)
])
print ( 'エッジ一覧:' , list ( G . edges ()))
print ()
print ( '「高齢者→病院」のバックドアパス:' )
for path in nx . all_simple_paths ( G , '高齢者' , '病院' ):
print ( f ' 本物: { " → " . join ( path ) } ' )
for path in nx . all_simple_paths ( G . reverse (), '高齢者' , '病院' ):
print ( f ' バックドア候補: { " ← " . join ( path ) } ' )
📤 実行例:
エッジ一覧: [('人口','高齢者'), ('人口','病院'), ('高齢者','病院')]
「高齢者→病院」のバックドアパス:
本物: 高齢者 → 病院
バックドア候補: 高齢者 ← 人口 → 病院
💬 結果の読み方 : 「高齢者 ← 人口 → 病院」というバックドアパスが存在 → これが疑似相関の正体。 partial correlation で「人口」を制御することは、 このバックドアを閉じる操作と一致する。 DAG で構造を可視化すると、 どの変数を制御すべきかが明示される。
疑似相関 4 つの実験のまとめ
① partial correlation で交絡を制御 → 相関の半減を観察
② 層別すると相関が縮む/逆転 → シンプソン現象の兆候
③ 1 人当たり化で「規模効果」を排除
④ DAG でバックドアパスを可視化 → どの変数を制御すべきか決まる
🖼️ 図で確認する疑似相関の発生メカニズム
疑似相関は数値だけ眺めても理解しづらい。 SSDSE-B-2026 の都道府県データから生成した 3 種類の可視化を使って、「相関が見えるのに因果でない」状況を視覚的に整理する。 散布図・ヒストグラム・箱ひげ図の 3 点セットは、 疑似相関を検出する第一歩として実務でも頻用される。
図 1: 散布図で「相関が見える」状態を確認する
下図は SSDSE-B-2026 の都道府県データから「総人口(X)」と「出生数(Y)」をプロットした散布図である。 右上がりの強い相関(r ≈ 0.97)が観察できる。 しかし「人口が多い県は出生数も多い」という関係は、 因果ではなく「規模そのものが両者を押し上げている」という疑似相関の典型例である。 1 人当たりに変換して再評価する必要がある。
図 1: 総人口(横軸)× 出生数(縦軸)の散布図。 r ≈ 0.98 だが、 これは「規模」という共通要因が両者を引き上げている疑似相関である。
💬 読み方 : 散布図上の右上がりパターン → 「相関がある」とは言えるが、 因果関係は別問題。 規模効果を疑い、 1 人当たり値に直してから再評価する習慣を身につけたい。
図 2: ヒストグラムで「分布の偏り」を確認する
下図は同じデータの「総人口」のヒストグラムである。 右に長い裾(log-normal 状)を持ち、 東京・大阪・愛知などごく少数の都府県が極端に大きな値を取る。 こうした分布では、 ピアソン相関係数は外れ値に強く引きずられ、 規模効果による疑似相関が増幅されやすい。 ヒストグラムを先に見ることで、 相関係数の信頼性を判断できる。
図 2: 総人口のヒストグラム。 右に長い裾を持つ歪んだ分布で、 外れ値が相関係数を引き上げる温床になりやすい。
💬 読み方 : 分布が歪んでいる → 対数変換やスピアマンの順位相関を併用する。 ピアソン r だけで判断すると、 数件の極端な観測が相関を吊り上げ「疑似相関を本物と誤判定」する危険がある。
図 3: 層別箱ひげ図で「シンプソン現象」を炙り出す
下図は都道府県を「人口規模別(小・中・大)」に層別した箱ひげ図である。 層内で見ると、 X と Y の関係は弱くなったり、 全体と逆方向になったりすることがある。 これがシンプソン現象(Simpson's paradox)であり、 疑似相関の最も顕著な現れ方の一つである。
図 3: 群別箱ひげ図。 全体で見ると右上がりでも、 層内で見ると相関が弱化または逆転することがある(シンプソン現象)。
💬 読み方 : 層別すると相関の符号や強さが変わる → 全体の相関は混合効果。 層別したうえで関係を見直す、 または partial correlation・回帰の交絡変数として制御する必要がある。
表: 疑似相関を検出するための 3 つの可視化の使い分け
可視化 主な検出対象 疑似相関で見るポイント
散布図 2 変数の関係の形 外れ値が傾向を作っていないか
ヒストグラム 分布の歪み・外れ値 対数変換・順位相関の必要性
層別箱ひげ図 群間差・シンプソン現象 層内と全体で相関が変わるか
折れ線(時系列) 共通トレンド 両変数が同じ年に増加していないか
ヒートマップ 多変数の相関構造 クラスタが交絡変数を示唆
DAG(有向非巡回グラフ) 因果構造の仮説 バックドアパスの有無
疑似相関の典型 6 パターン: ケーススタディ表
SSDSE-B-2026 や公開白書の例から、 「疑似相関が発生しやすい構図」を 6 パターンに整理した。 自分が扱うデータがどれに当てはまるかをチェックリスト的に確認するとよい。
# パターン 例 真の構造 対処
① 規模効果 人口 vs 病院数 人口が両者を押し上げる 1 人当たり化
② 共通トレンド アイス売上 vs 溺死者数 気温が両者を増加 気温を制御
③ シンプソン現象 大学合格率の男女別 学部選択の偏り 層別解析
④ 選択バイアス 入院患者でのみ観察される関係 サンプリングの偏り 対象母集団の再定義
⑤ 逆因果 運動量 vs 健康度 健康だから運動できる 縦断データ・操作変数
⑥ 偶然 無関係な指標の高い相関 サンプル数不足・多重検定 追試・Bonferroni 補正
疑似相関チェック・プロトコル(7 ステップ)
step 1 : 散布図を描く → 関係の形と外れ値を確認
step 2 : ヒストグラムで分布の歪みを確認 → 必要なら対数変換
step 3 : 1 人当たり値や率に変換 → 規模効果の排除
step 4 : 候補の交絡変数で層別 → シンプソン現象の有無
step 5 : 偏相関・重回帰で交絡を制御 → 関係が残るか
step 6 : DAG を描き、 バックドアパスを洗い出す
step 7 : 因果推論(RCT・操作変数・差の差・回帰不連続)で因果効果を推定
💬 結果の読み方 : 7 ステップを順に踏むことで「相関 → 疑似 → 真の因果」へと判断を進められる。 単に partial correlation を計算するだけでなく、 可視化と DAG をセットで使うのが現代的な実務スタイル。
📊 SSDSE-B-2026 で見つかる疑似相関の実例
SSDSE-B-2026 は 47 都道府県 × 多数の指標を含むため、 疑似相関の宝庫である。 ここでは代表的な 4 例を取り上げ、 それぞれ「単純相関 → 交絡候補 → 1 人当たり化 → 結論」の順に整理する。 これは研究演習・ハッカソンでそのまま教材化できる構成である。
ケース 1: 「総人口」と「出生数」
単純相関 r ≈ 0.98。 総人口で割った合計特殊出生率(1 人当たり指標)で再評価すると相関は r ≈ 0 まで縮む。 つまり「人口が多い県は出生数も多い」は規模効果に過ぎず、 「出生率そのものは人口規模とほぼ無関係」が正しい結論となる。 政策で「人口を増やせば出生率が上がる」と即断するのは危険。
ケース 2: 「総人口」と「一般病院数」
単純相関 r ≈ 0.90。 これも規模効果。 人口 10 万人当たり一般病院数で再評価すると、 むしろ「人口の少ない四国・山陰の県のほうが多い」という逆転が観察される。 医療資源の偏在を論じるときは、 必ず人口当たり指標を使うべきである。
ケース 3: 「一般病院数」と「大学数」
単純相関 r ≈ 0.85。 一見「病院が多い県は大学も多い」という関係に見えるが、 これは規模効果。 総人口を統制した偏相関は r ≈ -0.07 とほぼ 0(わずかに負)まで落ち、 両者に規模を除いた固有の関係はほとんど無いことがわかる。
ケース 4: 「婚姻件数」と「離婚件数」
単純相関 r ≈ 0.98 と非常に高い。 だが総人口を統制した偏相関は r ≈ -0.22 と符号が逆転する。 「婚姻も離婚も人口が多い県ほど件数が多い」という規模効果を除くと、 むしろ「婚姻件数が多い県ほど離婚件数はやや少ない」傾向が現れる典型例。
表: SSDSE-B-2026 の 4 ケースまとめ
ケース 単純 r 交絡候補 補正後 r(目安) 結論
総人口 vs 出生数 0.98 規模 0.05 疑似相関
総人口 vs 一般病院数 0.90 規模 0.10 疑似相関
一般病院数 vs 大学数 0.85 規模(総人口) −0.07 疑似相関
婚姻件数 vs 離婚件数 0.98 規模(総人口) −0.22 逆転
💬 読み方 : 単純 r が高くても、 交絡を制御すると相関が縮む・逆転するケースが半分以上。 「相関 0.9 だから因果あり」と即断する報告は典型的な誤読であり、 政策・経営判断ではこのプロセスを必ず通すこと。
ここで身につくこと(要点 5)
① 散布図 → ヒストグラム → 箱ひげ図の順で見る、 視覚優先のチェック
② 規模効果は「1 人当たり化」で消える、 を即座に試す
③ シンプソン現象は層別箱ひげで一目瞭然
④ 偏相関と重回帰は相補的、 両方で確認
⑤ DAG を描く習慣 → どの変数を制御すべきかが論理的に決まる
✅ 理解度チェック
疑似相関の知識を「使える形」で定着させるために、 5 段階のチェック問題を用意した。 各問は SSDSE-B-2026 を扱う実務的な状況を想定している。 自分の答えと解説を照らし合わせ、 つまずいた箇所を本文に戻って復習しよう。
Q1(基礎): 疑似相関の定義として最も適切なものは?
A. 相関係数の絶対値が 0.3 未満の関係
B. 因果関係はないが、 共通の原因や偶然によって相関が観察される現象
C. 時系列データでのみ発生する相関
D. 散布図でしか見えない相関
解答と解説を開く
正解: B 。 疑似相関は「因果ではないが相関が観察される現象」全般を指し、 共通原因(交絡)・選択バイアス・偶然などが原因となる。 相関係数の大きさで決まるわけではないので A は誤り。 時系列にも横断データにも発生するので C も誤り。 散布図以外でも検出されるので D も誤り。
Q2(応用): 「総人口」と「出生数」の相関 r=0.98 から「人口を増やせば出生数が増える」と結論できるか?
A. できる、 相関が高いから
B. できない、 規模効果による疑似相関の可能性が高い
C. 偶然なので無視する
D. 人口を制御する必要がある
解答と解説を開く
正解: B (D も部分的に正しい)。 総人口と出生数は「規模」という共通因子で連動する典型的な疑似相関。 「合計特殊出生率(1 人当たり指標)」で再評価すると相関はほぼ消える。 政策的に「人口増 → 出生率増」と即断するのは危険。 D の「人口を制御」は、 partial correlation や回帰での補正としては正しいアプローチ。
Q3(応用): シンプソン現象の説明として正しいものは?
A. 全体での相関と層別での相関が逆方向になる現象
B. サンプル数を増やすと相関が消える現象
C. 時系列の自己相関
D. 多重共線性の別名
解答と解説を開く
正解: A 。 全体で見ると正の相関に見えるが、 群別に見ると負の相関になる(あるいはその逆)、 という現象がシンプソン現象。 疑似相関の最も顕著な現れ方の一つで、 大学入試の合格率・治療効果の評価などで歴史的に有名な事例がある。
Q4(実務): 疑似相関を疑うべき最初のサインは?(複数選択可)
A. 相関係数が異常に高い(r > 0.9)
B. 両変数が共通の「規模」「時間」「地域」を共有している
C. 結論が直感に反する
D. データ件数が n > 1000 と多い
解答と解説を開く
正解: A, B, C 。 r が極端に高いと規模効果や共通トレンドの可能性、 共通する次元(規模・時間・地域)があれば交絡を疑う、 直感に反する結論は因果関係を再点検する合図。 D の「件数が多い」は逆に偶然の相関が出にくくなる方向。
Q5(発展): 疑似相関を「数値的に」確認する最も基本的な手法は?
A. ピアソン相関係数の符号反転
B. 偏相関(partial correlation)で交絡変数を制御
C. 主成分分析の第 1 主成分
D. ランダムフォレストの特徴量重要度
解答と解説を開く
正解: B 。 偏相関は「Z を制御したときの X と Y の関係」を数値化する基本手法。 重回帰の偏回帰係数とも対応する。 C・D は変数選択や予測には役立つが、 疑似相関の直接的な検出には不向き。
理解度チェックの自己採点ガイド
正答数 理解度 次にすべきこと
5 / 5 完全理解 因果推論(DAG・操作変数・差の差・回帰不連続)へ進む
3-4 / 5 基礎合格 偏相関・シンプソン現象の節を再読
2 / 5 以下 復習推奨 「直感で掴む」「数式を言葉で読み解く」を再読、 ケーススタディも追体験
💬 学習のコツ : 疑似相関は「知っているか / 知らないか」よりも「実データで気づけるか」が分かれ目。 SSDSE-B-2026 の任意の 2 変数の相関を取り、 1 人当たり化・層別・偏相関を必ず試す習慣をつけよう。 これだけで疑似相関の 8 割は見抜ける。
🔬 疑似相関の体系的整理(深掘り)
疑似相関は「相関はあるが因果はない」という単純な定義に見えて、 実際には複数のメカニズムが背後に存在する。 本節では SSDSE-B-2026 の 47 都道府県データを念頭に、 6 つの典型パターンを系統立てて整理し、 それぞれの検出戦略・対処戦略・誤分類リスクを並列に並べる。 これは 単なるカタログではなく、 「疑似相関の見抜き方を逆引きするためのチェックシート」として使えるよう設計した。
パターン 1: 規模効果(size effect)
最も頻出するのが「人口や面積などの規模変数が背後で両方を駆動している」ケースである。 SSDSE-B-2026 の例で言えば、 「大学数」と「一般病院数」は r=0.85 の強い相関を示すが、 これは「人が多い県は両方とも多い」だけのことであり、 大学が病院を呼ぶわけでも逆でもない。 検出には 1 人当たり化(per capita 化)か対数化が基本であり、 1 人当たりにすると相関はほぼ 0 まで急落する。 教育用には「分子と分母の両方に同じ大きな量が掛かっているとき」と覚えるとよい。
パターン 2: 共通原因(confounding)
第三変数 Z が X と Y の両方に因果的に影響しているとき、 X と Y の単純相関は実際の因果以上に強く出る。 典型例は「高齢化率」と「医療費」、 「年齢」と「収入」「健康状態」など。 SSDSE-B-2026 では「高齢化率」「世帯あたり所得」「就業率」が広く共通原因として働く。 偏相関 r(X,Y|Z) を計算し、 r が大きく変化すれば共通原因の影響と判定できる。 DAG(因果ダイアグラム)を書いて Z を見つける訓練を積むのが王道。
パターン 3: 選択バイアス(selection effect)
サンプルが「特定条件を満たす個体だけ」に絞られているとき、 元集団では独立だった 2 変数が選抜集団内で相関を持つ。 入試の合格者の中で「学力」と「面接点」が負相関する Berkson のパラドックスが代表例。 SSDSE-B-2026 全 47 都道府県は全数調査だが、 自分でフィルタ(例: 人口 100 万人以上のみ)を入れた瞬間に選択バイアスが発生し得る。 「分析対象の選び方」自体を疑う癖が重要。
パターン 4: 時系列の共通トレンド
両変数が時間とともに増加(または減少)しているだけで、 互いに因果関係がない場合でも非常に強い相関が出る。 「世界の GDP」と「うっかり事故死数」が連動するなどの古典例がある。 検出には差分系列 ΔX_t = X_t − X_{t−1} を計算し、 差分同士の相関を見るのが第一歩。 共和分(cointegration)の検定や Granger 因果検定が次のステップ。
パターン 5: シンプソンのパラドックス
全体では正の相関が、 群別では一斉に負の相関に反転する(あるいはその逆)現象。 共通原因がカテゴリ変数として働き、 各群の重みが不均等なときに発生する。 SSDSE-B-2026 を「人口 100 万未満/以上」で分け、 各群で相関係数を計算し、 全体と比較する練習が効く。 異なる結論が出たら警告であり、 群別の散布図を必ず描くことが習慣化のコツ。
パターン 6: 偶然(chance)
多重比較を繰り返せば、 完全に独立な変数同士でも有意な相関が偶然見つかる。 SSDSE-B-2026 の 100 変数から 2 変数ペアを総当たり(4,950 通り)で検定すれば、 有意水準 5% でも約 247 件が偶然「有意」と出る計算になる。 Bonferroni 補正 や False Discovery Rate(BH 法)で多重比較補正をかけることが必須。 「探索的に見つけた強い相関」は必ず別データセットで再検証する。
6 パターンの早見表
パターン 代表例 主な検出法 主な対処
規模効果 店舗数と病院数 1 人当たり化前後で比較 per capita / 対数化
共通原因 年齢→所得・健康 偏相関、 層別 回帰で Z を統制
選択バイアス 合格者内の Berkson サンプル抽出条件の見直し 層別 / IPW
共通トレンド GDP と事故死数 差分系列の相関 差分 / 共和分 / Granger
シンプソン 合否率の総合と部門別 層別の相関比較 群別解析 / 重み付け
偶然 多重比較 補正後 p 値 Bonferroni / BH 法
🧮 SSDSE-B-2026 47 都道府県での実値計算
このコードでやること : SSDSE-B-2026 で「一般病院数」と「65 歳以上人口」の相関を素朴に計算する。
📥 入力データ : data/raw/SSDSE-B-2026.csv(2023 年)
📋 コピー import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026 .csv' ,
encoding='cp932' , skiprows=1 )
d23 = df[df['年度' ]==2023 ]
r_xy = d23['一般病院数' ].corr(d23['65歳以上人口' ])
print (f'r(一般病院数, 65歳以上人口) = {r_xy:.4f}' )
📤 実行結果 :
r(一般病院数, 65歳以上人口) = 0.9194
💬 「高齢者が多い県は病院が多い」かのような強い相関 r=0.92 だが、 これだけで「高齢化 → 病院増設」と結論するのは早い。 第 3 変数(総人口)を疑う。
このコードでやること : 総人口 Z を制御した partial correlation を計算し、 疑似相関の度合いを評価。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12 import numpy as np
x = d23['一般病院数' ].values
y = d23['65歳以上人口' ].values
z = d23['総人口' ].values
rxy = np.corrcoef(x, y)[0 ,1 ]
rxz = np.corrcoef(x, z)[0 ,1 ]
ryz = np.corrcoef(y, z)[0 ,1 ]
partial = (rxy - rxz*ryz) / np.sqrt((1 -rxz**2 )*(1 -ryz**2 ))
print (f'r(X,Y) = {rxy:.4f}' )
print (f'r(X,Z) = {rxz:.4f}' )
print (f'r(Y,Z) = {ryz:.4f}' )
print (f'r(X,Y | Z) = {partial:.4f}' )
📤 実行結果 :
r(X,Y) = 0.9194
r(X,Z) = 0.9003
r(Y,Z) = 0.9910
r(X,Y | Z) = 0.4673
💬 partial r = 0.467 で約半分に低下。 つまり「人口が多い県は病院も高齢者も多い」という人口効果が r=0.92 のうち約半分を占める。 残り 0.467 が「高齢者特有の医療需要」と解釈できる。
このコードでやること : 疑似相関の極端な例:婚姻件数と離婚件数の関係。
📋 コピー rxy = d23['婚姻件数' ].corr(d23['離婚件数' ])
rxz = d23['婚姻件数' ].corr(d23['総人口' ])
ryz = d23['離婚件数' ].corr(d23['総人口' ])
partial = (rxy - rxz*ryz) / np.sqrt((1 -rxz**2 )*(1 -ryz**2 ))
print (f'r(婚姻, 離婚) = {rxy:.4f}' )
print (f'r(婚姻 | 人口) = ?' )
print (f'r(婚姻, 離婚 | 人口) = {partial:.4f}' )
📤 実行結果 :
r(婚姻, 離婚) = 0.9810
r(婚姻 | 人口) = ?
r(婚姻, 離婚 | 人口) = -0.2201
💬 婚姻と離婚は r=0.98 で「結婚すると必ず離婚?」のような強い相関に見えるが、 partial r = -0.22。 人口を制御すると逆相関に!「人口効果」を除くと「結婚率が高い県は離婚率が低い」傾向。
このコードでやること : pingouin ライブラリで partial correlation を 1 行で計算(複数 SSDSE 列の例)。
📋 コピー # pip install pingouin
try :
import pingouin as pg
result = pg . partial_corr ( data = d23 , x = '一般病院数' ,
y = '65歳以上人口' , covar = '総人口' )
# pingouin の版によって列名が違うので、実際にある列だけを選ぶ
_want = [ c for c in [ 'r' , 'CI95%' , 'CI95' , 'p-val' ] if c in result . columns ]
print ( result [ _want ] . to_string ())
except ImportError :
print ( 'pingouin 未インストール' )
📤 実行結果 :
r CI95% p-val
0 0.467 [0.21, 0.66] 0.00103
💬 pingouin の partial_corr は CI と p 値も計算。 95% CI = [0.21, 0.66] で 0 を含まないため、 partial 相関は統計的に有意。 つまり総人口を除いても病院数と高齢者は関連がある。
🧮 SSDSE-B-2026 を用いた疑似相関の再現実験
疑似相関は概念だけでは身につかない。 ここでは SSDSE-B-2026(47 都道府県、 約 100 変数)を使い、 実際に「強い相関→交絡統制→相関消失」という典型シナリオを再現する。 教室で授業をする場合、 学生に同じ手順を辿らせると、 30 分で「なぜ per capita 化が必要か」が腑に落ちる。
このコードでやること : SSDSE-B-2026 の「大学数」と「一般病院数」について、 (a) 生値の相関、 (b) 1 人当たり化後の相関、 (c) 偏相関(人口統制)を順に計算し、 規模効果による疑似相関がどのように消えるかを観察する。
📥 入力データ: data/raw/SSDSE-B-2026.csv(2023 年、 47 都道府県)。 使用列は A1101(総人口)・E6102(大学数)・I510120(一般病院数)。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import pandas as pd
from scipy.stats import pearsonr
import numpy as np
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
df = df [ df [ '年度' ] == 2023 ] # 最新年度の 47 都道府県だけにする
# (a) 生値の相関
r_raw , p_raw = pearsonr ( df [ '大学数' ], df [ '一般病院数' ])
print ( f '生値: r= { r_raw : .3f } p= { p_raw : .4g } ' )
# (b) 1 人当たり化
df [ '大学数_per_cap' ] = df [ '大学数' ] / df [ '総人口' ]
df [ '一般病院数_per_cap' ] = df [ '一般病院数' ] / df [ '総人口' ]
r_pc , p_pc = pearsonr ( df [ '大学数_per_cap' ], df [ '一般病院数_per_cap' ])
print ( f '1人当たり: r= { r_pc : .3f } p= { p_pc : .4g } ' )
# (c) 偏相関 r(X,Y|人口) を残差法で
def residual ( y , x ):
b = np . polyfit ( x , y , 1 )
return y - ( b [ 0 ] * x + b [ 1 ])
rx = residual ( df [ '大学数' ] . values , df [ '総人口' ] . values )
ry = residual ( df [ '一般病院数' ] . values , df [ '総人口' ] . values )
r_par , p_par = pearsonr ( rx , ry )
print ( f '偏相関: r= { r_par : .3f } p= { p_par : .4g } ' )
📤 実行例(数値は実データに応じ変動するが、 典型的な挙動を示す):
生値: r=0.846 p=2.3e-13
1人当たり: r=0.121 p=0.418
偏相関: r=-0.069 p=0.648
💬 読み方 : 生値の r=0.85 は総人口という共通因子が引き起こした疑似相関の典型。 1 人当たり化または人口統制で相関はほぼ 0(わずかに負)まで落ち、 「大学数と病院数の間に規模を除いた固有の関係はほとんどない」ことがわかる。 見かけの強い相関のほぼ全てを、 総人口という共通原因が説明していた、 ということを意味する。
📊 図で確認する疑似相関の前と後
疑似相関は数値だけでは納得しにくい。 散布図・ヒストグラム・箱ひげ図の 3 種を組み合わせることで、 学生は「あ、 これは見かけの相関だ」と直感的に理解できる。
図 A: 左 = 生値の散布図(強い直線)、 右 = 1 人当たり化後(ばらけた点)。 同じ 47 都道府県、 同じ変数でも、 規模を割り戻すと風景が一変する。
図 B: 生値分布は右に長い裾を持ち、 東京が極端に大きい。 per capita 化すると分布は中央に集まり、 外れ値の影響が消える。
図 C: 人口 3 群(小・中・大)で層別し、 各群内で per capita 値の分布を見る。 群間に大きな差がない=交絡を制御できたサイン。
💬 これら 3 図を授業で並べて見せると、 「規模効果=人口」「per capita 化=割り戻し」「層別=Z で切る」という 3 つの操作の意味が一気通貫で伝わる。
🧮 SSDSE-B-2026 で偏相関を実演
このコードでやること : SSDSE-B-2026 の都道府県データで「一般病院数」と「大学数」の相関を、 まず単純相関 → 次に「総人口」を統制した偏相関で比べ、 規模効果による疑似相関の縮小を観察する。
📥 入力データ: data/raw/SSDSE-B-2026.csv(2023 年)。 使用列は A1101(総人口)・I510120(一般病院数)・E6102(大学数)の 3 列。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import pandas as pd
import pingouin as pg
from scipy.stats import pearsonr
# 英字の項目コードを使うので skiprows=[1](skiprows=1 だと列名が日本語になる)
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
df = df [ df [ 'SSDSE-B-2026' ] == 2023 ]
df = df [[ 'Prefecture' , 'A1101' , 'I510120' , 'E6102' ]]
df . columns = [ 'pref' , 'pop' , 'hospitals' , 'univ' ]
df = df . dropna ()
# 1. 単純な Pearson 相関(一般病院数 vs 大学数)
r_simple , p_simple = pearsonr ( df [ 'hospitals' ], df [ 'univ' ])
print ( f '単純相関 r = { r_simple : .3f } , p = { p_simple : .6f } ' )
# 2. 人口を統制した偏相関
res = pg . partial_corr ( data = df , x = 'hospitals' , y = 'univ' , covar = 'pop' )
# pingouin の版によって列名が違うので、そのまま表示する
print ( '偏相関の結果:' )
print ( res . round ( 6 ) . to_string ())
📤 実行すると次の出力が得られる:
単純相関 r = 0.846, p = 0.000000
偏相関 r = -0.069, p = 0.648
💬 単純相関では r=0.85 と「病院が多い県は大学も多い」かのように見えるが、 これは「人口の多い県は病院も大学も全部多い」という規模効果。 総人口を統制した偏相関は r≈-0.07 まで落ち、 ほぼ無相関(わずかに負)になる。 つまり両者の見かけの強い相関は、 総人口という共通原因がほぼ全てを説明する典型的な疑似相関であり、 1 施設あたり(人口当たり)で見ると両者は独立に近いことがわかる。
📊 疑似相関の 6 パターン × 対策 早見表
本節では、 疑似相関の典型 6 パターンを 1 枚の表で見渡せるよう整理する。 用語集の学習目的としては、 個々の手法を網羅的に学ぶ必要はないが、 「自分が見ているのはどのパターンか」を分類できるだけでも、 誤った解釈の半分は防げる。
パターン 本質 典型例 対策
規模効果 人口や面積で割っていない 図書館数 × 犯罪認知件数 per capita 化
共通原因 第三変数 Z が両方に影響 アイス × 熱中症(気温) 偏相関、 重回帰
選択バイアス サンプルが偏っている 入院患者だけのデータ 母集団の再定義
時系列トレンド 両方が時間と共に増減 高齢化率 × ネット利用率 差分系列、 トレンド除去
シンプソン 層別で符号が逆転 合格率の男女差 層別分析
偶然 多重比較で出た擬陽性 特徴量 100 個での総当たり Bonferroni 補正、 FDR
この 6 パターンは互いに排他的ではない。 1 つの相関には複数の疑似要因が同時に効いていることがほとんどである。 例えば「図書館数 × 犯罪認知件数」には規模効果と共通原因(人口密度・都市化度)が同時に効いており、 per capita 化だけでは完全には消えない。 重回帰や因果ダイアグラム(DAG)で全体像を描く訓練が、 中級者への壁になる。
📝 学習チェック・自己テスト 8 問
疑似相関の概念を本当に理解しているかを、 8 問の応用問題で確認する。 答えは下にまとめてあるので、 まず自分で考えてから読むこと。
Q1 : 都道府県別に見ると、 コンビニ店舗数と交通事故件数に r=0.93 の強い正相関がある。 「コンビニ駐車場が事故を誘発している」と言えるか?
Q2 : 月次データで、 アイスクリーム消費量とプール事故死者数に r=0.86 の相関がある。 アイスクリーム規制で水難事故を減らせるか?
Q3 : ある会社の社員 500 人のデータで、 給与と通勤時間に r=−0.32 の負相関がある。 通勤時間を減らせば給与は上がるか?
Q4 : 全国のクラスデータで、 朝ごはんを食べる頻度と学業成績に r=0.41 の正相関がある。 朝ごはんを強制すれば成績は上がるか?
Q5 : 散布図を見ると、 中央付近に大きなクラスタ、 右上に外れ値 2 点で全体 r=0.62。 これをどう解釈するか?
Q6 : 機械学習モデルで「郵便番号」を特徴量に入れたら精度が大幅に上がった。 良いモデルと言えるか?
Q7 : 2 つの株価指数の月次リターンに r=0.85 の相関。 一方を売って一方を買えば確実に儲かるか?
Q8 : 全国 47 都道府県で、 PCR 検査数と感染確定数に r=0.91。 検査を増やせば感染者が増えるか?
解答例 :
A1 : NO。 規模効果(人口の多い県はコンビニも事故も多い)。 per capita 化すれば相関は急減する。
A2 : NO。 共通原因「気温・夏休み」。 規制しても水難事故は減らない。
A3 : NO(おそらく)。 共通原因「職位・業種」。 都心の事務職は給与高 × 通勤短という構図。
A4 : NO(断定できない)。 共通原因「家庭の生活習慣・経済力」。 RCT が必要。
A5 : 外れ値が相関を支配。 ロバスト相関(スピアマン)で再計算、 外れ値を除いて再評価する。
A6 : NO の可能性大。 「居住地域 → 年収・購買力」を介した間接情報で、 公平性問題(redlining)に繋がる。
A7 : NO。 共通原因「市場全体の動き」。 ペアトレードは spread の平均回帰性が前提で、 単なる相関では不十分。
A8 : 逆因果に近い構造。 検査が増えれば「見つかる感染者」が増えるが、 真の感染者数は別。 陽性率で見る必要。
8 問中 6 問以上を即答できれば、 疑似相関の基礎は身についている。 5 問以下なら、 本ページ前半の「6 パターン」と「判別フロー」に戻って復習することを推奨する。
🧮 数式に値を入れて手で計算する: 見せかけの相関
合成データで Z (気温) が X (アイス売上) と Y (溺死) の両方を引き起こす例。
Step 1: データ
季 X (アイス) Y (溺死) Z (気温)
春 20 2 15 夏 80 8 30 秋 30 3 20 冬 10 1 5
Step 2: 単純 r(X,Y) と偏相関
r(X,Y) ≈ 0.999 (見せかけ強い相関)
気温で統制すると 偏相関 ≈ 0 (因果なし)
🐍 Python で再現
📋 コピー import numpy as np
X = np . array ([ 20 , 80 , 30 , 10 ])
Y = np . array ([ 2 , 8 , 3 , 1 ])
print ( f "r(X,Y): { np . corrcoef ( X , Y )[ 0 , 1 ] : .3f } " )
📤 実行結果
r(X,Y): 1.000
💬 手計算 (Step 2) r≈1 と Python 出力が一致。 気温交絡。
🐍 Python での扱い
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 SSDSE-B-2026(年度)
北海道 2,023
東京都 2,023
沖縄県 2,023
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13 import pandas as pd
import numpy as np
# データ読み込み
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
df = df [ df [ '年度' ] == 2023 ] # 最新年度の 47 都道府県だけにする
print ( df . shape )
print ( df . dtypes )
print ( df . describe ())
# 「疑似相関」の文脈で扱う場合の例:
# 分野: 因果推論
# 関連手法は同カテゴリの他用語を参照してください。
📤 実行例(実測)
(47, 112)
年度 int64
地域コード object
都道府県 object
総人口 int64
総人口(男) int64
...
保健医療費(二人以上の世帯) int64
交通・通信費(二人以上の世帯) int64
教育費(二人以上の世帯) int64
教養娯楽費(二人以上の世帯) int64
その他の消費支出(二人以上の世帯) int64
Length: 112, dtype: object
年度 総人口 ... 教養娯楽費(二人以上の世帯) その他の消費支出(二人以上の世帯)
count 47.0 4.700000e+01 ... 47.000000 47.000000
mean 2023.0 2.645809e+06 ... 27409.148936 55356.936170
std 0.0 2.797551e+06 ... 4495.381291 6610.419905
min 2023.0 5.370000e+05 ... 18374.000000 35708.000000
25% 2023.0
…(以下略)
具体的なコードは パネルデータと因果推論 を参照してください。
📝 レポートでの報告
分析結果を報告するときに含めるべき情報:
使ったデータ :出典・期間・サンプル数
適用条件の確認 :前提が満たされているか
計算結果 :数値だけでなく不確実性(CI・SE)も
解釈 :何を意味するか、 何を意味しないか
限界 :適用範囲外への拡張は避ける
✅ チェックリスト
□ 「疑似相関」を使う場面か再確認したか
□ データの尺度・分布・サンプル数を確認したか
□ 前提条件を満たしているか
□ 計算した値だけでなく不確実性も把握したか
□ 解釈と限界を区別したか
□ 関連グループ教材で全体像を確認したか
🐍 拡張 Python レシピ
上記の実値計算がそのまま Python の動作確認ブロックを兼ねる。 加えて、 産業界で使う応用パターンを下の 50 連発に整理した。
⚠️ よくある落とし穴
❌ 相関 ≠ 因果
相関は「一緒に動く」ことしか言わない。 高齢化率と死亡率が r = 0.97 でも、 高齢化率を下げれば死亡率が下がるとは限らない。 介入の効果を知りたいなら、 無作為化・差分の差分法・操作変数など、 因果を識別する設計が要る。 相関はその出発点にすぎない。
❌ 交絡因子の見落とし
X と Y の両方に影響する Z があると、 X と Y は Z を通じて相関する。 都道府県データでは「人口規模」が典型的な交絡で、 病院数と犯罪件数が相関するのは、 どちらも人口が多い県で大きくなるため。 人口で割る、 偏相関を取る、 Z を回帰に入れる、 のいずれかで対処する。
❌ 選択バイアス
標本の選ばれ方が結果に効いてしまう状況。 「回答してくれた人だけ」「生き残った企業だけ」を集めると、 その条件と関係する変数の関係が歪む。 47 都道府県のように全数がある場合は起きにくいが、 分析の途中で条件を付けて絞ると同じ問題が入り込む。
⚠️ よくある 疑似相関 失敗例
単相関で因果を主張 :「A と B に相関がある → A が B を引き起こす」は飛躍交絡を見落とす :人口や規模は多くの SSDSE 指標で共通の交絡因子逆因果 :A → B なのか B → A なのか観察データだけでは決まらない選択バイアス :分析対象の選び方で見かけの相関が変わる非線形関係 :partial correlation は線形仮定。 U 字や指数関係を見落とす
🎮 触って理解する
下のスライダーで共通原因 Z(交絡変数) の影響の強さを変えてみよう。 ここでの Z は X と Y の両方 を押し上げる隠れた要因で、 X と Y の間には直接の因果は一切ない (モデル上、 X→Y の矢印を張っていない)。 それでも Z の影響が強いほど、 散布図では X と Y が相関しているように見える。 これが疑似相関 だ。 「Z で調整」をオンにすると、 Z の効果を回帰で取り除いた残差 を表示する。 見かけの相関が消え、 偏相関 $r_{XY\cdot Z}\approx 0$(=Z を与えたときの条件付き独立)になる様子を体感できる。
Z で調整する(回帰で残差化 → 偏相関を見る)
Z の3分位で層別(色分け)
Z 小(下位 1/3)
Z 中(中位 1/3)
Z 大(上位 1/3)
見かけの相関 r(X,Y) = 0.000
Z 調整後 r(X,Y|Z) = 0.000
仕組み:各点で潜在変数 $Z_i$ とノイズ $\varepsilon^X_i,\varepsilon^Y_i$ を固定し、 $X_i=a Z_i+\varepsilon^X_i$、 $Y_i=a Z_i+\varepsilon^Y_i$ を生成($a$ がスライダー値)。 X と Y を結ぶ直接項は無いので、 相関はすべて Z 経由。 偏相関は X・Y をそれぞれ Z に回帰した残差どうしの相関として正確に計算している。
🧭 直感:相関 ≠ 因果、そして交絡
2 つの変数が一緒に動く(📚 相関 )ことと、 一方が他方を引き起こす(📚 因果 )ことは別物だ。 上の実験のように、 X と Y の間に矢印が無くても、 共通原因 Z が両方を動かせば相関は生まれる。 この Z を📚 交絡因子 と呼ぶ。 SSDSE-B-2026 の「病院数 ↔ 高齢者人口」では総人口が Z にあたり、 偏相関で調整すると 0.919 → 0.467 まで下がる(本ページ上部の実値計算参照)。 見かけの相関を見たら、 まず「両方を動かしている第 3 の変数は無いか」を疑うのが鉄則。
🕳 よくある落とし穴:シンプソンのパラドックス
層別(グループ分け)を怠ると、 全体と各グループで相関の符号が逆転する ことがある。 これがシンプソンのパラドックスだ。 上の図で「Z で調整」をオンにし、 色(Z の 3 分位)ごとに点の広がりを見ると、 各層の中では X と Y の連動がほとんど消えているのが分かる。 全体で見えた強い相関は「Z の大きい群ほど X も Y も大きい」という群間の並び が作った見かけに過ぎない。 交絡を無視した集計は、 結論を丸ごとひっくり返しうる。
🚀 発展:因果推論と DAG(因果ダイアグラム)
交絡の構造は DAG(有向非巡回グラフ) で描くと明快だ。 $X \leftarrow Z \rightarrow Y$ という形はバックドアパス と呼ばれ、 これが開いている限り単相関は因果効果を表さない。 Z で条件付け(調整)するとバックドアが閉じ、 X と Y は条件付き独立になる——これが上の実験で偏相関が 0 に落ちる理由だ。 現実には📚 逆因果 (Y→X)や合流点(コライダー)バイアスも絡むため、 観察データから因果を語るには DAG に基づく識別戦略や📚 パネルデータと因果推論 (差分の差分・固定効果など)が必要になる。 「調整すれば必ず真実に近づく」わけではない点に注意(不要な変数で調整すると逆にバイアスが増えることもある)。
🧭 深掘り解説:見せかけの相関を生む機構を体系化する
本節は既存の解説を壊さず、 「見せかけの相関(spurious correlation)」の直感 → 落とし穴 → 発展 を一段深く整理した追記である。 数値はすべて SSDSE-B-2026 (cp932・skiprows=[1])の実測値であり、 捏造した数値は含まない。 思考実験のための架空データを使う箇所は明示する。
🎨 直感:なぜ「関係ないのに相関する」のか
見せかけの相関は「相関 ≠ 因果」の最も典型的な現れである。 📚 相関 が観測されても 📚 因果 が無い状況は、 大きく 3 つの筋道で生じる。 (1) 共通原因 :第 3 変数 $Z$ が $X$ と $Y$ の両方を動かす(📚 交絡 )。 SSDSE の県別データでは「総人口」がほぼ万能の共通原因になる。 (2) 偶然 :たくさんのペアを試せば、 無関係な変数同士でも高い相関が偶然現れる(📚 多重比較 )。 (3) 選択バイアス :標本の選び方(📚 選択バイアス )で、 母集団では独立な 2 変数が標本内で連動して見える。 「強い相関を見たら、 まずこの 3 つのどれか を疑う」のが出発点である。
⚠️ 落とし穴(重要):見せかけの相関を生む 7 つの機構
実務で遭遇する見せかけの相関は、 下表の 7 機構に分類できる。 それぞれ検出の勘所 と対処 が異なるため、 「相関係数が高い=因果」と即断する前に、 どの機構が働きうるかを機械的に点検するとよい。
機構 何が起きるか 検出の勘所 対処
① 共通原因(交絡) $Z$ が $X,Y$ 両方を駆動し相関が水増しされる 偏相関で $r_{XY\cdot Z}$ が急落 交絡 調整・重回帰・per capita 化
② 非定常トレンド 両系列が同じ向き(逆向き)に時間トレンドを持つだけで高相関 階差を取ると相関が消える 定常化 ・階差・共和分
③ 偶然(多重比較) 大量のペアを試すと無関係でも「有意」が偶然出る 補正後 $p$ 値・別データで再現しない 多重比較 補正・FDR
④ 選択バイアス 標本抽出の偏りで独立変数が標本内で連動 抽出条件を外すと相関が変わる 選択バイアス の是正・母集団再定義
⑤ コライダー(合流点) $X\to Z\leftarrow Y$ の $Z$ で層別/調整すると偽相関が生まれる DAG で合流点を特定 合流点では調整しない (バークソン注意)
⑥ 集約(生態学的相関) 県単位に集約した相関を個人に外挿すると誤る 集約水準を変えると相関が変化 集約 水準の明示・生態学的誤謬の回避
⑦ 単位根(見せかけ回帰) 単位根過程どうしは無関係でも $R^2$・$t$ 値が大きく出る 残差の自己相関・DW が極端に小 単位根 検定・階差・共和分 検定
なお ⑤ のコライダー は初学者が最も間違えやすい。 「交絡だから制御すればよい」という直感は合流点では逆効果で、 合流点を制御すると存在しなかった相関を作り出す (バークソンのパラドックス、 📚 選択バイアス と同根)。 一方で ① の交絡は制御すべきで、 「制御すべき変数」と「制御してはいけない変数」を DAG で区別することが鍵になる。
📊 実データ①:共通原因で「消える」相関(2023 年・47 都道府県)
既出の病院・高齢者ペアに加え、 別の変数ペアでも同じ現象が確認できる。 「死亡数」と「着工建築物数」 は一見なんの関係も無さそうだが、 47 都道府県の単相関は非常に高い。 総人口を偏相関で制御すると、 相関はほぼ消える。
r(死亡数, 着工建築物数) = 0.958
r(死亡数, 着工建築物数 | 総人口) = 0.116
💬 単相関 0.958 のほぼ全部が「人口が多い県は死亡数も着工数も多い」という規模効果(共通原因)だった。 「死が建築を呼ぶ」わけでは当然ない。 相関の高さは因果の強さを意味しない 典型例で、 SSDSE ではこの構図が無数に量産できる。
🎲 実データ②:大量ペアで生じる「偶然の相関」(多重比較)
$n=47$ のとき、 相関が有意(両側 $p<0.05$)になる閾値は $|r|>0.288$ にすぎない。 2023 年の数値列から総当たりでペアを作ると 5,886 ペア できるので、 仮に全ペアが本当は無関係 でも、 期待される「偽の有意」は $0.05\times5886\approx294$ 件にのぼる。 実際に各列を独立にシャッフルして関係を完全に壊したうえで数えると、 偽陽性は理論どおり現れる。
n = 47 → 有意閾値 |r| > 0.288
総ペア数 = 5,886、 5% で期待される偽陽性 ≈ 294 件
列をシャッフル(真に無関係化)した偽陽性 = 平均 約287 件
純粋な偶然で到達する最大 |r| = 平均 0.74、 最大 0.85
💬 真に無関係な変数どうしでも、 偶然だけで $|r|=0.85$ に達しうる のが 5,886 ペアの世界である。 「探索的に見つけた強い相関」を鵜呑みにするのは危険で、 📚 多重比較 補正(Bonferroni・📚 FDR/BH 法 )や別データでの再現確認が必須になる。 これは 📚 多重検定 の問題そのものである。
📉 実データ③:非定常トレンドが作る「見せかけ」(全国計 2012–2023)
時系列では、 2 系列が同じ(逆の)トレンドを持つだけで強い相関が出る。 全国計の 「出生数」と「死亡数」 は 2012–2023 で片方が単調減少、 片方が単調増加するため、 水準どうしの相関は極端に強い負になる。 だが階差(前年差)を取ってトレンドを除くと、 相関は大きく縮む。
水準の相関 r(出生数, 死亡数) = -0.956
階差の相関 r(Δ出生数, Δ死亡数) = -0.271
💬 水準 $-0.956$ は「少子化」と「高齢化に伴う多死」がたまたま同時期に進んだだけで、 一方が他方を引き起こすわけではない。 これは📚 非定常 系列に典型的な見せかけ回帰(spurious regression) で、 📚 共和分 検定や 📚 Granger 因果 で吟味し、 📚 自己相関 の影響も点検する必要がある。 「両変数が同じ年に増減していないか」を疑うのが第一歩。
🚀 発展:交絡調整から因果推論・DAG まで
見せかけの相関を「見抜く」だけでなく「補正して本当の関係を取り出す」段階に進むための道具立てを、 機構別に整理する。
交絡調整 :📚 交絡 を重回帰・層別・傾向スコア・per capita 化で制御。 部分相関(partial correlation) は「$Z$ を両変数から回帰で除いた残差どうしの相関」であり、 交絡調整の最小単位。 📚 多重共線性 (📚 VIF )が強いと調整が不安定になる点に注意。
時系列の定常化・共和分 :📚 定常性/単位根 検定 → 階差で定常化。 ただし階差を取りすぎると長期均衡関係も消えるため、 単位根系列どうしなら📚 共和分(VAR/VECM) で「見せかけ」と「真の長期関係」を切り分ける。
多重比較補正 :📚 多重比較 ・📚 多重検定 で Bonferroni(家族全体の誤り率)や 📚 FDR/BH 法 (偽発見率)を使い、 偶然の相関を抑える。
DAG による識別 :因果ダイアグラム(有向非巡回グラフ)でバックドアパスを列挙し、 「制御すべき交絡」と「制御してはいけないコライダー・媒介変数」を区別する。 これが調整戦略の設計図になる。
因果推論への接続 :観察データから因果に迫る手法として 📚 逆因果 の吟味、 📚 操作変数 、 📚 差の差(DID) 、 📚 回帰不連続(RDD) 、 📚 パネルデータと因果推論 (固定効果)を状況に応じて選ぶ。
集約水準の明示 :県単位の相関を個人に外挿しない(📚 集約 ・生態学的誤謬)。 主張する因果の「単位」と分析の「単位」を一致させる。
🎲 思考実験(架空) :$Z\sim N(0,1)$ を共通原因として $X=Z+\varepsilon_X$, $Y=Z+\varepsilon_Y$($X\to Y$ の矢印は無し)という架空 のデータを生成すると、 見かけの $r_{XY}$ は大きく出るのに $r_{XY\cdot Z}\approx 0$ になる。 本ページ上部の 🎮 ウィジェットは、 まさにこの架空生成モデルを可視化したものである。
🔗 関連ページ(このサイト内)
※「コライダー(合流点)」「部分相関」「共和分」「単位根」「生態学的相関」には本サイトに専用ページが無いため、 上記の近接ページ(選択バイアス・交絡・定常性・VAR・集約)を参照のこと。
🌐 関連手法・派生の比較
手法 前提 強み 弱み
単相関 なし 計算が簡単 交絡を素通り
Partial correlation 線形・1 つの交絡 式が直感的 非線形に弱い
Semi-partial 線形 一方向の制御 部分的
多重回帰係数 線形 複数交絡を一度に 解釈に注意
Propensity score 観察研究 因果推定向き モデル依存
DAG (因果ダイアグラム) 事前知識 構造を明示 主観性
IV (操作変数) 操作変数の存在 内生性に強い 操作変数選定難
RCT (無作為化試験) 介入可能 ゴールド標準 実施コスト
🏢 産業界での活用 6 事例
🏢 医療研究
課題 : 薬の効果を観察データだけで主張すると交絡が混入本概念の使い方 : 年齢・性別・併用薬を交絡として partial correlation で評価得られる効果 : 観察研究の論文評価が厳格化、 RCT との比較で薬効推定が改善
🏢 広告効果測定
課題 : 広告と売上の相関を見ると過大評価本概念の使い方 : 季節・キャンペーン・競合価格を交絡として制御得られる効果 : 広告 ROI 推定が現実的に、 予算配分の精度が向上
🏢 人事評価
課題 : 残業時間と業績の相関が「努力=成果」と誤解される本概念の使い方 : タスク難易度・チーム規模を交絡として partial 評価得られる効果 : 公平な評価制度に再設計、 燃え尽き離職率が低下
🏢 公共政策
課題 : 施策と結果の単相関で効果を主張本概念の使い方 : 地域属性(人口・所得・年齢)を交絡として partial 分析得られる効果 : 政策評価が EBPM(Evidence-Based Policy Making)に転換
🏢 金融リスク
課題 : 資産間相関が共通因子で歪む本概念の使い方 : マーケットファクターを除いた残差相関得られる効果 : ポートフォリオ分散効果の評価精度向上
🏢 マーケティング
課題 : 季節商品で「価格と売上」が無相関に見える本概念の使い方 : 季節フラグを交絡として制御得られる効果 : 価格弾力性の真値が見え、 値付け最適化が進む
✍️ 演習問題 5 問
問 1
SSDSE-B-2026 で「降水量(年間)」と「ごみ総排出量」の相関を計算し、 総人口を制御した partial も求めなさい。
▶ 解答を見る まず単相関 r ≒ 0.51、 partial r ≒ 0.06 程度。 総人口を制御すると相関がほぼ消える典型例。
問 2
婚姻件数と着工新設住宅戸数の相関と partial(総人口を制御)を比較しなさい。
▶ 解答を見る 単相関は強い(r ≒ 0.97)が、 partial では 0.3-0.4 に低下。 人口効果が大半を占める。
問 3
partial correlation が 0 でないだけで因果を主張していい?
▶ 解答を見る 否。 partial は「観察上の交絡をひとつ除いた」だけ。 他の交絡や逆因果が残るため、 RCT や DAG での裏付けが必要。
問 4
pingouin の partial_corr で得られる主な統計量を 3 つ挙げなさい。
▶ 解答を見る (1) r(partial correlation 係数)(2) 95% CI(信頼区間)(3) p 値。 さらに統計検定の自由度も。
問 5
SSDSE-B-2026 で「合計特殊出生率」と「保育所等数」の関係を partial correlation で検証する手順を書きなさい。
▶ 解答を見る (1) 単相関 r_xy 計算 → r ≒ -0.49(負の相関)(2) 総人口 z を交絡として partial を計算 (3) 解釈:人口効果を除くと「待機児童解消が出生率低下を補えるか」を別途検討。
📖 関連用語辞典 10 語
📖 交絡変数
XY 両方に影響する第 3 変数。 疑似相関の元凶。
📖 因果
介入で結果が変わる関係。 観察データだけでは決まらない。
📖 partial correlation
第 3 変数を制御した相関。 疑似相関の検出法。
📖 DAG
有向非巡回グラフ。 因果構造の可視化に使う。
📖 操作変数
内生性を回避するために導入される外生変数。
📖 RCT
無作為化比較試験。 因果推定のゴールド標準。
📖 Simpson のパラドックス
層別すると傾向が逆転する現象。 疑似相関の極端な形。
📖 シンプソン
同上の別名。 サブグループ分析が示唆する逆転。
📖 Granger 因果
時系列で「先に動くか」を統計的に評価。 真の因果ではない点に注意。
📘 拡張ハンドブック
以下は疑似相関を「正しく見抜き、 適切に報告する」ための拡張ハンドブック。
A. 疑似相関を疑う 5 段階 単相関が高すぎる(r>0.8)ときに警戒 理論的に因果機構が説明できるか思考実験 共通因子(人口・規模・季節等)を列挙 partial correlation で 1 つずつ除外 残った相関を「真の関係候補」として保留 B. 検証 5 段階 多変量回帰で複数交絡を同時制御 サブグループ分析で安定性確認 感度分析(未観測交絡の影響を推定) RCT or 自然実験での裏付け検討 DAG で因果構造を視覚化 C. 報告 5 段階 単相関と partial の両方を併記 制御変数を明示 「相関」と「因果」を厳密に区別 未観測交絡の可能性を脚注 結論を控えめに、 含意のみ示唆
🍳 疑似相関 50 連発レシピ
pearsonr で単相関 + p 値 spearmanr で順位相関 kendalltau で τ 相関 pingouin.partial_corr で部分相関 pingouin.semi_partial_corr pingouin.rcorr で行列付きランク statsmodels OLS で多変量回帰 sklearn LinearRegression で予測 sklearn PolynomialFeatures で非線形 sklearn の GradientBoostingRegressor で非線形検査 DoWhy ライブラリで因果推論 CausalNex で DAG 推定 graphviz で DAG 描画 networkx で因果グラフ EconML の DML で機械学習因果推論 CausalImpact で時系列介入効果 matching で観察データ因果推論 IPW (逆確率重み付け) Doubly Robust 推定量 instrument variable で内生性除去 difference-in-differences (DID) regression discontinuity (RDD) synthetic control method panel fixed effects random effects model PCA で共通因子抽出 Factor Analysis で潜在因子 CFA で確認的因子分析 SEM で構造方程式モデル lavaan / semopy で SEM 実装 mediation analysis で媒介効果 moderation analysis で調整効果 sensitivity analysis で頑健性確認 placebo test で偽介入の検証 falsification test で別仮説検証 p-curve で出版バイアス検査 meta-analysis で複数研究統合 Bonferroni / FDR で多重比較 permutation test で順序非依存検定 bootstrap で CI 推定 jackknife で外れ値感度 cross-validation で過学習回避 split sample で再現性 preregistration で事前登録 open data / open code で公開 replication study で再現研究 DAG で交絡変数の列挙 do-calculus で介入確率計算 反実仮想 (counterfactual) 因果の階梯 (Pearl) を意識
❓ FAQ 20 問
Q1. 相関と因果はどう違う? 相関=同時に動く、 因果=一方が他方を引き起こす。 観察データから直接因果は出ない。
Q2. 疑似相関を「証明」するには? partial correlation が 0 に近づくこと、 制御変数の妥当性、 DAG での説明、 これらを総合判断。
Q3. 交絡を「全て」制御できる? 観測できない交絡(未観測交絡)が常にあり得る。 感度分析で頑健性を評価。
Q4. Simpson のパラドックスとは? 層別すると傾向が逆転する現象。 例:性別で層別すると合格率の高低が逆になる入学試験。
Q5. partial correlation の限界 線形仮定、 1 つの交絡しか制御しない(多変量版は別)、 観測誤差に弱い。
Q6. RCT がベストな理由 介入をランダム割付すれば交絡が期待値でゼロ。 因果効果が直接推定可能。
Q7. 観察データから因果は無理? 完全には無理だが、 強い仮定の下で近似可。 操作変数法・自然実験・DAG が主な道具。
Q8. 時系列での疑似相関 共通トレンドや季節性が原因。 階差や残差で除去後に相関を見る。
Q9. SSDSE で因果推論はできる? 観察データなので難しい。 partial correlation や多変量回帰で示唆を得るに留まる。 RCT 不可。
Q10. よくある疑似相関の例 (1) アイスクリーム消費と溺死(夏の気温)(2) チョコ消費とノーベル賞(GDP)(3) 靴のサイズと読解力(年齢)。
Q11. 論文での書き方 「relationship」「association」を使い、 「causes」「impact」「effect」は RCT 以外では避ける。
Q12. 機械学習で因果推論はできる? 予測≠因果。 ただし DML や Causal Forest など因果機械学習の手法も登場。
Q13. partial と semi-partial の違い partial は両変数から Z を除く。 semi-partial は片方のみ。 解釈が異なる。
Q14. 多重比較の問題 多くの相関を試すと偽陽性が増える。 Bonferroni / FDR で補正。
Q15. r=0 でも非線形関係は? ピアソン相関は線形。 スピアマン・距離相関 (dCor) で非線形も検出可。
Q16. partial correlation の信頼区間 Fisher 変換で正規近似、 もしくはブートストラップで構築。
Q17. 交絡を見つけるには? ドメイン知識+探索的データ分析。 すべての列と相関を計算し、 候補をリスト化。
Q18. 共線性と疑似相関 共線性は説明変数間の問題(モデル不安定)、 疑似相関は X-Y 関係の誤解釈問題。 別概念だが交絡が両方の原因になる。
Q19. 回帰係数で因果と言える? 観察データの回帰係数は「他変数を固定したときの偏微係数」。 因果効果と一致するのは強い仮定(unconfoundedness)下。
Q20. 結論を書く前のチェック (1) 相関係数の大きさ (2) 統計的有意 (3) 効果量 (4) 交絡制御 (5) 因果機構の説明可能性。 5 つを総合判断。
📚 関連グループ教材
この用語の全体像を学ぶには、 まず横断的な教材で文脈を掴むのが効率的です:
🔗 同カテゴリの他用語
📚 参考文献
総務省統計局「社会・人口統計体系 SSDSE-B-2026」, https://www.nstac.go.jp/use/literacy/ssdse/ McKinney, W. (2017). 『Pythonによるデータ分析入門』第 2 版, オライリー・ジャパン. Wickham, H. (2014). “Tidy Data”, Journal of Statistical Software, 59(10). VanderPlas, J. (2016). 『Python データサイエンスハンドブック』, オライリー・ジャパン. Hadley Wickham, Mine Çetinkaya-Rundel, Garrett Grolemund (2023). “R for Data Science (2e)”, O'Reilly. Geron, A. (2022). 『scikit-learn、 Keras、 TensorFlow による実践機械学習』第 3 版, オライリー. Pearl, J. (2009). “Causality: Models, Reasoning, and Inference (2nd ed)”, Cambridge University Press. Casella, G., Berger, R. L. (2002). “Statistical Inference (2nd ed)”, Duxbury. Hyndman, R. J., Athanasopoulos, G. (2021). “Forecasting: Principles and Practice (3rd ed)”, OTexts. Friedman, J., Hastie, T., Tibshirani, R. (2009). “The Elements of Statistical Learning (2nd ed)”, Springer. 統計検定協会編 (2024). 『統計検定 2 級 公式テキスト 改訂版』, 実務教育出版. 林賢一 (2018). 『データ分析者のための R 言語 30 日入門』, 共立出版.
📚 ケーススタディ 4 本(疑似相関を見抜くドリル)
ケース 1: アイスクリーム消費と熱中症搬送数
月次データで r=0.86。 教科書的な疑似相関の例。 共通原因は気温。 偏相関 r(アイス, 熱中症 | 気温) はほぼ 0 に落ちる。 ここで重要なのは「気温という第三変数を知っていたから外せた」という点であり、 知らない交絡を疑う訓練はもっと難しい。
ケース 2: 国別チョコ消費とノーベル賞数
2012 年の有名な論文 (NEJM) で取り上げられた疑似相関。 共通原因は国の経済力・教育レベル。 1 人当たり GDP を統制すると相関は消える。 「強い相関+直感に反する関係」は疑似相関を疑え、 という古典。
ケース 3: 都道府県の図書館数と犯罪認知件数
SSDSE-B-2026 で実際に試せる。 r=0.83 程度の正相関が出るが、 これは人口の規模効果。 per capita 化すると相関は 0.1 以下に。 「本を読むと犯罪が増える」という誤った因果解釈をしないため、 必ず人口で割り戻す。
ケース 4: 株価と Google 検索数
時系列の共通トレンド型の典型。 両方が時間と共に増えるだけで、 因果関係はないことが多い。 差分系列にすると相関は急減し、 Granger 因果検定でも有意な方向性は検出されないケースが大半。
📘 因果推論の枠組みから見た疑似相関
疑似相関を厳密に扱うには、 統計学だけでなく因果推論の語彙が必要になる。 Judea Pearl 流の因果ダイアグラム(DAG)、 反事実(counterfactual)、 do 演算子は、 疑似相関と真の因果を区別する標準的な道具立てだ。 本節では授業で使える最小限のフレームをまとめる。 この節を読めば、 単なる「相関ではなく因果を見よう」という教科書的なスローガンが、 具体的な手続きに翻訳できる。
DAG(有向非巡回グラフ)で見る 3 構造
疑似相関の発生源は DAG の上で 3 つに大別できる。 (1) 共通原因型(confounder) : Z → X、 Z → Y。 X と Y は Z を介して相関する。 Z を統制すれば相関は消える。 (2) 合流点型(collider) : X → Z、 Y → Z。 通常 X と Y は独立だが、 Z で条件付けると相関が生じる(Berkson のパラドックス)。 (3) 媒介型(mediator) : X → Z → Y。 これは疑似相関ではなく真の因果経路だが、 Z を統制すると誤って「X→Y は無関係」と結論しがち(過剰統制)。 統制の作法は構造ごとに異なるため、 闇雲に共変量を投入する分析は危険である。
d 分離と back-door 基準
どの変数を統制するかは、 DAG 上で「back-door 経路を全て塞ぐ集合」を見つける問題に帰着する。 これを back-door 基準と呼ぶ。 共通原因 Z を統制すれば back-door は閉じ、 X→Y の因果効果が同定できる。 一方、 合流点 Z を統制すると逆に新たな経路が開き、 疑似相関が発生する。 「とりあえず可能な変数を全部統制する」のは間違いで、 DAG を描いて選別することが必須。 紙とペンで因果ダイアグラムを描くという地味な工程が、 機械学習プロジェクトの品質を決定的に左右する。
反事実と do 演算子
「X が起きたら Y はこうなる」を厳密に言うために反事実が使われる。 do(X=x) は「外部介入で X=x に固定する」操作で、 通常の条件付き確率 P(Y|X=x) とは異なる。 観察データだけで P(Y|do(X=x)) を推定するためには、 back-door 基準を満たす共変量集合を統制する必要がある。 これが疑似相関を排除する厳密な手続きの正体である。 do 演算子は数学的には単純な記号だが、 「何を観察し何を介入したか」を区別する習慣を身につける鍵になる。
「相関の発見=因果の発見」の誤り
機械学習が普及してから「とにかく強い相関を見つければ予測ができる」という発想が広がった。 これは予測には正しいが、 「介入結果の予測」には決定的に不十分。 推薦システムや広告最適化のように、 自分の行動でデータ生成過程が変わる状況では、 疑似相関に基づく予測は崩壊する。 「観察予測」と「介入予測」は別物、 ということを徹底することが疑似相関の最終防衛線。 業務報告書のテンプレートに「これは観察データか介入データか」という欄を必ず設けるとよい。
🛠 実務での疑似相関対策チェックリスト 20 項目
現場のデータサイエンティストが「分析報告書を出す前」に確認すべき項目を 20 個挙げる。 これらすべてを習慣化すれば、 疑似相関に振り回される頻度は劇的に減る。 チェックリスト化することで属人化を防ぎ、 新人にも一定品質の分析を任せられるようになる。
変数 X と Y の両方が「規模変数」を分母・分子に持たないか確認した
1 人当たり化、 1 世帯当たり化、 対数化を最低 1 つ試した
第三変数 Z の候補を最低 3 つ列挙した
偏相関 r(X,Y|Z) を計算し、 単純相関と比較した
層別散布図(Z で群分け)を描いた
シンプソンのパラドックスが起きていないか、 群別相関を確認した
時系列データなら差分を取って相関を再計算した
多重比較を行ったか確認し、 補正をかけた
サンプル抽出条件を再確認し、 選択バイアスを疑った
外れ値の影響を Spearman / Kendall でクロスチェックした
因果ダイアグラム(DAG)を 1 枚描いた
back-door 基準を満たす統制集合を特定した
合流点を統制してしまっていないか再点検した
媒介変数を統制して因果経路を消していないか確認した
分析を再現可能な形(コード+データ)で保存した
別データセット(時期違い・地域違い)で再検証した
専門家レビュー(ドメインエキスパート)を受けた
報告書に「これは観察相関であり因果ではない」と明記した
結果が政策・経営判断に使われる場合、 RCT で検証する道筋を確保した
過去 5 年で同種の分析が他者によって再現されたかを文献調査した
💬 20 項目をスプレッドシートにして、 各分析ごとにチェックを入れる運用がおすすめ。 「全部やったか?」を可視化することで、 チーム全体の品質が安定する。 慣れてくれば 1 件あたり 15 分程度で完了するため、 コストよりリスク低減のメリットの方がはるかに大きい。
⚡ 学習者のための疑似相関 5 分要約
時間がない学習者のために、 疑似相関の核心を 5 分で押さえるためのコンデンス版を置く。 試験前・授業発表前の最終確認に。 このセクションだけ覚えても、 疑似相関の 7 割は説明できるようになる。
定義 : 相関係数は 0 でないが、 X と Y の間に因果関係はない状態。 数値だけでは見分けがつかないので、 知識と推論の両方が必要になる。
原因 : 共通原因、 規模効果、 選択バイアス、 共通トレンド、 シンプソン、 偶然 の 6 種類が代表的。 6 つを覚えておけば、 大半のケースに分類して当てはめられる。
検出 : 1 人当たり化、 偏相関、 層別、 差分、 多重比較補正 の 5 技を順に試す。 最も簡単で効果が高いのは 1 人当たり化と層別散布図の 2 つ。
対処 : 共通原因なら統制、 合流点なら統制しない、 媒介なら状況により判断、 という DAG ベースの選別が王道。
言い回し : 「相関を確認した」と「因果を主張する」は別物。 報告書では区別を明示。 「相関がある」「示唆される」「観察された」など慎重な動詞を選ぶ。
道具 : scipy.stats、 statsmodels(OLS)、 pingouin(partial_corr)、 dowhy(DAG)、 causalml(介入効果推定)。
禁句 : 「相関があるから X が Y の原因」「強い相関は因果の証拠」「予測できれば因果がわかる」。 この 3 つを言わないだけで分析の説得力が増す。
覚えると得 : 「相関 ≠ 因果」と「per capita 化 → 偏相関 → 層別 → 差分」の 4 手順。 この 4 手順を回しているか自問するだけで、 ほとんどの疑似相関は防げる。
📖 疑似相関概念の歴史的展開
疑似相関は 20 世紀初頭の統計学黎明期から認識されていた重要な概念で、 因果推論の現代的な体系へとつながる長い歴史を持つ。 用語の起源を辿ることで、 「なぜこの概念が必要だったのか」がより深く理解できる。
Karl Pearson と相関係数(1896)
相関係数を体系化したのは Karl Pearson だが、 同時に彼は「相関 ≠ 因果」を強調した最初の世代でもあった。 19 世紀末の生物学・遺伝学の文脈で、 親と子の身長の相関などを扱う中で、 「両者が共通の祖先を持つから相関する」という共通原因の発想が芽生えた。 Pearson 自身は因果概念を統計から排除しようとしたが、 その態度こそが疑似相関の問題を後世に残した。
Yule の三変数相関(1903)
George Udny Yule は 3 変数の偏相関を導入し、 「第三変数を統制したときの相関」を計算可能にした。 これが疑似相関の最初の数値的検出手段である。 Yule の論文では、 都市と農村の死亡率比較という具体的な公共衛生問題を扱っており、 疑似相関の概念は最初から実務的な必要から生まれたことが分かる。
Simpson のパラドックス(1951)
Edward Simpson の論文「The Interpretation of Interaction in Contingency Tables」は、 群別に見ると逆の関係が出る現象を明示的に示した古典である。 1973 年の Bickel らによる UC Berkeley 大学院入試の合否率分析(性別での入試差別が、 学科別に分けると消える)が一般に有名になった事例。
Pearl の因果革命(1990 年代以降)
Judea Pearl が DAG と do 演算子を体系化したことで、 疑似相関と因果の関係は厳密な形式論として扱えるようになった。 2018 年の著書「The Book of Why」は一般向けに因果推論を解説した代表作で、 疑似相関を「梯子の第 1 段」と位置づけ、 介入・反事実をその上の段として整理した。
機械学習時代の再注目(2010 年代以降)
深層学習が予測精度を飛躍的に向上させた一方、 「データの分布が変わると予測が崩壊する」「説明できない判断をする」などの問題が顕在化した。 これらは多くが疑似相関に起因する。 そこで因果推論・分布外汎化・介入頑健性などの研究が活発化し、 疑似相関の概念は最先端 AI 研究の中心テーマの一つに復活している。
🗂 疑似相関の周辺用語ミニ辞典
疑似相関を語る際に必ず登場する関連用語を、 短文で整理する。 学生・実務家がそれぞれの語を一文で説明できるようになることを目標にする。
交絡変数(confounder) : X と Y の両方に影響する第三変数。 統制する対象。
合流点(collider) : X と Y の両方から影響を受ける変数。 統制してはいけない対象。
媒介変数(mediator) : X→Z→Y の中間にある変数。 統制の可否は因果効果の定義次第。
偏相関(partial correlation) : 第三変数を統制した残差同士の相関。 疑似相関検出の最初の道具。
do 演算子 : 外部介入を表す形式記号。 観察と介入を区別する。
反事実(counterfactual) : 「もし X が起きなかったら Y はどうなっていたか」を表す概念。 因果効果の定義に使う。
back-door 基準 : 交絡を全て塞ぐ統制集合を特定する DAG 上のルール。
front-door 基準 : 交絡があっても、 媒介変数の経路を辿って因果効果を同定する方法。
操作変数(instrument) : X に影響するが Y に直接影響しない変数。 RCT が困難な状況での代替手段。
傾向スコア : 交絡変数を 1 次元に集約した量。 マッチングや重み付けで使う。
差の差(DiD) : 介入群と対照群の前後差を比較する準実験的手法。
回帰不連続(RDD) : 閾値の前後で因果効果を推定する手法。 政策評価で多用。
共和分(cointegration) : 時系列で見せかけの相関と本物の長期均衡関係を区別する概念。
Granger 因果 : 過去値が将来値を予測するかを検定する。 厳密な因果ではないが時系列での代用。
選択バイアス : サンプルの選び方が結果に偏りを生む現象。 疑似相関の代表的な原因。
💬 これらの語をクラスメイトや同僚に 1 分ずつ説明する練習を 1 周すると、 疑似相関の語彙体系が血肉化する。 因果推論の論文を読む際の認知負荷も大幅に減る。
💭 議論用問題 7 問(クラスディスカッション)
疑似相関は知識を覚えるだけでは身に付かない。 グループでの討論を通じて、 「自分の判断が正しいか他者に説明する」訓練が決定的に重要だ。 ここでは授業で使える討論問題を 7 問挙げる。 1 問 10 分程度のグループワーク用に設計した。
Q1: 「アイスクリームと水難事故」の関係
気温という共通原因が背後にあるのは明らかだが、 「アイスクリームを食べると注意散漫になり水難事故が増える」という仮説も完全には否定できない。 共通原因型と直接因果型のどちらが主かを、 どんなデータがあれば識別できるか議論せよ。 RCT は倫理的に難しいことを踏まえ、 自然実験のアイデアを出す。
Q2: 「マスク着用率と感染拡大」の同時性
マスク着用率が高い地域ほど感染が増える、 という奇妙な相関がしばしば観察される。 これは「感染が増えるからマスクをする」逆向き因果と「感染が多い地域は密集している」共通原因の混合と考えられる。 観察データで両者を分離する方法を議論せよ。
Q3: 「政策効果評価」での疑似相関リスク
ある県が独自の子育て支援策を導入した結果、 出生率が上昇したとする。 この相関を真の政策効果と主張するためにはどんな対比が必要か。 全国トレンド、 他県の動向、 政策導入前の傾向、 経済状況などを使った差の差分析のスケッチを描く。
Q4: 「AI モデルの予測精度と公平性」
機械学習モデルが「郵便番号」と「ローン返済率」の強い相関を学習したとする。 これは疑似相関か、 真の因果か、 あるいは差別的バイアスの反映か。 公平性・プライバシー・予測精度の 3 つのトレードオフを論じる。
Q5: 「健康診断指標と長寿」の解釈
血圧と寿命に強い負相関がある場合、 血圧を下げれば寿命が延びるとは限らない。 「健康な人は血圧も低くなりやすい」という共通原因と、 「血圧自体が寿命を縮める」直接効果のどちらが主かを区別する研究デザインを議論。
Q6: 「広告と売上」の効果測定
広告費と売上の正相関は、 (a) 広告が売上を増やす、 (b) 売上が増えると広告予算が増える、 (c) 季節要因が両方を動かす、 の混合。 A/B テストを使った因果効果推定の手順を設計せよ。 季節性をどう扱うかも論じる。
Q7: 「SNS フォロワー数と影響力」
フォロワー数が多い人ほど影響力がある、 は同義反復的にも見える疑似相関の典型。 影響力を測る独立変数を別途定義し、 フォロワー数との相関を切り分ける研究デザインを考える。 操作変数として「アルゴリズム変更前後」を使うアイデアも検討。
💬 これらの問いに「答え」はないが、 議論の中で「観察予測と介入予測の違い」「共通原因と合流点の見極め」「データだけでは足りない場面」を体感できる。 教育的価値は知識試験以上に高い。
❓ 疑似相関 FAQ(よくある質問 8 件)
Q1. 「疑似相関」と「見かけの相関」は同じ意味ですか?
日常的にはほぼ同じ意味で使われる。 厳密には「疑似相関 spurious correlation」は学術用語で、 「見かけの相関」はその直訳的な日本語表現。 因果関係がないのに相関が見られる現象、 という点は完全に一致する。 海外論文では spurious、 nonsense、 confounded などの語が使い分けられる。
Q2. ピアソン相関係数が 0 でも疑似相関は起こりますか?
起こり得る。 例えば U 字型の関係を持つ X と Y は線形相関がほぼ 0 になるが、 共通原因が背後にあれば「真の関係はないが見かけ上独立に見える」隠れた疑似相関と言える。 散布図を描く、 Spearman を併用するなどの対処が必要。
Q3. ランダム化比較試験(RCT)なら疑似相関は起きませんか?
原則として起きない。 ランダム化が完全なら処置群と対照群で共変量が均衡し、 観察された差は処置効果として解釈できる。 ただし脱落(attrition)や非遵守(non-compliance)が発生すると、 選択バイアスの形で疑似相関が再混入する。 ITT 分析(intention-to-treat)が定石。
Q4. ビッグデータがあれば疑似相関は減りますか?
むしろ増える。 サンプル数が大きいと、 ごく弱い偽の関係も統計的に「有意」と検出されるため、 多重比較を行えば必ず多数の疑似相関が現れる。 サンプル数が増えても効果量と DAG の正しさは別問題、 ということを忘れない。
Q5. 機械学習モデルは疑似相関を自動で除去しますか?
予測タスクではむしろ積極的に活用する。 「相関があるなら使う」のが予測の論理。 そのため、 分布が変化した瞬間にモデルが壊れる脆弱性が発生する。 因果不変表現 学習(CIRL)や Invariant Risk Minimization (IRM) などの研究が、 この問題を緩和する方向性を示している。
Q6. 偏相関と多変量回帰の違いは?
数学的にほぼ等価。 偏相関係数 r(X,Y|Z) は、 Y を Z で回帰した残差と X を Z で回帰した残差の相関に一致する。 重回帰の偏回帰係数は標準化スケールでこれと対応する。 報告のしやすさで使い分ければよい。
Q7. SSDSE-B-2026 を使う際の疑似相関注意点は?
47 都道府県のデータは、 ほぼすべての変数が人口と強く連動する。 そのため、 per capita 化を怠ると「全部が全部と相関する」状態になる。 さらに、 大都市(東京・大阪・神奈川)が外れ値として効くため、 順位相関でのクロスチェックも必須。
Q8. 疑似相関を完全に排除することは可能ですか?
原理的には不可能。 観察データだけでは、 すべての交絡を保証付きで排除することはできない。 これを「観察データの限界」と呼ぶ。 解決には RCT、 自然実験、 領域知識による DAG 構築、 感度分析(unmeasured confounding 仮定の検証)などを組み合わせる必要がある。 「疑似相関は永遠に完全には消えないが、 段階的に減らすことはできる」というのが正直な答え。
Q9. データサイエンスのプロジェクトで疑似相関にどう向き合うべきか
プロジェクト立ち上げ時にまず「これは予測タスクか、 因果推論タスクか」を明確にする。 予測タスクなら疑似相関も活用するが、 「データ分布が変わった瞬間に壊れる」リスクを文書化する。 因果推論タスクなら DAG 設計と統制集合の選定をプロトコル化し、 RCT または準実験を可能な限り取り入れる。 報告書の冒頭に「本分析は観察データに基づく相関分析である」と明記するだけでも、 受け手の解釈が大きく変わる。 経営層に説明する際には「相関」「関連」「因果」の語を厳密に使い分け、 過剰な期待を生まないことが信頼関係の維持に直結する。
Q10. 学生に疑似相関を教える効果的な順序は?
第 1 段: 視覚的な例(アイスと水難事故、 チョコとノーベル賞)で直感的に「相関 ≠ 因果」を体感させる。 第 2 段: SSDSE-B-2026 で自分の手で per capita 化と層別を試す。 第 3 段: 偏相関の数式と計算を学ぶ。 第 4 段: DAG と back-door 基準を学び、 統制集合の正しい選び方を理解する。 第 5 段: RCT、 自然実験、 因果推論の論文を読む。 この順序を守れば、 1 学期で疑似相関の扱いに自信を持てるようになる。 各段階の境目で「自分が今どの抽象度で議論しているか」を意識させると定着が速い。 教員側は「全段階を一度に詰め込まない」ことを心掛けるとよい。
Q11. 疑似相関を扱う上で参考になる古典文献は?
Yule (1903) の三変数相関論文、 Simpson (1951) の交互作用論文、 Pearl (2009) の「Causality」、 Hernán & Robins (2020) の「Causal Inference: What If」、 Imbens & Rubin (2015) の「Causal Inference for Statistics, Social, and Biomedical Sciences」が定番。 日本語では 岩波の「統計的因果推論」シリーズが入門として読みやすい。 教科書の順序は、 直感→定量化→形式化→応用、 と段階的に進めるのが効果的。 最後に Pearl の「The Book of Why」を一般向け補強として読むと、 全体像が腑に落ちる。
🔍 疑似相関を見抜く 10 ステップ・チェックリスト
疑似相関は気づかないと信じてしまう性質が最も厄介である。 ここでは実務でデータを受け取った時に、 機械的に疑似相関を疑う 10 のチェック項目を提示する。 これは医療系の研究プロトコルでよく使われる Bradford Hill 基準を、 都道府県データや学校データなど身近な題材で使えるよう翻訳したものである。 機械学習のモデル選択や Kaggle の特徴量エンジニアリングでも、 target leakage を見つける際に役立つ。
ステップ 1: 単位を per capita で確認
都道府県・市区町村・国を集計単位とする場合、 まず人口で割り戻したか確認する。 「○○の数」 × 「△△の数」は、 ほとんどが規模効果で正相関する。 例えば SSDSE-B-2026 の「図書館数」と「犯罪認知件数」は r=0.83 だが、 人口で割ると r=0.07 まで落ちる。 機械的に「per 1,000 人」「per 1,000 世帯」へ変換するだけで、 偽の発見の半分は消える。
ステップ 2: 時系列か横断データかを区別
2 つの時系列の相関を取ると、 共通トレンド(増加傾向どうし・減少傾向どうし)だけで強い相関が現れる。 差分系列(前期との変化)あるいは ratio(前期比)で相関を取り直す習慣をつける。 横断データの場合は逆に、 都道府県固有の特性(県民所得・気候)が交絡することが多いので、 都道府県ダミーを入れた回帰で再確認する。
ステップ 3: 共通原因の候補を 3 つ書き出す
「X が増えると Y が増える」という相関を見つけたら、 X と Y の両方に影響しそうな第三変数 Z を、 紙に 3 つ書き出してみる。 アイス × 熱中症なら気温、 チョコ × ノーベル賞なら経済力、 図書館 × 犯罪なら人口。 候補が思い浮かばない時こそ要注意で、 ドメイン知識の不足が交絡の発見を阻んでいる可能性が高い。 過去 5 年の白書・統計年鑑を眺め直すのが近道である。
ステップ 4: 偏相関で交絡を統制
候補となる第三変数 Z を見つけたら、 偏相関係数 r(X, Y | Z) を計算する。 これは「Z の影響を除いたあとの X と Y の純粋な関係」を測る指標で、 pingouin ライブラリの partial_corr 関数で 1 行で計算できる。 通常の相関 r が 0.8 でも、 偏相関が 0.1 まで落ちれば、 Z を介した疑似相関と結論できる。
ステップ 5: サンプルサイズを再確認
n=10 のような小標本では、 r=0.6 でも p > 0.05 で有意にならない。 逆に n=10,000 では r=0.05 でも有意になる。 「相関係数の大きさ」と「統計的有意性」を混同しないこと。 SSDSE-B-2026 は 47 都道府県のみなので、 r > 0.3 が有意ライン(α=0.05、 両側)の目安である。 信頼区間を必ず計算する習慣をつける。
ステップ 6: 散布図を必ず目視
アンスコムの四重奏で有名だが、 同じ r=0.82 でも、 散布図の形が全く違うことがある。 外れ値 1 点が相関を支配している、 V 字型の非線形関係、 2 つのクラスタが分離している、 など散布図でしか気づけないパターンがある。 数値だけ見て満足せず、 必ず plt.scatter で図示する。 jitter を入れて重なりを解消するのも忘れない。
ステップ 7: 部分母集団で再現確認
全体で r=0.6 だったとして、 部分母集団(東日本・西日本、 都市部・郡部、 男女別など)で計算しても同じ符号と強さが出るか。 部分群で逆相関に逆転するのがシンプソンのパラドックスで、 全体だけ見て結論を出すと真逆の解釈に陥る。 層別分析(stratified analysis)を必ず併用する。
ステップ 8: タイムラグの方向を検討
「原因が結果より先」が因果の必要条件。 X(t) と Y(t) が相関していても、 X(t-1) → Y(t) と Y(t-1) → X(t) のどちらが強いかで、 因果の方向を絞り込める。 これが Granger 因果性検定の基本アイデアで、 statsmodels の grangercausalitytests で実装できる。 ただし Granger 因果は真の因果と同義ではない点に注意。
ステップ 9: 介入の可能性を考える
「X を人為的に増やしたら Y は変わるか」をシミュレーション的に問う。 観測データの相関は「X を増やせば Y が増える」を保証しない。 介入を行う準実験(差分の差分・回帰不連続)または無作為化試験(RCT)でしか、 因果効果は分離できない。 観測データの解釈は常に「もし介入したら…」を頭の中で問いかける。
ステップ 10: メカニズム仮説を文章化
最後に「なぜ X が Y に影響するのか」を、 因果の連鎖として文章で書き出す。 「X が増える → 中間変数 M に影響 → Y に影響」が説明できなければ、 たとえ統計的に有意でも疑似相関の可能性が高い。 メカニズムを言語化することで、 抜けている交絡や逆因果に自分で気づける。
📚 さらに学ぶための関連用語と発展
疑似相関は単独の用語というより、 因果推論・統計的検定・データ前処理・機械学習の特徴量選択など、 広範な分野と接続するハブ概念である。 ここでは本ページからさらに深掘りすべき関連用語を、 学習順序の目安と一緒に提示する。
相関係数 — 疑似相関を見抜く前提として、 単純相関の意味と限界を理解
因果関係 — 「相関ではなく因果」を主張するために何が必要か
交絡 — 共通原因による疑似相関の典型構造
外れ値 — 散布図での目視と除外判断
学習順序の目安: まず基礎(相関係数・交絡・外れ値)→ 中級(偏相関・シンプソン・回帰)→ 因果推論の枠組み(DAG・傾向スコア)→ 機械学習との接続(特徴量選択・leakage)。 因果推論の本格的な学習には、 Judea Pearl の「The Book of Why」、 安井翔太「効果検証入門」、 岩波データサイエンス vol.3「因果推論」など書籍も役立つ。
🧠 疑似相関を「言葉で説明する」訓練
疑似相関を見抜けるかどうかは、 統計学の計算力よりも「相関の背景にある社会構造を言葉で説明できるか」に依存することが多い。 ここでは「相関が出た時、 30 秒で口頭で説明する」訓練を 5 ステップで体系化する。 プレゼンテーションや論文の議論パートでも、 そのまま流用できる雛形である。
ステップ A: 数値を最初に言う
「X と Y の相関は r=0.83、 n=47、 p<0.001」と数値を 5 秒以内に提示する。 数値が無いと聞き手は議論の前提を共有できない。 信頼区間が計算済みなら一緒に出す。 「強い正相関」「弱い負相関」など定性表現に逃げず、 数値と判定基準(Cohen の慣習で 0.3 中・0.5 強)を併記する。
ステップ B: 疑似相関の可能性を 1 文で挙げる
「ただしこれは規模効果の可能性が高い」「気温という共通原因が背後にあるかもしれない」など、 一文で疑似相関の候補を提示する。 ここで重要なのは「断定」ではなく「仮説の提示」。 「可能性が高い」「示唆される」という表現を使い、 後の議論を閉じない。
ステップ C: 統制すべき第三変数を 3 つ挙げる
「人口」「県民所得」「平均気温」のように、 統制すべき候補を具体的に列挙する。 ドメイン知識に裏付けられた変数選択ができるかが、 アナリストの腕の見せどころ。 ここで候補を挙げられないと、 後の重回帰や DAG 構築でも空回りする。
ステップ D: 検証可能な仮説に翻訳する
「人口を統制した偏相関が r<0.2 に落ちれば規模効果と結論」「夏季のみのサブサンプルでも r>0.5 なら気温では説明できない」など、 反証可能な検証手順を 1 つ提案する。 ここまで言えれば、 研究計画や次の分析タスクが具体化する。
ステップ E: 暫定結論と次のアクションを 1 文で
「現時点では人口を介した疑似相関の可能性が高いので、 次は偏相関と層別分析を実施する」と、 暫定結論と次のアクションをセットで述べる。 「結論を出さない誠実さ」と「次に何をするかの提案」を両立させる訓練。 これができれば、 ステークホルダーから「データに振り回されない人」と信頼される。
このステップ A〜E を踏襲すると、 30 秒の説明でも聞き手の理解が一段深くなる。 1 つの相関に対して 30 秒の説明を 5 回繰り返すと、 5 つの異なる視点から疑似相関を捉える練習になる。 慣れてくると、 散布図を見ただけで A〜E が自動的に頭に浮かぶようになる。
追加ステップ F: 反対側の主張を 1 文で提示
最後に「もし自分の仮説が間違っていたら、 どんなデータが見えるはずか」を 1 文で言語化する。 たとえば「人口を統制しても r=0.5 残ったら、 規模効果以外の機序が働いている」など、 自分の仮説が反証されたときの観察を先に予告しておく。 これは Karl Popper の反証可能性の精神を、 日常分析に持ち込む実践テクニックである。 反対側を言語化できる人は、 自分の主張を客観的に守れるようになる。 議論の場で「自分の仮説が間違いだと判明するのはどんなケースか」を即答できるかどうかは、 中級と上級の分かれ目である。
追加ステップ G: 行動につながる提言を 1 文で
最終的に「だからどうするか」を 1 文で述べる。 「相関は強いが、 まず per capita 化と偏相関で検証する」「政策提言には RCT 設計が必要」「機械学習モデルでは郵便番号を除外して再学習する」など、 具体的な次のアクションを宣言する。 説明者が次の手を示せれば、 聞き手は「学んだ価値があった」と感じる。 疑似相関の知識は、 アクションに翻訳されて初めて意味を持つ。
補足: 全体を貫く 3 つの態度
ステップ A〜G を通して身につけたい 3 つの態度がある。 第 1 に 謙虚さ 。 観測データから因果を結論することは原理的に難しい、 という前提を毎回新たに思い出す。 第 2 に 反証可能性への意識 。 自分の仮説が間違っているときに何が見えるかを、 議論の最初に宣言する。 第 3 に 行動志向 。 知識を「次の分析・実験・意思決定」に翻訳することで初めて疑似相関の学習が完結する。 この 3 態度を伴った 7 ステップは、 統計教育の到達点として、 学部生から実務家まで共通の目標となる。 数式を覚える前に、 まずこの態度を体で覚えると、 後の手法学習が驚くほどスムーズになる。
なお、 疑似相関を「見つける力」と同じくらい大切なのが「指摘される側の心理的準備」である。 自分の分析結果について「これは疑似相関では?」と問われたとき、 防衛的になるのではなく、 「いい指摘です、 では一緒に検証しましょう」と返せる心の余裕を持ちたい。 共同で疑似相関を潰していく姿勢こそが、 健全な分析文化を育てる。 個人技ではなくチームスポーツとして因果推論に取り組む、 という心構えが、 結果的に最も強い分析能力を生む。 上司・同僚・査読者からの指摘は「自分を批判する敵」ではなく「無料で雇える共同検証者」だと捉え直すと、 議論の場が一気に建設的になる。 この発想転換は、 統計教育の最終到達点と言ってもよい。 疑似相関とは結局、 自分の解釈の不完全性に常に向き合う知的態度の総称なのであり、 統計学習の最大の果実は数式ではなくこの姿勢の獲得にあると言える。 これがデータサイエンスの実務に携わる全ての人の倫理基盤となるのである。
🗺 概念マップ
疑似相関を中心とした概念ツリー 📦
疑似相関 (このページ)
├─ 上位:
相関分析 / 因果推論
├─ 親戚:Simpson のパラドックス / 選択バイアス
├─ 解決:partial correlation / 多変量回帰 / RCT / DAG
├─ 関連:交絡変数 / 操作変数 / propensity score
└─ 応用:医療研究 / 経済評価 / 政策分析
🔧 疑似相関応用ブロック
以下は疑似相関を「見抜く・伝える」ための応用ブロック。 SSDSE-B-2026 で複数の追加コード・FAQ・トラブル表で深掘りする。
このコードでやること : SSDSE-B-2026 全 109 指標で「人口効果が大きい疑似相関ペア」を探索。
📥 入力データ : data/raw/SSDSE-B-2026.csv(2023 年)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 d23 = df[df['年度' ]==2023 ]
# 人口除外して非交絡な数値列を取得
cols = ['出生数' ,'死亡数' ,'婚姻件数' ,'大学数' ,
'一般病院数' ,'着工建築物数' ,'延べ宿泊者数' ]
import numpy as np
results = []
z = d23['総人口' ].values
for i, a in enumerate(cols):
for b in cols[i+1 :]:
x, y = d23[a].values, d23[b].values
r = np.corrcoef(x, y)[0 ,1 ]
rxz = np.corrcoef(x, z)[0 ,1 ]
ryz = np.corrcoef(y, z)[0 ,1 ]
pr = (r - rxz*ryz) / np.sqrt((1 -rxz**2 )*(1 -ryz**2 ))
results.append((a, b, r, pr))
for a, b, r, pr in sorted(results, key=lambda t:-abs(t[2 ]-t[3 ]))[:5 ]:
print (f'{a:6s} - {b:6s}: r={r:.3f}, partial={pr:.3f}, drop={r-pr:.3f}' )
📤 実行結果 :
死亡数 - 婚姻件数 : r=0.962, partial=-0.749, drop=1.711
出生数 - 死亡数 : r=0.977, partial=-0.508, drop=1.486
婚姻件数 - 着工建築物数: r=0.933, partial=-0.538, drop=1.470
着工建築物数 - 延べ宿泊者数: r=0.719, partial=-0.635, drop=1.354
大学数 - 着工建築物数: r=0.809, partial=-0.522, drop=1.331
💬 結果の読み方 : 出生数・死亡数・婚姻件数・大学数・着工建築物数・延べ宿泊者数は、 どれも「人口が多い県ほど多い」という共通の理由で動く。 だから単相関 r は 0.72〜0.98 と軒並み高い。 ところが総人口を制御した偏相関はいずれも −0.5 〜 −0.75 と、 0 に近づくどころか符号が反転 する。 落差(drop = r − partial)は最大 1.711 に達する。 反転は「人口を除くと本当は負の関係だった」という意味ではなく、 人口という 1 変数がこれらの量をほぼ説明し切ってしまうため、 残差どうしが「人口で説明した取り分の奪い合い」になって機械的に負に振れる、 という現象である。 いずれにせよ確かなのは、 元の 0.9 台という数字は 2 つの量の直接の関係をまったく表していない ということ。 47 都道府県データで疑似相関を体感する最強の教材である。
このコードでやること : 時系列での疑似相関:2012-2023 で「合計特殊出生率」と「ごみ総排出量」の単相関を見る。
📥 入力データ : data/raw/SSDSE-B-2026.csv(全年度)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12 # 全国平均年次推移
nat = df.groupby('年度' ).agg(
fertility=('合計特殊出生率' , 'mean' ),
waste=('ごみ総排出量(総量)' , 'sum' ),
pop=('総人口' , 'sum' )
).reset_index()
r1 = nat['fertility' ].corr(nat['waste' ])
r2 = nat['fertility' ].corr(nat['pop' ])
r3 = nat['waste' ].corr(nat['pop' ])
print (f'r(出生率, ごみ量) = {r1:.3f}' )
print (f'r(出生率, 人口) = {r2:.3f}' )
print (f'r(ごみ量, 人口) = {r3:.3f}' )
📤 実行結果 :
r(出生率, ごみ量) = 0.927
r(出生率, 人口) = 0.823
r(ごみ量, 人口) = 0.937
💬 r=0.93 と高いが、 両者とも人口とトレンドが似ているだけ。 partial で人口を制御すると消える典型例。 時系列の疑似相関は「共通トレンド」が主因。
このコードでやること : DAG(因果ダイアグラム)を意識して、 交絡候補を明示する。
📋 コピー # 構造を辞書で記述
dag = {
'総人口' : ['一般病院数' , '65歳以上人口' , '出生数' , '死亡数' ],
'65歳以上人口' : ['一般病院数' , '死亡数' ],
'所得水準' : ['一般病院数' , '65歳以上人口' ],
}
for parent, children in dag.items():
for c in children:
print (f'{parent} -> {c}' )
print ('\n→ 一般病院数 と 65歳以上人口 の関係を見るときは、 総人口と所得水準を制御すべき。' )
📤 実行結果 :
総人口 -> 一般病院数
総人口 -> 65歳以上人口
総人口 -> 出生数
総人口 -> 死亡数
65歳以上人口 -> 一般病院数
65歳以上人口 -> 死亡数
所得水準 -> 一般病院数
所得水準 -> 65歳以上人口
→ 一般病院数 と 65歳以上人口 の関係を見るときは、 総人口と所得水準を制御すべき。
💬 DAG を明示すれば交絡が一目瞭然。 SSDSE には所得水準そのものは無いので、 経済関連列(消費支出 等)で代替する。
このコードでやること : 統計的有意性と効果量の両方を見る:相関 r が大きくても n が小さいと信頼区間が広い。
📋 コピー from scipy.stats import pearsonr
r, p = pearsonr(d23['一般病院数' ], d23['65歳以上人口' ])
n = len(d23)
# Fisher z 変換で 95 % CI
z = 0.5 * np.log((1 +r)/(1 -r))
se = 1 /np.sqrt(n-3 )
lo = np.tanh(z - 1.96 *se)
hi = np.tanh(z + 1.96 *se)
print (f'r = {r:.4f}, p = {p:.2e}' )
print (f'95 % CI = [{lo:.4f}, {hi:.4f}], n = {n}' )
📤 実行結果 :
r = 0.9194, p = 7.39e-20
95% CI = [0.8591, 0.9546], n = 47
💬 r=0.92 で p<0.001、 95% CI = [0.86, 0.95]。 統計的には強い相関だが「因果」とは別。 partial correlation で半減することから「疑似相関の半分」と理解。
⚙️ 応用 25 連発(既出 25 + 応用 25 = 計 50 を補完) pingouin.partial_corr で部分相関 + CI statsmodels.stats.multitest で多重比較補正 DoWhy で因果効果推定 EconML で機械学習因果 causal-learn で DAG 推定 graphviz で DAG 描画 networkx で因果グラフ操作 CausalImpact で時系列介入効果 Synth で synthetic control pymc3 でベイズ因果モデル pystan で SEM lavaan (R) / semopy (Py) で SEM matching で観察研究マッチング IPW で逆確率重み付け Doubly Robust 推定 instrument variable DID (差分の差) RDD (回帰不連続) panel fixed effects random effects mediation analysis moderation analysis sensitivity analysis placebo test falsification test 🌟 追加 FAQ 10 問 Q1. partial correlation の代わりに多変量回帰でも良い? 良い。 partial r = 回帰係数の標準化版。 解釈は同等。
Q2. 疑似相関は「悪い」? 認識せずに因果と誤読する点が悪い。 相関自体は予測には使える(過信しないなら)。
Q3. 交絡が観測できないとき? 感度分析(unobserved confounder bound)、 IV 法、 自然実験で対応。
Q4. SSDSE で観測できる主な交絡 総人口、 都道府県の規模、 年齢構成、 経済指標。 これらが多くの相関の交絡因子。
Q5. 疑似相関と Simpson のパラドックスの違い 疑似相関は「相関が交絡で生まれる」、 Simpson は「層別すると逆転する」。 後者は疑似相関の極端形。
Q6. 相関係数が低くても因果はあり得る? あり得る。 (1) 非線形関係 (2) 抑制効果(複数経路が打ち消し合う)(3) 観測誤差で減衰。
Q7. 時系列疑似相関の代表例 1990 年代のアメリカ離婚率とマーガリン消費量(共通トレンドのみ)。
Q8. 疑似相関を可視化するには? 散布図に第 3 変数で色分け、 もしくは partial regression plot で残差散布図。
Q9. 実験ができない場合のベストプラクティス 多変量回帰+感度分析+複数モデル比較+透明な報告。
Q10. partial correlation の計算は誰が発明? Karl Pearson (1897 頃)。 相関係数を多変量に拡張する過程で導入。
🛠 トラブルシューティング表 症状 原因 対策 partial r が単相関より大きい 抑制効果 (suppression) 理論的に検討、 別の交絡候補を試す partial r が NaN 完全多重共線性 (rxz=1) 別の交絡変数に変える 結果が手法によって異なる 前提仮定が違う 複数手法で比較、 sensitivity 分析 交絡が多すぎて選べない DAG を描いて分類 ドメイン知識で重要なものに絞る 時系列でトレンドのみ 共通トレンドが交絡 階差・残差で除去後に相関
🧪 ラボノート(再現実験ステップ) SSDSE-B-2026 で 2 つの変数 X, Y を選ぶ 単相関 r_xy を計算 交絡候補 Z を列挙(人口・規模・経済等) partial r(XY | Z) を計算 |r - partial| が大きいなら疑似相関の度合いが高い 複数の Z で繰り返し 多変量回帰で複数 Z を同時制御 DAG を描いて理論的にも検証 結果を「単相関」「partial」両方表示 レポートには「相関」「関連」と書き「因果」は避ける
⭐ 有名な疑似相関の事例集
A. 教科書的な 10 ペア ペア 見かけの相関 実際の交絡 正しい解釈
アイスクリーム消費 - 溺死 +0.8 級 気温(夏) 夏は両方増えるだけ
チョコ消費 - ノーベル賞 +0.8 級 一人当たり GDP 豊かな国ほど両方が増える
靴サイズ - 読解力 +0.7 年齢(子供) 成長で両方が伸びる
結婚式件数 - 出生数 +0.95 人口・年齢 人口が多いほど両方多い
映画館数 - 自殺率 +0.6 人口密度 都市化が両方に影響
プールに人 - 殺人事件 +0.7 気温・季節 夏に外出が増える
Netflix 加入 - 物理学 PhD +0.9 時代(年) 同じ時期に増えた
ヤギ - 数学者の自殺 +0.5 rspurious-correlations.tylervigen.com の有名例 統計的偶然
婚姻数 - 離婚数(SSDSE) +0.98 総人口 人口効果
一般病院数 - 65 歳以上人口(SSDSE) +0.92 総人口 半分は人口効果
🧭 因果推論の手法比較
A. 10 手法の前提と道具 手法 前提 主な道具
partial correlation 線形・1 交絡 pingouin
多変量回帰 線形 statsmodels
Propensity Score Matching 観察研究 causalinference
IPW 介入確率モデル DoWhy
Doubly Robust モデル誤特定耐性 EconML
Instrumental Variable 操作変数あり statsmodels
DID パネルデータ linearmodels
RDD 閾値あり介入 rdrobust (R)
DAG / do-calculus 構造仮定 DoWhy / causal-learn
RCT 介入可能 実験設計
B. DoWhy 確認コード このコードでやること : DoWhy ライブラリの動作確認。
📋 コピー # DoWhy ライブラリで因果効果推定
# pip install dowhy
try:
import dowhy
from dowhy import CausalModel
print ('DoWhy インストール済み' )
except ImportError:
print ('未インストール: pip install dowhy' )
📤 実行結果 :
DoWhy インストール済み
💬 DoWhy は (1) モデル定義 (2) 識別 (3) 推定 (4) 検証 の 4 段階で因果効果を体系的に扱える。
🕸 DAG(有向非巡回グラフ)と因果構造
A. DAG の基本ルール DAG(Directed Acyclic Graph、 有向非巡回グラフ) は因果構造を視覚化する道具。 基本ルール: ・ノード=変数(観測 or 潜在) ・矢印=因果方向(A → B は「A が B を引き起こす」と仮定) ・循環無し(A → B → A は禁止、 因果は一方向)3 つの基本構造 ・チェイン : X → Z → Y(Z は媒介変数。 Z を制御すると関係が消える) ・フォーク : X ← Z → Y(Z は交絡変数。 Z を制御すべき) ・コライダー : X → Z ← Y(Z は合流点。 Z を制御してはいけない!)判別ルール 1. 因果効果を推定したいなら、 すべての バックドアパス を閉じる 2. コライダーは原則「閉じない」 3. 媒介変数を制御すると因果効果が「分解」される
B. networkx で SSDSE 医療 DAG を描く このコードでやること : SSDSE-B-2026 の医療関連変数で DAG を描き、 交絡を視覚化する。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import os
os . makedirs ( 'output' , exist_ok = True ) # 保存先のフォルダを作っておく
# networkx で DAG を描く
import networkx as nx
import matplotlib.pyplot as plt
G = nx . DiGraph ()
edges = [( '総人口' , '一般病院数' ),
( '総人口' , '65歳以上人口' ),
( '総人口' , '出生数' ),
( '65歳以上人口' , '一般病院数' ),
( '所得水準' , '一般病院数' ),
( '所得水準' , '65歳以上人口' )]
G . add_edges_from ( edges )
pos = nx . spring_layout ( G , seed = 42 )
nx . draw_networkx ( G , pos , with_labels = True , node_color = '#80DEEA' ,
node_size = 2500 , font_size = 10 , arrowsize = 20 )
plt . title ( 'SSDSE-B-2026 の医療資源 DAG' )
plt . savefig ( 'output/dag.png' , dpi = 120 , bbox_inches = 'tight' )
print ( 'DAG 描画完了' )
📤 実行結果 :
DAG 描画完了
💬 「総人口」と「所得水準」が交絡(フォーク)。 「65 歳以上人口」が媒介(チェイン)。 一般病院数の決定要因を分析するなら、 これらを多変量回帰で制御する。
🔄 Simpson のパラドックス
A. 概念解説 Simpson のパラドックス 全体集計では A 群が有利でも、 サブグループ別では B 群が有利、 という「層別による傾向逆転」。 疑似相関の極端形。有名な実例(1973 UC Berkeley 入学) 全体: 男性合格率 44% > 女性合格率 35%(女性差別?) 学科別: 多くの学科で実は女性合格率の方が高い 原因: 女性が「合格率の低い学科」に多く出願したため
B. SSDSE-B-2026 で層別検証 このコードでやること : 47 都道府県を人口大/小で 2 群分けし、 「高齢化率 vs 出生率」の相関を全体と群別で比較。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 SSDSE-B-2026(年度) A1101(総人口) A1303(65歳以上人口) A4103(合計特殊出生率)
北海道 2,023 5,092,000 1,681,000 1.06
東京都 2,023 14,086,000 3,205,000 0.99
沖縄県 2,023 1,468,000 350,000 1.6
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026 .csv' , encoding='cp932' , skiprows=1 )
# 12 年データを「人口大県」と「人口小県」に分けて出生率と高齢化率の関係を見る
d23 = df[df['年度' ]==2023 ].copy()
d23['pop_group' ] = pd.qcut(d23['総人口' ], 2 , labels=['小' ,'大' ])
d23['elder_ratio' ] = d23['65歳以上人口' ] / d23['総人口' ]
# 全体相関
all_r = d23['elder_ratio' ].corr(d23['合計特殊出生率' ])
# 群別相関
big_r = d23[d23['pop_group' ]=='大' ]['elder_ratio' ].corr(
d23[d23['pop_group' ]=='大' ]['合計特殊出生率' ])
small_r = d23[d23['pop_group' ]=='小' ]['elder_ratio' ].corr(
d23[d23['pop_group' ]=='小' ]['合計特殊出生率' ])
print (f'全体 r = {all_r:.3f}' )
print (f'人口大群 r = {big_r:.3f}' )
print (f'人口小群 r = {small_r:.3f}' )
📤 実行結果 :
全体 r = 0.201
人口大群 r = 0.467
人口小群 r = -0.557
💬 全体では r = +0.20 とごく弱い正の相関に見える。 ところが人口で 2 群に分けると、 人口大群は +0.47、 人口小群は −0.56 と符号が逆になる 。 つまり「全体でわずかに正」という要約は、 符号の違う 2 つの関係を平均して打ち消し合わせた結果 にすぎない。 これはシンプソンのパラドックスそのもので、 全体だけを見て「高齢化率と出生率はほぼ無関係」と結論すると、 群ごとに正反対の関係があることを見落とす。 結論を出す前に層別検査を必ず行うこと。
✅ 論文・レポートでの疑似相関チェックリスト
A. 疑似相関チェックリスト 12 項 □ 単相関だけでなく partial correlation も併記したか □ 制御変数を明示したか □ 「relationship / association」と「cause / impact」を区別したか □ 信頼区間(95% CI)を併記したか □ サンプル数 n を明示したか □ 多重比較補正(Bonferroni / FDR)の必要性を検討したか □ サブグループ分析(層別)で結論が変わらないか確認したか □ 感度分析(未観測交絡)を実施したか □ DAG で因果構造を可視化したか □ 結論を控えめに、 示唆的な表現に留めたか □ コードとデータを再現可能な形で公開したか □ 「相関がある」だけで終わらせず、 「機構」「メカニズム」の検討を含めたか B. 論文文体のテンプレート 論文文体テンプレート : ✅ 「47 都道府県のデータでは、 X と Y の間に r=0.92 の強い正の相関が観察された。 ただし、 第 3 変数として Z を制御した partial correlation は r=0.47 に低下することから、 この関係の約半分は Z を経由した間接的なものと考えられる。 因果関係を断定するには、 さらなる介入研究や DAG に基づく分析が必要である。」 ❌ NG: 「X は Y を強く引き起こす(r=0.92)」
🧪 媒介分析と調整変数の区別
A. 媒介 / 調整 / 交絡の違い 媒介変数 vs 調整変数 vs 交絡変数 ・媒介 (mediator) : X → M → Y(X が M を経由して Y に影響。 制御すると因果効果が分解される) ・調整 (moderator) : X → Y の関係が M によって強弱が変わる(交互作用) ・交絡 (confounder) : X ← Z → Y(Z が両方の原因。 制御しないと偽相関)大切なルール ・交絡を制御せず → 疑似相関 ・媒介を制御 → 因果効果の過小評価 ・コライダーを制御 → 選択バイアス
B. SSDSE-B-2026 で媒介分析 このコードでやること : X=総人口、 M=65 歳以上人口、 Y=一般病院数 で媒介分析。 「人口 → 高齢者 → 病院」の経路を分解。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 # SSDSE-B-2026 で媒介分析の例
# X = 総人口、 M = 65歳以上人口、 Y = 一般病院数
import statsmodels.api as sm
X = d23['総人口' ].values.astype(float)
M = d23['65歳以上人口' ].values.astype(float)
Y = d23['一般病院数' ].values.astype(float)
# Step 1 : X -> Y の総効果
m1 = sm.OLS(Y, sm.add_constant(X)).fit()
c = m1.params[1 ] # 総効果
# Step 2 : X -> M
m2 = sm.OLS(M, sm.add_constant(X)).fit()
a = m2.params[1 ]
# Step 3 : M -> Y (X 制御)
m3 = sm.OLS(Y, sm.add_constant(np.column_stack([X, M]))).fit()
c_prime = m3.params[1 ] # 直接効果
b = m3.params[2 ]
indirect = a * b
print (f'総効果 c = {c:.6f}' )
print (f'直接効果 c\' = {c_prime:.6f}')
print (f'間接効果 ab = {indirect:.6f}' )
print (f'媒介比率 = {indirect/c*100 :.1f}%' )
📤 実行結果 :
総効果 c = 0.000040
直接効果 c' = -0.000027
間接効果 ab = 0.000066
媒介比率 = 167.1%
💬 媒介比率 122% は「100% 媒介+反対方向の直接効果あり」を示す。 人口の影響は完全に高齢者を経由しており、 直接効果はわずかに負(人口あたり病院密度は人口少県の方が高い)という解釈。
spurious correlation
課題
本概念の使い方
得られる効果
前提
並列
発展
🔗 隣接手法への橋渡し
「擬似相関」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。
上流 : 入力データの前処理・整備 (関連用語 )
並列 : 類似目的を持つ代替手法 (関連用語 ) と比較・併用
下流 : 出力結果の評価・解釈 (関連用語 )
これらの接続を意識することで、 「擬似相関」を中核に据えた一貫した分析パイプラインを構築できる。
🌳 手法選択フロー
「擬似相関」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。
共通の原因が思い当たるか 都道府県データでは「人口規模」が最有力。 病院数と犯罪件数が相関するのは、 どちらも人口が多い県で大きくなるため。 人口で割る、 偏相関を取る、 回帰に入れる、 のいずれかで対処する。
どちらも時間とともに増えていないか 無関係な 2 つの時系列でも、 ともに増加傾向なら高い相関が出る。 差分を取るか、 トレンドを除いてから相関を見る。
層別すると関係が変わらないか 全体では正、 グループ内では負、 ということが起きる(シンプソンのパラドックス)。 層別しても同じ向きかを必ず確かめる。
介入の効果を言いたいのか 言いたいなら相関では足りない。 無作為化・差分の差分法・操作変数など、 因果を識別する設計が要る。
相関が強いほど因果に見えるが、 強さは因果の証拠にならない。 高齢化率と死亡率は $r = 0.97$ に達するが、 これは年齢構成という共通要因の反映にすぎない。