論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
共分散
Covariance (Cov(x,y))
「x のズレ × y のズレ」の平均。相関係数の分子。符号は関係の向きを示すが、単位依存で強さの比較不可。
基礎統計Cov(x,y)共分散

🔖 キーワード索引

共分散(covariance)」は 2 変数の連動の強さと向きを測る統計量で、 相関係数・分散共分散行列・主成分分析・線形回帰のすべての基礎をなす。 本ページでは共分散の定義・符号の意味・標本不偏推定・47 都道府県データでの実値計算・Python 実装・落とし穴を順に追う。

共分散 Cov(X,Y)符号と向きSSDSE-B-2026標本不偏 ÷(n-1)分散共分散行列相関係数との関係主成分分析の基礎np.cov / pd.DataFrame.cov単位依存の落とし穴

これらのキーワードは「共分散の定義 → 符号の解釈 → 標準化して相関係数 → 多変量への拡張(分散共分散行列・PCA)」という学習動線を構成する。

🔖 キーワード索引(深掘り版)

論文・記事に登場する用語のリンクで該当箇所へジャンプ:

🧮 SSDSE 実値計算 ⚠️ 落とし穴 6選 🐍 Python バリエーション 🔗 関連用語 共分散行列 マハラノビス距離 縮約推定 ポートフォリオ分散

💡 30秒で分かる結論

🍰 まずはやさしく

2つのデータが一緒に動くかを測る道具です。

関係の向きを知るために使います。

勉強時間とテストの点数の関係などが例です。

まずは結論を短くまとめました。

📖 もっと詳しく

共分散(covariance)は、 「2つの変数がどれだけ一緒に動くか」を測る量。 相関係数の 分子 として登場します。

計算:「x のズレ × y のズレ」の平均。 同方向に動けば正、 逆方向に動けば負、 無関係なら 0 付近。

弱点:単位依存。 「身長 cm × 体重 kg」と「身長 m × 体重 g」では、 同じ関係でも共分散の値が大きく変わります。 だから「共分散 = 100 と 10 のどちらが強い関係か」は判断不能。

解決策:単位を打ち消すため、 各変数の標準偏差で割って規格化したのが 相関係数。 これで必ず -1〜+1 に収まり、 違う変数ペアの強さを比較できる。

重要応用:分散共分散行列は PCA・回帰の基礎。 多変量データの構造を表す最重要行列です。

👁️ 直感 — 共分散は「一緒に動くか」

共分散(covariance)は、 2つの変数が同じ方向に動くか、 逆方向に動くかを測る指標。 散布図上で「平均からのズレが正負どちらの組合せか」を集計します。

共分散の象限

2変数(X, Y)の平均で4つの象限に分けると:

この積をすべて足し、 n(または n-1)で割ったものが共分散。 正の象限が多ければ正の共分散、 負が多ければ負の共分散。

共分散の3パターン

💡 共分散は分散の2変数版。 分散が「X が X 自身とどう動くか」(同じ変数)を測るのに対し、 共分散は「X と Y がどう一緒に動くか」を測る。

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

🍰 まずはやさしく

データ分析でよく出る重要な言葉です。

分析の基礎を身につけるために使います。

都道府県の人口などの実データで学びます。

このページで学ぶ内容の流れを説明します。

論文中に 「共分散」として登場する用語。

共分散 とは:「x のズレ × y のズレ」の平均。相関係数の分子。符号は関係の向きを示すが、単位依存で強さの比較不可。

本ページでは「covariance」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「covariance」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む

🍰 まずはやさしく

データの動きをイメージで捉える方法です。

直感的に意味を理解するために使います。

人口が多い県は出生数も多い傾向があります。

図や例を使って仕組みを解説します。

共分散は「x が平均より大きいとき、 y も平均より大きい傾向があるか?」を 1 つの数値で要約する。 47 都道府県の「総人口」と「出生数」を考えると、 人口が多い県は出生数も多い傾向 → ズレの積 (x_i - x̄)(y_i - ȳ) はほぼ正 → 共分散は正の大きな値になる。

図形的には、 散布図を「平均」で 4 象限に分けたとき、 右上 (+,+) と左下 (-,-) の点は積が正、 右下と左上は負。 共分散はこの符号付き面積の平均と等しい。 だから正なら右肩上がり、 負なら右肩下がり、 0 付近なら無相関。

ただし共分散の絶対値は単位に依存する (人口を「人」から「千人」に変えると値が 1000 倍変わる)。 これを単位なしに正規化したのがピアソン相関係数 r = s_xy / (s_x s_y) で、 -1 から +1 の範囲に収まる。 共分散は「相関係数の分子」と覚えるとよい。

🎮 触って理解する

下の散布図は点をドラッグ(スマホ・タブレットは指でスワイプ)して動かせます。 プロット内の空白をクリック / タップすると点を追加できます。 平均線 (x̄, ȳ) で分けた 4 象限が色分けされ、 各点の偏差の積 (xᵢ-x̄)(yᵢ-ȳ) が矩形(符号付き面積)として描かれます。 共分散 = Σ(xᵢ-x̄)(yᵢ-ȳ) / n がリアルタイムに更新されます。

正の寄与(右上・左下)   負の寄与(左上・右下)

点の数 n = -
x̄ = - / ȳ = -
Σ(xᵢ-x̄)(yᵢ-ȳ) = -
共分散 (÷n) = -
不偏共分散 (÷n-1) = -
相関係数 r = -
x を ×1 したとき:
共分散 = -スケールで変化
相関係数 r = -スケール不変

👁️ ここで体感すること

🕳️ よくある落とし穴(操作で確かめる)

🚀 発展

ここで見た「平均で 4 象限に分け、 偏差の積を足す」操作は、 変数が 3 つ以上になると分散共分散行列へ拡張され、 その固有値分解が 主成分分析(PCA) になる。 単位を消した規格化版が 相関係数、 対角成分(自分自身との共分散)が 分散 である。 非線形の従属(U字の例)を捉えたい場合は、 共分散ではなく距離相関や相互情報量といった指標が必要になる。

📐 数式と読み方

🍰 まずはやさしく

計算するための正確なルールです。

数値を正しく出すために使います。

単位を変えると値が変わる点に注意しましょう。

数式と記号の意味について詳しく読みます。

① 標本共分散

$$ s_{xy} = \frac{1}{n - 1} \sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y}) $$

② 母共分散

$$ \sigma_{xy} = \mathbb{E}[(X - \mu_X)(Y - \mu_Y)] $$

③ 計算用別形式

展開すると:

$$ s_{xy} = \overline{xy} - \bar{x}\bar{y} = \frac{1}{n}\sum x_i y_i - \bar{x}\bar{y} $$

記号の読み方

記号読み方意味
s_xy / σ_xyエス/シグマ サブ エックスワイX と Y の共分散
Cov(X, Y)カバリアンス エックス カンマ ワイ共分散の関数表記
(xᵢ-x̄)(yᵢ-ȳ)偏差の積2つの偏差の積

🔗 共分散 → 相関係数 — 単位を消して比較可能に

共分散の最大の問題は単位に依存すること。 同じデータでも単位を変えると値が変わります:

共分散の単位問題

千円単位だと cov ≈ 8、 円単位だと cov ≈ 8,000,000。 数字だけ見ても「強い関係か弱い関係か」が判断できません。

正規化 → 相関係数

共分散を、 両変数の標準偏差の積で割ることで単位を消すのが相関係数

$$ r = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} = \frac{s_{xy}}{s_x \, s_y} $$

これにより値は必ず -1 ≤ r ≤ +1 の範囲に収まり、 単位に依存しなくなります。 SSDSE 食料費×教育費の場合:

💡 覚え方:「共分散 ÷ 両方の標準偏差 = 相関係数」。 相関係数は正規化された共分散。 これによりどんな変数のペアでも比較可能に。

🎲 共分散行列 — 多変量の関係を一気に表現

変数が3つ以上ある場合、 すべてのペアの共分散を行列にまとめたものが共分散行列

