論文で「主成分分析(PCA)」「第1主成分」「分散説明率」と書かれている部分。 多くの社会経済データのまとめ・可視化に登場。
主成分分析(PCA) とは:多次元データを「分散が最大となる軸(主成分)」へ射影して次元削減。可視化や前処理に多用。
sklearn.decomposition.PCA(n_components=2)あなたが47都道府県について、 「人口」「年齢構成」「所得」「失業率」「医療費」「教育水準」「気温」など10個の指標を持っているとします。 「どの県とどの県が似ているか」「全体としてどんなパターンがあるか」を知りたい。 でも10次元の空間は脳で想像できません。 10次元を2次元に圧縮して可視化したい──これが PCA(主成分分析)の出番です。
PCA の核心アイデア: データのばらつき(=情報量)が最も大きい方向に新しい軸(第1主成分)を立て、 次にそれと直交する中でばらつきが最大の方向に第2主成分を立て...と続けます。 元の10個の変数の代わりに、 最初の数本の主成分だけを使えば、 ほとんどの情報を保ちながら次元を減らせます。
例えば SSDSE の社会経済指標を PCA すると、 第1主成分は「都市↔︎地方」軸(東京・神奈川 vs 秋田・島根)、 第2主成分は「北方↔︎南方」軸など、 解釈可能な軸として現れることがあります。 これにより 6次元のデータを 2次元の散布図で「都道府県マップ」として描けるのです。
注意:PCA は「事前に標準化(平均0・分散1)が必須」です。 単位や桁が違う変数(人口 vs 失業率)をそのまま入れると、 桁が大きい変数だけで第1主成分が決まってしまいます。

