PHONE APPLI Engineer blog

エンジニアブログ

非階層型クラスター分析を用いて、irisデータの分類をしてみた

こんにちは。株式会社 PHONE APPLI リサーチデベロップメント 森本と申します。

この記事では統計分析初学者の方に向けて、自分が勉強した分析手法を紹介していきます。 今回は非階層型クラスター分析を用いて、iris の特徴量からデータを分類します。

はじめに


まず分析に用いるデータや手法の説明から始めていきます。

・iris データ

iris データはアヤメという花の種類と特徴に関するデータで、
詳細な内容については以下の通りです。

種類: setosa , versicolor , virginica の3種類
特徴量:
・Sepal Lengt: がく片の長さ
・Sepal Width: がく片の幅
・Petal length: 花びらの長さ
・Petal Width: 花びらの幅

図1. iris データセット

・非階層型クラスター分析

非階層型クラスター分析は 代表点からの距離を測り、データをまとめて、クラスターにしていく手法です。
様々な手法がありますが、今回は k-means 法についての説明を記述します。

1. 代表点の個数を決定する

データを幾つに分けたいかを主観的に決定します。
その後決めた個数、ランダムなサンプルを代表点とします。

図2. 散布図 (代表点 3)

2. クラスタを作る

代表点からユークリッド距離が近いもので、クラスタを作ります。

図3. クラスタ作成

2次元平面のユークリッド距離については以下の式となります。

3. クラスタの重心を新たな代表点とする
  1. で分けたそれぞれのクラスタで重心点を求め、新たな代表点とします。

図4. クラスタの重心からとった新たな代表点

重心の座標については以下です。

4. 終了するまで繰り返す

任意な数、2. , 3. を繰り返しクラスタリングを終了する。

実装


ここからは実際に Python で実装した結果を記載していきます。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans  

ライブラリをインポート

iris = load_iris()
iris_np = np.array(iris.data)
iris データを展開し、配列として iris_np に格納

rgb = np.array(['r','g','b'])
plt.scatter(iris_np[:,0], iris_np[:,1], c= rgb[iris.target])
がく片の長さ, 幅で散布図をプロット


図5. 散布図 ( sepal )

plt.scatter(iris_np[:,2], iris_np[:,3], c= rgb[iris.target])
花びらの長さ, 幅で散布図をプロット


図6. 散布図 ( petal )

n_cluster = 3
max_iter = 300
クラスタ数と実行回数を定義

data = iris_np[:,0:2]
model = KMeans(n_clusters=n_cluster, max_iter=max_iter).fit(data)
plt.scatter(data[:,0], data[:,1], color = rgb[model.labels])
plt.scatter(model.cluster_centers[:,0], model.cluster_centers_[:,1],s=100, marker='*')
plt.show()
がく片の長さ, 幅でクラスタリング


図7. クラスタリング結果 ( sepal )

data = iris_np[:,2:4]
model = KMeans(n_clusters=n_cluster, max_iter=max_iter).fit(data)
plt.scatter(data[:,0], data[:,1], c=rgb[model.labels])
plt.scatter(model.cluster_centers[:,0], model.cluster_centers_[:,1],s=100, marker='*')
plt.show()
花びらの長さ, 幅でクラスタリング


図8. クラスタリング結果 ( petal )

クラスタリングの結果は前述のようになり、精度としては以下の通りでした。


図9. sepal 分類結果 (上: 分類後の配列, 下: 正解データ)

図10. petal 分類結果

クラスタリングの結果としては、 sepal では82% , petal は96% で分類することができましたが、
分類の精度向上や最適な実行回数などまだ考える余地はありそうです。

余談


今回の結果では、"がく" を用いるよりも "花びら" を用いたほうが精度が高く分類できました。
花は繁殖のために昆虫の興味をより惹きつけなければならないので、
花びらが目立つように進化しているためだと考えました。

実際に調べてみたところ、花びらには虫がとまれるように垂れ下がっていたり、
蜜の場所を知らせる "蜜標" という模様あり、非常に綺麗な花でした。

参考までに、自分が本記事をまとめるにあたって非常に有用だった URL を記載させていただきます。
https://www.albert2005.co.jp/knowledge/data_mining/cluster/non-hierarchical_clustering https://qiita.com/g-k/items/0d5d22a12a4507ecbf11

さいごに


今回は iris データセットを用いて非階層型クラスター分析を実装してみました。
この手法は同じクラスタリングの手法である階層型クラスター分析に比べて、
大量のデータを扱うのに長けており、散布図を用いて描画できるため視覚的にわかりやすい結果を得られます。

非階層型クラスター分析の中でも k-means 法の他に X-means や k-means++ などの手法が存在し、
これは初期値依存やクラスタをいくつに分割するのかという問題に対して有用な手法です。

また階層型クラスター分析についても他の記事で解説しておりますので、
ご興味ございましたら是非ご一読ください。
https://phoneappli.hatenablog.com/entry/2022/05/20/181128

まだまだ奥が深いクラスタリングですが、
様々な応用や見せ方ができると思いますので、ぜひ触ってみてはいかがでしょうか。

本記事がアヤメの模様のように、少しでも統計学習についての標となれば幸いです。


PHONE APPLIについて

phoneappli.net
phoneappli.net