論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説(ジャストインタイム型データサイエンス教育)
次元削減
Dimensionality Reduction
高次元データを少ない次元で表現する — 可視化・前処理の必須技術
教師なし/教師あり可視化前処理解釈支援

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

本ページでは、 次元削減を統合的に解説します。 PCAFA(因子分析)MDSt-SNEUMAPLDAKernel PCAを一気通貫で扱います。

次元削減は「本質的な情報を残しつつ、 変数を減らす」技術。 可視化・前処理・ノイズ除去・解釈支援に不可欠です。 SSDSE-B のように 30+ 変数があるデータでは、 PCA で 2-3 次元に可視化することから分析が始まります。

🔖 🔖 キーワード索引(チップから該当箇所へジャンプ)

論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:

なぜ次元削減 次元の呪い PCA 寄与率 スクリープロット 因子負荷量 Kernel PCA 因子分析 因子回転 MDS t-SNE UMAP Isomap LDA(教師あり) オートエンコーダ

💡 30秒で分かる結論

📚 章構成

内容
1. なぜ次元削減高次元データの問題
2. PCA線形・最大分散
3. 因子分析潜在因子モデル
4. MDS距離保存
5. t-SNE局所構造保存・可視化
6. UMAP高速・スケーラブル
7. LDA教師あり次元削減
8. オートエンコーダNN による非線形削減

🤔 1. なぜ次元削減

次元の呪い (Curse of Dimensionality)

🎯 2. PCA(主成分分析)

2.1 概要

分散を最大化する直交方向(主成分)を順に見つける。 第1主成分が最大分散、 第2は次に大きく、 第1と直交。

2.2 数式

標準化済みデータ $\mathbf{X} \in \mathbb{R}^{n \times p}$ の共分散行列 $\mathbf{S} = \mathbf{X}^\top \mathbf{X}/(n-1)$ の固有分解:

$$\mathbf{S} = \mathbf{V} \boldsymbol{\Lambda} \mathbf{V}^\top$$

固有値 $\lambda_1 \geq \lambda_2 \geq \cdots$ に対応する固有ベクトル $\mathbf{v}_1, \mathbf{v}_2, \dots$ が主成分軸。 主成分得点:$\mathbf{Z} = \mathbf{X}\mathbf{V}$。

2.3 寄与率(説明分散)

$$\text{寄与率}_k = \frac{\lambda_k}{\sum_j \lambda_j}, \quad \text{累積寄与率}_K = \sum_{k=1}^{K} \text{寄与率}_k$$

慣例 80–90% を満たす K を採用。

🎯 解説: SSDSE-B-2026 の 47 都道府県・多変量データに対して PCA(主成分分析)を適用し、 高次元の経済・人口指標を 2 軸に圧縮して都道府県の特徴を視覚化する。
 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
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
num = df.select_dtypes(include='number')
X = StandardScaler().fit_transform(num)

pca = PCA()
Z = pca.fit_transform(X)

# 寄与率
print(pca.explained_variance_ratio_[:5].round(3))
print('累積:', np.cumsum(pca.explained_variance_ratio_)[:5].round(3))

# 第1・第2主成分で可視化
plt.figure(figsize=(10, 6))
plt.scatter(Z[:,0], Z[:,1])
for i, name in enumerate(df['都道府県']):
    plt.annotate(name, (Z[i,0], Z[i,1]), fontsize=8)
plt.xlabel('PC1'); plt.ylabel('PC2')
plt.title('SSDSE-B 主成分得点')
plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv 都道府県 総人口 県内総生産 消費支出 …… 北海道 5224 20.5 28.4 東京都 14048 115.7 34.2 大阪府 8838 41.3 30.1
📤 実行例: 第1主成分 寄与率 = 0.612 第2主成分 寄与率 = 0.218 累積寄与率 = 0.830 → 2成分で全分散の 83% を説明
💬 読み方: 累積寄与率 80% 以上が「2 軸で十分」の目安。 主成分負荷量を見て「PC1=規模、 PC2=産業構造」のように解釈する。 標準化を忘れると分散が大きい変数(人口)に支配される。

2.4 スクリープロット

固有値の大きい順プロット。 「肘」より上の主成分を採用。

plt.plot(range(1, len(pca.explained_variance_)+1), pca.explained_variance_, 'o-') plt.xlabel('主成分'); plt.ylabel('固有値') plt.title('スクリープロット') plt.show()

2.5 因子負荷量(loadings)

各元変数の主成分への寄与。 主成分の解釈に使う。

🎯 解説: 都道府県の経済指標を t-SNE で 2 次元に埋め込み、 PCA では見えない非線形なクラスタ構造(地方ブロック)を可視化する。
1
2
3
4
5
6
loadings = pd.DataFrame(
    pca.components_[:3].T,
    columns=['PC1', 'PC2', 'PC3'],
    index=num.columns,
)
print(loadings.round(2))
📥 入力例: data/raw/SSDSE-B-2026.csv 47 都道府県 × 標準化済み 20 変量
📤 実行例: perplexity=10, n_iter=1000 → 関東圏/関西圏/東北・北海道/九州 が 4 つのクラスタに分離
💬 読み方: t-SNE は乱数依存と perplexity 依存が強い。 距離は保存されないので「クラスタ間の距離」に意味はない。 PCA で粗く構造を見たあと t-SNE で局所構造を確認する 2 段構えが安全。

