Bamba news

主成分分析(PCA)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】主成分分析(PCA)のPythonによる実装方法を、初心者向けにコード付きで丁寧に解説します。scikit-learnライブラリを使い、データの要約から可視化までをステップバイステップで学べます。機械学習やデータ分析の第一歩に最適です。


1. はじめに

今回は、データ分析の強力な手法である 主成分分析(Principal Component Analysis, PCA) を、Pythonを使って実際に手を動かしながら実装する方法を解説します。

「入門編」や「活用例編」で主成分分析の考え方に触れてきましたが、この「実践編」では、具体的なコードを用いて、その動きを一つひとつ確認していきます。「プログラミングは少し苦手…」という方でも大丈夫なように、難しい部分を極力減らし、丁寧に進めていきますので、ぜひ最後までお付き合いください。

この記事を読み終える頃には、たくさんの情報(多次元データ)を、よりシンプルで理解しやすい形に要約するスキルが身についているはずです。

記事の最後に、環境構築なしでスマホからでも即実行可能なGoogle Colabノートブックをご用意しています。


2. 主成分分析(PCA)とは? 簡単なおさらい

実装に入る前に、主成分分析がどのようなものだったか、簡単におさらいしましょう。

一言でいうと、主成分分析は 「たくさんの情報を、より少ない重要な情報にぎゅっと要約する技術」 です。

例えば、生徒の成績を評価するとき、「国語、数学、理科、社会、英語」という5教科の点数があるとします。この5つの情報を、もっと大局的に捉えるために**「文系能力」「理系能力」**という2つの新しい「ものさし」で評価し直すようなイメージです。

この新しい「ものさし」が 「主成分」 と呼ばれます。 最初のものさし(第1主成分)は、元の情報のばらつき(特徴)を最もよく表すように作られます。次のものさし(第2主成分)は、最初のものさしでは捉えきれなかった情報の中で、次に特徴をよく表すように作られます。

このようにして、元の情報の数を減らし(これを次元削減と呼びます)、データをシンプルにすることで、人間がグラフなどで直感的に理解しやすくなったり、機械学習モデルの計算が速くなったりするメリットがあります。


3. 実装の準備をしよう

それでは、実際にPythonで主成分分析を実装するための準備を始めましょう。今回は、データ分析でよく使われる便利なライブラリ群を利用します。

使用するライブラリ

  • scikit-learn: 機械学習のための総合ライブラリ。主成分分析(PCA)の機能もここに含まれています。
  • pandas: データを表形式で扱うためのライブラリ。データの読み込みや整理に非常に便利です。
  • NumPy: 数値計算、特に配列や行列の計算を高速に行うためのライブラリ。scikit-learnの土台にもなっています。
  • Matplotlib: データをグラフとして可視化するためのライブラリ。分析結果を視覚的に理解するのに役立ちます。

お使いのパソコンにこれらのライブラリが入っていない場合は、以下のコマンドでインストールできます。(Google Colabを利用する場合は、既にインストールされているため不要です。)

pip install scikit-learn pandas numpy matplotlib

4. 実際に使うデータを見てみよう(アヤメデータセット)

今回は、練習用のデータとして有名な 「アヤメ(iris)データセット」 を使用します。これは、3種類のアヤメ(setosa, versicolor, virginica)について、それぞれ以下の4つの特徴量を測定したデータです。

  • がくの長さ (sepal length)
  • がくの幅 (sepal width)
  • 花びらの長さ (petal length)
  • 花びらの幅 (petal width)

この4つの情報(4次元のデータ)を使って、主成分分析で「2つの総合的な特徴(2次元のデータ)」に要約し、グラフで可視化することを目指します。

まずは、pandasを使ってデータを読み込み、どのようなデータなのかを確認してみましょう。

import pandas as pd
from sklearn.datasets import load_iris

# アヤメデータセットを読み込む
iris = load_iris()

# データをpandasのDataFrame形式に変換する
# 特徴量データ(4つの測定値)
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
# 目的変数データ(アヤメの種類)
df['target'] = iris.target

# データの最初の5行を表示して確認
print(df.head())

実行結果のイメージ:

   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  target
0                5.1               3.5                1.4               0.2       0
1                4.9               3.0                1.4               0.2       0
2                4.7               3.2                1.3               0.2       0
3                4.6               3.1                1.5               0.2       0
4                5.0               3.6                1.4               0.2       0

target0setosa1versicolor2virginicaを指しています。この4つの特徴量データを使って分析を進めます。


5. Pythonで主成分分析を実装する手順

