主成分分析をPython実装と数式で解説


データ分析の分野でよく使われる「主成分分析(PCA)」は、多次元のデータを扱いやすくするための強力な手法です。特に、データの次元を削減しながら特徴を抽出することで、視覚化や機械学習の前処理に役立ちます。しかし、数学的な背景やPythonでの実装方法がわかりづらいと感じる方も多いのではないでしょうか。

この記事では、主成分分析の基本的な数式の解説からPythonでの実装方法までを丁寧に解説します。初心者の方でも理解しやすいように、式の意味や計算手順を順を追って説明し、実際にコードを動かしてみることで理解を深められる内容となっています。

具体的には以下の内容が学べます:

  • 主成分分析の数学的な基礎(共分散行列や固有値分解)
  • 主成分分析の数式とその解釈
  • Pythonでの主成分分析の実装例
  • 実装コードの解説と応用方法

例えば、主成分分析の中心となる共分散行列は次のように定義されます。データ行列 \(X\)(各列が変数、各行が観測値)に対して、平均ベクトル \(\bar{x}\) を引いた中心化データを用いて

\[
\Sigma = \frac{1}{n-1} (X – \bar{x})^\top (X – \bar{x})
\]

この共分散行列の固有値分解を行い、固有値の大きい方向に沿った主成分を抽出します。


主成分分析は、データの本質的な構造を捉えるための基本的かつ重要な技術です。この記事で学んだ数学的な理解とPythonの実装スキルを活用して、実際のデータ分析にぜひ応用してみてください。主成分分析をマスターすることで、データの可視化や機械学習の精度向上に大きく貢献できるでしょう。


主成分分析とは何か

主成分分析(Principal Component Analysis、PCA)は、多次元のデータをより少ない次元に圧縮し、特徴を抽出する手法です。データの分散が最も大きい方向に軸を見つけ、その軸を「主成分」と呼びます。これにより、データの情報をできるだけ損なわずに次元削減が可能です。

主成分分析の基本的な考え方は以下の通りです。

  • 元のデータ行列 \(X\) の平均を0に調整(平均中心化)
  • データの分散共分散行列 \( \Sigma = \frac{1}{n} X^T X \) を計算
  • 共分散行列の固有値と固有ベクトルを求める
  • 固有値の大きい順に対応する固有ベクトルを主成分として選択

数学的には、共分散行列の固有値分解を行い、以下の式で主成分を求めます。

\[
\Sigma \mathbf{v}_i = \lambda_i \mathbf{v}_i
\]

ここで、\( \lambda_i \) は固有値、\( \mathbf{v}_i \) は固有ベクトルです。固有値が大きいほど、その固有ベクトルが表す方向にデータの分散が大きいことを意味します。

Pythonでは、scikit-learnのPCAクラスを使うと簡単に実装できます。例えば:

from sklearn.decomposition import PCA
import numpy as np

# 平均中心化したデータを用意
X = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9]])

# PCAインスタンスを生成し主成分数を指定
pca = PCA(n_components=1)

# データに適合させ変換
X_pca = pca.fit_transform(X)
print(X_pca)

このコードは、2次元データを1次元に圧縮し、主成分を抽出しています。

主成分分析の基本概念

主成分分析(PCA)は多変量データの次元を削減し、重要な情報を抽出する手法です。元の変数が多いと解析や可視化が難しくなるため、PCAを使ってデータの特徴を簡潔に表現します。

PCAの基本的な考え方は以下の通りです。

  • データの分散を最大化する方向(主成分)を見つける
  • 元の変数の線形結合として主成分を定義する
  • 主成分は互いに直交し、情報の重複を避ける

具体的には、データ行列 \(X\) の共分散行列 \( \Sigma \) を計算し、固有値分解を行います。

式は以下の通りです。

\[
\Sigma = \frac{1}{n-1} X^{\top} X
\]

ここで、\(n\) はサンプル数、\(X\) は平均を引いたデータ行列です。固有値分解すると、固有値 \(\lambda_i\) と固有ベクトル \(v_i\) が得られます。

\[
\Sigma v_i = \lambda_i v_i
\]

固有値の大きい順に主成分を並べ、主要な情報が含まれる成分を選びます。

Pythonでの実装は、NumPyを用いて以下のように行います。

import numpy as np

# データ行列X(平均を引いた状態)
X_centered = X - np.mean(X, axis=0)

