論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
疑似相関
Spurious Correlation
因果推論
別称: 見かけの相関 / misleading correlation

🔖 キーワード索引

30秒結論文脈直感数式読み解き実値計算Python実装落とし穴比較表産業活用演習FAQ参考文献用語辞典50連発交絡partial

spurious correlation」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「spurious correlation」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

spurious correlation統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「spurious correlation の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

見かけだけの関係のことです。

データの勘違いを防ぐために使います。

スマホの利用時間と成績のような例です。

この概念の重要ポイントを読みましょう。

実は関係していない 2 変数が共通原因(交絡)のせいで相関しているように見える現象。

spurious correlation を 30 秒で把握する重要ポイント:

📍 あなたが今見ているもの

🍰 まずはやさしく

実際のデータを使った練習ページです。

仕組みを具体的に確かめるために使います。

都道府県のデータを使って考えます。

定義から演習までの流れを読みましょう。

本ページでは 疑似相関(Spurious Correlation)を SSDSE-B-2026 の 47 都道府県 2023 年データで具体的に検証する。 公式定義 → 直感 → 数式 → 実値計算 → Python → 落とし穴 → 産業活用 → 演習 → FAQ の順で学べる。

🎨 直感で掴む

🍰 まずはやさしく

関係を見分けるための道具です。

本当の原因を探るために使います。

部活の練習量と試合結果のような例です。

使いかたと注意点を読みましょう。

「相関」と「因果」を区別する道具のひとつ。 反事実(counterfactual)の枠組みで、 介入の効果を推定します。

本ページでは 疑似相関 を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。

📐 定義

🍰 まずはやさしく

共通の原因で起きていた現象です。

正しい分析をするために使います。

買い物と天気の関係のような例です。

詳しい定義や条件について読みましょう。

実は関係していない 2 変数が共通原因(交絡)のせいで相関しているように見える現象。

英語名 Spurious Correlation。 同義・関連語:見かけの相関, misleading correlation。

🎯 いつ・どこで使うか

📋 前提条件・適用範囲

この用語を理解・使用するときは、 次のような前提を意識してください:

📐 数式または定義(厳密版)

疑似相関とは、 共通の第 3 変数 $Z$ の影響で、 $X$ と $Y$ の間に実際の因果関係がないのに相関が観測される現象。

$$\mathrm{Cor}(X, Y) \neq 0 \quad \text{かつ} \quad \mathrm{Cor}(X, Y \mid Z) \approx 0$$

partial correlation で $Z$ の影響を除いた相関係数 $r_{XY \cdot Z}$ がゼロに近づけば、 元の相関は $Z$ を経由した疑似相関と判定できる。

$$r_{XY \cdot Z} = \frac{r_{XY} - r_{XZ}\,r_{YZ}}{\sqrt{(1 - r_{XZ}^2)(1 - r_{YZ}^2)}}$$

🔬 数式を言葉で読み解く

記号意味SSDSE-B-2026 での具体例
$X$注目変数 1一般病院数
$Y$注目変数 265 歳以上人口
$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$ を制御した partial0.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 分位に層別。

1
2
3
4
5
6
7
8
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。

1
2
3
4
5
6
7
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 つの実験のまとめ

🖼️ 図で確認する疑似相関の発生メカニズム

疑似相関は数値だけ眺めても理解しづらい。 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 ステップ)

  1. step 1: 散布図を描く → 関係の形と外れ値を確認
  2. step 2: ヒストグラムで分布の歪みを確認 → 必要なら対数変換
  3. step 3: 1 人当たり値や率に変換 → 規模効果の排除
  4. step 4: 候補の交絡変数で層別 → シンプソン現象の有無
  5. step 5: 偏相関・重回帰で交絡を制御 → 関係が残るか
  6. step 6: DAG を描き、 バックドアパスを洗い出す
  7. 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)

✅ 理解度チェック

疑似相関の知識を「使える形」で定着させるために、 5 段階のチェック問題を用意した。 各問は SSDSE-B-2026 を扱う実務的な状況を想定している。 自分の答えと解説を照らし合わせ、 つまずいた箇所を本文に戻って復習しよう。