$$ \Sigma = \begin{pmatrix} \sigma_x^2 & \sigma_{xy} & \sigma_{xz} \\ \sigma_{xy} & \sigma_y^2 & \sigma_{yz} \\ \sigma_{xz} & \sigma_{yz} & \sigma_z^2 \end{pmatrix} $$

共分散行列と相関行列

共分散行列の性質

  1. 対称:Σᵢⱼ = Σⱼᵢ
  2. 半正定値:すべての固有値が非負
  3. 対角成分は分散:常に非負

主要な応用

🔧 共分散の性質 — 線形変換

① 対称性

$$ \text{Cov}(X, Y) = \text{Cov}(Y, X) $$

② 自分自身との共分散は分散

$$ \text{Cov}(X, X) = \text{Var}(X) $$

③ 線形変換

$$ \text{Cov}(aX + b, cY + d) = ac \cdot \text{Cov}(X, Y) $$

定数倍は乗算、 加算は影響なし。 単位変換で共分散が変わる原因。

④ 独立なら共分散ゼロ

X と Y が独立 ⇒ Cov(X, Y) = 0(逆は成立しない! 共分散ゼロでも非線形に依存することがある)

⑤ 和の分散

$$ \text{Var}(X + Y) = \text{Var}(X) + \text{Var}(Y) + 2 \text{Cov}(X, Y) $$

共分散項があるため、 一般には和の分散は単純な和ではない。 ポートフォリオ理論の基礎。

💰 ポートフォリオ理論への応用

投資の世界で共分散はリスク計算の中核。 Markowitz の現代ポートフォリオ理論(1952)の基礎。

ポートフォリオのリスク

2資産(A, B)に重み w_A, w_B で投資する場合のリスク(分散):

$$ \sigma_p^2 = w_A^2 \sigma_A^2 + w_B^2 \sigma_B^2 + 2 w_A w_B \text{Cov}(A, B) $$

ポイント:共分散が小さい(あるいは負の)資産を組み合わせると、 ポートフォリオ全体のリスクが小さくなる。 これが分散投資の数学的根拠。

分散投資の効果

多変量への拡張

$$ \sigma_p^2 = \mathbf{w}^T \Sigma \mathbf{w} $$

w は重みベクトル、 Σ は資産の共分散行列。 機関投資家の最適化計算の中核式。

🤖 機械学習での共分散

① PCA(主成分分析)

PCA は共分散行列 Σ の固有値分解で実装:

$$ \Sigma = V \Lambda V^T $$

固有ベクトル V が主成分軸、 固有値 Λ が各軸の分散。 「最も分散が大きい方向」が第1主成分。

② 線形判別分析 (LDA)

クラス内共分散とクラス間共分散の比を最大化する。 共分散構造に基づく分類。

③ ガウス混合モデル (GMM)

複数の多変量正規分布の組合せでデータ生成過程をモデル化。 各分布が共分散行列を持つ。

④ 共分散関数(カーネル)

ガウス過程回帰では、 「入力空間での近さ」を共分散関数で測ります。 RBFカーネルなど。

⑤ Whitening 変換

共分散行列 Σ を単位行列に変換する前処理。 PCA + 標準化のような効果で、 学習を加速します。

🔬 共分散の深掘り — 行列・固有値・スパース化

🔬 共分散の深掘り — 行列・固有値・スパース化

共分散は単一の数値だけでなく、 多変量データでは「共分散行列」として頻繁に登場します。 ここでは SSDSE-B-2026 を題材に、 共分散行列の対角化(PCA の前段階)、 標本共分散の不偏性、 そして高次元下での スパース化テクニックを順に押さえます。

① 共分散行列の対角化と PCA への橋渡し

共分散行列 Σ を固有値分解すると、 固有ベクトルが 主成分方向、 固有値が 分散の大きさになります。 SSDSE-B-2026 の数値変数群に対して以下を実行すると、 主成分の意味と寄与率を一目で確認できます。

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
num = df.select_dtypes(include=[np.number]).iloc[:, :6]   # 先頭 6 変数で例示
Sigma = num.cov().values
eigvals, eigvecs = np.linalg.eigh(Sigma)
order = np.argsort(eigvals)[::-1]
print('固有値:', eigvals[order])
print('寄与率:', eigvals[order] / eigvals.sum())
📤 実行例(実測) 固有値: [1.98926364e+13 3.10541937e+09 1.16439411e+09 9.92528686e+05 6.94887713e+04 9.46844048e+00] 寄与率: [9.99785350e-01 1.56075480e-04 5.85213617e-05 4.98835658e-08 3.49244082e-09 4.75874985e-13]

② 不偏共分散と最尤推定の違い

標本共分散の分母には n-1 を使う(不偏推定量)か n を使う(最尤推定量)かの 2 つの慣習があります。 SSDSE-B-2026 のように n=47 と小さいデータでは、 分母の違いが約 2% の差を生むため、 ライブラリの仕様 (ddof=1 がデフォルトか) を必ず確認してください。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
x = df['総人口'].values
y = df.iloc[:, 4].values
unbiased = np.cov(x, y, ddof=1)[0, 1]   # n-1
mle      = np.cov(x, y, ddof=0)[0, 1]   # n
print(f'不偏共分散 (n-1): {unbiased:.4f}')
print(f'最尤共分散 (n)  : {mle:.4f}')
print(f'差分比         : {(unbiased - mle) / unbiased:.4%}')
📤 実行例(実測) 不偏共分散 (n-1): 3674496413186.8457 最尤共分散 (n) : 3667981348624.4575 差分比 : 0.1773%

③ 高次元下のスパース共分散推定

変数の数 p が観測数 n に近い、 あるいは超えると、 標本共分散行列は 特異になり PCA や マハラノビス距離が機能しません。 対策は 3 つ:

  1. 縮約推定(Ledoit-Wolf)— 標本共分散と単位行列の凸結合で正則化
  2. グラフィカル LASSO— 精度行列にスパース性を仮定
  3. 主成分回帰— 上位 k 固有値のみで近似
📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
1
2
3
4
5
6
7
8
from sklearn.covariance import LedoitWolf
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
X = df.select_dtypes('number').fillna(0)
lw = LedoitWolf().fit(X)
print('shrinkage 強度:', lw.shrinkage_)
print('縮約共分散行列の形状:', lw.covariance_.shape)
📤 実行例(実測) shrinkage 強度: 0.03039357721450191 縮約共分散行列の形状: (110, 110)
手法仮定向き
標本共分散n >> pSSDSE 全体(n=47, p<=30)
Ledoit-Wolf高次元安定化p ≈ n の境界領域
グラフィカル LASSO疎な依存構造変数間関係の可視化

コンペでは「共分散行列の固有値が極端に小さい場合に PCA が不安定になる」現象を見たら、 まず 縮約推定を試すのが基本動作です。 また、 共分散が単位の影響を受ける点を忘れず、 単位の異なる変数を組み合わせる際には 必ず標準化を入れてから共分散行列を計算しましょう(事実上、 標準化後の共分散行列 = 相関行列)。

④ 共分散の解釈テンプレート(コンペ提出用)

⑤ 共分散行列の正定値性チェック

共分散行列は理論的には 半正定値(PSD)です。 しかし数値誤差で固有値がわずかに負になることがあり、 マハラノビス距離やコレスキー分解が失敗する原因になります。 SSDSE-B-2026 で対角成分を扱う際の 正定値補正テンプレートを覚えておきましょう。

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import numpy as np
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
X = df.select_dtypes('number').fillna(df.select_dtypes('number').mean())
S = X.cov().values

# 固有値分解で小さい負の値を 0 にクリップ
w, V = np.linalg.eigh(S)
w_clip = np.clip(w, 1e-8, None)
S_pd = V @ np.diag(w_clip) @ V.T
print('元の最小固有値:', w.min())
print('補正後の最小固有値:', w_clip.min())
📤 実行例(実測) 元の最小固有値: -0.001684967752842429 補正後の最小固有値: 1e-08