準備が整いました。ここからは、以下の4つのステップで主成分分析を実装していきます。

  1. データの「ものさし」を揃える(標準化)
  2. 主成分分析を実行する
  3. 新しい「ものさし」の性能を確認する(寄与率)
  4. 結果をグラフで見てみよう(可視化)

5.1. データの「ものさし」を揃える(標準化)

主成分分析を行う前に、非常に重要な下準備があります。それが**「標準化(Standardization)」**です。

なぜこれが必要なのでしょうか? 今回のデータは全て「cm」という単位ですが、もし「がくの長さ(cm)」と「花びらの重さ(g)」のように単位や数値のスケールが全く違うデータがあった場合、単純に計算すると、数値が大きい方の特徴量の影響が不当に大きくなってしまいます。

そこで、すべての特徴量が同等の影響力を持つように、データの「ものさし」を揃えてあげる必要があります。標準化は、各特徴量の平均を0、ばらつき(標準偏差)を1に変換する処理で、これによりスケールの違いを気にせず分析できるようになります。

scikit-learnStandardScalerを使うと、この処理は簡単に行えます。

from sklearn.preprocessing import StandardScaler

# 分析に使う特徴量(4つの測定値)を抽出
features = ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
x = df.loc[:, features].values

# データを標準化する
x_scaled = StandardScaler().fit_transform(x)

# 標準化後のデータ(最初の5行)を確認
print(x_scaled[:5])

実行すると、平均0、標準偏差1に変換された数値の配列が表示されます。これで、すべての特徴量を公平に扱えるようになりました。

5.2. 主成分分析を実行する

いよいよ主成分分析の実行です。scikit-learnPCAクラスを使います。 今回は4つの特徴量を2つの主成分に要約したいので、n_components=2と指定します。これは「新しいものさしを2本だけ作ってください」というお願いに相当します。

from sklearn.decomposition import PCA

# 主成分分析を実行
# n_components=2 として、2つの主成分を生成する
pca = PCA(n_components=2)

# 標準化したデータを使って、主成分分析を適用
principalComponents = pca.fit_transform(x_scaled)

# 変換後のデータ(主成分)をDataFrameに格納
principal_df = pd.DataFrame(data=principalComponents, columns=['principal component 1', 'principal component 2'])

# アヤメの種類(target)も結合しておく
final_df = pd.concat([principal_df, df[['target']]], axis=1)

# 変換後のデータの最初の5行を表示
print(final_df.head())

実行結果のイメージ:

   principal component 1  principal component 2  target
0              -2.264703               0.480027       0
1              -2.080961              -0.674134       0
2              -2.364229              -0.341908       0
3              -2.299384              -0.597395       0
4              -2.389842               0.646835       0

元々は4つあった特徴量が、principal component 1principal component 2という2つの新しい特徴量(主成分)に変換されたことがわかります。

5.3. 新しい「ものさし」の性能を確認する(寄与率)

さて、2つの主成分に情報を要約できましたが、この2つで元の情報のどれくらいを説明できているのでしょうか?それを確認するための指標が 「寄与率(explained variance ratio)」 です。

  • 寄与率: それぞれの主成分が、元の情報全体のばらつきのうち、何%を説明できているかを示す割合。
  • 累積寄与率: 主成分を足し合わせたときに、合計で何%の情報を説明できているかを示す割合。

これを確認することで、「第1主成分だけで70%説明できている」「第1と第2を合わせると95%説明できている」といった評価ができます。95%も説明できているなら、元の4つの情報の代わりにこの2つの情報を使っても、ほとんど大事な部分は失われていない、と判断できます。

# 各主成分の寄与率を表示
print('各主成分の寄与率:', pca.explained_variance_ratio_)

# 累積寄与率を表示
import numpy as np
print('累積寄与率:', np.cumsum(pca.explained_variance_ratio_))

実行結果のイメージ:

各主成分の寄与率: [0.72962445 0.22850762]
累積寄与率: [0.72962445 0.95813207]

この結果から、

  • 第1主成分だけで、元の情報の約73%を説明できている。
  • 第2主成分は、残りの情報のうち約23%を説明できている。
  • そして、第1と第2主成分を合わせると、元の情報の約96%を説明できていることがわかります。

これは素晴らしい結果です。4つの情報をたった2つに減らしたにもかかわらず、情報の96%を保持できていることになります。

5.4. 結果をグラフで見てみよう(可視化)

