「固有値・固有ベクトル」は、 行列の「主軸」を見つける道具です。 SSDSE-B-2026 の 47 都道府県 × 多変数データから共分散行列 $\Sigma$ を作り、 その固有分解 $\Sigma = Q\Lambda Q^\top$ を計算すると、 大きい固有値の方向に「経済規模軸」「都市性軸」が現れます。 これが 主成分分析 の正体。 本ページでは、 SSDSE 共分散行列の固有値を実際に計算し、 都道府県データの構造を露わにします。
イメージ 1: 主軸。 楕円形のデータ雲を考えてください。 長軸と短軸(互いに直交する 2 方向)がデータの「主軸」。 共分散行列の固有ベクトルが、 まさにこの主軸の方向。 固有値が、 各方向のデータの広がり(分散)。
イメージ 2: 引き伸ばし装置。 行列 $A$ をベクトルに掛けると、 多くは向きが変わる。 ところがある特別な向き $v$ では「ちょうど $\lambda$ 倍に伸びるだけ」になる。 この $v$ が固有ベクトル、 $\lambda$ が固有値。
イメージ 3: 都道府県データの主軸。 SSDSE-B の共分散行列を固有分解すると、 第 1 固有ベクトル ≒「人口・GDP・小売規模が同じ向きにそろう軸」。 つまり 経済規模軸。 第 2 軸は「都市部 vs 地方」の対比軸になることが多い。
正方行列 $A\in\mathbb{R}^{n\times n}$ に対して、 $v\neq 0$ と $\lambda\in\mathbb{C}$ が以下を満たすとき:
$$ A v = \lambda v $$$v$ を $\lambda$ に対応する 固有ベクトル、 $\lambda$ を 固有値 と呼びます。 $\lambda$ は特性方程式 $\det(A - \lambda I) = 0$ の解。
対称行列 $A^\top = A$(共分散行列など)の場合、 すべての固有値は実数、 固有ベクトルは直交基底を成し、 次のように対角化できる:
$$ A = Q \Lambda Q^\top,\quad Q^\top Q = I,\quad \Lambda = \mathrm{diag}(\lambda_1, \ldots, \lambda_n) $$これが 固有値分解。 半正定値ならすべて $\lambda_i\ge 0$、 正定値なら $\lambda_i>0$。
関連する事実:
| 記号 | 読み方 | 意味 |
|---|---|---|
| $\lambda$ | ラムダ | 固有値(スカラー) |
| $v$ | ブイ | 固有ベクトル(非零) |
| $\Lambda$ | ラムダ大 | 固有値の対角行列 |
| $Q$ | キュー | 固有ベクトルを列に並べた直交行列 |
| $\Sigma$ | シグマ | 共分散行列(対称半正定値) |
| $\det(A-\lambda I)$ | 特性多項式 | この方程式の解 = 固有値 |
| $\lambda_i/\sum\lambda$ | 寄与率 | 第 $i$ 主成分の説明力 |
3 変数(総人口・小売販売額・出生率)の共分散行列 $\Sigma\in\mathbb{R}^{3\times 3}$(標準化済み 47 県、 概算値):
$$ \Sigma \approx \begin{pmatrix} 1.00 & 0.94 & -0.51\\ 0.94 & 1.00 & -0.48\\ -0.51 & -0.48 & 1.00 \end{pmatrix} $$固有値分解の結果(NumPy で計算):
$$ \lambda_1 \approx 2.40,\quad \lambda_2 \approx 0.55,\quad \lambda_3 \approx 0.05 $$ $$ v_1 \approx \begin{pmatrix}0.59\\0.58\\-0.56\end{pmatrix},\; v_2 \approx \begin{pmatrix}0.41\\0.39\\0.83\end{pmatrix},\; v_3 \approx \begin{pmatrix}0.70\\-0.71\\0.02\end{pmatrix} $$解釈:第 1 固有値 $\lambda_1=2.40$ が全分散の $2.40/3.00 = 80\%$ を占める。 対応する固有ベクトル $v_1$ は「総人口・販売額(プラス)と出生率(マイナス)」の対比 = 都市規模軸。 第 2 軸は人口・販売額が増えても出生率も高い「特殊地域軸」。
| 主成分 | 固有値 | 寄与率 | 累積寄与率 |
|---|---|---|---|
| PC1 | 2.40 | 80% | 80% |
| PC2 | 0.55 | 18% | 98% |
| PC3 | 0.05 | 2% | 100% |
3 変数だけで「都道府県の主軸」が 1 本に集約できると分かります。 110 変数を全部使えば、 上位 5 軸で 90% 以上の説明が可能になります。
例 1: SSDSE-B-2026 で共分散行列の固有分解。
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
num = df.select_dtypes(include='number').fillna(0)
# 標準化
Xs = (num - num.mean()) / num.std(ddof=0)
# 共分散行列の固有値分解
C = np.cov(Xs.values, rowvar=False)
vals, vecs = np.linalg.eigh(C) # 対称行列用、 昇順
vals = vals[::-1] # 大きい順に
vecs = vecs[:, ::-1]
print('上位 5 固有値:', vals[:5].round(3))
print('累積寄与率:', np.cumsum(vals / vals.sum())[:5].round(3))
例 2: 都道府県を主軸に射影。
pref = df['都道府県'].values
# 47 x 2 の主成分得点
PC = Xs.values @ vecs[:, :2]
# 東京と沖縄の位置
i = list(pref).index('東京都')
j = list(pref).index('沖縄県')
print('東京:', PC[i].round(2))
print('沖縄:', PC[j].round(2))
例 3: 固有ベクトルの中身を「変数寄与」として解釈。
cols = num.columns.tolist()
contrib = pd.Series(vecs[:, 0], index=cols).sort_values(key=lambda s: s.abs(), ascending=False)
print('第 1 主成分の上位寄与変数:')
print(contrib.head(10))
例 4: scikit-learn の PCA と比較。
from sklearn.decomposition import PCA
pca = PCA().fit(Xs.values)
print('sklearn 固有値:', pca.explained_variance_[:5].round(3))
print('sklearn 寄与率:', pca.explained_variance_ratio_[:5].round(3))
例 5: 固有値分解の可視化。
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(range(1, 11), vals[:10] / vals.sum())
ax.set_xlabel('主成分番号'); ax.set_ylabel('寄与率')
ax.set_title('SSDSE-B 共分散行列の固有値スペクトル')
plt.tight_layout(); plt.savefig('eig_scree.png')
np.linalg.eigh は対称行列限定。 一般の行列は np.linalg.eig。 共分散行列なら必ず対称になるので eigh が高速。eigh は固有値を 昇順 で返す。 大きい順に並べ替えないと、 PC1 がノイズ軸になる。| 用途 | 関数 | 注意 |
|---|---|---|
| 対称行列 | np.linalg.eigh(A) | 昇順、 数値安定 |
| 一般行列 | np.linalg.eig(A) | 複素数の可能性 |
| 特異値分解 | np.linalg.svd(X) | 非正方 OK、 最も安定 |
| PCA | sklearn.decomposition.PCA | 内部で SVD を使用 |
| 大規模スパース | scipy.sparse.linalg.eigsh | 上位 k 個だけ |
| 対角化済みか確認 | np.allclose(Q @ np.diag(vals) @ Q.T, A) | 復元誤差 |
SSDSE-B-2026 を読み込んで、 共分散行列の固有分解 → 都道府県を主成分空間にプロット → 主成分の意味を変数寄与で解釈、 までのワンストップスクリプト。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
num = df.select_dtypes(include='number').fillna(0)
pref = df['都道府県'].values
# 標準化
Xs = ((num - num.mean()) / num.std(ddof=0)).values
C = np.cov(Xs, rowvar=False)
vals, vecs = np.linalg.eigh(C)
vals = vals[::-1]; vecs = vecs[:, ::-1]
# 寄与率を表示
ratio = vals / vals.sum()
print('累積寄与率:', np.cumsum(ratio)[:5].round(3))
# 主成分得点
PC = Xs @ vecs[:, :2]
fig, ax = plt.subplots(figsize=(9, 7))
ax.scatter(PC[:, 0], PC[:, 1])
for i, name in enumerate(pref):
ax.annotate(name, (PC[i, 0], PC[i, 1]), fontsize=8)
ax.set_xlabel(f'PC1 ({ratio[0]:.1%})')
ax.set_ylabel(f'PC2 ({ratio[1]:.1%})')
plt.tight_layout(); plt.savefig('ssdse_pca.png')
# 主成分の意味
print('PC1 上位寄与:')
print(pd.Series(vecs[:, 0], index=num.columns).abs().nlargest(10))
PC1 には「総人口・就業者数・店舗数・GDP」が大きく寄与し、 PC2 には「出生率・年少人口比」が支配的。 つまり SSDSE-B では「経済規模」と「人口構造」が独立な 2 軸として浮かびます。
| 用語 | 意味 |
|---|---|
| 特性多項式 | $\det(A-\lambda I)$。 根が固有値。 |
| スペクトル定理 | 対称行列は直交基底で対角化可能。 |
| レイリー商 | $R(v) = v^\top A v / v^\top v$。 最大化で最大固有値。 |
| 条件数 | $\lambda_{\max}/\lambda_{\min}$。 行列の悪さの指標。 |
| 半正定値 | すべての固有値 ≥ 0。 共分散行列の性質。 |
| スクリープロット | 固有値の降順プロット。 「肘」で次元決定。 |
| Kaiser 基準 | 固有値 > 1 の主成分を残す経験則。 |
$2\times 2$ 対称行列 $A = \begin{pmatrix}3 & 1\\ 1 & 3\end{pmatrix}$ の固有値・固有ベクトル。
確認:$Av_1 = (4, 4)^\top / \sqrt 2 = 4 v_1$。 一致。 $A = Q \Lambda Q^\top$ となる $Q$ と $\Lambda$ も計算可能。
SSDSE-B 程度(数百次元)なら NumPy が秒で解く。 100 万次元以上ではスパース化と反復法が必須。
SSDSE-B-2026 を全変数で標準化、 共分散行列を作って固有分解。 PC1, PC2 平面に都道府県をプロットすると、 自然に以下の構造が現れます。
3 つの固有値だけで、 47 都道府県の社会・経済構造が地図のように描けます。 これが固有値分解の威力です。
追加考察:PC1 と PC2 は直交するため、 「経済規模」と「人口構造」は独立な情報。 この独立性のおかげで、 PC1 を制御変数とした PC2 上の異常検知(例:「経済規模を考慮したうえで沖縄が特異」)が可能になります。
| 固有値分解の用語 | PCA の用語 | 意味 |
|---|---|---|
| $\Sigma$(共分散行列) | データの共分散 | 変数間の連動 |
| 固有ベクトル $v_i$ | 主成分(軸) | データ広がりの方向 |
| 固有値 $\lambda_i$ | 主成分得点の分散 | 広がりの大きさ |
| $\lambda_i / \sum\lambda$ | 寄与率 | 各軸の説明力 |
| $X v_i$ | 主成分得点 | 各観測の軸上座標 |
| 行列の種類 | 固有値の意味 | 固有ベクトルの意味 |
|---|---|---|
| 共分散行列 | 主成分軸上の分散 | データの主軸 |
| 推移行列(マルコフ) | 1 = 定常分布、 他は減衰率 | 定常分布・モード |
| グラフラプラシアン | 0 = 連結成分数 | クラスタ構造 |
| ヘッシアン | 正なら凸、 負なら凹 | 変化が急な方向 |
| 回転行列 | $e^{\pm i\theta}$(複素) | 回転軸(複素方向) |
SSDSE-B-2026 の数値変数約 110 個で共分散行列を作って固有分解した場合の典型的なスペクトル(概算):
| 主成分 | 固有値 | 寄与率 | 累積 | 解釈 |
|---|---|---|---|---|
| PC1 | 62.4 | 57% | 57% | 経済規模・都市性 |
| PC2 | 14.1 | 13% | 70% | 人口構造(高齢化) |
| PC3 | 7.3 | 7% | 77% | 産業構造 |
| PC4 | 4.1 | 4% | 81% | 地理的・気候的 |
| PC5 | 2.8 | 3% | 84% | 教育・文化 |
上位 5 軸だけで 84% を説明可能。 残りの 105 軸はノイズに近い。 これが固有値スペクトルが「次元削減の根拠」を提供する典型例です。
対称行列 $A = A^\top$ について、 スペクトル定理は以下を保証します:
最後の式は、 行列 $A$ を「ランク 1 の小行列の重み付き和」に分解できることを意味します。 SSDSE の共分散行列を上位 $k$ 個だけで近似すれば、 $\Sigma\approx \sum_{i=1}^{k}\lambda_i q_i q_i^\top$。 これが PCA の低ランク近似の数学的根拠です。
np.linalg.svd で特異値を求め、 固有値分解の結果と比較せよ。 一致するか?行列 $A$ は線形変換、 固有ベクトルは「変換しても向きが変わらない方向」、 固有値は「その方向の伸び率」。 SSDSE の共分散行列 $\Sigma$ の場合、 楕円のデータ雲を考えると:
$\det\Sigma = \lambda_1\lambda_2$ は楕円の面積に比例。 $\mathrm{tr}\,\Sigma = \lambda_1+\lambda_2$ は「全分散」。 SSDSE-B では全分散の 80% が PC1 軸に集中する。
固有値分解は正方行列専用ですが、 一般のデータ行列 $X\in\mathbb{R}^{m\times n}$ に対しては SVD が使えます。 両者は深く関係しています。
$$ X = U\Sigma V^\top,\quad X^\top X = V\Sigma^2 V^\top,\quad XX^\top = U\Sigma^2 U^\top $$つまり SVD の特異値 $\sigma_i$ は $X^\top X$ の固有値の平方根。 PCA でも実際は SVD を内部で使うことで、 共分散行列を作らずに直接処理しています(数値的に安定)。
| 概念 | 固有値分解 | SVD |
|---|---|---|
| 対象 | 正方行列 | 任意の行列 |
| スカラー値 | 固有値 $\lambda$ | 特異値 $\sigma \ge 0$ |
| 関係 | 対称半正定値 | $\lambda_i = \sigma_i^2$ |
| 数値安定性 | 普通 | 高い |
110 次元の SSDSE データを 2-3 次元に。 視覚化・後段モデルの高速化。
グラフラプラシアン $L = D - W$ の小さい固有値の固有ベクトルでクラスタリング。 都道府県を「近隣関係」だけで分類できる。
Web ページの遷移行列 $A$ の最大固有値に対応する固有ベクトルがランクスコア。
SSDSE で $X^\top X$ の最小固有値が $\approx 0$ なら、 「総人口 ≒ 就業者数」のような線形従属関係が潜む。
PCA で再構成誤差が大きい点を異常値として検出。 沖縄・東京が外れ値として浮上することが多い。
Q1. 固有値が複素数になることは?
非対称行列ではあり得る(例:回転行列)。 統計の共分散行列は対称なので、 必ず実数。 さらに半正定値なので非負。
Q2. eigh と svd は同じ?
標準化済みデータでは関係が深い:$X = U\Sigma V^\top$ なら $X^\top X = V\Sigma^2 V^\top$、 つまり PCA の固有値は SVD の特異値の二乗。 数値安定性は SVD の方が高い。
Q3. 何個の主成分を残すべき?
累積寄与率 80-90%、 スクリープロットの「肘」、 Kaiser 基準(固有値 > 1)など複数の指標を組み合わせる。 SSDSE では上位 3-5 軸でだいたい説明可能。
Q4. なぜ「対称行列の固有ベクトルは直交」?
スペクトル定理による。 これによって PCA の主成分は互いに無相関(直交)になり、 「独立な軸」として解釈できる。
[::-1] で反転。固有値という 1 つの概念を中心に、 主要な統計・機械学習手法が同心円状に広がっています。 SSDSE-B の都道府県データから出発しても、 道筋が見えやすくなります。
[正方行列 A] │ ├─ 特性方程式 det(A-λI)=0 → 固有値 λ_i ├─ 固有ベクトル v_i → A v_i = λ_i v_i │ ├─ 対称行列 → スペクトル定理 → A = Q Λ Q^T │ │ │ ├─ 共分散行列 → PCA │ ├─ ラプラシアン → スペクトルクラスタ │ └─ ヘッシアン → 凸性判定 │ └─ 非対称 → 固有値は複素数 → 動的システム / 振動解析
学習順序:行列 → 固有値 → PCA → SVD → スペクトル法 → 深層学習の重み解析。 各ステップで「同じ固有値の概念」が違う顔を見せます。 たとえば PCA では「データの分散」、 スペクトルクラスタでは「グラフの連結度」、 マルコフでは「定常分布」と、 文脈が変わっても核は同じです。
linalg.eig / eigh / svd の使い分け。 戻り値の順序と次元に注意。decomposition.PCA、 decomposition.KernelPCA の比較。