⑥ 都道府県データでの可視化

共分散行列はヒートマップとして可視化すると一目で「正の依存」「負の依存」「独立」の構造が見えます。 SSDSE-B-2026 では総人口、 高齢化率、 大学進学率、 完全失業率などの軸で並べると、 人口関連 vs 経済関連のブロック構造が浮き上がります。

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
num = df.select_dtypes('number').iloc[:, :8]
fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(num.cov(), annot=False, cmap='RdBu_r', center=0, ax=ax)
ax.set_title('SSDSE-B-2026: 共分散ヒートマップ(先頭 8 変数)')
plt.tight_layout()
plt.savefig('cov_heatmap.png', dpi=120)

注意点として、 単位が大きく異なる変数を含む生の共分散行列は 解釈困難です。 「総人口」(数百万)と「失業率」(数%)が同じヒートマップに乗ると、 後者の動きはほぼ見えません。 必ず 標準化(z-score)した上での共分散=相関行列を併記しましょう。

⑦ 共分散と独立性 — 重要な誤解の整理

「共分散 = 0」は「無相関」を意味するが、 「独立」を意味するとは限りません。 例えば U字型の関係(X² と X など)では、 共分散はゼロでも明らかな依存関係があります。 この誤解はコンペでも頻発するため、 共分散ゼロを発見しても 非線形依存の可能性を散布図で必ず確認しましょう。

関係性共分散独立性
線形に増加×(依存)
線形に減少×(依存)
U 字 (Y=X²)0(理論)×(依存)
完全独立0

この表をコンペ提出物に貼っておくと、 「共分散ゼロ ≠ 独立」の指摘に対する反論材料になります。 一方、 多変量正規分布の特殊ケースでは「共分散ゼロ ⇔ 独立」が成立するため、 仮定が成立するか否かを最初に検討する習慣をつけましょう。 SSDSE-B-2026 の各指標は正規性が必ずしも担保されないため、 散布図と Spearman 順位相関の併用が安全策です。

⑧ 共分散をビジネス/政策にどう翻訳するか

共分散の数値そのものは 単位の積であり、 ビジネスや政策の文脈では直接そのまま示しても理解されにくいです。 そこで、 以下の 3 ステップで「説明可能な指標」に翻訳することを推奨します。

  1. 標準化: 各変数を z-score に変換し、 共分散を計算 → これは相関係数 r になる
  2. 効果量: r²(決定係数) で「変動の何 % が説明できるか」を伝える
  3. 具体例: 「都道府県別データで、 高齢化率が 1 SD 上がると、 平均所得が 0.X SD 変化する」のような言い回し

最終的に、 共分散は 多変量解析の入口として捉え、 「ばらつき」「相関」「主成分」「マハラノビス距離」「カルマンフィルター」など、 後段の応用に橋渡しする数学的ツールであることを意識すれば、 用語ページとしての価値が一段と高まります。 関連用語のリンク先(相関PCA分散距離)を往復しながら、 自分なりの「共分散から始まる学習マップ」を作ってみてください。

⑨ 練習問題(自学用)

最後に、 共分散は 確率変数の積の期待値から、 それぞれの期待値の積を引いたものとして定義されます。 この定義を式と日本語の両方で言えるようになれば、 多変量解析の基礎が固まったと判断できます。 自分のノートに 「共分散の 5 通りの説明」を書き出してみるのもおすすめです。

🧮 計算ステップ — 東北6県の共分散を手計算

東北6県の食料費と教育費の共分散を計算します。 (x̄ = 80.82, ȳ = 7.73)

都道府県 食料費 xᵢ 教育費 yᵢ xᵢ - x̄ yᵢ - ȳ (xᵢ-x̄)(yᵢ-ȳ)
青森県77.906.71-2.925-1.021+2.9864
岩手県82.006.75+1.173-0.986-1.1566
宮城県83.8311.24+3.011+3.511+10.5716
秋田県78.124.32-2.700-3.418+9.2286
山形県84.117.27+3.281-0.467-1.5322
福島県78.9810.12-1.840+2.381-4.3810
合計 +15.7168

共分散の値

🧮 合成例で学ぶ:家計5変数の分散共分散行列

ここでは家計5変数(魚介・肉・野菜・果物・酒類)を想定した合成(架空)の共分散行列を題材に、 PCA・マハラノビス距離との関係を見ます(数値は SSDSE 実測ではなく、 構造を分かりやすくするための合成値)。

📊 ステップ1:分散共分散行列の値

各変数を 1000円単位にスケールしたと想定した合成の共分散行列 Σ(架空値):

魚介 野菜 果物 酒類
魚介42.38.112.49.75.2
8.138.614.211.87.4
野菜12.414.231.918.56.8
果物9.711.818.528.44.9
酒類5.27.46.84.922.6

※対角は分散、 オフ対角は共分散。 単位は (千円)²。 すべて正なので「どの食品も一緒に増えやすい」傾向。 これは家計の総支出という共通因子の存在を示唆。

📊 ステップ2:PCA を共分散行列の固有値分解として理解

固有値分解 Σ = V Λ V^T を行うと、 固有値の大きい順に主成分が並びます:

固有値の合計はトレース(対角和)163.8 に一致し、 各寄与率の合計は 100% になる(λ₁ の 46.2% は 92.4/163.8=56.4% ではなく、 上の行列を実際に固有値分解した値)。 第1〜第2主成分で約 66.5% の情報を保持。 共分散行列は多変量データの構造を凝縮した行列です。

📊 ステップ3:マハラノビス距離で「特異な県」を検出

マハラノビス距離 $D^2 = (x-\mu)^T \Sigma^{-1} (x-\mu)$ は、 共分散の構造を考慮した「異常さの度合い」。 47県でこの値が大きい県(D > 4 程度)は、 一般的な家計パターンから離れた特異な県と言えます。 沖縄県は酒類消費が独特で、 マハラノビス距離が大きく出る代表例。

🧮 数式に値を入れて手で計算する: 共分散

合成 2 変量データで Cov(x,y) を計算する。

Step 1: データと平均

ixyx-x̄y-ȳ
123-2.2-48.8
247-0.200.0
37122.8514.0
4590.821.6
534-1.2-33.6

x̄ = 4.2, ȳ = 7.0

Step 2: 共分散

Σ積 = 8.8 + 0 + 14.0 + 1.6 + 3.6 = 28.0 標本共分散 (n-1) = 28.0 / 4 = 7.0 母共分散 (n) = 28.0 / 5 = 5.6

🐍 Python で再現

1
2
3
4
5
import numpy as np
x = np.array([2, 4, 7, 5, 3])
y = np.array([3, 7, 12, 9, 4])
print(f"標本共分散: {np.cov(x, y, ddof=1)[0,1]:.2f}")
print(f"母共分散: {np.cov(x, y, ddof=0)[0,1]:.2f}")

📤 実行結果

標本共分散: 7.00 母共分散: 5.60

💬 手計算 (Step 2) 7.0 / 5.6 と Python 出力が完全一致。

🐍 Python での計算

🎯 解説: 共分散 Cov(X, Y) は 2 変数の「同時変動の程度と方向」を測る。 SSDSE-B-2026 の「総人口」と「出生数」で、 単位を保ったままどれだけ一緒に動くかを確認する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import numpy as np
import pandas as pd

# 2変数の共分散
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 7, 9])

# numpy
cov_mat = np.cov(x, y)         # 2x2 行列
print(cov_mat[0, 1])           # x と y の共分散

# pandas
df = pd.DataFrame({'x': x, 'y': y})
print(df.cov())                # 共分散行列
print(df['x'].cov(df['y']))    # 個別の共分散
📥 入力例: data/raw/SSDSE-B-2026.csv X: A1101(総人口) Y: A4101(出生数)
📤 実行例(実測) 4.25 x y x 2.50 4.25 y 4.25 7.30 4.25
💬 読み方: 共分散の値そのものは単位依存で「大小」の解釈が難しい。 そのため標準化された相関係数(共分散を標準偏差積で割った値)の方が解釈しやすい。 ただし回帰係数の計算では共分散が直接使われる。

