前回の記事で、アヤメの品種データを使ったクラスタリングの例を紹介した。

今回はクラスタリングしたデータを可視化する方法について、サンプルコードを交えながら紹介する。

標準化したデータをクラスタリングする

クラスタリングついては前回の記事で詳しく取り上げたので、ここでは割愛する。

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種に分類することができた。