図の左上、 右下、 などにグループが見えるはずです。 これは元の6次元では分かりにくかった「都道府県の特徴の似ている度合い」を、 たった2次元で表現できているということ。 PCA がうまく機能している証拠です。
具体的に PCA が何をしているか:
ローディング(loading):各主成分が元のどの変数と強く関係しているかを示す係数。 ローディングを見れば「第1主成分は人口や所得が強く効いている → 都市性軸」のような解釈ができます。
2変数(高齢化率 x、 死亡率 y、 標準化済)で PCA の動きを直感的に追ってみましょう。
PCA vs 因子分析(FA):似ているが目的が違います。 PCA は「観測変数の全分散をなるべく少ない軸で説明」、 FA は「観測変数の共通分散のみを共通因子で説明(独自分散は誤差扱い)」。 因子分析の方が「潜在変数の存在」という仮説に踏み込むので、 心理学・社会学のスケール開発で好まれます。
PCA vs SVD(特異値分解):数学的にはほぼ同じ。 SVD はより一般的な行列分解法で、 PCA は SVD の特殊例。 NumPy の np.linalg.svd でも PCA を実装できます。
PCA の限界:
PCR (Principal Component Regression):多重共線性で OLS が不安定なとき、 説明変数を PCA してから上位主成分だけで回帰する手法。 解釈は犠牲になるが安定性が向上。
StandardScaler で z-score 化してから PCA。主成分分析(Principal Component Analysis, PCA)は、 多次元データの「分散が最大になる方向」を新しい軸として、 元の変数を組み替える手法。 次元削減と特徴抽出の基本ツール。
左:元の2変数(食料費と住居費)の散布図。 赤い矢印が PC1(最大分散方向)。
右:PCA 後、 データが PC1/PC2 という新しい直交軸上に再配置される。 もはや「食料費」「住居費」ではなく、 合成変数になっています。
💡 PCAは回転と考えられます。 「元の軸」を「データの最大分散方向」に回転させ、 新しい軸を作る。 情報損失を最小にしながら次元を減らせます。
100変数のデータを、 寄与の大きい数個の主成分で要約。 ストレージ削減、 可視化、 学習高速化。
高次元データを2次元/3次元に圧縮して散布図化。 クラスタや異常を視覚的に発見。
相関の強い変数群を独立な主成分に置き換える。 回帰モデルの安定化。
新しい「合成変数」を作り、 元の変数では見えなかった「潜在因子」を発見。
寄与の小さい成分はノイズ。 削ることでデータをスムージング。
各変数から平均を引く。 場合によって標準偏差で割る(標準化):
$$ x'_i = \frac{x_i - \bar{x}}{s} $$
単位が違う変数を扱う場合は標準化必須。 単位が同じなら中心化のみでもOK。
$$ \Sigma = \frac{1}{n-1} X^T X $$
p個の変数に対して p×p の対称行列。 対角成分が各変数の分散、 非対角が共分散。
$$ \Sigma = V \Lambda V^T $$
$$ Z = X \cdot V $$
元データを新しい軸(主成分)に射影。 これが「主成分得点」。
大規模データでは特異値分解(SVD)で実装するのが一般的:
$$ X = U \Sigma V^T $$
V が主成分、 ΣΣ^T/(n-1) が固有値。 sklearn の PCA は内部で SVD を使っている。
$$ z_{ij} = \sum_{k=1}^{p} v_{kj} \cdot x_{ik} $$
i番目のサンプルの j番目主成分得点 = 元の変数 × 固有ベクトルの重み付き和。
$$ \text{寄与率}_j = \frac{\lambda_j}{\sum_{k=1}^{p} \lambda_k} $$
各主成分が全分散のうち何%を説明するか。 固有値の比。
第1〜j主成分までの寄与率の合計。 通常80%や90%を超える主成分まで採用。
| 記号 | 読み方 | 意味 |
|---|---|---|
| X | エックス | n×p のデータ行列 |
| Σ | シグマ(大文字) | 共分散行列(p×p) |
| V | ブイ | 固有ベクトル(主成分方向) |
| λ_j | ラムダ サブ ジェイ | j番目主成分の固有値(=分散) |
| Z | ゼット | 主成分得点行列 |
47都道府県の家計5項目(食料費、 住居費、 教育費、 光熱費、 保健医療費)で PCA を実施した結果:
| 主成分 | 固有値 | 寄与率 | 累積寄与率 |
|---|---|---|---|
| PC1 | 1.801 | 35.2% | 35.2% |
| PC2 | 1.379 | 27.0% | 62.2% |
| PC3 | 1.051 | 20.6% | 82.8% |
| PC4 | 0.644 | 12.6% | 95.4% |
| PC5 | 0.234 | 4.6% | 100.0% |
PC1だけで全分散の 35.2% を説明。 PC1とPC2で62.2%。 PC1 と PC2 だけで全体像がほぼ捉えられる。
主成分は合成変数。 元の変数の重み付き和です。 重み(loading)を見ることで主成分の「意味」が分かります。
| 変数 | PC1の重み | PC2の重み |
|---|---|---|
| 食料費 | +0.659 | +0.289 |
| 住居費 | -0.010 | -0.243 |
| 教育費 | +0.702 | +0.066 |
| 光熱費 | -0.151 | +0.711 |
| 保健医療費 | -0.223 | +0.590 |
PC1:符号が混在 → 支出のバランスを表す対比。 つまり PC1 のスコアが高い県は「全体的に支出が多い県」、 低い県は「節約県」と読めます。
PC2:PC1 では捉えられない別の軸。 重みの符号を見て「何 vs 何の対比」かを読み取る。
💡 主成分の解釈にはドメイン知識が必要。 重みの大きさ・符号を見て、 「この成分は何を表しているか」を仮説的に解釈し、 散布図と組み合わせて確認します。
主成分得点の散布図に、 元変数の loading を矢印で重ね合わせたのがバイプロット。 「各サンプルがどの変数の影響で配置されているか」が一目で分かる強力な可視化。
累積寄与率が80%(または90%)を超える数の主成分を採用。 もっとも一般的。
固有値が1以上の主成分を採用(標準化データの場合)。 「平均的な変数より分散が大きい主成分」を残す考え方。
スクリープロットで「カーブが急に折れる点」を探す。 視覚的判断だが直感的。
ランダムデータの固有値分布と比較。 ランダムを超える主成分を採用。 統計的根拠あり。
高次元データで多重共線性を解消、 計算量削減。 ただし PCA は分散最大化であり、 教師あり学習の予測精度を最大化はしません。
クラスタリング結果を 2D で見るための定番。 t-SNE や UMAP の代替・併用。
画像処理:固有顔(eigenfaces)で顔画像認識の前処理。 ファイルサイズ削減(JPEG の DCT に類似)。
主要な主成分で再構成した結果と元データの残差が大きいサンプルを異常と判定。
PCA で共分散行列を単位行列に変換する前処理。 PCA + 標準化のような効果で学習を加速。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler # データの標準化(重要!) scaler = StandardScaler() X_std = scaler.fit_transform(X) # PCA 実行 pca = PCA(n_components=2) # 主成分数を指定 Z = pca.fit_transform(X_std) # 寄与率 print(f'寄与率: {pca.explained_variance_ratio_}') print(f'累積寄与率: {pca.explained_variance_ratio_.cumsum()}') # 主成分軸(固有ベクトル) print(f'主成分軸:\n{pca.components_}') # 固有値 print(f'固有値: {pca.explained_variance_}') |
1 2 3 | pca = PCA(n_components=0.95) # 累積寄与率95%まで Z = pca.fit_transform(X_std) print(f'採用された主成分数: {pca.n_components_}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import numpy as np # 1. 中心化 X_centered = X - X.mean(axis=0) # 2. 共分散行列 cov_matrix = np.cov(X_centered, rowvar=False) # 3. 固有値分解 eig_vals, eig_vecs = np.linalg.eigh(cov_matrix) # 4. 降順ソート order = np.argsort(eig_vals)[::-1] eig_vals = eig_vals[order] eig_vecs = eig_vecs[:, order] # 5. 射影 Z = X_centered @ eig_vecs # 寄与率 ratio = eig_vals / eig_vals.sum() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(10, 8)) ax.scatter(Z[:, 0], Z[:, 1], alpha=0.5) # 変数を矢印で for i, name in enumerate(feature_names): ax.arrow(0, 0, pca.components_[0, i] * 3, pca.components_[1, i] * 3, color='red', head_width=0.05) ax.text(pca.components_[0, i] * 3.2, pca.components_[1, i] * 3.2, name) ax.set_xlabel(f'PC1 ({pca.explained_variance_ratio_[0]*100:.1f}%)') ax.set_ylabel(f'PC2 ({pca.explained_variance_ratio_[1]*100:.1f}%)') |
単位が違う変数(kg と cm)をそのまま PCA すると、 単位の大きい変数が支配的に。 必ず標準化してから実施。
PCA は線形変換。 曲線的なパターンは見逃します。 そのときは Kernel PCA、 t-SNE、 UMAP、 Autoencoder を。
主成分は合成変数で、 元の変数ほど直感的でないことがある。 特に loading の重みが似た値なら解釈が難しい。 回転(varimax 回転、 因子分析)を検討。
分散を最大化するため、 外れ値の影響を受けやすい。 RobustPCA や事前の外れ値除去を。
PCA は教師なし。 「分散が大きい方向」が「目的変数の予測に有用」とは限らない。 PCR(主成分回帰)より PLS のほうが優れることも。
固有ベクトルは符号が反転しても同じ主成分。 異なる環境で計算すると符号が違うことが。 解釈時に注意。
120年以上の歴史を持ち、 現代のデータサイエンスの中核的手法として使われ続けています。
sklearn.decomposition.PCA(標準)1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) X = df[['一人当たり県民所得','世帯人員','高齢化率','人口密度','大学進学率']] Xs = StandardScaler().fit_transform(X) pca = PCA(n_components=3).fit(Xs) print('寄与率', pca.explained_variance_ratio_) print('累積', pca.explained_variance_ratio_.cumsum()) print('ローディング\n', pd.DataFrame(pca.components_.T, index=X.columns, columns=['PC1','PC2','PC3']).round(3)) |
numpy.linalg.svd 直書き(教育的)1 2 3 4 5 6 | import numpy as np Xc = Xs - Xs.mean(axis=0) U, S, Vt = np.linalg.svd(Xc, full_matrices=False) loadings = Vt.T scores = U * S # = Xc @ Vt.T print((S**2 / (S**2).sum())[:3]) |
scipy.linalg.eigh による固有値分解1 2 3 4 5 | from scipy.linalg import eigh cov = np.cov(Xs, rowvar=False) eigvals, eigvecs = eigh(cov) order = np.argsort(eigvals)[::-1] print(eigvals[order]) |
KernelPCA(非線形多様体)1 2 | from sklearn.decomposition import KernelPCA kpca = KernelPCA(n_components=2, kernel='rbf', gamma=0.1).fit_transform(Xs) |
SparsePCA / FactorAnalysis(解釈性向上)1 2 3 4 | from sklearn.decomposition import SparsePCA, FactorAnalysis spca = SparsePCA(n_components=3, alpha=1.0, random_state=42).fit(Xs) fa = FactorAnalysis(n_components=3).fit(Xs) print(pd.DataFrame(spca.components_.T, index=X.columns).round(2)) |
IncrementalPCA(大規模データのストリーム処理)1 2 3 4 | from sklearn.decomposition import IncrementalPCA ipca = IncrementalPCA(n_components=3, batch_size=10) for i in range(0, len(Xs), 10): ipca.partial_fit(Xs[i:i+10]) |
1. 標準化を忘れる。「人口(万人)」と「失業率(%)」を素のまま PCA すると、 人口の桁が圧倒的に大きいため、 第 1 主成分が「人口の方向」とほぼ一致してしまい、 他の指標が全く反映されません。 StandardScaler(z 化)または RobustScaler を必ず通しましょう。
2. 主成分の符号反転を気にしない。PCA の固有ベクトルは符号が定まらないため、 ライブラリ・乱数によって PC1 が反転することがあります。 解釈で「PC1 が大きい県」と書くなら、 必ずローディングを確認して「PC1 が高い → ◯◯ が高い」の対応を明示しましょう。
3. 累積寄与率だけで主成分数を決める。「80% を超えるまで」という閾値は経験則であり、 サンプル数や目的によって変えるべきです。 スクリープロットの肘、 カイザー基準(固有値 ≥ 1)、 並列分析(parallel analysis)、 CV 損失の最小点を併用しましょう。
4. 線形変換以外を試さない。三日月型・ドーナツ型のように非線形多様体上のデータは、 PCA では分散最大方向に「貫通」してしまい、 構造を捉えられません。 Kernel PCA・t-SNE・UMAP・Isomap などの非線形手法も比較しましょう。
5. PC スコアを使った回帰(PCR)で解釈を捨てる。多重共線性の解消には便利ですが、 「PC1 の係数が 0.3」と言われても元の変数への落とし込みが難しいです。 解釈優先なら Ridge・Lasso、 もしくは Sparse PCA を検討しましょう。
6. 外れ値で第 1 主成分を奪われる。1 県(例:東京)が他県より極端な値を持つと、 PC1 がほぼ「東京の方向」になり、 残りの分散が捉えにくくなります。 RobustPCA や、 外れ値を除いた感度分析を行いましょう。
7. テストデータで fit_transform を再実行する。訓練データで学習した PCA は、 テストには transform のみ適用しなくてはいけません。 テストで fit すると、 異なる回転行列が出てしまい予測モデルが壊れます。 sklearn Pipeline を使えば自動で正しい順序になります。
主成分分析(PCA) がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 教師なし学習 › 次元削減 › 主成分分析
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「主成分分析(PCA)」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「主成分分析(PCA)」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
主成分分析(PCA)を実務で正しく使うために必須となる 4 つの追加トピックを、 SSDSE-B-2026 で実証しながら整理します。 「標準化の有無」 → 「寄与率の読み方」 → 「主成分の意味づけ」 → 「ローディングの可視化」の流れで進めます。
SSDSE-B-2026 のように単位の異なる変数(総人口は数百万、 失業率は数%)を混ぜると、 標準化しない PCAは単に「数値の大きい変数」が支配的になります。 必ず z-score 標準化を行ってから PCA を計算してください。
|
主成分の寄与率は 各主成分が説明する分散の割合です。 累積寄与率 70-80% を超えるところで打ち切るのが定石ですが、 SSDSE-B-2026 のような 強く相関した都道府県データでは、 第 1 主成分だけで 50% を超えることも珍しくありません。 その場合は第 1 主成分の解釈に注力するのが効率的です。
| 基準 | 解釈 |
|---|---|
| 累積寄与率 70%+ | 主要構造を捉えた |
| Kaiser 基準 | 固有値 ≥ 1 の成分を採用 |
| スクリー基準 | 折れ線の「肘」を見る |
| 並行分析 | 乱数固有値との比較 |
主成分は元変数の線形結合です。 ローディング行列を見て、 「どの元変数が大きく寄与しているか」で 意味づけします。 SSDSE-B-2026 では、 第 1 主成分が「総人口・事業所数・税収」など 都市規模を表すケースが典型的です。
|
バイプロットは、 都道府県(サンプル)を点で、 変数(次元)を矢印で同じ図に配置する PCA の可視化テクニックです。 都道府県のクラスタと、 各クラスタが「どの変数で特徴づけられているか」を一望できます。
PCA は次元削減のためだけでなく、 変数構造の発見にも極めて有効です。 SSDSE-B-2026 で PCA を計算したら、 必ず累積寄与率・ローディング表・バイプロットの 3 点セットを提出資料に含めるようにしましょう。 これだけで「都道府県データの全体構造が分かっている」ことを示せます。
PCA は本質的に 特異値分解 (SVD) の応用です。 中心化された行列 X に対し $X = U \Sigma V^\top$ と分解したとき、 $V$ の列ベクトルが主成分方向、 $\Sigma^2 / (n-1)$ が固有値(=各主成分の分散)に対応します。 この視点は、 「共分散行列を作らずに直接 X から PCA を計算できる」ことを意味し、 高次元データで数値安定性が高い実装の根拠となります。
|
説明変数間に強い相関(多重共線性)がある場合、 OLS は不安定になります。 そこで 主成分回帰では、 PCA で得た上位 k 主成分を新たな説明変数として使います。 SSDSE-B-2026 で 都道府県の特徴量 30 個から「平均所得」を予測する場面では、 PCR が安定推定に役立ちます。
|
コンペや論文で PCA を使うときは、 以下の 5 つの図表をセットで提出すると説得力が増します。
これらをそろえれば、 「変数構造の理解」「外れ値の発見」「次元削減」「可視化」「予測前処理」の 5 目的すべてで PCA が機能していることを示せます。 SSDSE-B-2026 を題材にこのテンプレートを身につけておくと、 他のデータでも即座に同じ手順を再現できる強い武器になります。
| 手法 | 線形/非線形 | 教師あり/なし | 向き |
|---|---|---|---|
| PCA | 線形 | なし | 分散保存 |
| Kernel PCA | 非線形 | なし | 非線形多様体 |
| t-SNE | 非線形 | なし | 局所構造可視化 |
| UMAP | 非線形 | なし | 高速・大域構造保存 |
| LDA | 線形 | あり | クラス分離 |
| オートエンコーダ | 非線形 | なし | 深層学習・大規模 |
PCA が「分散最大化の線形投影」なら、 t-SNE/UMAP は「局所近傍の保存」、 オートエンコーダは「再構成誤差最小化」と、 それぞれ最適化対象が異なります。 SSDSE-B-2026 のような 少数サンプル・量的データには PCA が第一選択ですが、 サンプル数が増え、 非線形構造が疑われる場合には UMAP や Kernel PCA を併用するのが現代的なベストプラクティスです。
fit_transform で学習し、 新規データは transform のみで投影する(再フィット禁止)。PCA は 1901 年に Pearson が、 1933 年に Hotelling が独立に定式化した古典手法ですが、 100 年以上経った今もデータ解析の 第一線の道具として君臨し続けています。 「次元削減と聞いたらまず PCA」、 「変数が多いと感じたらまず PCA」を合言葉に、 自分のデータ解析プロセスに必ず組み込みましょう。 SSDSE-B-2026 のような身近な公的データで何度も練習することで、 「結果を見て即座に解釈する」能力が育ちます。