# 共分散行列の計算
cov_matrix = np.cov(X_centered, rowvar=False)

# 固有値と固有ベクトルの計算
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)

# 固有値の降順に並べ替え
idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]

このようにPCAは数学的にデータの分散を最大化する軸を見つけ、次元を効果的に削減します。初心者の方もPythonコードを通じて理解を深めましょう。

データ次元削減の目的

主成分分析(PCA)は、高次元データの次元削減に使われます。次元削減とは、多数の変数を少数の要素にまとめることです。これにより、データの特徴を損なわずに情報を圧縮できます。

次元削減の主な目的は以下の通りです。

  • 処理速度の向上:計算負荷が軽減し、分析が速くなります。
  • 可視化の容易化:2次元や3次元に縮約してデータを視覚的に理解しやすくなります。
  • ノイズ除去:不要な情報を削減し、分析の精度向上に寄与します。

主成分分析は、元の変数の線形結合で新たな軸を作り、データの分散が最大となる方向を見つけます。数学的には、共分散行列 \( \Sigma \) の固有値分解を行います。

具体的には、以下の式で固有値 \(\lambda\) と固有ベクトル \(\mathbf{v}\) を求めます。

\[
\Sigma \mathbf{v} = \lambda \mathbf{v}
\]

この \(\mathbf{v}\) が主成分の方向を示し、対応する \(\lambda\) が情報量の大きさ(分散)を表します。Pythonでの実装例は次の通りです。

import numpy as np

# データの標準化
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)

# 共分散行列の計算
cov_matrix = np.cov(X, rowvar=False)

# 固有値と固有ベクトルの計算
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)

このようにして得た主成分を用いて、元のデータをより扱いやすい形に変換します。これがデータ次元削減の基本的な流れです。

主成分分析の活用例

主成分分析(PCA)は多次元データを扱う際に、特徴量の次元を減らすために使われます。Pythonではscikit-learnライブラリを用いると簡単に実装可能です。例えば、複数の測定値を持つセンサーデータやアンケート結果の解析に役立ちます。

具体的には、以下のような場面でPCAが活用されます。

  • 画像認識:高次元の画像データから重要な特徴を抽出し、処理を高速化する。
  • マーケティング分析:顧客の属性や購買履歴からパターンを抽出し、ターゲット層を特定する。
  • 遺伝子データ解析:膨大な遺伝子情報から主要な変動要因を見つける。

数学的には、データ行列 \(X\) の共分散行列 \(S\) を作り、その固有値分解を行います。

式は以下の通りです。

\[ S = \frac{1}{n-1} X^\top X \]

\[ S \mathbf{v}_i = \lambda_i \mathbf{v}_i \]

ここで、\(\mathbf{v}_i\) は固有ベクトル、\(\lambda_i\) は対応する固有値です。固有値の大きい順に固有ベクトルを並べ、主成分を形成します。Pythonでの実装例を示します。

from sklearn.decomposition import PCA
import numpy as np

# ダミーデータの作成(5サンプル、3特徴量)
X = np.array([[2.5, 2.4, 1.0],
              [0.5, 0.7, 0.8],
              [2.2, 2.9, 0.9],
              [1.9, 2.2, 1.2],
              [3.1, 3.0, 1.1]])

# PCAの適用(主成分数を2に設定)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

print("主成分分析後のデータ:\n", X_pca)

このように、Pythonで簡単に主成分分析を実装し、多次元データの視覚化や解析に活用できます。

主成分分析の数式と理論

主成分分析(PCA)は多次元データの次元削減を行う手法です。データの分散を最大化する方向(主成分)を見つけることで、情報の損失を最小限に抑えつつ特徴量を圧縮します。

まず、データ行列を平均0に正規化します。次に共分散行列を計算し、固有値問題を解きます。具体的には以下の式で表されます。

データ行列を \(X \in \mathbb{R}^{n \times p}\) とし、平均中心化後の行列を用いる場合、共分散行列は

\[
\Sigma = \frac{1}{n-1} X^T X
\]

この共分散行列の固有値問題を解きます。

\[
\Sigma \mathbf{w} = \lambda \mathbf{w}
\]

ここで、\(\mathbf{w}\)は固有ベクトル(主成分の方向)、\(\lambda\)は対応する固有値です。固有値の大きい順に固有ベクトルを並べ、その軸にデータを射影します。

