PCA(主成分分析)とは?【DS検定対策】
1. 概要
PCA(Principal Component Analysis, 主成分分析)は、多くの特徴量を持つデータを「より少ない次元」にまとめるための手法です。
言い換えると、情報をなるべく失わずにデータを圧縮する方法です。
例えば、10個の特徴量を持つデータでも、実際には「2〜3個の軸(主成分)」だけで全体の傾向がかなり説明できる場合があります。
PCAは、その「データのばらつきを最もよく表す方向」を数式的に探し出します。
2. 学習モデルの分類
PCAは「教師なし学習(unsupervised learning)」に分類されます。
その理由は、正解ラベル(Y)が存在しない状態で、「特徴量(X)同士の関係」だけを見て構造を見つけ出すからです。
教師あり学習のように「正解を予測する」のではなく、
データの構造やパターンを整理・圧縮することが目的です。
3. 概念ロジック
「データが最もばらつく方向(分散が最大になる方向)」を探し、その方向を“新しい軸”として取り直します。
流れ
各特徴量を標準化(平均0・分散1)にする
共分散行列を求める(特徴間の関係性を表す)
固有値と固有ベクトルを求める(分散が最大の方向を探す)
固有値の大きい順に並べ、上位のベクトルを「主成分軸」として採用する
結果として、元の特徴量の組み合わせから生まれた**新しい軸(主成分)**にデータを投影し、2次元や3次元に可視化したり、モデルの入力を圧縮したりします。
4. 計算ロジック
ここでは、上記の流れをもう少し数学的に分解してみます。
PCAは「共分散行列を固有値分解する」という操作で、新しい軸を作ります。
1) 中心化(平均を0に)
各特徴量から平均を引き、データの中心を原点に合わせます。
$$
X_{centered} = X - \bar{X}
$$
2) 共分散行列を作る
特徴量どうしの関係を表す行列を作成します。
$$
\Sigma = \frac{1}{n-1} X_{centered}^T X_{centered}
$$
この行列の中には、各特徴量の分散(縦)と、特徴間の相関(斜め)が入っています。
3) 固有値と固有ベクトルを求める
共分散行列を分解し、データのばらつきが最も大きい方向(主成分)を探します。
$$
\Sigma v = \lambda v
$$
ここで、
λ(ラムダ)は「ばらつきの大きさ(分散量)」
v は「方向(主成分軸)」
です。
4) 固有値の大きい順に主成分を選ぶ
λ(分散)が大きいほど情報量が多い軸なので、上位から順に選びます。
5) 元のデータを新しい軸へ投影
最後に、データを新しい主成分軸に写し取ります。
$$
Z = X_{centered} \cdot W
$$
W は選んだ主成分軸をまとめた行列です。
5. 活用例
可視化:高次元データを2D・3Dで散布図化する(クラスタの形を直感的に見る)
ノイズ除去:重要な軸だけ残して、小さなゆらぎを削る
前処理:学習モデルの入力次元を減らして軽量化
特徴抽出:多次元データから「意味のある方向」を取り出す
画像圧縮:画像を主成分で再構成し、容量を小さくする
例えば、顔認識ではPCAで「顔の特徴軸」を作り、
それを使って類似度を計算する方法(Eigenfaces)が有名です。
6. 注意点
標準化を必ず行う
特徴量のスケールがバラバラだと、大きい値の特徴が主成分を支配してしまいます。
そのため、PCAの前にStandardScalerなどで平均0・分散1にしておく必要があります。
主成分の数は“情報量”で決める
どこまで次元を落とすかは、「累積寄与率」を見て判断します。
一般的には、全体の分散の8〜9割を説明できるところで止めるのが目安です。
主成分は人間に直感的な意味を持たないことが多い
新しい軸は、もとの特徴の線形結合(重み付き和)で作られるため、「この主成分が何を意味するか」は簡単に解釈できない場合があります。
7. メリット
データの次元を減らせるため、計算が軽くなる
特徴量間の相関を自動的に整理してくれる
ノイズを減らし、精度を安定化
可視化や探索的データ分析に非常に便利
8. デメリット
主成分軸が元の特徴量の意味を直接反映しない
標準化を怠ると、結果が大きく歪む
線形変換が前提のため、非線形な構造は捉えられない(t-SNEやUMAPの方が得意)
累積寄与率の閾値をどこで切るかに人間の判断が入る
9. Pythonでの実装例
ここでは、Iris(アヤメのデータ)を例にして、4次元の特徴量を2次元にPCAで圧縮して可視化してみます。
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# データ読み込み
data = load_iris()
X = data.data
y = data.target
labels = data.target_names
# 標準化
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
# PCA(2次元に削減)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_std)
# 結果を表示
print("寄与率(各主成分が説明する割合):", pca.explained_variance_ratio_)
print("累積寄与率:", pca.explained_variance_ratio_.sum())
# 可視化
plt.figure(figsize=(6,5))
for i, label in enumerate(labels):
plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=label)
plt.xlabel('主成分1')
plt.ylabel('主成分2')
plt.title('PCAによる次元削減結果')
plt.legend()
plt.show()10. まとめ
PCAは、「たくさんの特徴を持つデータを、少ない軸で要約する」ための基本手法です。ラベルがなくてもデータの構造を掴むことができ、どのモデルを使う前処理としても有効に働きます。
ただし、「情報を圧縮する=一部は捨てている」という点は忘れてはいけません。
PCAは便利だけど万能ではない。
それを理解した上で、探索・前処理・可視化の3つのフェーズで上手に使うのがポイントです。
