あやめ(iris)

データの取得と簡単なプロット

Fisher の有名な「あやめ」(iris、アイリス)のデータをプロットしてみます。データは Seaborn にも入っていますが、ここでは後で scikit-learn を使うので、そちらからロードします:

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)

もっと丁寧に:

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)

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)

fig, ax = plt.subplots(figsize=(10,10), subplot_kw=dict(projection="3d"))
ax.scatter(x[:,0], x[:,1], x[:,2], c=iris.target)
ax.set_xlabel("1st")
ax.set_ylabel("2nd")
ax.set_zlabel("3rd")

対話型の環境なら、マウスでぐりぐりできます。

決定木

from sklearn.tree import DecisionTreeClassifier, export_graphviz

model = DecisionTreeClassifier(max_depth=3)
model.fit(iris.data, iris.target)
export_graphviz(model, "tree.dot",
                feature_names=iris.feature_names,
                class_names=iris.target_names)

これで tree.dot というテキストファイルができます。これを画像に変換するには Graphviz を使います。Mac へのインストールは brew install graphviz でできます。Graphviz の dot コマンドを使っていろいろな画像に変換できます:

dot -Tpng tree.dot -o tree.png
dot -Tpdf tree.dot -o tree.pdf
dot -Tsvg tree.dot -o tree.svg
あやめの分類木

pandas のデータフレームに変換する方法

Seaborn の iris データはデータフレームの形になっていますが、scikit-learn のものをデータフレームにするには次のようにする必要があります:

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()