Pythonでは、NumPyの関数を使い簡単に固有値分解が可能です。以下は簡単な例です。

import numpy as np
# 平均中心化
X_centered = X - np.mean(X, axis=0)
# 共分散行列計算
cov_matrix = np.cov(X_centered, rowvar=False)
# 固有値・固有ベクトルの計算
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)
# 固有値の降順に並べ替え
idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]

この理論とコードを理解すれば、Pythonでの主成分分析の基礎が掴めます。

共分散行列の計算方法

主成分分析(PCA)では、データの特徴間の関係性を捉えるために共分散行列を計算します。共分散行列は、各特徴の分散と特徴間の共分散をまとめたものです。

まず、データ行列を \(X\) とし、各行がサンプル、各列が特徴量を表します。データの平均ベクトルを \(\bar{x}\) とすると、共分散行列 \(C\) は以下の式で求められます。

\[
C = \frac{1}{n-1} (X – \bar{x})^\top (X – \bar{x})
\]

ここで、\(n\) はサンプル数です。式の意味は、各特徴の偏差(平均との差)を掛け合わせ、その平均を取ることで特徴間の共分散を算出しています。

Pythonでは、NumPyを使って簡単に計算できます。以下のコード例では、データ行列 \(X\) から共分散行列を計算しています。

import numpy as np

# データ行列 X (サンプル数 x 特徴数)
X = np.array([[2.5, 2.4],
              [0.5, 0.7],
              [2.2, 2.9],
              [1.9, 2.2],
              [3.1, 3.0]])

# 平均ベクトルを引いて中心化
X_centered = X - np.mean(X, axis=0)

# 共分散行列の計算
cov_matrix = np.dot(X_centered.T, X_centered) / (X.shape[0] - 1)
print(cov_matrix)

このようにして求めた共分散行列を使い、主成分分析の次のステップへ進みます。

固有値と固有ベクトルの意味

主成分分析(PCA)では、データの分散を最大化する方向を見つけることが重要です。ここで登場するのが固有値と固有ベクトルです。固有ベクトルはデータの特徴を表す「方向ベクトル」で、固有値はその方向に沿った「分散の大きさ」を示します。

具体的には、共分散行列 \( \Sigma \) に対して、以下の固有値問題を解きます。

式:

\[
\Sigma \mathbf{v} = \lambda \mathbf{v}
\]

ここで、\( \mathbf{v} \) は固有ベクトル、\( \lambda \) は固有値です。固有ベクトルは変換後も方向が変わらず、固有値はその方向のスケール(分散)を表します。

つまり、固有値が大きい固有ベクトルの方向ほど、データのばらつきが大きく重要な主成分となります。

Pythonでの実装例は以下の通りです。共分散行列を計算し、NumPyの関数で固有値・固有ベクトルを求めます。

import numpy as np

# サンプルデータ(行:サンプル、列:特徴量)
X = np.array([[2.5, 2.4],
              [0.5, 0.7],
              [2.2, 2.9],
              [1.9, 2.2],
              [3.1, 3.0]])

# 共分散行列の計算
cov_matrix = np.cov(X.T)

# 固有値と固有ベクトルの計算
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

print("固有値:", eigenvalues)
print("固有ベクトル:", eigenvectors)

このように固有値と固有ベクトルを利用して、PCAはデータの次元削減や特徴抽出を行います。

主成分の選び方と寄与率

主成分分析では、元の多変量データを少数の主成分に集約します。どの主成分を選ぶかは「寄与率」が重要な指標です。寄与率とは、各主成分がデータの分散をどれだけ説明できるかを示します。

主成分の分散は固有値 \(\lambda_i\) に対応し、寄与率は以下の式で計算されます。

\[
\text{寄与率}_i = \frac{\lambda_i}{\sum_{j=1}^p \lambda_j}
\]

ここで、\(p\) は主成分の総数です。寄与率が高い主成分ほど元データの情報を多く含んでいます。累積寄与率は選択の目安となり、多くの場合70〜90%を基準にします。

Pythonで寄与率を計算する例を示します。

import numpy as np
# 固有値の例
eigenvalues = np.array([3.5, 1.2, 0.8, 0.5])
contribution_ratio = eigenvalues / np.sum(eigenvalues)
cumulative_ratio = np.cumsum(contribution_ratio)