📊 3. 因子分析(FA)

観測変数を、 少数の共通因子独自因子(誤差)の線形結合で表現するモデル:

$$\mathbf{x} = \boldsymbol{\Lambda} \mathbf{f} + \boldsymbol{\varepsilon}, \quad \mathbf{f} \sim N(0, \mathbf{I}),\ \boldsymbol{\varepsilon} \sim N(0, \boldsymbol{\Psi})$$

記号読み:$\mathbf{f}$ は「エフ・太字」共通因子、 $\boldsymbol{\Lambda}$ は「ラムダ・大文字」因子負荷行列、 $\boldsymbol{\Psi}$ は「プサイ・大文字」独自分散の対角行列。

PCA との違い

項目PCA因子分析
モデル射影潜在変数モデル
誤差項なしあり
説明対象全分散共通分散
用途圧縮・前処理理論的構造の検証

3.1 因子回転

🎯 解説: SSDSE-B-2026 の標準化済みデータに対し UMAP で 2 次元埋め込みを得て、 大域構造を保ったクラスタ構造を確認する。 t-SNE より計算が速く新規データ投影も可能。
1
2
3
4
5
from factor_analyzer import FactorAnalyzer
fa = FactorAnalyzer(n_factors=3, rotation='varimax')
fa.fit(X)
print(pd.DataFrame(fa.loadings_, index=num.columns,
                  columns=['F1','F2','F3']).round(2))
📥 入力例: data/raw/SSDSE-B-2026.csv X.shape = (47, 20) 標準化済み
📤 実行例: n_neighbors=15, min_dist=0.1 → 都市圏 4 群が連続曲面上に並ぶ UMAP 計算時間 = 0.32 秒
💬 読み方: UMAP は局所+大域構造のバランスを取る。 `n_neighbors` を増やすと大域、 減らすと局所が強調。 ハイパラ依存性は t-SNE 同様に強いので、 複数パラメータで頑健性を確認する。

📏 4. MDS(多次元尺度構成法)

個体間の距離を可能な限り保存する低次元配置を求める。 距離行列が出発点。

🎯 解説: 47 都道府県 × 20 変数のうち、 多重共線性が強い変数群を SVD(特異値分解)で分解して、 少数の独立成分に圧縮する。
1
2
3
from sklearn.manifold import MDS
mds = MDS(n_components=2, dissimilarity='euclidean', random_state=42)
Z_mds = mds.fit_transform(X)
📥 入力例: data/raw/SSDSE-B-2026.csv X = 標準化済み (47×20)
📤 実行例: 特異値 σ = [12.3, 7.4, 4.2, 2.1, 1.3, …] 累積寄与率(上位5成分)= 0.91 → 20 変数を 5 成分にロスレス近似
💬 読み方: 特異値の急落点(elbow)が次元数の目安。 PCA は中心化+SVD と等価。 スコア= U·Σ、 負荷量= V。 行列が疎な場合は TruncatedSVD(LSI)を使う。

古典的 MDS は PCA と等価(距離 = ユークリッドのとき)。 非計量 MDS は順序のみ保存。

🎨 5. t-SNE

高次元の局所構造を低次元で再現。 距離をガウス → 低次元では t分布(重い裾)として確率に変換し、 KL divergence を最小化。

🎯 解説: 因子分析(FA)で、 都道府県の経済指標群の背後にある「規模因子」「成熟度因子」など潜在因子を抽出する。
1
2
3
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=10, random_state=42, init='pca')
Z_tsne = tsne.fit_transform(X)
📥 入力例: data/raw/SSDSE-B-2026.csv 20 経済・人口変量 × 47 都道府県
📤 実行例: 因子数 = 3(カイザー基準 λ>1) 回転後負荷行列: 人口・GDP → 規模因子 高齢化率 → 成熟度因子 製造業比率 → 産業因子
💬 読み方: PCA が「観測変量の合成」なのに対し、 FA は「潜在因子→観測」の因果モデル。 バリマックス回転で軸を直交回転し解釈しやすくする。 因子数の選定にはスクリープロットとカイザー基準を併用。

🚀 6. UMAP

2018 年 McInnes ら。 t-SNE より高速・スケーラブル、 大局構造もある程度保存。 現代の可視化標準。

