前回の記事で、アヤメの品種データを使ったクラスタリングの例を紹介した。
今回はクラスタリングしたデータを可視化する方法について、サンプルコードを交えながら紹介する。
標準化したデータをクラスタリングする
クラスタリングついては前回の記事で詳しく取り上げたので、ここでは割愛する。
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
# データセットの読み込み
data_set = load_iris()
df = pd.DataFrame(data_set.data, columns=data_set.feature_names)
# 標準化
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
clustering_sc = sc.fit_transform(df)
# クラスタリング
kmeans = KMeans(n_clusters=3, random_state=0)
clusters = kmeans.fit(clustering_sc)
df['cluster'] = clusters.labels_
df.head()
前回紹介したコードと違うのは、クラスタリングを行うデータを標準化しているところだ。
アヤメのデータは4つの変数から構成されており、「sepal length」と「petal width」では平均値が大きく異なる。
このように単位が大きく異なるデータは、標準化(平均0・分散1のデータに変換)をするべきである。
主成分分析を用いて2次元データに変換する
先述のとおり、今のままでは4次元データになっているので、2軸のグラフに可視化するためには「次元削除」を行わなければならない。
今回は次元削除の代表的手法である「主成分分析」を用いて、2次元データに変換する。
# 次元削除
from sklearn.decomposition import PCA
x = clustering_sc
pca = PCA(n_components=2)
pca.fit(x)
x_pca = pca.transform(x)
pca_df = pd.DataFrame(x_pca)
pca_df['cluster'] = df['cluster']
pca_df.head()
主成分分析は、多変数データをより少ない指標や、変数同士を組み合わせた合成変数に要約する分析手法だ。
出力されたデータを見ると、4つの変数が二つの合成変数に要約されたことがわかる。
これで2次元データとなったので、グラフにプロットすることができるようになった。
データの可視化
あとはmatplotlibを使って散布図に描画するだけだ。
import matplotlib.pyplot as plt
%matplotlib inline
for i in df['cluster'].unique():
tmp = pca_df.loc[pca_df['cluster'] == i]
plt.scatter(tmp[0], tmp[1])
for文を使ってクラスター毎にデータをプロットし、アヤメのデータを3種に分類することができた。