あやめ(iris)

Fisher の有名な「あやめ」のデータをプロットしてみます。まず,データをロードします:

from sklearn.datasets import load_iris

iris = load_iris()

ざっとプロットしてみます:

import matplotlib.pyplot as plt

plt.scatter(iris.data[:,0], iris.data[:,1], c=iris.target)

もっと丁寧に:

plt.clf()  # クリア
markers = ['o', '^', 'v']
for i in range(3):
    d = iris.data[iris.target == i, :]
    plt.plot(d[:,0], d[:,1], 'o', fillstyle='none', marker=markers[i])
plt.xlabel('sepal length (cm)')
plt.ylabel('sepal width (cm)')
plt.legend(iris.target_names)

印刷用には 'o''ko' にすれば黒になります。

主成分分析(PCA)で2次元にしてからプロットしてみます:

from sklearn.decomposition import PCA

x = PCA(n_components=2).fit_transform(iris.data)

plt.clf()
for i in range(3):
    d = x[iris.target == i, :]
    plt.plot(d[:,0], d[:,1], 'o', fillstyle='none', marker=markers[i])
plt.xlabel('1st')
plt.ylabel('2nd')
plt.legend(iris.target_names)
あやめ

次のようにすれば主成分ごとの分散の割合がわかります:

pca = PCA(n_components=2)
x = pca.fit_transform(iris.data)
pca.explained_variance_ratio_

出力は array([0.92461872, 0.05306648]) のようになります。第1主成分92%,第2主成分5%ほどの寄与があります。

PCAする前に変数ごとに標準化するか,あるいはここの「Scaling vs Whitening」にあるように PCA(n_components=2, whiten=True) するといいかもしれません。標準化は次のようにします:

from sklearn import preprocessing
t = preprocessing.scale(iris.data)
x = PCA(n_components=2).fit_transform(t)

3次元ならどうなるでしょうか:

x = PCA(n_components=3).fit_transform(iris.data)

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(8,6))
ax = Axes3D(fig, elev=-150, azim=110)
ax.scatter(x[:,0], x[:,1], x[:,2], c=iris.target)
ax.set_xlabel("1st")
ax.set_ylabel("2nd")
ax.set_zlabel("3rd")

マウスでぐりぐりできます。


細かな操作のためには pandas のデータフレームに変換するほうが扱いやすいかもしれません:

import pandas as pd

df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['species'] = iris.target  # または df['species'] = iris.target_names[iris.target]
df.shape
df.info()
df.head()
df.describe()
df.isnull().sum()  # 列ごとの欠測値の数を調べる
df.groupby('species').size()
df.corr()

Last modified: