主成分分析(PCA)の基礎と応用
主成分分析(PCA:Principal Component Analysis)は、高次元のデータをより少ない次元に変換するための代表的な次元削減手法です。データに含まれる情報をできるだけ保ちながら、特徴量の数を減らすことができます。
機械学習では、特徴量が多すぎると計算コストが増えたり、モデルが複雑になったり、データの可視化が難しくなったりします。PCAを使うことで、重要な情報を残しつつ、データを扱いやすい形に整理できます。
この記事では、PCAの基本的な考え方、主成分の意味、Pythonによる実装例、PCAの応用場面、他の次元削減手法との違いについて解説します。
主成分分析(PCA)の仕組みを図で理解する

PCAとは?
PCAは、データのばらつきが最も大きくなる方向を見つけ、その方向に沿ってデータを変換する手法です。
元のデータに多数の特徴量がある場合でも、データの重要な変化の方向を見つけることで、より少ない軸でデータを表現できます。この新しい軸を主成分と呼びます。
たとえば、身長、体重、胸囲、肩幅などの身体データがある場合、それぞれを別々に見るのではなく、「体の大きさを表す方向」のような新しい軸にまとめられることがあります。
PCAの基本的な考え方
PCAの目的は、データの情報量をなるべく失わずに、次元を減らすことです。
ここでいう情報量とは、主にデータの分散を指します。分散が大きい方向には、データの違いや特徴が多く含まれていると考えます。
PCAでは、次のような考え方でデータを変換します。
- データが最も大きくばらついている方向を探す
- その方向を第1主成分とする
- 第1主成分と直交する方向の中で、次にばらつきが大きい方向を第2主成分とする
- 必要な主成分だけを残して、次元を削減する
たとえば、4次元のデータを2つの主成分に変換すれば、2次元の散布図として可視化できるようになります。
PCAの処理の流れ
PCAは、一般的に次の流れで行われます。
- データを標準化または中心化する
- データのばらつきや相関を計算する
- 分散が大きい方向を表す主成分を求める
- 主成分ごとの重要度を確認する
- 必要な主成分を選ぶ
- 元のデータを主成分の軸に変換する
元の特徴量のスケールが大きく異なる場合は、PCAの前に標準化を行うことが重要です。たとえば、年齢と年収を同時に扱う場合、数値の大きい年収の影響が過度に大きくなる可能性があります。
主成分とは?
主成分とは、元の特徴量を組み合わせて作られる新しい軸のことです。
第1主成分は、データのばらつきを最もよく表す方向です。第2主成分は、第1主成分と直交しながら、次に大きなばらつきを表す方向です。
| 主成分 | 意味 |
|---|---|
| 第1主成分 | データのばらつきが最も大きい方向 |
| 第2主成分 | 第1主成分と直交し、次にばらつきが大きい方向 |
| 第3主成分以降 | 前の主成分と直交しながら、残りのばらつきを表す方向 |
主成分は、元の特徴量そのものではありません。複数の特徴量を組み合わせて作られる新しい特徴量と考えると理解しやすくなります。
固有値と固有ベクトルの考え方
PCAでは、主成分を求めるために、共分散行列の固有値と固有ベクトルを利用します。
難しく見えますが、考え方としては次のように理解できます。
- 固有ベクトル:データがよく広がっている方向を表す
- 固有値:その方向にどれだけ大きなばらつきがあるかを表す
固有値が大きい主成分ほど、データの情報を多く含んでいると考えられます。そのため、PCAでは固有値の大きい主成分から順に選びます。
PythonによるPCAの実装
Pythonでは、scikit-learnのPCAを使って簡単に主成分分析を実行できます。
以下の例では、Irisデータセットを使って、4次元の特徴量を2次元に削減します。
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# Irisデータセットの読み込み
data = load_iris()
X = data.data
# 標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# PCAを実行して2次元に削減
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 結果を可視化
plt.scatter(
X_pca[:, 0],
X_pca[:, 1],
c=data.target
)
plt.title('PCA on Iris Dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
このコードでは、Irisデータセットの4つの特徴量を2つの主成分に変換しています。これにより、元のデータを2次元の散布図として可視化できます。
寄与率と累積寄与率
PCAでは、各主成分がデータ全体の情報をどれくらい説明しているかを確認することが重要です。
この割合を寄与率と呼びます。また、複数の主成分を合わせた説明割合を累積寄与率と呼びます。
| 用語 | 意味 |
|---|---|
| 寄与率 | ある主成分が、全体の分散のうちどれだけを説明しているか |
| 累積寄与率 | 第1主成分から順に足し合わせた説明割合 |
scikit-learnでは、explained_variance_ratio_を使って寄与率を確認できます。
print(pca.explained_variance_ratio_)
たとえば、第1主成分と第2主成分で累積寄与率が90%以上であれば、2次元に削減しても元のデータの多くの情報を保持できていると判断できます。
PCAの応用例
PCAは、さまざまな場面で利用されます。
| 応用例 | 内容 |
|---|---|
| 次元削減 | 多数の特徴量を少ない主成分にまとめ、計算コストを削減します。 |
| データの可視化 | 高次元データを2次元や3次元に変換し、散布図として確認できます。 |
| ノイズ除去 | 重要な主成分だけを残すことで、ノイズの影響を減らせる場合があります。 |
| 特徴量抽出 | 元の特徴量を組み合わせた新しい特徴量として主成分を利用できます。 |
| 前処理 | 機械学習モデルに入力する前のデータ圧縮や整理に使えます。 |
PCAを使うときの注意点
PCAは便利な手法ですが、使う際にはいくつかの注意点があります。
主成分の解釈が難しい場合がある
主成分は元の特徴量を組み合わせて作られるため、「第1主成分が何を意味するのか」を直感的に説明しにくいことがあります。
特に、複数の特徴量が複雑に混ざっている場合は、元の特徴量よりも解釈性が下がることがあります。
標準化が重要になる
PCAはデータの分散をもとに主成分を求めるため、特徴量のスケールに影響を受けます。
単位や値の範囲が異なる特徴量を扱う場合は、事前に標準化を行うことが一般的です。
非線形な構造には弱い
PCAは線形変換による次元削減手法です。そのため、データが複雑な曲線状の構造を持っている場合、うまく表現できないことがあります。
そのような場合は、t-SNEやUMAPなどの非線形な次元削減手法が使われることもあります。
PCAと他の次元削減手法の比較
PCAは代表的な次元削減手法ですが、目的によっては他の手法が適している場合もあります。
| 手法 | 特徴 |
|---|---|
| PCA | 分散が大きい方向を見つけて次元削減する。基本的で高速。 |
| LDA | クラス間の分離を重視して次元削減する。教師あり学習の情報を利用する。 |
| NMF | 非負の値を使ってデータを分解する。部品の組み合わせとして解釈しやすい場合がある。 |
| t-SNE | 局所的な構造を保ちながら低次元に可視化する。主に可視化目的で使われる。 |
| UMAP | 局所構造と大域構造の両方をある程度保ちながら可視化できる手法。 |
まとめ
主成分分析(PCA)は、高次元データを少ない次元に変換するための代表的な手法です。
- PCAは、データのばらつきが大きい方向を主成分として見つける
- 主成分は、元の特徴量を組み合わせて作られる新しい軸である
- 次元削減、可視化、ノイズ除去、特徴量抽出に活用できる
- 寄与率や累積寄与率を確認すると、どれだけ情報を残せているか分かる
- 特徴量のスケールが異なる場合は、事前に標準化することが重要
- PCAは線形手法であり、複雑な非線形構造には向かない場合がある
PCAを理解すると、高次元データを整理し、データの構造を見やすくする考え方が分かるようになります。機械学習の前処理やデータ可視化でよく使われるため、基本的な仕組みと使いどころを押さえておくと便利です。