見出し画像

PCA(主成分分析)とは?【DS検定対策】

1. 概要

PCA(Principal Component Analysis, 主成分分析)は、多くの特徴量を持つデータを「より少ない次元」にまとめるための手法です。

言い換えると、情報をなるべく失わずにデータを圧縮する方法です。

例えば、10個の特徴量を持つデータでも、実際には「2〜3個の軸(主成分)」だけで全体の傾向がかなり説明できる場合があります。
PCAは、その「データのばらつきを最もよく表す方向」を数式的に探し出します。

2. 学習モデルの分類

PCAは「教師なし学習(unsupervised learning)」に分類されます。

その理由は、正解ラベル(Y)が存在しない状態で、「特徴量(X)同士の関係」だけを見て構造を見つけ出すからです。

教師あり学習のように「正解を予測する」のではなく、
データの構造やパターンを整理・圧縮することが目的です。

3. 概念ロジック

「データが最もばらつく方向(分散が最大になる方向)」を探し、その方向を“新しい軸”として取り直します。

流れ

  1. 各特徴量を標準化(平均0・分散1)にする

  2. 共分散行列を求める(特徴間の関係性を表す)

  3. 固有値と固有ベクトルを求める(分散が最大の方向を探す)

  4. 固有値の大きい順に並べ、上位のベクトルを「主成分軸」として採用する

結果として、元の特徴量の組み合わせから生まれた**新しい軸(主成分)**にデータを投影し、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つのフェーズで上手に使うのがポイントです。


いいなと思ったら応援しよう!