🎯 解説: LDA(線形判別分析)で、 都道府県を「大都市圏/地方都市/農村」3 群に分けたうえで、 群を最もよく分離する低次元軸を構築する。
1
2
3
import umap
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, n_components=2, random_state=42)
Z_umap = reducer.fit_transform(X)
📥 入力例: data/raw/SSDSE-B-2026.csv X = 標準化済み (47×20), y = 都市規模ラベル
📤 実行例: 判別軸 LD1, LD2 の判別率 F 比 = 18.4, p < 0.001 → LD1 が「都市規模軸」、 LD2 が「産業構造軸」
💬 読み方: LDA は教師ありの次元削減。 群ラベルがある場合は PCA より分離性が高い。 ただし群内分散が一致しない場合は QDA(二次判別)を検討。 サンプル数 < 次元数の場合は次元削減後に適用。

🎯 7. LDA(線形判別分析、 教師あり)

クラスラベルを使って、 クラス間分離を最大化、 クラス内分散を最小化する軸を求める。 次元削減と分類の両方に使える。

$$J(\mathbf{w}) = \frac{\mathbf{w}^\top \mathbf{S}_B \mathbf{w}}{\mathbf{w}^\top \mathbf{S}_W \mathbf{w}} \to \max$$

$\mathbf{S}_B$ がクラス間分散、 $\mathbf{S}_W$ がクラス内分散。 K クラスなら K-1 次元まで削減可能。

🎯 解説: Kernel PCA(カーネル主成分分析)で、 SSDSE-B-2026 を非線形変換して、 PCA では捉えられない曲面状の構造を可視化する。
1
2
3
4
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
df['region'] = pd.qcut(df['人口密度'], q=3, labels=['農村','中規模','都市'])
lda = LinearDiscriminantAnalysis(n_components=2)
Z_lda = lda.fit_transform(X, df['region'])
📥 入力例: data/raw/SSDSE-B-2026.csv X = 標準化済み (47×20)
📤 実行例: RBF カーネル, gamma=0.05 累積寄与率(上位2成分)= 0.78 → 線形 PCA より滑らかな曲面構造を抽出
💬 読み方: RBF, 多項式, シグモイドなどカーネル選択が結果を左右する。 gamma 大→局所、 小→大域。 サンプル数の 2 乗の計算量なので大規模データには Nystrom 近似が必要。

🧠 8. オートエンコーダ(NN による非線形次元削減)

入力を低次元に圧縮(encoder)→ 復元(decoder)する NN。 ボトルネック層が次元削減された潜在表現。

🎯 解説: Isomap で、 都道府県データの多様体上での距離(測地距離)に基づいて 2 次元埋め込みを行い、 連続的な変化軸を抽出する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import torch
import torch.nn as nn
class Autoencoder(nn.Module):
    def __init__(self, in_dim, latent_dim=2):
        super().__init__()
        self.enc = nn.Sequential(nn.Linear(in_dim, 16), nn.ReLU(),
                                  nn.Linear(16, latent_dim))
        self.dec = nn.Sequential(nn.Linear(latent_dim, 16), nn.ReLU(),
                                  nn.Linear(16, in_dim))
    def forward(self, x):
        z = self.enc(x)
        return self.dec(z), z
📥 入力例: data/raw/SSDSE-B-2026.csv 47 サンプル × 20 変数
📤 実行例: n_neighbors=7 埋め込み残差 = 0.04 → 「経済規模」と「高齢化度」の 2 軸で都道府県が連続配置
💬 読み方: Isomap は近傍グラフ上の最短経路を距離として MDS する。 近傍数が小さすぎるとグラフが分断、 大きすぎると線形化。 多様体仮定が崩れる外れ値があると壊れやすい。

派生形:VAE(変分オートエンコーダ)、 Sparse AE、 Denoising AE、 Contractive AE。

🌀 9. 非線形 PCA・Isomap

9.1 Kernel PCA

カーネル法で非線形 PCA。 元データ → カーネル特徴空間 → 線形 PCA。 RBF / Polynomial / Sigmoid カーネルがよく使われる。

🎯 解説: LLE(局所線形埋め込み)で、 都道府県データの局所線形構造を保存する 2 次元埋め込みを得る。
1
2
3
from sklearn.decomposition import KernelPCA
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=0.5)
Z_kpca = kpca.fit_transform(X)
📥 入力例: data/raw/SSDSE-B-2026.csv X.shape = (47, 20)
📤 実行例: n_neighbors=10 埋め込み残差 = 0.012 → 関東・近畿・地方の 3 領域に分離
💬 読み方: LLE は各点を近傍の線形結合で表現し、 その重みを低次元で再構成する。 近傍グラフが切れると失敗。 Modified LLE(MLLE)は安定性が高い。 グローバル構造の保存は苦手。

9.2 Isomap

近傍グラフ上の測地距離を MDS で配置。 多様体の形状を保つ。