最後に、この結果をグラフにして見てみましょう。 4次元のデータはグラフに描けませんが、2次元に要約したデータなら、x軸を「第1主成分」、y軸を「第2主成分」とした散布図としてプロットできます。

アヤメの種類ごとに色を変えてプロットすることで、主成分分析によってデータがどのように分離されたかを確認できます。

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(1, 1, 1)
ax.set_xlabel('Principal Component 1', fontsize=15)
ax.set_ylabel('Principal Component 2', fontsize=15)
ax.set_title('2 component PCA', fontsize=20)

targets = [0, 1, 2]
colors = ['r', 'g', 'b']
target_names = iris.target_names

for target, color in zip(targets, colors):
    indicesToKeep = final_df['target'] == target
    ax.scatter(final_df.loc[indicesToKeep, 'principal component 1'],
               final_df.loc[indicesToKeep, 'principal component 2'],
               c=color,
               s=50)
ax.legend(target_names)
ax.grid()
plt.show()

このコードを実行すると、美しい散布図が表示されます。 赤(setosa)、緑(versicolor)、青(virginica)の点が、2次元の平面上でそれぞれ固まっていることが確認できるはずです。特にsetosaは他の2種類から明確に分離されており、versicolorvirginicaもある程度分かれています。

これは、主成分分析によって、4つの特徴量に隠れていた「アヤメの種類を分けるための重要な情報」が、2つの主成分としてうまく抽出されたことを示しています。


まとめ

今回は、主成分分析(PCA)をPythonのscikit-learnライブラリを使って実装する方法を、ステップバイステップで解説しました。

複雑に見える多次元のデータも、主成分分析を用いることで、その本質的な情報を失うことなく、より次元の低い、人間が理解しやすい形に変換できることがお分かりいただけたかと思います。

特に、

  • データの標準化が、公正な分析のための重要な前処理であること。
  • PCAクラスを使えば、数行のコードで主成分の抽出が可能であること。
  • 寄与率を確認することで、どれだけ情報を要約できたかを定量的に評価できること。
  • 2次元に要約することで、データを可視化し、直感的な洞察を得られること。

これらのポイントは、データ分析や機械学習の世界で非常に役立つ基本的なスキルです。今回の実践を通して、データと向き合うための一つの強力な武器を手に入れることができたはずです。ぜひ、他のデータセットでも試してみてください。

図解即戦力 データ分析の基本と進め方がこれ1冊でしっかりわかる教科書

本書は、データ分析の初学者であるビジネスパーソンを主な読者層として、「データ分析とは何か」「ビジネスにデータ分析をどう活用できるか」という基本的な疑問から始まり、実際のプロジェクト遂行、そして分析結果の評価まで、段階的に学べるよう構成されています。

▶ Amazonで見る

環境構築なし
実行できるファイルはこちら!

このボタンからGoogle Colabを開き、すぐにコードをお試しいただけます。

お仕事のご依頼・ご相談はこちら

フロントエンドからバックエンドまで、アプリケーション開発のご相談を承っております。
まずはお気軽にご連絡ください。

関連する記事

KAN (Kolmogorov-Arnold Networks)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】AIの新しい波、KAN(Kolmogorov-Arnold Networks)の実装方法を、具体的なPythonコード付きで一から丁寧に解説。本記事では、KANの理論的な背景から、実際の回帰問題への適用、モデルの解釈、そしてチューニングまでを網羅。機械学習の新しいアーキテクチャを実践的に学びたい方に最適です。

畳み込みニューラルネットワーク(CNN)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】畳み込みニューラルネットワーク(CNN)の実装方法を初心者にも分かりやすく解説。Pythonコード付きで、画像認識の仕組みを実践的に学べます。AI、ディープラーニング、画像分類に興味がある方必見です。

ガウス過程回帰を実装してみよう!わかりやすく解説

【スマホからでも実行可能】Pythonでガウス過程回帰を実装する方法を初心者向けにわかりやすく解説します。機械学習のモデル構築や不確実性の可視化に興味がある方必見です。

ベイズ最適化を実装してみよう!わかりやすく解説

【スマホからでも実行可能】ベイズ最適化の実装方法をPythonコード付きで徹底解説。機械学習のハイパーパラメータチューニングを効率化したい方必見。サンプルコードを動かしながら、実践的に学べます。

エクストラツリー(ExtraTrees)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】この記事では、機械学習のアルゴリズムであるエクストラツリー(ExtraTrees)について、その仕組みからPythonによる実装方法までを丁寧に解説します。ランダムフォレストとの違いも理解しながら、実践的なスキルを身につけましょう。

Bamba news