「共分散(covariance)」は 2 変数の連動の強さと向きを測る統計量で、 相関係数・分散共分散行列・主成分分析・線形回帰のすべての基礎をなす。 本ページでは共分散の定義・符号の意味・標本不偏推定・47 都道府県データでの実値計算・Python 実装・落とし穴を順に追う。
これらのキーワードは「共分散の定義 → 符号の解釈 → 標準化して相関係数 → 多変量への拡張(分散共分散行列・PCA)」という学習動線を構成する。
論文・記事に登場する用語のリンクで該当箇所へジャンプ:
🍰 まずはやさしく
2つのデータが一緒に動くかを測る道具です。
関係の向きを知るために使います。
勉強時間とテストの点数の関係などが例です。
まずは結論を短くまとめました。
共分散(covariance)は、 「2つの変数がどれだけ一緒に動くか」を測る量。 相関係数の 分子 として登場します。
計算:「x のズレ × y のズレ」の平均。 同方向に動けば正、 逆方向に動けば負、 無関係なら 0 付近。
弱点:単位依存。 「身長 cm × 体重 kg」と「身長 m × 体重 g」では、 同じ関係でも共分散の値が大きく変わります。 だから「共分散 = 100 と 10 のどちらが強い関係か」は判断不能。
解決策:単位を打ち消すため、 各変数の標準偏差で割って規格化したのが 相関係数。 これで必ず -1〜+1 に収まり、 違う変数ペアの強さを比較できる。
重要応用:分散共分散行列は PCA・回帰の基礎。 多変量データの構造を表す最重要行列です。
共分散(covariance)は、 2つの変数が同じ方向に動くか、 逆方向に動くかを測る指標。 散布図上で「平均からのズレが正負どちらの組合せか」を集計します。
2変数(X, Y)の平均で4つの象限に分けると:
この積をすべて足し、 n(または n-1)で割ったものが共分散。 正の象限が多ければ正の共分散、 負が多ければ負の共分散。
💡 共分散は分散の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 がリアルタイムに更新されます。
正の寄与(右上・左下) 負の寄与(左上・右下)
ここで見た「平均で 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} $$
$$ \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 は共分散行列 Σ の固有値分解で実装:
$$ \Sigma = V \Lambda V^T $$
固有ベクトル V が主成分軸、 固有値 Λ が各軸の分散。 「最も分散が大きい方向」が第1主成分。
クラス内共分散とクラス間共分散の比を最大化する。 共分散構造に基づく分類。
複数の多変量正規分布の組合せでデータ生成過程をモデル化。 各分布が共分散行列を持つ。
ガウス過程回帰では、 「入力空間での近さ」を共分散関数で測ります。 RBFカーネルなど。
共分散行列 Σ を単位行列に変換する前処理。 PCA + 標準化のような効果で、 学習を加速します。
共分散は単一の数値だけでなく、 多変量データでは「共分散行列」として頻繁に登場します。 ここでは SSDSE-B-2026 を題材に、 共分散行列の対角化(PCA の前段階)、 標本共分散の不偏性、 そして高次元下での スパース化テクニックを順に押さえます。
共分散行列 Σ を固有値分解すると、 固有ベクトルが 主成分方向、 固有値が 分散の大きさになります。 SSDSE-B-2026 の数値変数群に対して以下を実行すると、 主成分の意味と寄与率を一目で確認できます。
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()) |
標本共分散の分母には n-1 を使う(不偏推定量)か n を使う(最尤推定量)かの 2 つの慣習があります。 SSDSE-B-2026 のように n=47 と小さいデータでは、 分母の違いが約 2% の差を生むため、 ライブラリの仕様 (ddof=1 がデフォルトか) を必ず確認してください。
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%}') |
変数の数 p が観測数 n に近い、 あるいは超えると、 標本共分散行列は 特異になり PCA や マハラノビス距離が機能しません。 対策は 3 つ:
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) |
| 手法 | 仮定 | 向き |
|---|---|---|
| 標本共分散 | n >> p | SSDSE 全体(n=47, p<=30) |
| Ledoit-Wolf | 高次元安定化 | p ≈ n の境界領域 |
| グラフィカル LASSO | 疎な依存構造 | 変数間関係の可視化 |
コンペでは「共分散行列の固有値が極端に小さい場合に PCA が不安定になる」現象を見たら、 まず 縮約推定を試すのが基本動作です。 また、 共分散が単位の影響を受ける点を忘れず、 単位の異なる変数を組み合わせる際には 必ず標準化を入れてから共分散行列を計算しましょう(事実上、 標準化後の共分散行列 = 相関行列)。
共分散行列は理論的には 半正定値(PSD)です。 しかし数値誤差で固有値がわずかに負になることがあり、 マハラノビス距離やコレスキー分解が失敗する原因になります。 SSDSE-B-2026 で対角成分を扱う際の 正定値補正テンプレートを覚えておきましょう。
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()) |
共分散行列はヒートマップとして可視化すると一目で「正の依存」「負の依存」「独立」の構造が見えます。 SSDSE-B-2026 では総人口、 高齢化率、 大学進学率、 完全失業率などの軸で並べると、 人口関連 vs 経済関連のブロック構造が浮き上がります。
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 ステップで「説明可能な指標」に翻訳することを推奨します。
最終的に、 共分散は 多変量解析の入口として捉え、 「ばらつき」「相関」「主成分」「マハラノビス距離」「カルマンフィルター」など、 後段の応用に橋渡しする数学的ツールであることを意識すれば、 用語ページとしての価値が一段と高まります。 関連用語のリンク先(相関、 PCA、 分散、 距離)を往復しながら、 自分なりの「共分散から始まる学習マップ」を作ってみてください。
最後に、 共分散は 確率変数の積の期待値から、 それぞれの期待値の積を引いたものとして定義されます。 この定義を式と日本語の両方で言えるようになれば、 多変量解析の基礎が固まったと判断できます。 自分のノートに 「共分散の 5 通りの説明」を書き出してみるのもおすすめです。
東北6県の食料費と教育費の共分散を計算します。 (x̄ = 80.82, ȳ = 7.73)
| 都道府県 | 食料費 xᵢ | 教育費 yᵢ | xᵢ - x̄ | yᵢ - ȳ | (xᵢ-x̄)(yᵢ-ȳ) |
|---|---|---|---|---|---|
| 青森県 | 77.90 | 6.71 | -2.925 | -1.021 | +2.9864 |
| 岩手県 | 82.00 | 6.75 | +1.173 | -0.986 | -1.1566 |
| 宮城県 | 83.83 | 11.24 | +3.011 | +3.511 | +10.5716 |
| 秋田県 | 78.12 | 4.32 | -2.700 | -3.418 | +9.2286 |
| 山形県 | 84.11 | 7.27 | +3.281 | -0.467 | -1.5322 |
| 福島県 | 78.98 | 10.12 | -1.840 | +2.381 | -4.3810 |
| 合計 | +15.7168 | ||||
ここでは家計5変数(魚介・肉・野菜・果物・酒類)を想定した合成(架空)の共分散行列を題材に、 PCA・マハラノビス距離との関係を見ます(数値は SSDSE 実測ではなく、 構造を分かりやすくするための合成値)。
各変数を 1000円単位にスケールしたと想定した合成の共分散行列 Σ(架空値):
| 魚介 | 肉 | 野菜 | 果物 | 酒類 | |
|---|---|---|---|---|---|
| 魚介 | 42.3 | 8.1 | 12.4 | 9.7 | 5.2 |
| 肉 | 8.1 | 38.6 | 14.2 | 11.8 | 7.4 |
| 野菜 | 12.4 | 14.2 | 31.9 | 18.5 | 6.8 |
| 果物 | 9.7 | 11.8 | 18.5 | 28.4 | 4.9 |
| 酒類 | 5.2 | 7.4 | 6.8 | 4.9 | 22.6 |
※対角は分散、 オフ対角は共分散。 単位は (千円)²。 すべて正なので「どの食品も一緒に増えやすい」傾向。 これは家計の総支出という共通因子の存在を示唆。
固有値分解 Σ = V Λ V^T を行うと、 固有値の大きい順に主成分が並びます:
固有値の合計はトレース(対角和)163.8 に一致し、 各寄与率の合計は 100% になる(λ₁ の 46.2% は 92.4/163.8=56.4% ではなく、 上の行列を実際に固有値分解した値)。 第1〜第2主成分で約 66.5% の情報を保持。 共分散行列は多変量データの構造を凝縮した行列です。
マハラノビス距離 $D^2 = (x-\mu)^T \Sigma^{-1} (x-\mu)$ は、 共分散の構造を考慮した「異常さの度合い」。 47県でこの値が大きい県(D > 4 程度)は、 一般的な家計パターンから離れた特異な県と言えます。 沖縄県は酒類消費が独特で、 マハラノビス距離が大きく出る代表例。
合成 2 変量データで Cov(x,y) を計算する。
| i | x | y | x-x̄ | y-ȳ | 積 |
|---|---|---|---|---|---|
| 1 | 2 | 3 | -2.2 | -4 | 8.8 |
| 2 | 4 | 7 | -0.2 | 0 | 0.0 |
| 3 | 7 | 12 | 2.8 | 5 | 14.0 |
| 4 | 5 | 9 | 0.8 | 2 | 1.6 |
| 5 | 3 | 4 | -1.2 | -3 | 3.6 |
x̄ = 4.2, ȳ = 7.0
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}") |
💬 手計算 (Step 2) 7.0 / 5.6 と Python 出力が完全一致。
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'])) # 個別の共分散 |
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()) |
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)) |
同じデータでも単位を変えると共分散が変わる。 「強い関係か弱いか」を判断するには相関係数を使うこと。
共分散ゼロでも非線形な関係(U字、 周期的)はあり得ます。 共分散はあくまで「線形な共変動」のみを捉える指標。
偏差の積を取るので、 外れ値1つで共分散が大きく動きます。 散布図で外れ値を確認してから判断。
共分散が大きい ≠ 因果関係がある。 第3変数(交絡変数)の可能性を常に考慮。
共分散は線形関係のみを測るため、 非線形関係は数値に反映されない。 散布図と組み合わせて判断。
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() |
このページの上にある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() | 時系列で時間減衰させた共分散 |
MinCovDet(MCD)または順位ベースEmpiricalCovariance は n。 報告時に必ず明示bias 引数の値を明示np.linalg.cond(Σ)。 10⁸ を超えたら特異性を疑うdf.corr() も併記し、 絶対値比較は相関側で行う共分散は「記述統計(ばらつき)」と「多変量解析(行列演算)」の橋渡しに位置します。 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 |
| フィルタリング | カルマンフィルタ(状態共分散の時間更新) |
| 応用ドメイン | ポートフォリオ理論、 遺伝子共発現、 因子モデル |
np.cov で計算df.corr() と一致するか確認df.cov() を計算し、 対角成分が各変数の分散と一致することを確認np.linalg.eigh で実施、 最大固有値の固有ベクトルを PC1 として確認EmpiricalCovariance().mahalanobis(X) で計算し、 外れ県を抽出np.linalg.cond(Σ) を測り、 10⁸ を超えるか確認(縮約の必要性判定)LedoitWolf を適用、 shrinkage_ の値を解釈GraphicalLassoCV でスパース精度行列を推定、 非ゼロパターンから条件付き独立構造を読み取るdf.ewm(span=10).cov() で計算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) |
高次元データや小サンプルでは、 標本共分散より縮約推定の方が安定。
1 2 3 4 | from sklearn.covariance import LedoitWolf, MinCovDet, GraphicalLassoCV lw = LedoitWolf().fit(X) print(lw.covariance_, lw.shrinkage_) # ロバスト共分散(外れ値に強い) |
1 2 3 4 | from sklearn.covariance import EmpiricalCovariance cov = EmpiricalCovariance().fit(X) d_squared = cov.mahalanobis(X) # 各サンプルのマハラノビス距離² print(sorted(d_squared)[-5:]) # 最も外れた5サンプル |
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])) # 観測値の確率密度 |
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() |
身長を 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 は成立、 しかし逆は成立しない。 例:y = x² で x が標準正規なら Cov(x, y) = 0 だが、 明らかに独立ではない。 線形関係しか測れないのが共分散の本質的限界。 非線形関係には距離相関(distance correlation)、 相互情報量(MI)、 HSIC を使う。 機械学習の前処理で特徴量選択する際は要注意。
共分散は偏差の積の平均なので、 1つの極端な外れ値が大きく影響。 たとえば1点だけが (100, 100) にあると、 残りの点が独立でも共分散が大きく出ます。 対策:(1) ロバスト共分散行列(sklearn.covariance.MinCovDet)、 (2) Spearman 順位相関、 (3) Mahalanobis 距離での外れ値検出と除外。 金融データではブラックスワン事象でこの問題が顕在化。
分母を 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つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 記述統計 › ばらつき › 共分散
中心に 共分散 を置き、 そこから 分散・相関係数・平均・PCA・クラスタリング・標準偏差 など 計 11 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。
大きな円が小さな円を包含する Circle Packing 図。 「共分散」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「共分散」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 共分散 の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → ばらつき → 共分散 という入れ子の位置を示します。 「ばらつきには他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。
本セクションは「共分散」を 47都道府県データ(SSDSE-B-2026)で具体的に確認するための追加教材です。 例として総人口と出生数の共分散を扱います。
共分散を 47都道府県データで直感的に捉えるには、 まず「総人口と出生数の共分散」を思い浮かべます。 東京都・大阪府・神奈川県のように総人口が大きい都道府県ほど、 出生数も多くなる傾向があり、 こうしたデータの「形」を 共分散 は要約します。
たとえば 47都道府県を散布図にすると、 右肩上がりの帯状にデータが並びます。 この「帯の傾き」「帯のばらつき」「帯から外れる外れ値」を表現する道具が、 ここで扱う 共分散 だとイメージしてください。
つまり、 この数式は「47枚のデータ点から、 最も当てはまりの良い 1 本の直線を選ぶ」操作を表現しており、 共分散の本質はこの「集計とフィッティング」にあります。
SSDSE-B-2026 の 47都道府県データから、 「総人口と出生数の共分散」を Python で再現します。 先頭列 SSDSE-B-2026 は年度、 2 行目に和名ヘッダが入るため skiprows=[1] で除外し、 2023 年でフィルタします:
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 |
このコードを実行すると、 総人口と出生数の共分散が約 4.78×10¹⁰[人×人]、 相関係数が 0.9954 と得られます。 共分散の絶対値は単位(人×人)に依存して大きくなるため、 強さの判断には相関係数を併用します。 SSDSE-B-2026 が手元にない場合は、 統計データ活用コンペティション公式ページからダウンロードしてください。
共分散は分散・相関係数・PCA・回帰分析の基礎量で、 標準化前のスケール依存指標として全多変量解析の土台になる。 本章では「接続 (どう繋がるか)」「統合 (どう組み合わせるか)」「比較 (どう使い分けるか)」の 3 視点で隣接手法を整理する。
共分散は単独で結論を出す指標ではなく、 多変量解析のパイプラインの一部として機能する。 以下の 5 手法は共分散行列を入力として受け取る。
共分散単独より、 他手法と組み合わせた時に真価を発揮する。 SSDSE-B-2026 で頻出する 2 パイプライン。
| パイプライン | ステップ | 共分散の役割 |
|---|---|---|
| PCA + クラスタリング | 標準化 → 共分散行列 → 固有値分解 → 主成分スコア → k-means | 共分散行列が次元削減の入力。 都道府県を 47 → 2 次元に圧縮した後で類似グループに分類。 |
| 重回帰 + 多重共線性診断 | 説明変数間の共分散行列 → VIF 計算 → 高 VIF 変数の除外 → 回帰係数推定 | 共分散 (相関) が高い説明変数を事前検出し、 推定不安定を回避。 |
「相関係数を使うべきか共分散のままか」の判断基準。 実務で迷うポイントを比較表に整理。
| 状況 | 共分散を選ぶ | 相関係数を選ぶ |
|---|---|---|
| 単位を比較したい | ○ (元単位を保つ) | × (単位情報が消える) |
| 異種データの強さ比較 | × (スケール依存で比較不可) | ○ ([-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 共分散 |
共分散は突きつめると「偏差の積の平均」ただ一つです。 各データ点について「x が自分の平均からどれだけズレたか」×「y が自分の平均からどれだけズレたか」を掛け、 それを全点で平均する。 2 つのズレが同じ向き(両方プラス or 両方マイナス)なら積はプラス、 逆向きなら積はマイナス。 この符号の多数決が共分散の符号になります。
共分散の符号は意味を持ちますが、 絶対値の大きさは単位次第でいくらでも変わります。 2023 年・47 都道府県の 総人口(A1101)と出生数(A4101)で確認すると:
| 計算 | 共分散の値 | 相関係数 r |
|---|---|---|
| 総人口を「人」単位のまま | 4.777×10¹⁰ [人²相当] | 0.9954 |
| 総人口を「千人」単位に換算(÷1000) | 4.777×10⁷(1000 分の 1) | 0.9954(不変) |
単位を千人に変えただけで共分散は 3 桁縮みますが、 相関係数 0.9954 は 1 ミリも動きません。 これが「相関係数=単位を打ち消して無次元化した共分散」という関係の実演です。 共分散の大きさそのもので関係の強弱を語ってはいけない——強弱は必ず相関係数で。 数値は SSDSE-B-2026(cp932, skiprows=[1], 2023 年 47 県)の実測値です。
💡 一言で:共分散 = 偏差の積の平均。 符号は「同方向/逆方向」を語り、 大きさは「単位の積」を引きずる。 単位を洗い落とすと相関係数になる。
ここは特に重要です。 共分散は「符号は意味を持つが、 大きさは単位に振り回される」という二面性を持つため、 解釈でつまずきやすい。 コンペや実務で頻出する 6 つの罠を、 SSDSE-B-2026 の実感と結び付けて整理します。
共分散の絶対値は変数の単位(円・人・%・kg…)の積を引きずるため、 異なる変数ペア間で大小を比べても意味がありません。 前節の実測どおり、 単位を変えるだけで値は桁単位で動きます。 「強さ」を語るときは必ず相関係数 r に正規化する。 大きさの比較=相関、 向きの確認=共分散の符号と役割を分けて覚えるのが安全です。
共分散が捉えるのは線形の共変動だけです。 y = x²(x が平均 0 の対称分布)のような U 字型の従属関係では、 明らかに y が x に決まっているのに共分散はほぼ 0 になります。 「Cov = 0 ⇒ 独立」は成り立たない(逆の「独立 ⇒ Cov = 0」だけが真)。 非線形の依存を捉えたいときは距離相関・相互情報量・HSIC、 単調関係ならスピアマン順位相関を併用します。 ページ上部の 🎮 ウィジェットの「U字」ボタンでこの現象を数値で体感できます。
偏差の積の平均なので、 遠く離れた 1 点の寄与が支配的になり得ます。 SSDSE-B-2026 では東京都・大阪府・神奈川県のような大規模県が「影響点(leverage point)」として共分散を大きく動かします。 散布図で外れ値を確認し、 必要なら MinCovDet などのロバスト共分散や順位ベース指標に切り替えます。
分母を n とする(最尤・母共分散)か n−1 とする(不偏・標本共分散)かで値が変わります。 n=47 の都道府県データでは 47/46 ≈ 1.0217、 約 2% の差。 pandas.DataFrame.cov() と numpy.cov() はデフォルト n−1、 numpy.cov(..., bias=True) と sklearn の EmpiricalCovariance は 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.0000 | 0.9954 | 0.9910 |
| 出生数 | 0.9954 | 1.0000 | 0.9803 |
| 65歳以上人口 | 0.9910 | 0.9803 | 1.0000 |
対角が 1、 非対角が相関係数(すべて 0.98〜0.995 と強い正)。 「標準化してからの共分散=相関」を実データで確認できます。 スケールの異なる変数を混ぜて PCA する場合は、 共分散行列 PCA ではなくこの相関行列 PCA(=標準化後 PCA)を使うのが定石です。
共分散行列 Σ は多変量正規分布のパラメータ(平均ベクトル μ と Σ で分布が定まる)であり、 その逆行列 Σ⁻¹ がマハラノビス距離 $D^2=(x-\mu)^\top\Sigma^{-1}(x-\mu)$ を定義します。 これは「変数間の相関を考慮した楕円距離」で、 各変数単独では正常でも組合せで異常なサンプル(多変量外れ値)を検出できます。 Σ⁻¹ を使うため、 前述の正定値性・条件数の問題が直接効いてきます。