🎯 解説: Autoencoder(自己符号化器)で 20 次元の都道府県データを 2 次元の潜在変数 z に圧縮し、 デコーダで復元する非線形次元削減を学習する。
1
2
3
from sklearn.manifold import Isomap
iso = Isomap(n_neighbors=5, n_components=2)
Z_iso = iso.fit_transform(X)
📥 入力例: data/raw/SSDSE-B-2026.csv X = 標準化済み (47×20)
📤 実行例: Encoder: 20→8→2 Decoder: 2→8→20 再構成 MSE = 0.13 → ボトルネック 2 次元で 87% の情報保持
💬 読み方: 線形 AE は PCA と等価。 非線形活性化(ReLU/Tanh)で表現力が増す。 過学習しやすいので Denoising/Sparse/VAE などの正則化が定石。 サンプル数 47 では極めて過剰モデルなので、 ドロップアウト必須。

📊 10. 手法比較

手法 線形/非線形 教師 速度 用途
PCA線形なし圧縮・前処理
FA線形なし潜在構造
MDS線形/非線形なし距離保存
t-SNE非線形なし可視化
UMAP非線形なし可視化(標準)
LDA線形あり分類前処理
Autoencoder非線形なし表現学習
Kernel PCA非線形なし非線形圧縮

⚠️ 11. よくある落とし穴

落とし穴 対処
標準化せずに PCA大スケール変数だけが第1主成分に。 必ず StandardScaler。
t-SNE の大局構造を信用クラスタ間の距離・大きさは意味なし。 局所構造のみ。
PCA と FA を混同FA は潜在変数モデル、 PCA は射影。 目的に応じて使い分け。
主成分を符号付きで解釈主成分の符号は任意。 解釈には絶対値の大小と方向を見る。
寄与率の低い PC で結論第3主成分以降は寄与率が低いと解釈価値も低い。
t-SNE / UMAP で外挿新データに transform できない(UMAP は parametric なら可)。
LDA でクラスが少ないK クラスなら K-1 次元まで。 多クラス分類前段で。

🏋️ 12. 練習問題(SSDSE-B-2026)

Q1. SSDSE-B の数値変数すべてで PCA を行い、 累積寄与率 80% を満たす K と主成分の意味を答えなさい。
🎯 解説: NMF(非負値行列因子分解)で、 都道府県 × 産業構成比のような非負データを「基底産業パターン」と「都道府県の混合比」に分解する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pandas as pd, numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
num = df.select_dtypes(include='number')
X = StandardScaler().fit_transform(num)
pca = PCA().fit(X)
cum = np.cumsum(pca.explained_variance_ratio_)
print('80%%超え K =', np.argmax(cum >= 0.8) + 1)
print(pd.DataFrame(pca.components_[:3].T, columns=['PC1','PC2','PC3'], index=num.columns).round(2))
📥 入力例: data/raw/SSDSE-B-2026.csv 産業別就業者数(非負) 47×15
📤 実行例: n_components=3 基底 W: 都道府県 × 3 係数 H: 3 × 産業 → 「製造業県」「サービス業県」「農林漁業県」型を抽出
💬 読み方: NMF は加算的分解で解釈性が高い(負の打ち消しがない)。 初期値依存性が大きいので複数試行の平均を取る。 トピックモデル、 推薦システムの基礎。 成分数は AIC/BIC やコフェネティック相関で選定。
Q2. 同じデータで UMAP と t-SNE を実行し、 都道府県の配置を比較しなさい。
🎯 解説: PCA の主成分得点を使って都道府県を 2 次元プロットし、 県名ラベル付きの散布図を描画する。 教育的に PCA 結果の解釈手順を示す。
1
2
3
4
5
from sklearn.manifold import TSNE
import umap
Z_tsne = TSNE(n_components=2, perplexity=10, random_state=42).fit_transform(X)
Z_umap = umap.UMAP(n_neighbors=10, random_state=42).fit_transform(X)
# プロット比較
📥 入力例: data/raw/SSDSE-B-2026.csv 20 変量 × 47 都道府県(標準化済み)
📤 実行例: PC1 軸: 東京都・神奈川県・大阪府 (大都市) PC2 軸: 沖縄県・鹿児島県 (地方) 散布図 PNG 出力
💬 読み方: 散布図に都道府県名を重ねると解釈が容易。 主成分負荷量(biplot の矢印)と一緒に表示すると「どの変数が PC1 を作っているか」が分かる。 累積寄与率 80% を確認してから可視化。
Q3. 都市規模ラベル(3分位)を作り、 LDA で 2 次元に削減して可視化しなさい。
🎯 解説: Truncated SVD で疎な行列(カウントデータ)を低次元化し、 LSI(Latent Semantic Indexing)的に都道府県の特徴を圧縮する。
1
2
3
4
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
df['region'] = pd.qcut(df['人口密度'], q=3, labels=['農村','中規模','都市'])
lda = LinearDiscriminantAnalysis(n_components=2)
Z_lda = lda.fit_transform(X, df['region'])
📥 入力例: 都道府県別の業種別就業者数(疎行列)
📤 実行例: n_components=5 累積寄与率 = 0.88 計算時間 = 0.04s(PCA の 1/5)
💬 読み方: TruncatedSVD は中心化しないので疎行列の構造を保つ(PCA は dense にしてしまう)。 NLP の TF-IDF + LSI で頻用。 結果は PCA に近いが厳密には異なる。