print("寄与率:", contribution_ratio)
print("累積寄与率:", cumulative_ratio)
  

このコードで寄与率を確認し、主成分の選択に役立てましょう。

Pythonで主成分分析を実装する方法

主成分分析(PCA)は多次元データの次元削減に有効な手法です。PythonでPCAを実装するには、まずデータの共分散行列を計算します。共分散行列は各変数間の関係を示し、次の式で表されます。

\[ \Sigma = \frac{1}{n-1} (X – \bar{X})^T (X – \bar{X}) \]

ここで、\(X\)はデータ行列、\(\bar{X}\)は各特徴量の平均ベクトルです。共分散行列の固有値と固有ベクトルを求めることで、データの分散が最大の方向(主成分)を特定できます。

PythonではNumPyを使い、次のように実装可能です。

import numpy as np

# データの中心化
X_centered = X - np.mean(X, axis=0)

# 共分散行列の計算
cov_matrix = np.cov(X_centered, rowvar=False)

# 固有値・固有ベクトルの計算
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)

# 固有値の降順で並べ替え
sorted_idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[sorted_idx]
eigenvectors = eigenvectors[:, sorted_idx]

# 主成分への射影
X_pca = np.dot(X_centered, eigenvectors)

このコードでは、まずデータを平均で中心化し、共分散行列を計算します。次に固有値分解を行い、固有値の大きい順に固有ベクトルを並べ替えます。最後に元のデータを主成分空間に射影して、新たな特徴量を得ています。これにより、データの重要な構造を捉えつつ次元圧縮が可能です。

必要なライブラリの紹介

主成分分析(PCA)をPythonで実装する際には、いくつかの基本的なライブラリが必要です。まず、データの操作や計算にはNumPyが不可欠です。NumPyは多次元配列や行列計算を効率的に行えます。次に、データの可視化にはMatplotlibSeabornがよく使われます。これらはグラフ作成の支援に役立ちます。

また、PCAの計算を簡単に行うために、scikit-learn(sklearn)が非常に便利です。scikit-learnにはPCAのクラスが用意されており、数式を理解したうえで実装を学ぶ際にも役立ちます。

これらのライブラリは以下のようにインストールします。

pip install numpy matplotlib seaborn scikit-learn

これらを用いて、まずはデータの標準化を行います。標準化は、各特徴量の平均を0、分散を1に変換する処理です。数式では、特徴量 \(x_j\) の標準化は以下のように表されます。

\[
z_j = \frac{x_j – \mu_j}{\sigma_j}
\]

ここで、\(\mu_j\) は平均、\(\sigma_j\) は標準偏差を示します。Pythonでの標準化は、scikit-learnの StandardScaler を使うのが一般的です。

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

これにより、主成分分析の前処理が整います。次のステップでは、実際にPCAを実装していきます。

データの前処理手順

主成分分析(PCA)を正しく行うためには、まずデータの前処理が重要です。前処理の基本的な流れは以下の通りです。

  • 欠損値の確認と処理
  • データの標準化
  • 必要に応じた次元削減や変換

特に標準化は、各特徴量が異なる単位やスケールを持つ場合に必須です。標準化の数式は次のように表されます。

各データ点 \( x_i \) に対して平均 \(\mu\) と標準偏差 \(\sigma\) を用いて、

\[
z_i = \frac{x_i – \mu}{\sigma}
\]

この式は、データの平均を0、分散を1に変換する操作です。Pythonではscikit-learnのStandardScalerを使うと簡単に実装できます。

from sklearn.preprocessing import StandardScaler
import numpy as np

# サンプルデータ
X = np.array([[10, 200],
              [15, 220],
              [14, 210]])

# 標準化
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
print(X_std)

このようにして得られた標準化データを用いることで、主成分分析の結果が各特徴量のスケールに影響されずに、より正確に分散の構造を捉えられます。

scikit-learnを使った主成分分析の実装

Pythonで主成分分析(PCA)を行う際に、最も手軽で強力な方法は
機械学習ライブラリのscikit-learnを活用することです。PCAは
多次元データの分散が最大になる方向に軸を変換する解析手法で、
以下の数式で表されます。

主成分ベクトル \(\mathbf{w}\) は次の最大化問題を解くことで求めます。