Q1(基礎): 疑似相関の定義として最も適切なものは?

解答と解説を開く

正解: B。 疑似相関は「因果ではないが相関が観察される現象」全般を指し、 共通原因(交絡)・選択バイアス・偶然などが原因となる。 相関係数の大きさで決まるわけではないので A は誤り。 時系列にも横断データにも発生するので C も誤り。 散布図以外でも検出されるので D も誤り。

Q2(応用): 「総人口」と「出生数」の相関 r=0.98 から「人口を増やせば出生数が増える」と結論できるか?

解答と解説を開く

正解: B(D も部分的に正しい)。 総人口と出生数は「規模」という共通因子で連動する典型的な疑似相関。 「合計特殊出生率(1 人当たり指標)」で再評価すると相関はほぼ消える。 政策的に「人口増 → 出生率増」と即断するのは危険。 D の「人口を制御」は、 partial correlation や回帰での補正としては正しいアプローチ。

Q3(応用): シンプソン現象の説明として正しいものは?

解答と解説を開く

正解: A。 全体で見ると正の相関に見えるが、 群別に見ると負の相関になる(あるいはその逆)、 という現象がシンプソン現象。 疑似相関の最も顕著な現れ方の一つで、 大学入試の合格率・治療効果の評価などで歴史的に有名な事例がある。

Q4(実務): 疑似相関を疑うべき最初のサインは?(複数選択可)

解答と解説を開く

正解: A, B, C。 r が極端に高いと規模効果や共通トレンドの可能性、 共通する次元(規模・時間・地域)があれば交絡を疑う、 直感に反する結論は因果関係を再点検する合図。 D の「件数が多い」は逆に偶然の相関が出にくくなる方向。

Q5(発展): 疑似相関を「数値的に」確認する最も基本的な手法は?

解答と解説を開く

正解: 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 年)

 1
 2
 3
 4
 5
 6
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 が「高齢者特有の医療需要」と解釈できる。

このコードでやること: 疑似相関の極端な例:婚姻件数と離婚件数の関係。

 1
 2
 3
 4
 5
 6
 7
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 列の例)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 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 種を組み合わせることで、 学生は「あ、 これは見かけの相関だ」と直感的に理解できる。

生値の散布図(強い相関)と per capita 化後の散布図(弱い相関)の比較
図 A: 左 = 生値の散布図(強い直線)、 右 = 1 人当たり化後(ばらけた点)。 同じ 47 都道府県、 同じ変数でも、 規模を割り戻すと風景が一変する。
生値と per capita 値の分布比較
図 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 問の応用問題で確認する。 答えは下にまとめてあるので、 まず自分で考えてから読むこと。

  1. Q1: 都道府県別に見ると、 コンビニ店舗数と交通事故件数に r=0.93 の強い正相関がある。 「コンビニ駐車場が事故を誘発している」と言えるか?
  2. Q2: 月次データで、 アイスクリーム消費量とプール事故死者数に r=0.86 の相関がある。 アイスクリーム規制で水難事故を減らせるか?
  3. Q3: ある会社の社員 500 人のデータで、 給与と通勤時間に r=−0.32 の負相関がある。 通勤時間を減らせば給与は上がるか?
  4. Q4: 全国のクラスデータで、 朝ごはんを食べる頻度と学業成績に r=0.41 の正相関がある。 朝ごはんを強制すれば成績は上がるか?
  5. Q5: 散布図を見ると、 中央付近に大きなクラスタ、 右上に外れ値 2 点で全体 r=0.62。 これをどう解釈するか?
  6. Q6: 機械学習モデルで「郵便番号」を特徴量に入れたら精度が大幅に上がった。 良いモデルと言えるか?
  7. Q7: 2 つの株価指数の月次リターンに r=0.85 の相関。 一方を売って一方を買えば確実に儲かるか?
  8. Q8: 全国 47 都道府県で、 PCR 検査数と感染確定数に r=0.91。 検査を増やせば感染者が増えるか?

解答例:

8 問中 6 問以上を即答できれば、 疑似相関の基礎は身についている。 5 問以下なら、 本ページ前半の「6 パターン」と「判別フロー」に戻って復習することを推奨する。