共分散行列(多変量)

🎯 解説: 標本共分散(÷n-1)と母共分散(÷n)の違いを確認する。 pandas のデフォルトは ÷(n-1)、 numpy.cov のデフォルトも ÷(n-1)、 numpy.cov(bias=True) で ÷n。
 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
28
29
30
31
# ── この抜粋で使うデータを用意します(SSDSE-B の 47 都道府県・最新年度)──
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()]

# 使う費目だけ数値に直す
# 注意: SSDSE-B の費目名は「◯◯費(二人以上の世帯)」。「光熱費」ではなく
#       「光熱・水道費(二人以上の世帯)」が正しい列名。
cols = ['食料費(二人以上の世帯)', '住居費(二人以上の世帯)',
        '教育費(二人以上の世帯)', '光熱・水道費(二人以上の世帯)']
for _c in cols:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')
df = df.dropna(subset=cols)

cov_matrix = df[cols].cov()
print(cov_matrix)

# 相関行列に変換
import numpy as np
def cov_to_corr(cov):
    sd = np.sqrt(np.diag(cov))
    return cov / np.outer(sd, sd)

corr_matrix = cov_to_corr(cov_matrix.values)
print(corr_matrix)

# pandas で直接
print(df[cols].corr())
📥 入力例: data/raw/SSDSE-B-2026.csv n = 47 都道府県
📤 実行例(実測) 食料費(二人以上の世帯) 住居費(二人以上の世帯) 教育費(二人以上の世帯) 光熱・水道費(二人以上の世帯) 食料費(二人以上の世帯) 3.412620e+07 -8.304801e+04 1.790584e+07 1.748020e+06 住居費(二人以上の世帯) -8.304801e+04 1.877887e+07 -4.776925e+05 -2.048284e+06 教育費(二人以上の世帯) 1.790584e+07 -4.776925e+05 1.773959e+07 -1.996651e+06 光熱・水道費(二人以上の世帯) 1.748020e+06 -2.048284e+06 -1.996651e+06 9.730842e+06 [[ 1. -0.00328058 0.7277447 0.0
💬 読み方: 標本共分散(n-1)は不偏推定量、 母共分散(n)は最尤推定量。 サンプルから母集団を推定する文脈では標本共分散を使う。 47 県のような小サンプルでは差が 2% 程度あるので注意。

ddof(自由度)の指定

# pandas のデフォルトは ÷(n-1) df.cov() # 不偏共分散 # numpy のデフォルトも ÷(n-1)(numpy.cov はやや特殊) np.cov(x, y) # 不偏(ddof=1 がデフォルト) np.cov(x, y, ddof=0) # 標本共分散

ポートフォリオ分散の計算

🎯 解説: 共分散行列(複数変数の共分散をまとめた行列)を計算する。 主成分分析(PCA)の基礎であり、 多変量解析の出発点。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def portfolio_variance(weights, cov_matrix):
    # σ_p^2 = w^T Σ w
    return weights.T @ cov_matrix @ weights

w = np.array([0.6, 0.4])    # 60% 株, 40% 債券
returns_cov = np.array([
    [0.04, 0.01],
    [0.01, 0.02]
])
print(portfolio_variance(w, returns_cov))
📥 入力例: data/raw/SSDSE-B-2026.csv X: [A1101, A1301, A1303, A4101] 4 変数 × 47 県
📤 実行例(実測) 0.0224
💬 読み方: 共分散行列の対角成分は分散、 非対角は共分散。 PCA はこの行列の固有値分解で主成分を求める。 共線性が強いと行列が不安定になり、 逆行列計算(重回帰の係数推定)が誤差を含む。

🚧 共分散の落とし穴

1️⃣ 単位への依存 — 直接比較不可

同じデータでも単位を変えると共分散が変わる。 「強い関係か弱いか」を判断するには相関係数を使うこと。

2️⃣ 共分散ゼロ ≠ 独立

共分散ゼロでも非線形な関係(U字、 周期的)はあり得ます。 共分散はあくまで「線形な共変動」のみを捉える指標。

3️⃣ 外れ値の影響

偏差の積を取るので、 外れ値1つで共分散が大きく動きます。 散布図で外れ値を確認してから判断。

4️⃣ 因果関係ではない

共分散が大きい ≠ 因果関係がある。 第3変数(交絡変数)の可能性を常に考慮。

5️⃣ 非線形関係を見逃す

共分散は線形関係のみを測るため、 非線形関係は数値に反映されない。 散布図と組み合わせて判断。

📜 共分散の歴史

📖 包括的解説 — この概念を完全マスター

📍 学習の3ステップ

  1. 定義を理解する:この概念は何か? 数式や条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

🎯 解説: 共分散 Cov(X, Y) は 2 変数の「同時変動の程度と方向」を測る。 SSDSE-B-2026 の「総人口」と「出生数」で、 単位を保ったままどれだけ一緒に動くかを確認する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 基本パターン
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['食料費(二人以上の世帯)', '教育費(二人以上の世帯)', '住居費(二人以上の世帯)']])
plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv X: A1101(総人口) Y: A4101(出生数)
📤 このブロックは標準出力には何も出さない
💬 読み方: 共分散の値そのものは単位依存で「大小」の解釈が難しい。 そのため標準化された相関係数(共分散を標準偏差積で割った値)の方が解釈しやすい。 ただし回帰係数の計算では共分散が直接使われる。

📚 統計概念マップでの位置

このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。

🎯 共分散ならではの実装ポイント

共分散は「単位依存」「対称性」「正定値性」「外れ値感応」の 4 性質に強く縛られる。 同じ cov 関数でも (1) 分母を n とするか n-1 とするか、 (2) 入力行列を「行=変数」とするか「行=サンプル」とするか、 (3) 観測値に重みを付けるか、 (4) 縮約 (shrinkage) を入れるかで結果が変わる。 SSDSE-B-2026 の 47 都道府県 × 数十変数という低 n × 中 p 設定では、 標本共分散行列の最小固有値が小さく PCA や Mahalanobis 計算が数値的に不安定になりやすい点に注意。

💡 共分散計算で押さえるべきライブラリ差

処理 Python の代表 API 分母 / 入力規約
標本共分散行列df.cov() / np.cov(X.T)n-1 / pandas は列=変数、 numpy は行=変数(要転置)
最尤(母)共分散np.cov(X.T, bias=True)n / EM・GMM の M-step で使われる
縮約共分散sklearn.covariance.LedoitWolf対角に寄せた重み付き平均、 高次元で安定
ロバスト共分散sklearn.covariance.MinCovDet最小行列式の部分集合で外れ値除外推定
スパース精度行列sklearn.covariance.GraphicalLassoCVΣ⁻¹ の非ゼロ構造を L1 で同定
重み付き共分散np.cov(X.T, aweights=w)アンケート weight・EWMA 共分散の素材
EWMA 共分散df.ewm(span=20).cov()時系列で時間減衰させた共分散

🚧 共分散固有の落とし穴と対策

📊 共分散・共分散行列の報告フォーマット

🌐 共分散が中核となる応用

🎓 共分散をさらに深掘る文献

🔗 共分散が組み込まれている統計用語ネットワーク

共分散は「記述統計(ばらつき)」と「多変量解析(行列演算)」の橋渡しに位置します。 1 変数の分散の自然な 2 変数拡張であり、 相関係数の前段、 PCA / Mahalanobis / 重回帰の素材、 縮約・ロバスト推定で形を変えながら、 ベイズ統計の事前分布(逆 Wishart 分布)にも顔を出します。 以下のリンクを辿ることで、 共分散がどう変形・拡張されていくかを体系的に把握できます。

共分散と直接連結する概念グループ

