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

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

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

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

💡 30秒で分かる結論

📖 もっと詳しく

共分散(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 がどう一緒に動くか」を測る。

🧮 計算ステップ — 東北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

共分散の値

📐 数式と読み方

① 標本共分散

$$ 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 + 標準化のような効果で、 学習を加速します。

🐍 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: C120120(県内総生産, 百万円)
📤 実行例: Cov(X, Y) = 9.84e+12 [人×百万円] → 単位が大きく解釈困難
💬 読み方: 共分散の値そのものは単位依存で「大小」の解釈が難しい。 そのため標準化された相関係数(共分散を標準偏差積で割った値)の方が解釈しやすい。 ただし回帰係数の計算では共分散が直接使われる。

共分散行列(多変量)

🎯 解説: 標本共分散(÷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
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 都道府県
📤 実行例: pandas df.cov() = 9.84e+12 numpy np.cov(bias=False) = 9.84e+12 numpy np.cov(bias=True) = 9.63e+12 比率: 47/46 = 1.0217
💬 読み方: 標本共分散(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, A4101, A6101, C120120] 4 変数 × 47 県
📤 実行例: 共分散行列 4x4: A1101 A4101 A6101 C120120 A1101 ... ... ... ... ... 対角成分 = 各変数の分散
💬 読み方: 共分散行列の対角成分は分散、 非対角は共分散。 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')

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['食料費', '教育費', '住居費']])
plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv X: A1101(総人口) Y: C120120(県内総生産, 百万円)
📤 実行例: Cov(X, Y) = 9.84e+12 [人×百万円] → 単位が大きく解釈困難
💬 読み方: 共分散の値そのものは単位依存で「大小」の解釈が難しい。 そのため標準化された相関係数(共分散を標準偏差積で割った値)の方が解釈しやすい。 ただし回帰係数の計算では共分散が直接使われる。

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

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

🎯 SSDSE-B-2026 で挑戦

統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:

💡 よく使うコマンド集

機能 Python (pandas) Python (scipy)
要約統計df.describe()stats.describe()
平均df.mean()np.mean()
標準偏差df.std()np.std()
相関df.corr()stats.pearsonr()
t検定stats.ttest_ind()
回帰stats.linregress()
分布フィッティングstats.norm.fit()

🚧 一般的な落とし穴と対策

📊 結果報告の標準フォーマット

🌐 関連分野での応用

🎓 さらに学ぶための文献

🔗 統計用語ネットワーク

この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。

主要な関連概念のグループ

グループ 主要概念
記述統計平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計標本平均、 標準誤差、 信頼区間、 p値、 有意水準
確率分布正規分布、 t分布、 χ²分布、 F分布、 二項分布
仮説検定t検定、 F検定、 χ²検定、 ノンパラ検定
回帰単回帰、 重回帰、 OLS、 Ridge、 LASSO
分類ロジスティック回帰、 決定木、 SVM、 k-NN
教師なし学習クラスタリング、 PCA、 因子分析
時系列ARIMA、 VAR、 指数平滑法、 自己相関
因果推論DiD、 IV、 傾向スコア、 交絡変数
前処理標準化、 正規化、 欠損値処理、 多重共線性対策
評価R²、 残差、 CV、 RMSE、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

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

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

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

🧮 SSDSE-B 実値計算例:47都道府県の家計5変数の分散共分散行列

SSDSE-B-2026 2023年データから、 家計5変数(魚介・肉・野菜・果物・酒類)の共分散行列を計算し、 PCA・マハラノビス距離との関係を見ます。

📊 ステップ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 を行うと、 固有値の大きい順に主成分が並びます:

第1〜第2主成分で 74% の情報を保持。 共分散行列は多変量データの構造を凝縮した行列です。

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

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

