📈

主成分分析(PCA)をなんとなく理解する

はじめまして、まつのです!

機械学習や生成AIの受託開発・AI学習サービス「aipass」の運営をしている株式会社dotConfという会社で、代表をしております!

今回は、主成分分析(PCA)について、 「なんとなく聞いたことはあるけど、ちょっと難しそう…」という方向けに、解説していきます。

主成分分析とは?

主成分分析(PCA)は、たくさんの変数を“似た方向”にまとめる方法です。 ざっくり言うと、データの特徴を少ない数の軸に圧縮する技のこと。例えば、あるクラスで「身長」と「体重」を調べたとします。 背が高い人は体重も重い傾向にあるとしたら、この2つの変数は似た情報を持っています。
その場合、わざわざ2つの軸で扱わずに、全体の傾向を表す1本の軸にまとめることができるんです。

この「右上がりの線」が 主成分となりデータが一番ばらついている方向を意味します。

なんのために使うの?

PCAはデータ分析の中でとてもよく使われます。理由はシンプルで、「情報を整理して見やすくする」からです。

目的 説明
可視化 多次元データを2Dや3Dにして見たい
次元削減 変数が多すぎるときにコンパクトにしたい
ノイズ除去 情報が少ない部分(小さな揺らぎ)を省きたい

PCAのしくみ

ステップ①:平均をそろえる(中心化)

まず、各項目(列)から平均を引いてデータを中心にそろえます。 これは「みんな原点からスタート」という準備となります。

X_{\text{centered}} = X - \mu

ステップ②:一番ばらつく方向を探す

データが一番広がっている方向(=情報量が多い方向)を探します。
その次に直角方向で広がっている方向を探します。
それぞれ、第一主成分・第二主成分と呼びます。

ステップ③:「写す(射影する)」とは?

PCAでは元のデータを新しい軸(主成分)に写し取る(=射影する)ことで、情報を少ない次元に圧縮します。たとえば4次元のデータを2次元に「写す」と、 データの大まかな形を保ちながらシンプルに扱えるようになります。

PythonでPCAを実行してみよう!

実際にコードで PCA を体験してみましょう。 定番の「Iris(アヤメ)データセット」を使います。

# 必要なライブラリをインポート
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import pandas as pd

# 1. データ読み込み
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names

# 2. 標準化(スケールをそろえる)
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 3. PCAの実行(2次元に圧縮)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_std)

# 4. 結果をプロット
plt.figure(figsize=(8,6))
colors = ['red', 'blue', 'green']
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1],
                alpha=.7, color=color, label=target_name)

plt.xlabel("PC1")
plt.ylabel("PC2")
plt.legend()
plt.show()

# 5. 寄与率と負荷量の確認
print("寄与率:", pca.explained_variance_ratio_)
print("累積寄与率:", pca.explained_variance_ratio_.cumsum())

loadings = pd.DataFrame(pca.components_,
                        columns=iris.feature_names,
                        index=['PC1', 'PC2'])
print("\n主成分ごとの負荷量:")
print(loadings)

上記コードを実行すると、次のような2次元プロットが表示されます。3種類のアヤメが、主成分軸で綺麗に分かれており、主成分だけの2次元の情報でも十分にそれぞれの花の特徴を捉えられているということがわかります。

出力結果のテキストを読み解いてみます。PCAの結果には、「寄与率」 と 「負荷量」という2つの重要な指標があります。

寄与率: [0.72962445 0.22850762]
累積寄与率: [0.72962445 0.95813207]

主成分ごとの負荷量:
     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
PC1           0.521066         -0.269347           0.580413          0.564857
PC2           0.377418          0.923296           0.024492          0.066942
  • 寄与率
    それぞれの主成分が、全体の情報をどのくらい表しているかを示します。 たとえば「PC1が70%、PC2が20% ⇒ 2つで全体の90%を説明」というように、上位の主成分でどこまで情報を保てているかがわかります。

  • 負荷量
    各特徴(列変数)が、主成分にどれくらい影響しているかを示します。値が大きいほど、その変数の影響が強いことを意味します。

まとめ

  • PCAは「たくさんの変数を少ない軸にまとめる」手法
  • データの構造を見やすく、扱いやすくできる
  • Pythonなら StandardScalerPCA の2ステップで簡単に実行できる
  • 「どんな情報が失われるか」に注意しながら活用するのがポイント
ポイント 説明
スケーリング 変数ごとの単位が違うときは必ず標準化する
欠損値 欠損があるとPCAは動かないので補完または除外
主成分数 累積寄与率80〜90%あたりを目安に選ぶ
解釈 主成分は「抽象的な方向」なので過度に意味づけしない

Pythonを学習したい方へ

Pythonを体系的に学び、プロの指導のもとで実践的なAIスキルを習得したい方、
キャリアの幅を広げたい方や複業を目指す方は、ぜひこちらからお問い合わせください。
https://b2c.aipass.tech
https://lin.ee/pbd6SZJ

Zenn以外の情報発信媒体はこちら👇
dotConf, Inc

Discussion