グループ 共分散との接続
記述統計の基礎分散(自己共分散)、 標準偏差、 平均
標準化された関連度相関係数、 偏相関、 Spearman / Kendall
行列としての共分散分散共分散行列、 精度行列 Σ⁻¹、 相関行列
分解・縮約PCA(固有値分解)、 Ledoit-Wolf、 Graphical Lasso
頑健・順位ベースMCD、 Spearman 共分散、 距離共分散
回帰での出現単回帰係数 β = Cov/Var、 OLS の (X'X)⁻¹X'y
分類・距離Mahalanobis 距離、 LDA、 QDA
分布多変量正規、 多変量 t、 ウィッシャート / 逆ウィッシャート
時系列自己共分散、 EWMA 共分散、 DCC-GARCH
非線形依存距離相関、 相互情報量、 HSIC
フィルタリングカルマンフィルタ(状態共分散の時間更新)
応用ドメインポートフォリオ理論、 遺伝子共発現、 因子モデル

共分散を起点とした推奨学習順序

  1. 分散と標準偏差(1 変数のばらつき)
  2. 2 変数の散布図と偏差の積(共分散の直感)
  3. 共分散の定義式と n / n-1 の違い
  4. 共分散から相関係数への標準化
  5. 分散共分散行列と固有値分解 → PCA
  6. Mahalanobis 距離(Σ⁻¹ の利用)
  7. 縮約推定(Ledoit-Wolf)とスパース精度行列(Graphical Lasso)
  8. ロバスト共分散(MCD)と外れ値耐性
  9. 時系列共分散(EWMA、 DCC-GARCH)と応用(ポートフォリオ / カルマン)

📝 共分散の SSDSE-B-2026 実践課題

初級課題(共分散の定義と単位依存)

  1. SSDSE-B-2026 の総人口 (A1101) と出生数 (A4101) で Cov(X,Y) を np.cov で計算
  2. 同じ計算を bias=True(÷n)と bias=False(÷n-1)で行い 47/46 倍の差を確認
  3. 総人口を「千人」単位に換算(1/1000)した時、 共分散が 1/1000 倍になることを検証
  4. 共分散の値を両変数の標準偏差で割って相関係数を再構成、 df.corr() と一致するか確認

中級課題(共分散行列と多変量)

  1. 家計支出 5 変数で df.cov() を計算し、 対角成分が各変数の分散と一致することを確認
  2. 共分散行列の固有値分解を np.linalg.eigh で実施、 最大固有値の固有ベクトルを PC1 として確認
  3. Mahalanobis 距離を EmpiricalCovariance().mahalanobis(X) で計算し、 外れ県を抽出
  4. 条件数 np.linalg.cond(Σ) を測り、 10⁸ を超えるか確認(縮約の必要性判定)

上級課題(縮約・ロバスト・時系列)

  1. SSDSE-B-2026 の人口・産業・家計の 20 変数で LedoitWolf を適用、 shrinkage_ の値を解釈
  2. 1 県を意図的に外れ値化し、 標本共分散 vs MCD 共分散の差を比較(条件数・最大固有値)
  3. GraphicalLassoCV でスパース精度行列を推定、 非ゼロパターンから条件付き独立構造を読み取る
  4. 時系列版として、 SSDSE 年次データから 2 変数の EWMA 共分散を df.ewm(span=10).cov() で計算

🐍 Python 実装バリエーション

① NumPy / Pandas(基本)

🎯 解説: 標本共分散(÷n-1)と母共分散(÷n)の違いを確認する。 pandas のデフォルトは ÷(n-1)、 numpy.cov のデフォルトも ÷(n-1)、 numpy.cov(bias=True) で ÷n。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 SSDSE-B-2026(年度) A1101(総人口) A4101(出生数) A4200(死亡数) A9101(婚姻件数) 北海道 2,023 5,092,000 24,430 75,120 17,281 東京都 2,023 14,086,000 86,348 137,241 71,774 沖縄県 2,023 1,468,000 12,549 15,110 6,316 …(全 47 行)
 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
28
# ── この抜粋で使うデータを用意します(SSDSE-B の 47 都道府県・最新年度)──
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()]

import numpy as np

# 使う列だけ数値に直す
_feats = ['総人口', '出生数', '死亡数', '婚姻件数']
for _c in _feats:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')
df = df.dropna(subset=_feats)
X = df[_feats].to_numpy(dtype=float)

cov_matrix = np.cov(X.T)  # 各列を変数とみなす(注意:行列の向き)
print(np.round(cov_matrix, 1))

# pandas なら直接
# 注意: 「魚介」「肉」「野菜」は SSDSE-B には無い(品目別は市区町村版の SSDSE-C)。
#       SSDSE-B にある費目で同じことをする。
cols = ['食料費(二人以上の世帯)', '住居費(二人以上の世帯)', '教育費(二人以上の世帯)']
for _c in cols:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')
cov_df = df[cols].dropna().cov()
print(cov_df)
📥 入力例: data/raw/SSDSE-B-2026.csv n = 47 都道府県
📤 実行例(実測) [[7.82629390e+12 4.77737544e+10 8.04735808e+10 3.61382286e+10] [4.77737544e+10 2.94310339e+08 4.87665486e+08 2.22150852e+08] [8.04735808e+10 4.87665486e+08 8.45792456e+08 3.65405267e+08] [3.61382286e+10 2.22150852e+08 3.65405267e+08 1.70591934e+08]] 食料費(二人以上の世帯) 住居費(二人以上の世帯) 教育費(二人以上の世帯) 食料費(二人以上の世帯) 3.412620e+07 -8.304801e+04 1.790584e+07 住居費(二人以上の世帯) -8.304801e+04 1.877887e
💬 読み方: 標本共分散(n-1)は不偏推定量、 母共分散(n)は最尤推定量。 サンプルから母集団を推定する文脈では標本共分散を使う。 47 県のような小サンプルでは差が 2% 程度あるので注意。

② scikit-learn — 縮約推定(Ledoit-Wolf)

高次元データや小サンプルでは、 標本共分散より縮約推定の方が安定。

🎯 解説: 共分散行列(複数変数の共分散をまとめた行列)を計算する。 主成分分析(PCA)の基礎であり、 多変量解析の出発点。
1
2
3
4
from sklearn.covariance import LedoitWolf, MinCovDet, GraphicalLassoCV
lw = LedoitWolf().fit(X)
print(lw.covariance_, lw.shrinkage_)
# ロバスト共分散(外れ値に強い)
📥 入力例: data/raw/SSDSE-B-2026.csv X: [A1101, A1301, A1303, A4101] 4 変数 × 47 県
📤 実行例(実測) [[6.52701693e+12 3.75372233e+10 6.32304245e+10 2.83948534e+10] [3.75372233e+10 3.77902260e+11 3.83172904e+08 1.74550362e+08] [6.32304245e+10 3.83172904e+08 3.78335576e+11 2.87109508e+08] [2.83948534e+10 1.74550362e+08 2.87109508e+08 3.77805051e+11]] 0.19718995620242605
💬 読み方: 共分散行列の対角成分は分散、 非対角は共分散。 PCA はこの行列の固有値分解で主成分を求める。 共線性が強いと行列が不安定になり、 逆行列計算(重回帰の係数推定)が誤差を含む。

③ scikit-learn — マハラノビス距離

🎯 解説: 共分散 Cov(X, Y) は 2 変数の「同時変動の程度と方向」を測る。 SSDSE-B-2026 の「総人口」と「出生数」で、 単位を保ったままどれだけ一緒に動くかを確認する。
1
2
3
4
from sklearn.covariance import EmpiricalCovariance
cov = EmpiricalCovariance().fit(X)
d_squared = cov.mahalanobis(X)  # 各サンプルのマハラノビス距離²
print(sorted(d_squared)[-5:])  # 最も外れた5サンプル
📥 入力例: data/raw/SSDSE-B-2026.csv X: A1101(総人口) Y: A4101(出生数)
📤 実行例(実測) [np.float64(11.356129717958595), np.float64(13.363358526237564), np.float64(21.265846296851677), np.float64(22.22855292121774), np.float64(42.13299019631621)]
💬 読み方: 共分散の値そのものは単位依存で「大小」の解釈が難しい。 そのため標準化された相関係数(共分散を標準偏差積で割った値)の方が解釈しやすい。 ただし回帰係数の計算では共分散が直接使われる。

