Iris データセットの主成分分析プロット(Python, matplotlib, seaborn を使用)
Iris データセットの主成分分析を行い,第1主成分スコアと第2主成分スコアをプロットする.
主成分分析により次元削減ができる.
ある花の属性は、「5.1 3.5 1.4 0.2」という4つの数値属性を持ち、 別の花の属性は、「4.9 3.0 1.4 0.2」という4つの数値属性を持つとする。
数値属性の個数のことを「次元」と言ったりする。
上で書いた花は、どちらも4次元である。
次元が大きすぎると、解析がうまく行かなかったり、人工知能の学習がうまくいかないという可能性がある。 元のデータで、互いの類似性を保ったままで、より少ない個数の数値属性を作ることを 次元削減という。
【目次】
Google Colaboratory のページ:
次のリンクをクリックすると,Google Colaboratory のノートブックが開く. そして,Google アカウントでログインすると,Google Colaboratory のノートブック内のコード等を編集したり再実行したりができる.編集した場合でも,他の人に影響が出たりということはない.そして,編集後のものを,各自の Google ドライブ内に保存することもできる.
https://colab.research.google.com/drive/1nWjnjxgPrldV75OCUcp3RFEV_baeCs4D?usp=sharing
1. 前準備
Python の準備(Windows,Ubuntu 上)
- Windows での Python 3.10,関連パッケージ,Python 開発環境のインストール(winget を使用しないインストール): 別ページ »で説明
- Ubuntu では,システム Pythonを使うことができる.Python3 開発用ファイル,pip, setuptools のインストール: 別ページ »で説明
【サイト内の関連ページ】
- Python のまとめ: 別ページ »にまとめ
- Google Colaboratory の使い方など: 別ページ »で説明
【関連する外部ページ】 Python の公式ページ: https://www.python.org/
Python の numpy,pandas,matplotlib,seaborn,scikit-learn のインストール
- Windows の場合
Windows では,コマンドプロンプトを管理者として実行し, 次のコマンドを実行する.
python -m pip install -U numpy pandas matplotlib seaborn scikit-learn scikit-learn-intelex
- Ubuntu の場合
端末で,次のコマンドを実行
sudo apt -y update sudo apt -y install python3-numpy python3-pandas python3-seaborn python3-matplotlib python3-sklearn
2. Iris データセットの準備
- Iris データセットの読み込み
import pandas as pd import seaborn as sns sns.set() iris = sns.load_dataset('iris')
- データの確認
print(iris.head())
- 形と次元を確認
配列(アレイ)の形: サイズは 150 ×5.次元数は 2. 最後の列は,iris.target は花の種類のデータである
print(iris.shape) print(iris.ndim)
- Iris データセットの0, 1, 2, 3列目を表示
print( iris.iloc[:,0:4] )
3. Iris データセットの主成分分析プロット
- 主成分分析プロットの前準備
import numpy as np import sklearn.decomposition %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings # 主成分分析 def prin(A, n): pca = sklearn.decomposition.PCA(n_components=n) return pca.fit_transform(A) # 主成分分析で2つの成分を得る def prin2(A): return prin(A, 2) # M の最初の2列を,b で色を付けてプロット.b はラベル def scatter_label_plot(M, b, alpha): a12 = pd.DataFrame( M[:,0:2], columns=['a1', 'a2'] ) f = pd.factorize(b) a12['target'] = f[0] g = sns.scatterplot(x='a1', y='a2', hue='target', data=a12, palette=sns.color_palette("hls", np.max(f[0]) + 1), legend="full", alpha=alpha) # lenend を書き換え labels=f[1] for i, label in enumerate(labels): g.legend_.get_texts()[i].set_text(label) plt.show() # 主成分分析プロット def pcaplot(A, b, alpha): scatter_label_plot(prin2(A), b, alpha)
- 主成分分析プロット
Iris データセットの0, 1, 2, 3列目については, 主成分分析により,サイズ 150 × 4 を,150 × 2 に変換.
X = iris.iloc[:,0:4].to_numpy() y = iris.iloc[:,4] pcaplot(X, y, 0.4)