\[
\mathbf{w} = \arg\max_{\mathbf{w}:\|\mathbf{w}\|=1} \mathrm{Var}(\mathbf{Xw}) = \arg\max_{\mathbf{w}:\|\mathbf{w}\|=1} \mathbf{w}^T \mathbf{S} \mathbf{w}
\]

ここで、\(\mathbf{S}\) はデータ行列 \(\mathbf{X}\) の共分散行列です。

scikit-learnのPCAクラスは、この計算を内部で効率的に処理し、
主成分の抽出と次元削減を簡単に実装できます。以下は基本的な
コード例です。

from sklearn.decomposition import PCA
import numpy as np

# ダミーデータの作成(10サンプル、3特徴量)
X = np.array([
  [2.5, 2.4, 0.5],
  [0.5, 0.7, 1.1],
  [2.2, 2.9, 0.9],
  [1.9, 2.2, 1.0],
  [3.1, 3.0, 0.7],
  [2.3, 2.7, 0.6],
  [2.0, 1.6, 0.8],
  [1.0, 1.1, 1.5],
  [1.5, 1.6, 0.9],
  [1.1, 0.9, 1.2]
])

# 主成分数を2に指定してPCAを適用
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

print("主成分得点(次元削減後):\n", X_pca)
print("各主成分の寄与率:", pca.explained_variance_ratio_)

このコードでは、3次元データを2次元に削減し、主成分得点を算出します。
また、explained_variance_ratio_属性で各主成分がデータの分散に
どれだけ寄与しているかを確認できます。

結果の可視化方法

主成分分析(PCA)で得られた結果を理解するためには、可視化が非常に効果的です。Pythonでは主に matplotlibseaborn を使い、主成分スコアを散布図で表現します。これにより、データの分布やクラスタリングが視覚的に把握しやすくなります。

まず、主成分得点(主成分スコア)は元のデータ \(\mathbf{X}\) を主成分ベクトル \(\mathbf{W}\) に射影したものです。式で表すと、

\[
\mathbf{Z} = \mathbf{X} \mathbf{W}
\]

ここで、\(\mathbf{Z}\) は新しい主成分空間でのデータ点の座標を示します。PythonではPCAの実装例として以下のコードで散布図を作成します。

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# PCAの実行(2主成分に削減)
pca = PCA(n_components=2)
Z = pca.fit_transform(X)  # Xは元データの配列

# 散布図の描画
plt.figure(figsize=(8,6))
plt.scatter(Z[:,0], Z[:,1], c='blue', alpha=0.5)
plt.xlabel('第1主成分')
plt.ylabel('第2主成分')
plt.title('主成分分析の結果(散布図)')
plt.grid(True)
plt.show()

この図により、データのばらつきや潜在的なグループ構造が視覚的に確認できます。また、主成分の寄与率(分散説明率)を棒グラフで示すと、どの主成分がデータの特徴を多く説明しているかが把握しやすいです。

主成分分析の結果の解釈と応用

主成分分析(PCA)では、得られた主成分の「寄与率」や「累積寄与率」を使い、次元削減の効果を評価します。主成分の寄与率は、各主成分が元のデータの分散をどれだけ説明しているかを示します。具体的には、固有値を使って次のように計算します。

固有値を \(\lambda_i\) とすると、i番目の主成分の寄与率は以下の式です。

\[
寄与率_i = \frac{\lambda_i}{\sum_{j=1}^p \lambda_j}
\]

この寄与率を累積することで、どの程度の次元まで主成分を用いれば元のデータの情報を十分に保持できるか判断可能です。一般的には累積寄与率が70〜90%を超える主成分を選択します。

Pythonで寄与率を計算し、グラフ化する例を示します。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# データX(例)
X = np.random.rand(100, 5)

pca = PCA()
pca.fit(X)

explained_variance_ratio = pca.explained_variance_ratio_
cumulative_ratio = np.cumsum(explained_variance_ratio)

plt.plot(range(1, len(cumulative_ratio) + 1), cumulative_ratio, marker='o')
plt.xlabel('主成分の数')
plt.ylabel('累積寄与率')
plt.title('主成分分析の累積寄与率')
plt.grid(True)
plt.show()

この図から、主成分の数を決めて次元削減を行い、解析や機械学習の前処理に活用します。PCAはノイズ除去や可視化にも効果的な手法です。

主成分スコアの理解

主成分分析(PCA)では、データの次元を減らしながら重要な特徴を捉えます。ここで重要なのが「主成分スコア」です。主成分スコアは元のデータを新しい軸(主成分)に射影した値を指します。