④ scipy.stats.multivariate_normal — 多変量正規の確率密度

🎯 解説: 標本共分散(÷n-1)と母共分散(÷n)の違いを確認する。 pandas のデフォルトは ÷(n-1)、 numpy.cov のデフォルトも ÷(n-1)、 numpy.cov(bias=True) で ÷n。
 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
28
29
30
# ── この抜粋で使うデータを用意します(SSDSE-B の 47 都道府県・最新年度)──
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()]
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')
df['高齢化率'] = df['65歳以上人口'] / df['総人口'] * 100

# 見本でよく使われる仮の列名を、実データから作っておく
df['income'] = df['消費支出(二人以上の世帯)']
df['population'] = df['総人口']
_region = {'北海道': '北海道', '青森県': '東北', '岩手県': '東北', '宮城県': '東北',
           '秋田県': '東北', '山形県': '東北', '福島県': '東北', '茨城県': '関東',
           '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東',
           '東京都': '関東', '神奈川県': '関東'}
df['region'] = df['都道府県'].map(_region).fillna('その他')
df['地域'] = df['region']

_feats = ['総人口', '出生数', '死亡数', '婚姻件数']
df = df.dropna(subset=_feats + ['消費支出(二人以上の世帯)'])
X = df[_feats].to_numpy(dtype=float)
y = df['消費支出(二人以上の世帯)'].to_numpy(dtype=float)
x = df['総人口'].to_numpy(dtype=float)

from scipy.stats import multivariate_normal
mvn = multivariate_normal(mean=X.mean(0), cov=np.cov(X.T))
print(mvn.pdf(X[0]))  # 観測値の確率密度
📥 入力例: data/raw/SSDSE-B-2026.csv n = 47 都道府県
📤 実行例(実測) 2.2542925276651292e-23
💬 読み方: 標本共分散(n-1)は不偏推定量、 母共分散(n)は最尤推定量。 サンプルから母集団を推定する文脈では標本共分散を使う。 47 県のような小サンプルでは差が 2% 程度あるので注意。

⑤ statsmodels — 重み付き / 加重共分散

🎯 解説: 共分散行列(複数変数の共分散をまとめた行列)を計算する。 主成分分析(PCA)の基礎であり、 多変量解析の出発点。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd

# ── この抜粋だけで動くように、47 都道府県・最新年度を読み込む ──
_d = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
_d = _d[_d['SSDSE-B-2026'] == 2023]
import numpy as np

_feats = ['総人口', '出生数', '死亡数']
X = _d[['A1101', 'A4101', 'A4200']].astype(float).values   # 総人口・出生数・死亡数
weights = _d['A1101'].astype(float).values                  # 人口を標本ウェイトにする

# 標本ウェイト付き共分散(大きい県ほど重く数える)
cov_w = np.cov(X.T, aweights=weights)
print('ウェイトあり:\n', np.round(cov_w, 1))
print('ウェイトなし:\n', np.round(np.cov(X.T), 1))
# 時系列の EWMA 共分散は pandas で:df.ewm(span=20).cov()
📥 入力例: data/raw/SSDSE-B-2026.csv X: [A1101, A1301, A1303, A4101] 4 変数 × 47 県
📤 実行例(実測) ウェイトあり: [[1.78544992e+13 1.10454362e+11 1.70665424e+11] [1.10454362e+11 6.87904428e+08 1.05133913e+09] [1.70665424e+11 1.05133913e+09 1.66809912e+09]] ウェイトなし: [[7.82629390e+12 4.77737544e+10 8.04735808e+10] [4.77737544e+10 2.94310339e+08 4.87665486e+08] [8.04735808e+10 4.87665486e+08 8.45792456e+08]]
💬 読み方: 共分散行列の対角成分は分散、 非対角は共分散。 PCA はこの行列の固有値分解で主成分を求める。 共線性が強いと行列が不安定になり、 逆行列計算(重回帰の係数推定)が誤差を含む。

⚠️ 共分散の落とし穴(深掘り版・6件)

① 単位を変えると共分散の値が大きく変わる

身長を cm から m に変えるだけで、 共分散の値は 1/100 倍に。 つまり「Cov = 100」という数字だけでは関係の強さを判断できない。 だから相関係数(共分散 ÷ 両方の標準偏差)で規格化する。 共分散の値の絶対値を異なる変数ペアで比較するのは原則禁止。 比較したいなら必ず相関係数に変換すること。

② 共分散行列が非正定値になるケース

標本サイズ n が変数数 p より小さい(n < p、 高次元)場合、 標本共分散行列は特異になり逆行列が存在せず、 PCA・マハラノビス・GLS が破綻します。 対策:(1) 主成分回帰、 (2) Ridge 系の縮約(shrinkage)共分散行列、 (3) Ledoit-Wolf 縮約推定(sklearn.covariance.LedoitWolf)、 (4) スパース推定(Graphical Lasso)。 ファイナンス・遺伝子解析で必須。

③ 共分散 = 0 を「独立」と誤解する

独立 ⇒ 共分散 = 0 は成立、 しかし逆は成立しない。 例:y = x² で x が標準正規なら Cov(x, y) = 0 だが、 明らかに独立ではない。 線形関係しか測れないのが共分散の本質的限界。 非線形関係には距離相関(distance correlation)相互情報量(MI)HSIC を使う。 機械学習の前処理で特徴量選択する際は要注意。

④ 外れ値が共分散行列を歪める

共分散は偏差の積の平均なので、 1つの極端な外れ値が大きく影響。 たとえば1点だけが (100, 100) にあると、 残りの点が独立でも共分散が大きく出ます。 対策:(1) ロバスト共分散行列sklearn.covariance.MinCovDet)、 (2) Spearman 順位相関、 (3) Mahalanobis 距離での外れ値検出と除外。 金融データではブラックスワン事象でこの問題が顕在化。

⑤ 標本共分散 vs 不偏共分散の混乱

分母を n とする標本共分散(numpy.cov(..., bias=True))と、 n-1 とする不偏共分散(デフォルト)で値が違う。 小サンプル(n < 20)では差が無視できない。 また pandas の df.cov() はデフォルト不偏(n-1)、 numpy の np.cov() もデフォルト不偏ですが bias 引数で切り替え可能。 ライブラリ間で挙動が違うので必ずドキュメントで確認。

⑥ 時間相関を無視して共分散を計算する

時系列データでは隣接時点の y_t と y_{t+1} に自己相関がある。 これを iid とみなして共分散を計算すると、 標準誤差が過小評価される。 ファイナンスではEWMA 共分散DCC-GARCH、 計量経済では Newey-West 標準誤差で時間相関を補正。 単純な np.cov は時系列に対しては誤解を招く道具と心得る。

🗺️ 概念マップ — 3つの視点で体系を理解する

共分散 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス記述統計ばらつき共分散

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心に 共分散 を置き、 そこから 分散・相関係数・平均・PCA・クラスタリング・標準偏差 など 計 11 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語あとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「共分散」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「共分散」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 共分散隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンスばらつき → 共分散 という入れ子の位置を示します。 「ばらつきには他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。

📌 補足セクション — 共分散を SSDSE-B-2026 で確かめる

本セクションは「共分散」を 47都道府県データ(SSDSE-B-2026)で具体的に確認するための追加教材です。 例として総人口と出生数の共分散を扱います。

🎨 直感で掴む — 共分散

共分散を 47都道府県データで直感的に捉えるには、 まず「総人口と出生数の共分散」を思い浮かべます。 東京都・大阪府・神奈川県のように総人口が大きい都道府県ほど、 出生数も多くなる傾向があり、 こうしたデータの「形」を 共分散 は要約します。