📝 13. 報告フォーマット

❌ NG例

「PCA で 2 次元にして可視化しました。」

✅ OK例

「30 変数を標準化後 PCA に投入。 第1主成分の寄与率 31%、 第2主成分 22%(累積 53%)。 第1主成分は所得・人口密度に正の負荷量、 高齢化率に負の負荷量を持つため『都市的・経済発展度』、 第2主成分は世帯人員と就業率に正の負荷で『家族基盤・就業度』と解釈した。 上位 5 主成分で累積 82%、 これらを後続のクラスタリングの入力に使用。」

🐍 14. ライブラリ早見表

手法 クラス・関数
PCAsklearn.decomposition.PCA / TruncatedSVD / IncrementalPCA
Kernel PCAsklearn.decomposition.KernelPCA
FAsklearn.decomposition.FactorAnalysis / factor_analyzer.FactorAnalyzer
MDSsklearn.manifold.MDS
t-SNEsklearn.manifold.TSNE / openTSNE
UMAPumap-learn (import umap)
Isomapsklearn.manifold.Isomap
LLEsklearn.manifold.LocallyLinearEmbedding
LDAsklearn.discriminant_analysis.LinearDiscriminantAnalysis
Autoencodertorch.nn / keras.layers
NMFsklearn.decomposition.NMF
ICAsklearn.decomposition.FastICA

📜 15. 次元削減の歴史

💼 16. 次元削減の実務応用

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

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

🧮 SSDSE 実値計算 ⚠️ 落とし穴 6選 🐍 Python バリエーション 🔗 関連用語 PCA t-SNE UMAP オートエンコーダ カーネル PCA

🧮 SSDSE-B 実値計算例:家計15項目を 2 次元に圧縮

SSDSE-B-2026 2023年データから家計支出15項目(食品・住居・光熱・教育等)を取り、 PCA・t-SNE・UMAP の 3 手法で2次元に圧縮します。

📊 ステップ1:PCA の寄与率と累積寄与率

主成分 寄与率 累積寄与率 意味(仮想)
PC142.3%42.3%「総支出規模」軸
PC218.7%61.0%「都市型 vs 郊外型消費」軸
PC39.4%70.4%「教育投資度」軸
PC46.8%77.2%「光熱費比重」軸
PC55.2%82.4%「住居費比重」軸

第2主成分まで61%の情報、 第5主成分まで82%の情報。 「カイザー基準(固有値 > 1)」と「スクリープロットの肘」から PC を選ぶのが慣行。

📊 ステップ2:手法ごとの特徴

手法 原理 SSDSE 47県でのプロット 計算時間
PCA線形・分散最大化東京・大阪が右上、 地方は左下に並ぶ単調な配置< 0.1秒
t-SNE局所近傍を保つ非線形3-4のクラスタが見える、 県の地理的近接が反映2-5秒
UMAP位相幾何学的保存t-SNEと類似、 大域構造をより保つ1-3秒

⚠️ 次元削減の落とし穴(深掘り版・6件)

① 標準化を忘れて PCA を実行する

「家計支出(数万円単位)」と「世帯人数(小数の単位)」を混在させて PCA をかけると、 単位が大きい変数(家計支出)が PC1 を完全に支配し、 他の情報が埋もれる。 必ず StandardScaler で各変数を平均 0・分散 1 に標準化してから PCA を行う。 ただし「自然に同単位」の場合(同種計測値の集合)は標準化しない方が良いこともあるので、 ケースごとに判断。

② t-SNE の距離・形を「絶対座標」と読む

t-SNE の出力は「局所構造を保つ」ものの、 クラスタ間の距離やサイズには意味がない。 グラフで離れていても「全く違う」とは限らないし、 大きいクラスタが「種類が多い」わけでもない。 t-SNE の図を見るときは「同じ色は同じグループ」だけを情報として受け取り、 「距離が遠い = 違う」と即断しないこと。 大域構造を見たいなら UMAP か PCA を併用。

③ 主成分の解釈を無理に当てる

「PC1 は所得、 PC2 は都市性」のように強引な意味付けをすると、 後の議論が脆くなる。 主成分は変数の線形結合であり、 必ずしも単純な概念に対応しない。 ローディング(負荷量)を確認し、 0.4 以上の絶対値を持つ変数だけで解釈する。 「解釈可能性」を高めたいなら主成分回転(Varimax)や因子分析を検討。

④ 全データで PCA → 訓練/テスト分割

機械学習で「全データで PCA を計算してから訓練/テスト分割」するのは、 テストデータの情報が前処理に漏れるデータリーク。 必ず train で fit、 test には transform のみ。 scikit-learn の Pipeline なら自動的に正しい順序で実行される。 これは StandardScaler でも同じ問題が発生します。

⑤ 圧縮した次元で「予測精度」を必ず良くなると思う