⚠️ 共分散の落とし穴(深掘り版・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 は時系列に対しては誤解を招く道具と心得る。

🐍 Python 実装バリエーション

① NumPy / Pandas(基本)

🎯 解説: 標本共分散(÷n-1)と母共分散(÷n)の違いを確認する。 pandas のデフォルトは ÷(n-1)、 numpy.cov のデフォルトも ÷(n-1)、 numpy.cov(bias=True) で ÷n。
1
2
3
4
5
import numpy as np
cov_matrix = np.cov(X.T)  # 各列を変数とみなす(注意:行列の向き)
# pandas なら直接
cov_df = df[['魚介', '肉', '野菜']].cov()
print(cov_df)
📥 入力例: data/raw/SSDSE-B-2026.csv n = 47 都道府県
📤 実行例: pandas df.cov() = 9.84e+12 numpy np.cov(bias=False) = 9.84e+12 numpy np.cov(bias=True) = 9.63e+12 比率: 47/46 = 1.0217
💬 読み方: 標本共分散(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, A4101, A6101, C120120] 4 変数 × 47 県
📤 実行例: 共分散行列 4x4: A1101 A4101 A6101 C120120 A1101 ... ... ... ... ... 対角成分 = 各変数の分散
💬 読み方: 共分散行列の対角成分は分散、 非対角は共分散。 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: C120120(県内総生産, 百万円)
📤 実行例: Cov(X, Y) = 9.84e+12 [人×百万円] → 単位が大きく解釈困難
💬 読み方: 共分散の値そのものは単位依存で「大小」の解釈が難しい。 そのため標準化された相関係数(共分散を標準偏差積で割った値)の方が解釈しやすい。 ただし回帰係数の計算では共分散が直接使われる。

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

🎯 解説: 標本共分散(÷n-1)と母共分散(÷n)の違いを確認する。 pandas のデフォルトは ÷(n-1)、 numpy.cov のデフォルトも ÷(n-1)、 numpy.cov(bias=True) で ÷n。
1
2
3
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 都道府県
📤 実行例: pandas df.cov() = 9.84e+12 numpy np.cov(bias=False) = 9.84e+12 numpy np.cov(bias=True) = 9.63e+12 比率: 47/46 = 1.0217
💬 読み方: 標本共分散(n-1)は不偏推定量、 母共分散(n)は最尤推定量。 サンプルから母集団を推定する文脈では標本共分散を使う。 47 県のような小サンプルでは差が 2% 程度あるので注意。

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

🎯 解説: 共分散行列(複数変数の共分散をまとめた行列)を計算する。 主成分分析(PCA)の基礎であり、 多変量解析の出発点。
1
2
3
4
import numpy as np
# 標本ウェイト付き共分散
cov_w = np.cov(X.T, aweights=weights)
# 時系列の EWMA 共分散は pandas で:df.ewm(span=20).cov()
📥 入力例: data/raw/SSDSE-B-2026.csv X: [A1101, A4101, A6101, C120120] 4 変数 × 47 県
📤 実行例: 共分散行列 4x4: A1101 A4101 A6101 C120120 A1101 ... ... ... ... ... 対角成分 = 各変数の分散
💬 読み方: 共分散行列の対角成分は分散、 非対角は共分散。 PCA はこの行列の固有値分解で主成分を求める。 共線性が強いと行列が不安定になり、 逆行列計算(重回帰の係数推定)が誤差を含む。

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

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

📍 体系階層のパス

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

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

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

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

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

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

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

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

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

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

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

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

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

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

🎨 直感で掴む — 共分散

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

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

🔬 数式を言葉で読み解く

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

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

SSDSE-B-2026 の 47都道府県データから、 「総人口と課税対象所得の共分散」を Python で再現します。 まず一行で読み込めるよう、 引数を直書きしたシンプル版を示します:

# 最小コード(直書き)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv')

続いて、 列名はリポジトリ準拠(A1101 総人口、 A1102 男性人口、 D3201 課税対象所得、 等)の本番コードです。

import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=[0,1,2])
# 列名を 3 段ヘッダの最下段だけ採用(コード列: A1101, D3201 等)
df.columns = [c[-1] for c in df.columns]

# 2022 年の 47都道府県スナップショット
sub = df[df['年度コード'] == 2022].copy()
x = sub['A1101'].astype(float)   # 総人口
y = sub['D3201'].astype(float)   # 課税対象所得

# 共分散の基礎統計
x_mean, y_mean = x.mean(), y.mean()
beta1 = ((x - x_mean) * (y - y_mean)).sum() / ((x - x_mean) ** 2).sum()
beta0 = y_mean - beta1 * x_mean

print(f'n = {len(x)}')             # 47
print(f'beta1 = {beta1:,.4f}')     # 傾き
print(f'beta0 = {beta0:,.4f}')     # 切片
print(f'相関係数 = {x.corr(y):.4f}')  # 0.95+ になる

# 残差・決定係数も計算
y_hat = beta0 + beta1 * x
resid = y - y_hat
ss_res = (resid ** 2).sum()
ss_tot = ((y - y_mean) ** 2).sum()
r2 = 1 - ss_res / ss_tot
print(f'R^2 = {r2:.4f}')

このコードを実行すると、 47都道府県データから 共分散に関連する係数・指標が直接得られます。 SSDSE-B-2026 が手元にない場合は、 統計データ活用コンペティション公式ページからダウンロードしてください。

⚠️ 補足の落とし穴

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

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

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

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

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

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

import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig', 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 がデフォルトか) を必ず確認してください。

import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig', 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. 縮約推定(Ledoit-Wolf)— 標本共分散と単位行列の凸結合で正則化
  2. グラフィカル LASSO— 精度行列にスパース性を仮定
  3. 主成分回帰— 上位 k 固有値のみで近似
from sklearn.covariance import LedoitWolf
import pandas as pd

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

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

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

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

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

import numpy as np
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig', 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 経済関連のブロック構造が浮き上がります。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig', 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 通りの説明」を書き出してみるのもおすすめです。