数学的には、主成分スコア \( \mathbf{Z} \) は次のように表されます。

元データ行列を \( \mathbf{X} \)、主成分の固有ベクトルを列ベクトルとしてまとめた行列を \( \mathbf{W} \) とすると、

主成分スコアは

\( \mathbf{Z} = \mathbf{X} \mathbf{W} \)

となります。つまり、元のデータを主成分の方向に変換した値がスコアです。

Pythonでの実装例を見てみましょう。ここではscikit-learnのPCAを用いて主成分スコアを計算します。

from sklearn.decomposition import PCA
import numpy as np

# サンプルデータ(例)
X = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2]])

# PCAモデルの作成
pca = PCA(n_components=2)
pca.fit(X)

# 主成分スコアの計算(元データを主成分に射影)
Z = pca.transform(X)
print(Z)

上記コードの pca.transform(X) がまさに \(\mathbf{X}\mathbf{W}\) の計算です。これにより、元の複数の特徴量を主成分という新しい軸で表した値を得られます。

主成分スコアは、次元削減後のデータ解析や可視化に活用されます。初心者の方はまずこのイメージを掴むことが重要です。

寄与率から見る重要な主成分

主成分分析において、「寄与率」は各主成分がデータの分散をどれだけ説明しているかを示す重要な指標です。具体的には、寄与率は固有値を使って計算します。主成分の固有値を \(\lambda_i\) とすると、寄与率は次のように定義されます。

式:

\[ \text{寄与率}_i = \frac{\lambda_i}{\sum_{j=1}^p \lambda_j} \]

ここで、\(p\) は主成分の総数です。この式は、各主成分の固有値が全固有値の合計に占める割合を表します。寄与率が高い主成分は、元のデータの特徴を多く反映しているため、解析では重要視されます。

Pythonを使って寄与率を計算・可視化する例を示します。まず、固有値のリストから寄与率を計算します。

eigenvalues = [4.0, 2.0, 1.0, 0.5]
contribution_ratios = [eig / sum(eigenvalues) for eig in eigenvalues]
print(contribution_ratios)

出力は各主成分の寄与率を示します。次に、寄与率をグラフで確認して重要な主成分を選びましょう。

import matplotlib.pyplot as plt
import numpy as np

eigenvalues = np.array([4.0, 2.0, 1.0, 0.5])
contribution_ratios = eigenvalues / eigenvalues.sum()

plt.bar(range(1, len(contribution_ratios)+1), contribution_ratios)
plt.xlabel('主成分')
plt.ylabel('寄与率')
plt.title('主成分の寄与率')
plt.show()

このグラフで、寄与率の高い主成分を見極め、分析に活用することが可能です。初心者の方は、寄与率が累積で70〜80%を超える主成分を選ぶと良いでしょう。

主成分分析の注意点と限界

主成分分析(PCA)は多次元データの次元削減に有効ですが、いくつかの注意点と限界があります。まず、PCAはデータの線形な構造を前提としています。そのため、非線形な関係を持つデータには適さない場合があります。

また、PCAは分散が大きい方向に重要な情報があると仮定します。しかし、分散が小さい変数が解析に重要な場合もあるため、必ずしもすべての情報を捉えられるわけではありません。

さらに、主成分は元の変数の線形結合で表されるため、解釈が難しいこともあります。以下の数式は、データ行列 \(X\)(平均中心化済み)に対し、共分散行列 \(S\) の固有値分解を示します。

\[
S = \frac{1}{n-1} X^\top X
\]

\[
S \mathbf{v}_i = \lambda_i \mathbf{v}_i
\]

ここで、\(\lambda_i\) は固有値、\(\mathbf{v}_i\) は対応する固有ベクトルです。固有ベクトルが主成分の方向を示し、固有値がその分散の大きさを表します。

Pythonでの実装例も示します。scikit-learnのPCAクラスを使うと簡単です。

from sklearn.decomposition import PCA
import numpy as np

# データの準備(平均中心化を自動で実施)
X = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0]])

pca = PCA(n_components=2)
pca.fit(X)

print("固有値(分散):", pca.explained_variance_)
print("主成分ベクトル:\n", pca.components_)

このように、PCAは強力ですが、線形性の仮定や解釈の難しさを理解した上で利用しましょう。

コメントする