🧮 数式に値を入れて手で計算する: 見せかけの相関

合成データで Z (気温) が X (アイス売上) と Y (溺死) の両方を引き起こす例。

Step 1: データ

X (アイス)Y (溺死)Z (気温)
20215
80830
30320
1015

Step 2: 単純 r(X,Y) と偏相関

r(X,Y) ≈ 0.999 (見せかけ強い相関) 気温で統制すると 偏相関 ≈ 0 (因果なし)

🐍 Python で再現

1
2
3
4
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 …(以下略)

具体的なコードは パネルデータと因果推論 を参照してください。

📝 レポートでの報告

分析結果を報告するときに含めるべき情報:

✅ チェックリスト

🐍 拡張 Python レシピ

上記の実値計算がそのまま Python の動作確認ブロックを兼ねる。 加えて、 産業界で使う応用パターンを下の 50 連発に整理した。

⚠️ よくある落とし穴

❌ 相関 ≠ 因果
相関は「一緒に動く」ことしか言わない。 高齢化率と死亡率が r = 0.97 でも、 高齢化率を下げれば死亡率が下がるとは限らない。 介入の効果を知りたいなら、 無作為化・差分の差分法・操作変数など、 因果を識別する設計が要る。 相関はその出発点にすぎない。
❌ 交絡因子の見落とし
X と Y の両方に影響する Z があると、 X と Y は Z を通じて相関する。 都道府県データでは「人口規模」が典型的な交絡で、 病院数と犯罪件数が相関するのは、 どちらも人口が多い県で大きくなるため。 人口で割る、 偏相関を取る、 Z を回帰に入れる、 のいずれかで対処する。
❌ 選択バイアス
標本の選ばれ方が結果に効いてしまう状況。 「回答してくれた人だけ」「生き残った企業だけ」を集めると、 その条件と関係する変数の関係が歪む。 47 都道府県のように全数がある場合は起きにくいが、 分析の途中で条件を付けて絞ると同じ問題が入り込む。

⚠️ よくある 疑似相関 失敗例

  1. 単相関で因果を主張:「A と B に相関がある → A が B を引き起こす」は飛躍
  2. 交絡を見落とす:人口や規模は多くの SSDSE 指標で共通の交絡因子
  3. 逆因果:A → B なのか B → A なのか観察データだけでは決まらない
  4. 選択バイアス:分析対象の選び方で見かけの相関が変わる
  5. 非線形関係:partial correlation は線形仮定。 U 字や指数関係を見落とす

🎮 触って理解する

下のスライダーで共通原因 Z(交絡変数)の影響の強さを変えてみよう。 ここでの Z は X と Y の両方を押し上げる隠れた要因で、 X と Y の間には直接の因果は一切ない(モデル上、 X→Y の矢印を張っていない)。 それでも Z の影響が強いほど、 散布図では X と Y が相関しているように見える。 これが疑似相関だ。 「Z で調整」をオンにすると、 Z の効果を回帰で取り除いた残差を表示する。 見かけの相関が消え、 偏相関 $r_{XY\cdot Z}\approx 0$(=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 まで

見せかけの相関を「見抜く」だけでなく「補正して本当の関係を取り出す」段階に進むための道具立てを、 機構別に整理する。

🎲 思考実験(架空):$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・集約)を参照のこと。

🗺 概念マップ

疑似相関を中心とした概念ツリー

📦 疑似相関(このページ)
├─ 上位:相関分析 / 因果推論
├─ 親戚: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(因果ダイアグラム)を意識して、 交絡候補を明示する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 構造を辞書で記述
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 が小さいと信頼区間が広い。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 を補完)

  1. pingouin.partial_corr で部分相関 + CI
  2. statsmodels.stats.multitest で多重比較補正
  3. DoWhy で因果効果推定
  4. EconML で機械学習因果
  5. causal-learn で DAG 推定
  6. graphviz で DAG 描画
  7. networkx で因果グラフ操作
  8. CausalImpact で時系列介入効果
  9. Synth で synthetic control
  10. pymc3 でベイズ因果モデル
  11. pystan で SEM
  12. lavaan (R) / semopy (Py) で SEM
  13. matching で観察研究マッチング
  14. IPW で逆確率重み付け
  15. Doubly Robust 推定
  16. instrument variable
  17. DID (差分の差)
  18. RDD (回帰不連続)
  19. panel fixed effects
  20. random effects
  21. mediation analysis
  22. moderation analysis
  23. sensitivity analysis
  24. placebo test
  25. 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 を描いて分類ドメイン知識で重要なものに絞る