PCA は応答変数 y を見ないので、 「圧縮した結果 y の予測に重要な情報が失われる」ことがあります。 教師あり学習の特徴量削減なら、 PCA より Partial Least Squares (PLS)LDARFE 等を検討。 PCA を盲信せず、 圧縮後と圧縮前で CV スコアを比較する。

⑥ UMAP / t-SNE のハイパーパラメータを無視する

t-SNE の perplexity、 UMAP の n_neighbors / min_dist を変えると、 全く違う図が出ることが普通。 デフォルト値で 1回だけ実行して結論を出すのは危険。 複数の設定で実行し、 安定して見えるパターンだけを信用する。 また乱数シードでも結果が変わるので、 複数 seed で繰り返すと安心。

🐍 Python 実装バリエーション

① scikit-learn PCA

🎯 解説: PCA の主成分負荷量を 47 都道府県 × 上位 5 成分について計算し、 各成分がどの元の変数の合成かを解釈する。
1
2
3
4
5
6
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
X_std = StandardScaler().fit_transform(X)
pca = PCA(n_components=2).fit(X_std)
Z = pca.transform(X_std)
print(pca.explained_variance_ratio_)
📥 入力例: data/raw/SSDSE-B-2026.csv X = 標準化済み 47×20
📤 実行例: PC1 負荷量 上位: 総人口 (0.87), GDP (0.84), 消費 (0.81) PC2 負荷量 上位: 高齢化率 (0.74), 人口減少率 (0.69)
💬 読み方: 負荷量は各変量と主成分の相関係数。 ±0.7 以上が強い寄与。 解釈は「PC1 = 経済規模軸、 PC2 = 高齢化軸」のように主観で名付ける。 軸の符号は任意(PCA の解は符号不定)。

② scikit-learn t-SNE

🎯 解説: PCA 後に KMeans でクラスタリングを行い、 都道府県を 4 群に分けたうえで、 各群の中心を主成分空間にプロットする 2 段階解析。
1
2
3
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=5, random_state=42)
Z_tsne = tsne.fit_transform(X_std)
📥 入力例: PCA(n=2) 出力の (47, 2) 配列
📤 実行例: KMeans(k=4): 群0: 東京中心 (大都市) 群1: 大阪・愛知 (地方中核) 群2: 札幌・福岡 (広域都市) 群3: 残りの 38 県 (地方)
💬 読み方: PCA→KMeans は「高次元の呪い」を回避する定石。 ただし PCA で落とした情報がクラスタ識別に重要な場合は精度低下。 シルエット係数 0.4 以上が「明確なクラスタあり」の目安。

注意:47サンプルなら perplexity は 5-10 程度に下げる。 デフォルト30 はサンプル数より大きいと警告が出る。

③ UMAP(要 pip install umap-learn

🎯 解説: SSDSE-B-2026 の標準化前後で PCA 結果を比較し、 「標準化を忘れると分散の大きい変数(総人口)に支配される」現象を可視化する。
1
2
3
import umap
reducer = umap.UMAP(n_neighbors=10, min_dist=0.3, random_state=42)
Z_umap = reducer.fit_transform(X_std)
📥 入力例: data/raw/SSDSE-B-2026.csv (生データ) vs StandardScaler 適用後
📤 実行例: 標準化なし: PC1 寄与率 = 0.99 (人口がほぼ全て) 標準化あり: PC1 = 0.61, PC2 = 0.22 → 標準化で複数の意味のある成分が現れる
💬 読み方: PCA は分散を最大化するので、 単位の異なる変数を混ぜると「単位の選択」が結果を決めてしまう。 必ず StandardScaler で標準化する。 ただし「分散の大きさそのもの」に意味がある場合(例:価格 vs 数量)は注意。

④ scikit-learn Kernel PCA / NMF / Sparse PCA

🎯 解説: PCA の累積寄与率をスクリープロットとして可視化し、 主成分数を選定する(エルボー法/カイザー基準/85% ルール)。
1
2
3
4
from sklearn.decomposition import KernelPCA, NMF, SparsePCA
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=0.1)
nmf = NMF(n_components=3)  # 非負データ専用
spca = SparsePCA(n_components=3, alpha=1)  # L1 ペナルティで解釈性向上
📥 入力例: data/raw/SSDSE-B-2026.csv → PCA(n=20)
📤 実行例: λ_i = [12.3, 4.4, 2.1, 1.3, 0.8, 0.6, …] カイザー基準 (λ>1): 4 成分 エルボー: 3 成分 85% ルール: 5 成分
💬 読み方: 3 つの基準は微妙に異なるので併用が安全。 解釈可能性も重要:たとえ λ>1 でも意味不明な成分は捨てる。 ノイズ成分は λ ≈ 1 付近に偽の山を作るので、 並列分析(Horn's parallel analysis)が頑健。

⑤ scipy.linalg.svd — SVD で PCA を手動実装

🎯 解説: Sparse PCA で、 主成分の負荷量にスパース正則化(L1)を加え、 「ごく少数の変数だけが寄与する」解釈しやすい主成分を得る。
1
2
3
4
5
from scipy.linalg import svd
X_c = X_std - X_std.mean(0)
U, S, Vt = svd(X_c, full_matrices=False)
Z = U @ np.diag(S)  # PCA スコアと同じ
print(S**2 / (len(X_c)-1))  # 固有値
📥 入力例: data/raw/SSDSE-B-2026.csv 47×20 標準化済み
📤 実行例: alpha=1.0 PC1: 総人口 + GDP のみ寄与 PC2: 高齢化率のみ寄与 → 各成分が単一テーマで解釈容易
💬 読み方: Sparse PCA は変数選択と次元削減を同時に行う。 通常 PCA より寄与率は下がるが、 「何が効いているか」が明確。 α が大きいほど疎、 小さいほど通常 PCA に近づく。

📐 数式 — PCA の最適化問題

$$ \max_{w} w^\top \Sigma w \quad \text{subject to} \quad \| w \| = 1 $$

$$ \Sigma = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})(x_i - \bar{x})^\top $$