たとえば 47都道府県を散布図にすると、 右肩上がりの帯状にデータが並びます。 この「帯の傾き」「帯のばらつき」「帯から外れる外れ値」を表現する道具が、 ここで扱う 共分散 だとイメージしてください。

  • 比喩:47枚のレシート(各都道府県)を 1 本のメジャー(共分散)で測る。
  • 具体例:東京(人口 約1409万)と鳥取(人口 約54万)の差を、 1 つの指標で要約。
  • 図解:横軸 総人口、 縦軸 出生数の散布図を頭に描く。

🔬 数式を言葉で読み解く

  • \(x_i\)(説明変数):i 番目の都道府県の総人口。 例えば東京なら 約1409万。
  • \(y_i\)(目的変数):i 番目の都道府県の出生数。
  • \(\bar{x}, \bar{y}\)(標本平均):47都道府県を平均した値。 中心を表す。
  • \(\hat{\beta}_1\)(傾き):人口が 1 人増えたとき、 出生数が何人増えるかの推定値。
  • \(\hat{\beta}_0\)(切片):人口が 0 のときの所得(理論上の値で、 解釈は限定的)。
  • \(\sum_{i=1}^{47}\)(総和):47 都道府県すべてを足し合わせる操作。 共分散の核となる集計。

つまり、 この数式は「47枚のデータ点から、 最も当てはまりの良い 1 本の直線を選ぶ」操作を表現しており、 共分散の本質はこの「集計とフィッティング」にあります。

🧮 実値で計算してみる — 共分散

SSDSE-B-2026 の 47都道府県データから、 「総人口と出生数の共分散」を Python で再現します。 先頭列 SSDSE-B-2026 は年度、 2 行目に和名ヘッダが入るため skiprows=[1] で除外し、 2023 年でフィルタします:

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A4101(出生数) 北海道 5,092,000 24,430 東京都 14,086,000 86,348 沖縄県 1,468,000 12,549 …(全 47 行)
 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 numpy as np

# cp932 で読み込み、 2 行目の和名ヘッダ行を skiprows で除外
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])

# 先頭列 'SSDSE-B-2026' が年度。 2023 年の 47 都道府県スナップショット
sub = df[df['SSDSE-B-2026'] == 2023].copy()
x = sub['A1101'].astype(float)   # 総人口
y = sub['A4101'].astype(float)   # 出生数

# 共分散(不偏 n-1 と母 n)と相関係数
cov_unb = np.cov(x, y, ddof=1)[0, 1]   # 不偏共分散
cov_ml  = np.cov(x, y, ddof=0)[0, 1]   # 母共分散
r = x.corr(y)

print(f'n = {len(x)}')                       # 47
print(f'Cov 不偏(n-1) = {cov_unb:,.2f}')      # 約 4.78e+10 [人×人]
print(f'Cov 母  (n)   = {cov_ml:,.2f}')       # 約 4.68e+10
print(f'相関係数 r    = {r:.4f}')             # 0.9954
📤 実行例(実測) n = 47 Cov 不偏(n-1) = 47,773,754,440.80 Cov 母 (n) = 46,757,291,580.35 相関係数 r = 0.9954

このコードを実行すると、 総人口と出生数の共分散が約 4.78×10¹⁰[人×人]、 相関係数が 0.9954 と得られます。 共分散の絶対値は単位(人×人)に依存して大きくなるため、 強さの判断には相関係数を併用します。 SSDSE-B-2026 が手元にない場合は、 統計データ活用コンペティション公式ページからダウンロードしてください。

⚠️ 補足の落とし穴

🔗 関連用語(補足リンク)

相関係数 最小二乗法 残差 決定係数 共分散 p 値 標準誤差 多重共線性

🔗 隣接手法への橋渡し

共分散は分散・相関係数・PCA・回帰分析の基礎量で、 標準化前のスケール依存指標として全多変量解析の土台になる。 本章では「接続 (どう繋がるか)」「統合 (どう組み合わせるか)」「比較 (どう使い分けるか)」の 3 視点で隣接手法を整理する。

① 接続: 共分散から派生する手法群

共分散は単独で結論を出す指標ではなく、 多変量解析のパイプラインの一部として機能する。 以下の 5 手法は共分散行列を入力として受け取る。

② 統合: 共分散を組み込んだワークフロー

共分散単独より、 他手法と組み合わせた時に真価を発揮する。 SSDSE-B-2026 で頻出する 2 パイプライン。

パイプラインステップ共分散の役割
PCA + クラスタリング標準化 → 共分散行列 → 固有値分解 → 主成分スコア → k-means共分散行列が次元削減の入力。 都道府県を 47 → 2 次元に圧縮した後で類似グループに分類。
重回帰 + 多重共線性診断説明変数間の共分散行列 → VIF 計算 → 高 VIF 変数の除外 → 回帰係数推定共分散 (相関) が高い説明変数を事前検出し、 推定不安定を回避。

③ 比較: 共分散 vs 隣接指標の使い分け判断

「相関係数を使うべきか共分散のままか」の判断基準。 実務で迷うポイントを比較表に整理。

状況共分散を選ぶ相関係数を選ぶ
単位を比較したい○ (元単位を保つ)× (単位情報が消える)
異種データの強さ比較× (スケール依存で比較不可)○ ([-1, 1] で統一)
PCA の入力○ (変数のスケール差を保ちたい時)○ (スケール差を消したい時、 相関行列 PCA)
外れ値の影響大 (二乗で増幅)大 (同様、 ロバスト版が別途必要)
解釈の容易さ低 (例: cov=1.2e9 だけ見て強弱判断できない)高 (例: r=0.97 → 強い)

原則: 「強さの解釈」「異種比較」が目的なら相関係数「PCA・回帰など下流処理への入力」なら共分散行列のまま渡すのが定石。

🌳 手法選択フロー

共分散の計算・推定は、 データの分布特性 (外れ値の有無)・サンプル数 n と次元 p の関係・後段分析の目的の 3 軸で選択する。

典型シナリオ別の共分散推定手法

シナリオ重視する観点候補手法
標本サイズ n が十分大きく分布が概ね正規 (例: SSDSE 47 都道府県の総人口・出生数)最尤推定の不偏性 / 計算簡便性標本共分散 (np.cov)
外れ値が多い (東京・大阪が極端値となる地域指標)頑健性 / 中央値・MAD ベースMCD (Minimum Covariance Determinant)
サンプル数 n < 次元 p (高次元小サンプル)推定の安定化 / 正則化Ledoit-Wolf シュリンケージ
PCA や因子分析の入力として使う単位依存を避けたい相関行列 (標準化後の共分散)
疎な構造を仮定 (変数間の偏共分散の多くが 0)解釈性 / 変数選択Graphical Lasso
時系列データで共分散が時変逐次更新 / ボラティリティ追跡DCC-GARCH / EWMA 共分散

選んだ後の検証ステップ

  1. 前処理確認: 標準化 / 欠損処理 / カテゴリ変数のエンコード が適切か
  2. ハイパラ調整: 交差検証で安定する値を選ぶ
  3. 性能評価: タスクに応じた指標 (RMSE / Accuracy / F1 / AUC / シルエット等) を複数併用
  4. 頑健性チェック: 別手法 / 別シードで結果が大きく違わないか確認
  5. 解釈: 結果を分野知識と照らし合わせ、 意味のある発見になっているか検討

👁️ 直感の深掘り — 「一緒に動く度合い」をもう一段ほぐす

共分散は突きつめると「偏差の積の平均」ただ一つです。 各データ点について「x が自分の平均からどれだけズレたか」×「y が自分の平均からどれだけズレたか」を掛け、 それを全点で平均する。 2 つのズレが同じ向き(両方プラス or 両方マイナス)なら積はプラス逆向きなら積はマイナス。 この符号の多数決が共分散の符号になります。

符号の読み方(3 行でまとめ)

「単位に依存する」を実データで体感(SSDSE-B-2026 実測)

共分散の符号は意味を持ちますが、 絶対値の大きさは単位次第でいくらでも変わります。 2023 年・47 都道府県の 総人口(A1101)出生数(A4101)で確認すると:

計算共分散の値相関係数 r
総人口を「人」単位のまま4.777×10¹⁰ [人²相当]0.9954
総人口を「千人」単位に換算(÷1000)4.777×10⁷(1000 分の 10.9954(不変

単位を千人に変えただけで共分散は 3 桁縮みますが、 相関係数 0.9954 は 1 ミリも動きません。 これが「相関係数=単位を打ち消して無次元化した共分散」という関係の実演です。 共分散の大きさそのもので関係の強弱を語ってはいけない——強弱は必ず相関係数で。 数値は SSDSE-B-2026(cp932, skiprows=[1], 2023 年 47 県)の実測値です。

💡 一言で:共分散 = 偏差の積の平均。 符号は「同方向/逆方向」を語り、 大きさは「単位の積」を引きずる。 単位を洗い落とすと相関係数になる。

⚠️ 落とし穴の深掘り(重要)— 共分散で足を踏み外す 6 つの罠

ここは特に重要です。 共分散は「符号は意味を持つが、 大きさは単位に振り回される」という二面性を持つため、 解釈でつまずきやすい。 コンペや実務で頻出する 6 つの罠を、 SSDSE-B-2026 の実感と結び付けて整理します。

① 単位依存で「大きさ」を解釈してはいけない

共分散の絶対値は変数の単位(円・人・%・kg…)の積を引きずるため、 異なる変数ペア間で大小を比べても意味がありません。 前節の実測どおり、 単位を変えるだけで値は桁単位で動きます。 「強さ」を語るときは必ず相関係数 r に正規化する。 大きさの比較=相関、 向きの確認=共分散の符号と役割を分けて覚えるのが安全です。

② 共分散ゼロは「独立」を意味しない(非線形は素通り)

共分散が捉えるのは線形の共変動だけです。 y = x²(x が平均 0 の対称分布)のような U 字型の従属関係では、 明らかに y が x に決まっているのに共分散はほぼ 0 になります。 「Cov = 0 ⇒ 独立」は成り立たない(逆の「独立 ⇒ Cov = 0」だけが真)。 非線形の依存を捉えたいときは距離相関・相互情報量・HSIC、 単調関係ならスピアマン順位相関を併用します。 ページ上部の 🎮 ウィジェットの「U字」ボタンでこの現象を数値で体感できます。

③ 外れ値 1 点に強く振られる

偏差のの平均なので、 遠く離れた 1 点の寄与が支配的になり得ます。 SSDSE-B-2026 では東京都・大阪府・神奈川県のような大規模県が「影響点(leverage point)」として共分散を大きく動かします。 散布図で外れ値を確認し、 必要なら MinCovDet などのロバスト共分散や順位ベース指標に切り替えます。

④ 標本共分散 n vs 不偏共分散 n−1 の取り違え

分母を n とする(最尤・母共分散)か n−1 とする(不偏・標本共分散)かで値が変わります。 n=47 の都道府県データでは 47/46 ≈ 1.0217、 約 2% の差pandas.DataFrame.cov()numpy.cov() はデフォルト n−1、 numpy.cov(..., bias=True)sklearnEmpiricalCovariance は n。 報告時はどちらを使ったか必ず明示します。

⑤ 共分散行列の正定値性を過信しない

共分散行列は理論上半正定値(固有値がすべて非負)ですが、 数値誤差やほぼ共線な変数があると最小固有値が極小・わずかに負になり、 マハラノビス距離やコレスキー分解が破綻します。 実測でも、 総人口・出生数・65 歳以上人口の 3 変数共分散行列は条件数がおよそ 4.0×10⁶ と大きく、 逆行列計算が数値的に不安定になりやすいことが分かります。 固有値のクリップ(下限を微小正数に)や Ledoit-Wolf 縮約が対策になります。

⑥ 「共分散」と「相関」を混同する

両者は分子を共有しますが別物です。 相関 = 共分散 ÷(両変数の標準偏差の積)で、 相関は −1〜+1 に収まる無次元量、 共分散は単位付きで範囲に上限がありません。 「相関が 0.99 だから共分散も大きい」とは限らず(単位次第)、 逆もまた然り。 比較・強弱の議論は相関、 回帰係数 β = Cov(X,Y)/Var(X) や PCA・ポートフォリオ分散などの下流計算は共分散、 と使い分けます。

⚠️ 補足:SSDSE-B-2026 の生の指標は「総人口」という共通因子のせいでほとんどの共分散が正になります(例:総人口・出生数・65 歳以上人口はどれも正の共分散)。 負の関係(例:高齢化率と若年人口比率)を見たいときは、 生の件数ではなく人口当たり・比率に変換してから共分散をとる必要があります。 これも「共分散は単位・スケールに強く依存する」ことの一側面です。

🚀 発展 — 共分散から多変量解析への扉

① 共分散の双線形性という土台

共分散は双線形(各引数について線形)です。 定数 a,b,c,d に対して

$$ \text{Cov}(aX+bU,\; cY) = ac\,\text{Cov}(X,Y) + bc\,\text{Cov}(U,Y) $$

が成り立ち、 定数の加算は共分散を変えません($\text{Cov}(X+b,Y)=\text{Cov}(X,Y)$)。 この双線形性が「和の分散 $\text{Var}(X+Y)=\text{Var}(X)+\text{Var}(Y)+2\,\text{Cov}(X,Y)$」やポートフォリオ分散 $\mathbf{w}^\top\Sigma\mathbf{w}$ を導く根っこです。

② 共分散行列と主成分分析(固有値分解)— 実測で見る

変数が増えると、 全ペアの共分散を並べた共分散行列 Σになります。 SSDSE-B-2026(2023 年・47 県)の 総人口・出生数・65 歳以上人口の 3 変数で実測すると(不偏, ddof=1, 単位付き):

総人口出生数65歳以上人口
総人口7.826×10¹²4.777×10¹⁰1.924×10¹²
出生数4.777×10¹⁰2.943×10⁸1.167×10¹⁰
65歳以上人口1.924×10¹²1.167×10¹⁰4.814×10¹¹

この Σ を固有値分解 $\Sigma = V\Lambda V^\top$ すると、 実測の固有値と寄与率は:

固有値の合計はトレース(対角和 ≈ 8.308×10¹²)に一致します。 第 1 主成分だけで 99.9% を占めるのは、 総人口の分散が桁違いに大きく、 PCA がその 1 軸に引きずられているためです。 これは「単位・スケールがバラバラなまま共分散行列で PCA すると、 分散最大の変数に主成分が支配される」という重要な教訓で、 対策が次の標準化です。

③ 標準化 → 相関行列(無次元化した共分散)— 実測で一致確認

各変数を z 得点 $(x-\bar x)/s$ に標準化してから共分散をとると、 それは相関行列そのものになります。 実測でも、 標準化後の共分散行列は相関行列と完全一致しました:

総人口出生数65歳以上人口
総人口1.00000.99540.9910
出生数0.99541.00000.9803
65歳以上人口0.99100.98031.0000

対角が 1、 非対角が相関係数(すべて 0.98〜0.995 と強い正)。 「標準化してからの共分散=相関」を実データで確認できます。 スケールの異なる変数を混ぜて PCA する場合は、 共分散行列 PCA ではなくこの相関行列 PCA(=標準化後 PCA)を使うのが定石です。

④ 多変量正規分布とマハラノビス距離

共分散行列 Σ は多変量正規分布のパラメータ(平均ベクトル μ と Σ で分布が定まる)であり、 その逆行列 Σ⁻¹ がマハラノビス距離 $D^2=(x-\mu)^\top\Sigma^{-1}(x-\mu)$ を定義します。 これは「変数間の相関を考慮した楕円距離」で、 各変数単独では正常でも組合せで異常なサンプル(多変量外れ値)を検出できます。 Σ⁻¹ を使うため、 前述の正定値性・条件数の問題が直接効いてきます。

⑤ さらに先へ