主成分分析(PCA)とは?
主成分分析(Principal Component Analysis、略してPCA)は、多くの変数を持つデータ(多次元データ)の情報をできるだけ損なわずに、より少ない変数(次元)で表現するための統計的な手法です。言い換えると、たくさんの指標を、より少数の新しい指標(主成分)に要約することを目指します。これを「次元削減」と呼びます。
例えば、国語、数学、理科、社会、英語の5科目のテストの点数があったとします。これらの点数はそれぞれ関連性があるかもしれません。主成分分析を使うと、これらの5つの科目の情報を「総合的な学力」や「文系・理系傾向」といった、より少ない新しい指標(主成分)にまとめることができます。これにより、データ全体の特徴をより簡単に理解したり、可視化したりすることが可能になります。
主成分分析の目的とメリット
主成分分析は、主に以下の目的で利用されます。
- データの可視化: 多くの変数を持つ高次元のデータは、そのままではグラフにすることが困難です。主成分分析を使って2次元や3次元に次元を削減することで、データを散布図などで可視化し、データポイントの分布や関係性を直感的に理解できるようになります。
- 次元の削減: 機械学習モデルなどを扱う際に、変数が多すぎると計算コストが高くなったり、モデルが複雑になりすぎて未知のデータに対する予測精度が落ちる「過学習」という問題が起きやすくなります。主成分分析で変数の数を減らすことで、これらの問題を軽減できます。
- ノイズの除去: データに含まれるノイズ(無関係な情報)を除去する効果も期待できます。主成分分析は、データのばらつき(分散)が大きい方向を優先的に抽出するため、ばらつきの小さいノイズ成分の影響を小さくすることができます。
主成分分析の仕組み(考え方)
主成分分析は、どのような考え方で次元を削減しているのでしょうか。専門的な数式は割愛し、イメージで説明します。
主成分分析では、データのばらつき(分散)が最も大きくなるような新しい軸(座標軸)を探します。この最初の軸を「第1主成分」と呼びます。この軸は、元のデータの特徴を最もよく表している方向と言えます。
次に、第1主成分とは直交する方向(90度の角度をなす方向)で、次にデータのばらつきが大きくなる軸を探します。これを「第2主成分」と呼びます。
このようにして、元の変数の数だけ主成分を計算することができますが、通常は最初のいくつかの主成分(例えば、第1主成分と第2主成分)だけで、元のデータの情報の大部分を説明できることが多いです。
各主成分が元のデータの情報をどれくらい説明できているかを示す指標として「寄与率」があります。また、第1主成分から特定の主成分までの寄与率を足し合わせたものを「累積寄与率」と呼びます。一般的に、累積寄与率が80%程度になるまでの主成分を採用することが多いです。
主成分分析の活用事例
主成分分析は様々な分野で活用されています。
分野 | 活用事例 |
---|---|
マーケティング | 顧客アンケートの多岐にわたる質問項目(価格、デザイン、機能、サポートなど)を、例えば「コストパフォーマンス重視」「デザイン・機能性重視」といった少数の主成分に要約し、顧客のセグメンテーション(グループ分け)に役立てる。 |
金融 | 株価や金利など、多数の経済指標から、市場全体の動向を示すような総合的な指標を作成し、リスク管理やポートフォリオ構築に利用する。 |
画像認識 | 画像の各ピクセルの値を一つの変数と捉え、主成分分析によって画像データの特徴を抽出し、次元を削減する(画像圧縮)。これにより、少ないデータ量で画像を表現したり、顔認証などの処理を高速化したりする。 |
品質管理 | 製品の多数の品質特性データ(寸法、重量、強度など)を少数の主成分にまとめ、製造プロセスの異常検知や品質の総合評価に用いる。 |
Pythonによる主成分分析の実装例
Pythonのライブラリであるscikit-learnを使うと、簡単に主成分分析を実装できます。以下は、サンプルデータ(アヤメのデータセット)を使って主成分分析を行い、2次元に削減して可視化するコード例です。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# 1. データの読み込み
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names
# 2. データの標準化
# 各変数のスケールを揃える(平均0, 分散1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 3. 主成分分析の実行
# 2次元に削減することを指定
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 4. 結果の可視化
plt.figure(figsize=(8, 6))
colors = ['navy', 'turquoise', 'darkorange']
lw = 2
for color, i, target_name in zip(colors,, target_names): plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], color=color, alpha=.8, lw=lw, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA of IRIS dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
# 寄与率の確認
print('Explained variance ratio (first two components): %s' % str(pca.explained_variance_ratio_))
# 出力例: Explained variance ratio (first two components): [0.72962445 0.22850762]
# この場合、第1主成分で約73%、第2主成分で約23%、合わせて約96%の情報を説明できていることがわかる。
主成分分析の注意点
主成分分析は非常に便利な手法ですが、いくつかの注意点があります。
- 解釈の難しさ: 主成分は元の変数の線形結合(足し合わせ)によって作られるため、その主成分が具体的に何を意味するのかを解釈するのが難しい場合があります。各主成分がどの元の変数の影響を強く受けているか(主成分負荷量)を確認し、意味を考察する必要があります。
- データの標準化: 主成分分析はデータの分散に基づいているため、各変数の単位やスケール(大きさ)が大きく異なると、スケールの大きい変数に結果が引っ張られてしまいます。そのため、分析前には各変数の平均を0、分散を1にする「標準化」という前処理を行うのが一般的です。
- 線形性の仮定: 主成分分析は、変数間の関係が線形(直線的)であることを前提としています。非線形な(曲線的な)関係を持つデータを扱う場合は、他の手法(例: t-SNE, UMAP)の方が適していることがあります。