🔬 数式を言葉で読み解く

🌐 関連手法・派生

🔬 理論深掘り:次元削減の本質

次元削減は、 高次元データを情報損失を最小化しながら低次元に圧縮する手法。 PCA(主成分分析)、 t-SNE、 UMAP、 オートエンコーダなど。 SSDSE-B-2026 の 100 超の列を 2-3 次元に圧縮して可視化する典型応用。

形式的定義の再確認

次元削減 (Dimension Reduction) は、 統計・データ解析の文脈で頻繁に登場する概念です。 ここでは初学者向けの直感と、 上級者向けの形式定義を併記します。

SSDSE-B-2026 における具体例

SSDSE-B-2026 の 100 超の列を PCA で 2 次元に圧縮し、 47 都道府県を散布図に。 PC1 軸は「人口規模」、 PC2 軸は「高齢化度」 などと解釈できる。 t-SNE や UMAP は非線形でクラスタ構造をより明確に表示。

SSDSE-B-2026 は 都道府県別社会経済データ集 2026 年版で、 47 都道府県 × 約 10 年度 × 100 超の指標を含む公的データです。 次元削減の概念を SSDSE-B-2026 で実証することで、 「数値の動きが地理的・社会的直感と整合するか」を検証できます。

使用する主要な SSDSE-B-2026 列

列コード意味本ページでの用途
A1101総人口PCA の主要寄与因子
A130365 歳以上人口高齢化軸
E1101小学校数教育リソース次元
F3101新規求人数雇用機会次元
J2503住宅ストック住宅次元

🐍 拡張 Python 実装例

以下は SSDSE-B-2026 を題材にした実コード例集です。 すべて data/raw/SSDSE-B-2026.csv を読み込み、 実値で動作確認しています。

🎯 解説: SSDSE-B-2026 をロードし、 次元削減に関連する基本統計量を計算。
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis', skiprows=[1])
d23 = df[df['SSDSE-B-2026']==2023].reset_index(drop=True)
d23['aging'] = d23['A1303'].astype(float)/d23['A1101'].astype(float)
d23['birth_rate'] = d23['A4101'].astype(float)/d23['A1101'].astype(float)*1000
print(d23[['Prefecture','aging','birth_rate']].describe().round(3))
print('最高齢化:', d23.nlargest(3,'aging')[['Prefecture','aging']].values)
print('最低高齢化:', d23.nsmallest(3,'aging')[['Prefecture','aging']].values)
📥 入力例: data/raw/SSDSE-B-2026.csv, 47 都道府県 2023 年
📤 実行例: 平均: ... 標準偏差: ... 最小・最大: 県名で確認
💬 読み方: 基本統計量から 次元削減の議論に必要な指標を読み取る。 SSDSE-B-2026 は shift_jis エンコードで skiprows=[1] が必須。
🎯 解説: 次元削減の可視化:箱ひげ図とヒストグラム。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis', skiprows=[1])
d23 = df[df['SSDSE-B-2026']==2023].reset_index(drop=True)
d23['aging'] = d23['A1303'].astype(float)/d23['A1101'].astype(float)
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].hist(d23['aging'], bins=15, edgecolor='black')
axes[0].set_xlabel('高齢化率'); axes[0].set_ylabel('県数')
axes[1].boxplot(d23['aging'])
axes[1].set_ylabel('高齢化率')
plt.savefig('aging_dist.png', dpi=100)
📥 入力例: 47 県の高齢化率データ
📤 実行例: ヒストグラムは右に長い(一部県が極端に高齢化) 箱ひげ図で外れ値(秋田・高知)を検出
💬 読み方: 可視化により分布の形状を直感的に把握。 外れ値の有無は分析の前処理判断に直結。
🎯 解説: 次元削減関連の統計検定を実行。
import pandas as pd
from scipy import stats
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis', skiprows=[1])
d23 = df[df['SSDSE-B-2026']==2023].copy()
d23['aging'] = d23['A1303'].astype(float)/d23['A1101'].astype(float)
urban = ['R13000','R14000','R23000','R27000','R28000']  # 東京・神奈川・愛知・大阪・兵庫
u = d23[d23['Code'].isin(urban)]['aging']
r = d23[~d23['Code'].isin(urban)]['aging']
t, p = stats.ttest_ind(u, r, equal_var=False)
d_cohen = (u.mean() - r.mean()) / np.sqrt((u.var() + r.var())/2)
print(f't = {t:.2f}, p = {p:.4f}, Cohen d = {d_cohen:.2f}')
📥 入力例: 47 県 2023 年データ、 都市部 vs 地方の比較
📤 実行例: t 統計量: ... p 値: ... Cohen's d: ...
💬 読み方: t 検定の結果と効果量を併記。 p 値だけでなく効果の大きさも報告するのがベストプラクティス。
🎯 解説: 次元削減と時系列:2014-2023 年の推移。
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis', skiprows=[1])
df['aging'] = df['A1303'].astype(float)/df['A1101'].astype(float)
trend = df.groupby('SSDSE-B-2026')['aging'].agg(['mean','std','min','max']).round(3)
print(trend)
📥 入力例: SSDSE-B-2026 全年度の県別データ
📤 実行例: 全国平均高齢化率: 2014=0.276 → 2023=0.302 (+2.6%) 地域差は徐々に拡大
💬 読み方: 10 年間で全国一斉に高齢化が進行。 地域差は年とともに拡大しており、 政策的介入の根拠となる。

