PCA(主成分分析)完全ガイド:目的・原理(共分散・SVD)とPython実装、実務での使い方

PCA(主成分分析)とは — 概要と目的

PCA(Principal Component Analysis、主成分分析)は、多次元データの次元削減および構造把握のための古典的で広く使われる統計手法です。データの分散が最も大きくなる直交方向(主成分)を順に見つけることで、元の変数を線形に組み合わせた少数の変数でデータの特徴を表現します。これにより可視化、ノイズ除去、圧縮、特徴抽出などが可能になります。

直感的な理解

直感的には、PCAは「データが広がっている方向」を見つけます。例えば2次元の点群が細長い楕円状に分布している場合、楕円の長軸方向が第一主成分(最大分散方向)、短軸方向が第二主成分(次に大きな分散方向)になります。第一主成分に投影すると、データの情報(分散)の多くを少ない次元で表現できます。

数学的定式化(中心化、共分散行列、固有値分解)

データ行列を X (n サンプル × p 次元) とする。まず各特徴量を平均で中心化(平均0にする)することが重要です。中心化した行列を X_center とすると、共分散行列 S は通常次のように定義されます:

S = (1 / (n - 1)) X_center^T X_center

PCA はこの共分散行列 S の固有値分解を行います:

S = V Λ V^T

ここで V は固有ベクトル(各列が主成分の方向)、Λ は対角行列(固有値=その主成分が説明する分散)です。固有値を大きい順に並べ、対応する固有ベクトルを取ることで主成分空間への射影行列が得られます。データの主成分スコア(射影結果)は Z = X_center V で与えられます。

SVD(特異値分解)との関係

PCA は SVD (Singular Value Decomposition) を用いて計算されることが多いです。中心化したデータ行列 X_center に対して SVD を行うと、

X_center = U Σ V^T

となり、ここで V は共分散行列の固有ベクトルと一致し、Σ の特異値は固有値の平方根に比例します。SVD を直接使うと数値安定性や計算効率の面で有利です。特に n < p や p が大きい場合に有用です。

主成分の解釈(スコアと負荷量)

  • スコア(Scores): 各サンプルを主成分軸に射影した値(Z = X_center V)。可視化やクラスタリングに使う。
  • 負荷量(Loadings): 固有ベクトルの各成分。元の変数が各主成分に対してどの程度寄与しているかを示す。
  • 説明分散(Explained Variance): 各主成分が元データの分散の何割を説明しているか。累積説明分散を見て次元数を決める。

次元数(k)の決定方法

主成分の数を決める方法は複数あります。よく使われる基準は以下の通りです:

  • 累積説明分散(例:80%または90%を閾値にする)
  • スクリープロット(固有値の山が落ちる「肘」)
  • カイザー基準(固有値が1以上の成分を残す) — 標準化時の相関行列に対してよく使われる
  • 交差検証(PCAを前処理に用いた機械学習タスクでの性能を評価)

前処理の重要性:中心化とスケーリング

PCA は分散に基づくため、変数の尺度(単位や分散)が結果に大きく影響します。一般に以下を行います:

  • 平均で中心化する(必須)
  • 標準偏差で割って標準化するかどうかは目的次第:
    • 変数が異なる単位で測定され、各変数を同等に扱いたい場合は標準化(Zスコア)して相関行列ベースのPCAを行う。
    • 測定単位そのものの分散を重視する場合は標準化しない(共分散行列ベース)。
  • 外れ値は分散を極端に歪めるため、外れ値処理(ロバストPCAやトリミング)を検討する。

計算上の注意点と大規模データへの対処

標準的なSVDの計算コストはデータのサイズに依存し、p(次元)や n(サンプル数)が大きいと計算負荷が高くなります。実務では次の方法が用いられます:

  • ランダム化されたSVD(randomized SVD)で近似的に高速化
  • インクリメンタルPCA(ミニバッチやストリーミングデータ向け)
  • スパース行列や分散処理を使う(大規模分散環境での実装)
  • 欠損値は事前に扱う:単純な代入法、EMアルゴリズムを使ったPCA(EM-PCA)など

PCAの用途(代表例)

  • 次元削減・可視化(高次元データを2次元・3次元に落として散布図で可視化)
  • ノイズ除去(低次元復元によりノイズが平均化される)
  • 特徴抽出・圧縮(画像圧縮やデータ圧縮)
  • 前処理(機械学習の入力次元削減による学習時間短縮や過学習抑制)
  • 異常検知(再構成誤差や低分散方向を見る)

PCAの限界と留意点

  • 線形手法:PCA は線形な次元削減しか行えない。非線形な構造がある場合はカーネルPCA、t-SNE、UMAPなどが有効。
  • 解釈性の問題:主成分は線形結合であり、元の変数の自然な意味が失われることがある。負荷量を見ることである程度解釈可能。
  • 外れ値に敏感:外れ値が第一主成分を支配する可能性がある。ロバストPCAを検討。
  • カテゴリ変数の扱い:そのままPCAに入れると意味がない。ダミー化や適切なエンコーディング、別手法の検討が必要。
  • 分散が重要でない場合:目的変数との関連性を考慮せずに分散だけで次元削減するため、教師ありの次元削減(LDAなど)が有利なケースがある。

拡張と関連手法

  • カーネルPCA:非線形特徴抽出のため、カーネル法を使って高次元空間で線形PCAを行う
  • スパースPCA:負荷量にスパース性(多くがゼロ)を導入して解釈性向上
  • 確率的PCA(Probabilistic PCA):確率モデルとしての定式化。Tipping & Bishop によるモデルはEMアルゴリズムで推定可能。
  • 独立成分分析(ICA):PCAが分散最大化に基づくのに対し、独立性を重視して非ガウス成分を分離する
  • ロバストPCA(RPCA):低ランク成分+スパースな異常成分に分解する手法で、外れ値や欠損に強い

実務での使い方(実装のヒント)

  • Python の scikit-learn: sklearn.decomposition.PCA や IncrementalPCA、KernelPCA が標準的に使える。
  • 前処理は pipeline を使って明示的に行う(スケーリング→PCA→モデル)。これにより再現性が保たれる。
  • 可視化:主成分スコアをプロットして群や傾向を確認。バイプロット(scores と loadings を同時表示)で変数の寄与を確認する。
  • 検証:PCA を次元削減前の性能比較(モデル予測精度の変化)で評価する。単に説明分散が高くても目的変数に寄与しない場合がある。

簡単な計算例(手順のまとめ)

  1. データを収集し、欠損値や外れ値の処理を行う。
  2. 各特徴量を平均で中心化。必要に応じて標準化(Zスコア)。
  3. 共分散行列を計算(または直接SVD)。
  4. 固有値・固有ベクトル(またはSVD)を求め、主成分軸を得る。
  5. 上位k成分を選択し、データを射影して低次元表現を得る。
  6. 累積説明分散やスクリープロットで選択の妥当性を確認する。

まとめ

PCA はシンプルで汎用性の高い次元削減手法で、可視化・ノイズ除去・特徴抽出など多くの場面で役立ちます。しかし線形手法であること、スケーリングや外れ値の影響を受けやすいことを理解し、目的に応じて標準化・ロバスト手法・非線形手法への置き換えを検討することが重要です。実務では単に分散を最大化するだけでなく、最終的なタスク(例:予測精度)を基準に評価・選択することを推奨します。

参考文献