時系列でトレンドのみ共通トレンドが交絡階差・残差で除去後に相関

🧪 ラボノート(再現実験ステップ)

  1. SSDSE-B-2026 で 2 つの変数 X, Y を選ぶ
  2. 単相関 r_xy を計算
  3. 交絡候補 Z を列挙(人口・規模・経済等)
  4. partial r(XY | Z) を計算
  5. |r - partial| が大きいなら疑似相関の度合いが高い
  6. 複数の Z で繰り返し
  7. 多変量回帰で複数 Z を同時制御
  8. DAG を描いて理論的にも検証
  9. 結果を「単相関」「partial」両方表示
  10. レポートには「相関」「関連」と書き「因果」は避ける

⭐ 有名な疑似相関の事例集

A. 教科書的な 10 ペア

ペア見かけの相関実際の交絡正しい解釈
アイスクリーム消費 - 溺死+0.8 級気温(夏)夏は両方増えるだけ
チョコ消費 - ノーベル賞+0.8 級一人当たり GDP豊かな国ほど両方が増える
靴サイズ - 読解力+0.7年齢(子供)成長で両方が伸びる
結婚式件数 - 出生数+0.95人口・年齢人口が多いほど両方多い
映画館数 - 自殺率+0.6人口密度都市化が両方に影響
プールに人 - 殺人事件+0.7気温・季節夏に外出が増える
Netflix 加入 - 物理学 PhD+0.9時代(年)同じ時期に増えた
ヤギ - 数学者の自殺+0.5rspurious-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 ライブラリの動作確認。

 1
 2
 3
 4
 5
 6
 7
 8
# 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 項

  1. □ 単相関だけでなく partial correlation も併記したか
  2. □ 制御変数を明示したか
  3. □ 「relationship / association」と「cause / impact」を区別したか
  4. □ 信頼区間(95% CI)を併記したか
  5. □ サンプル数 n を明示したか
  6. □ 多重比較補正(Bonferroni / FDR)の必要性を検討したか
  7. □ サブグループ分析(層別)で結論が変わらないか確認したか
  8. □ 感度分析(未観測交絡)を実施したか
  9. □ DAG で因果構造を可視化したか
  10. □ 結論を控えめに、 示唆的な表現に留めたか
  11. □ コードとデータを再現可能な形で公開したか
  12. □ 「相関がある」だけで終わらせず、 「機構」「メカニズム」の検討を含めたか

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 課題 本概念の使い方 得られる効果 前提 並列 発展

🔗 隣接手法への橋渡し

「擬似相関」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。

これらの接続を意識することで、 「擬似相関」を中核に据えた一貫した分析パイプラインを構築できる。

🌳 手法選択フロー

「擬似相関」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。

  1. 共通の原因が思い当たるか
    都道府県データでは「人口規模」が最有力。 病院数と犯罪件数が相関するのは、 どちらも人口が多い県で大きくなるため。 人口で割る、 偏相関を取る、 回帰に入れる、 のいずれかで対処する。
  2. どちらも時間とともに増えていないか
    無関係な 2 つの時系列でも、 ともに増加傾向なら高い相関が出る。 差分を取るか、 トレンドを除いてから相関を見る。
  3. 層別すると関係が変わらないか
    全体では正、 グループ内では負、 ということが起きる(シンプソンのパラドックス)。 層別しても同じ向きかを必ず確かめる。
  4. 介入の効果を言いたいのか
    言いたいなら相関では足りない。 無作為化・差分の差分法・操作変数など、 因果を識別する設計が要る。

相関が強いほど因果に見えるが、 強さは因果の証拠にならない。 高齢化率と死亡率は $r = 0.97$ に達するが、 これは年齢構成という共通要因の反映にすぎない。