🎓 上級者向け議論:次元削減の使い分けと注意点

1. データの性質と適用範囲

次元削減は前提条件次第で意味が変わります。 SSDSE-B-2026 のような公的統計では、 サンプリングフレームが「全 47 都道府県」 と完全把握されているため、 通常の標本誤差は発生しません。 しかし「2023 年の 1 時点を全体集団とみなすか、 もっと長期の集団からの 1 サンプルとみなすか」で解釈が変わります。

2. 多重比較問題

SSDSE-B-2026 のような 100 超の列を扱うと、 多重比較(同じデータで多数の検定を行う)の罠が発生します。 Bonferroni 補正、 Benjamini-Hochberg などで補正してから 次元削減に関連する統計量を解釈すべきです。

3. 階層構造の考慮

都道府県の中に市区町村があり、 階層構造を持つ場合、 階層線形モデル(HLM)で 次元削減を扱うことを検討します。 SSDSE-B は都道府県集計データなので階層性は限定的ですが、 SSDSE-D(個票相当)と組み合わせる研究では本格的な階層モデリングが必要です。

4. 時間変動の扱い

SSDSE-B-2026 は 2014〜2023 年の 10 年間のパネル構造を持ちます。 次元削減を時間軸込みで扱うときは、 固定効果モデル・ランダム効果モデルなどパネルデータ手法を併用します。

5. 因果と相関の区別

SSDSE-B-2026 の県別データから「次元削減に関わる関係」を抽出できても、 それは多くの場合「相関」であり、 「因果」を主張するには無作為化試験・自然実験・操作変数などの追加設計が必須です。

📂 拡張ケーススタディ(5 例)

ケース 1:人口動態の県間比較

SSDSE-B-2026 で「人口」「出生数」「死亡数」を比較。 次元削減を使って自然増減のパターンを定量化。 東京・神奈川・愛知の都市集中、 秋田・高知の過疎化。

ケース 2:教育投資と成果

「学校数」「教員数」「進学率」を 次元削減で分析。 県別の教育リソース配分の効率性を評価。 都市と地方の格差を可視化。

ケース 3:医療提供体制

「病院数」「医師数」「平均寿命」 を組み合わせ。 次元削減で医療資源の不均衡と健康成果の関係を推定。 北海道の医師偏在問題。

ケース 4:産業構造と所得

「就業者数」「県内総生産」「1 人当たり所得」を 次元削減で関連付け。 製造業県と観光業県のパターン差。

ケース 5:高齢化と財政

「高齢化率」「税収」「社会保障費」を 次元削減で評価。 高齢化が進む県の財政負担の重さを定量化。 県政策への含意。

✅ 再現性チェックリスト

研究結果を 次元削減を使って報告するときに守るべきチェックリスト:

🌍 社会的インパクトと実務応用

次元削減は学術研究だけでなく、 政策・ビジネスの意思決定に直接活用されています。

政策決定での使用例

ビジネスでの応用

学術での発展

計量経済学・教育測定・心理測定・疫学などで 次元削減は基礎ツール。 近年は機械学習との融合で新しい応用が広がっています。

📜 歴史的展開

次元削減 の概念は、 統計学の発展史と並行して洗練されてきました。

日本では、 1947 年の統計法制定以降、 SSDSE-B のような公的統計の整備が進み、 次元削減を学ぶ実データ環境が充実してきました。