教師なしのクラスタリング手法ってどうやって実装すればいいんだろう?
今回はビジネスシーンで必要になることが多い、教師なしのクラスタリングモデルのk-meansについて説明していきます!
ビジネスでの活用性としては以下の通りです。
ビジネスでの活用性
- 大量の顧客情報を分析するための、セグメント(クラスタ)作成に活用
- クラスタリングすることで自社の顧客にどんな属性の人がいるのか分類(STP)
- 顧客をニーズやサービス利用状況でクラスタリングし、事業戦略ターゲティングを実施(事業戦略)
- マーケティング施策の対象選定に活用(施策実行)
今日はしっかりとクラスタリングモデルのアルゴリズムを理解し、実装する力を身につけましょう!
この記事を書いた人
k-meansとは
k-meansクラスタリングは、教師なし学習アルゴリズムの1つです。
ラベルのないデータ点を、あらかじめ自分で決めた数のクラスタ(グループ)に割り当てる機能をもちます。
k-meansは互いに類似した点をグループ化することによって、データにクラスタラベルを割り当てることによってクラスタリングを実行します。
具体的な動作は以下の通りです。
k-meansの動作
- 何個にクラスタリングしたいか、クラスタ数を決める
- データセットからあらかじめ決めたクラスタ数だけ、ランダムにセントロイドと呼ばれる点を選ぶ
- セントロイドの近接度に基づきデータ点をクラスタに割り当てる
- 割り当てた各クラスタないで距離に基づいた重心を算出し、セントロイドの位置を重心点に更新する
- 3と4を決められた回数 or 重心の更新が進まなくなるまで続ける
文字で読むだけでは解釈が難しいと思いますので、次にこの動作を図にして解説していきます!
k-meansのアルゴリズム(図解)
それでは、図解で説明していきます。
今2次元のデータとして、下図のデータセットが初期状態で与えられていたとします。(STEP0)
今回は5つのクラスタにデータを分類したいと考え、ランダムに5つのセントロイド(★)を生成します。(STEP1)
次に各セントロイドとの距離が近いデータ点を同じクラスタ(同色)に割り当てます。全てのデータ点に対してクラスタを割り当てます。(STEP2)
その後、同じクラスタと判定された点の重心を計算し、セントロイドを新しい重心に移動します。(STEP3)
新しい各セントロイドとの距離が近いデータ点を同じクラスタ(同色)に再度割り当てます。(STEP4)
あとは、STEP4とSTEP5を繰り返し、決められた回数分の操作を繰り返す、またはセントロイド(重心)の更新が止まったらクラスタリングが完了します!
k-meansの弱点
図解で理解すると、非常に合理的で解釈のしやすいアルゴリズムに思えますが、k-meansには1つだけ弱点があります。
初回にランダムに生成されたセントロイドの場所によっては極度に偏ったクラスタリングができたり、なかなか収束しない事態に陥ってしまう点です。
そこで、初期のセントロイドの選び方に改良を加えたk-means++法が生み出されました。
現在の教師なしクラスタリングのメインはk-means++です。
k-means++法
k-means++は、従来のk-meansの初回セントロイド選定方法に改良を加えた手法です。
具体的には、
k-means++の改良点
初期のセントロイドが集中しないように、必ずランダムかつ離れた距離で選択されるように改良した!
※初期のクラスタ中心をなるべく遠目におくという発想があります。
まず始めにデータ点をランダムに選び1つ目のクラスタ中心とし、全てのデータ点とその最近傍のクラスタ中心の距離を求めその距離の二乗に比例した確率でクラスタ中心として選ばれていないデータ点をクラスタ中心としてランダムに選んでいきます
k-means++を実装(シナリオとデータ)
それでは、k-means++の実装プログラムを見ていきましょう!
今回の学習シナリオは、下記の通りです。
シナリオ
アヤメのがく片と花びらの長さと幅から3つのクラスタに分類するモデルを作成してください。
シナリオで利用するデータは、こちらからダウンロードできます。
データの構成
データセットには品種が含まれていますが、k-meansは教師なし学習のため本来は不要な情報です。
モデルの精度確認のために今回は利用します。
k-means++を実装(コードの紹介)
今回のk-means++によるクラスタリングは、こちらのコードで実装が可能です。
import pandas as pd
from sklearn.cluster import KMeans
#データの読込み
df = pd.read_csv('アヤメの品種分類.csv',encoding='shift-jis')
df = df.iloc[:,0:4]
#k-means++のモデル構築
kmeans = KMeans(n_clusters=3, init='k-means++',random_state=0)
#「init = 'k-means'」を削除すると、通常のk-meansで実行されます。
#k-means++のモデル実行(クラスタリング)
clusters = kmeans.fit(df)
df['cluster'] = clusters.labels_
#結果をcsvファイルに出力
df.to_csv("kmeans++.csv", index=False )
出力結果
説明変数(A~D列)を用いて、0,1,2のクラスタ分類ができていることが分かります!
※ちなみに90%の精度で実際のアヤメの3品種と同じクラスタリングができています。
(教師なし学習なので本来は精度は存在しない)
今回はアヤメを各特徴量に応じて、3つにクラスタリングをしました。
ビジネスで利用する場合は、同じ手法でクラスタリングを行った後に必ず各クラスタごとの統計量(平均値、中央値、標準偏差など)を確認し、各クラスタに名称をつけてあげましょう。
そうすることで、マーケティング的に意味のある集合に分類でき、各集合に合った戦略を適用することができるようになります!
クラスタ数はどうやって決めるのがいい?(発展編)
ここまで学習する中で、最初に決定するクラスタ数をどうやって決めるのが最適か疑問に思うと思います。
統計量から意味の違うクラスタの分だけ自動生成したいと考えている場合は、Elbow法を適用することがオススメです。
Elbow法
Elbow法とは様々なクラスタ数でクラスタリングを行い、それぞれモデルの 歪み(distortion) を計算し最適なクラスタ数を見つける手法です。
その名の通り、出力されるグラフの形の肘のあたりが最適なクラスタ数を表すことから命名されています。
k-meansでは SSE(クラスタ内誤差平方和)を歪みとして用います。
Elbow法は、以下のコードで実装ができます。
import pandas as pd
from sklearn.cluster import KMeans
#データの読込み
df = pd.read_csv('アヤメの品種分類.csv',encoding='shift-jis')
df = df.iloc[:,0:4]
#k-means++のモデル構築
kmeans = KMeans(n_clusters=3, init='k-means++',random_state=0)
#「init = 'k-means'」を削除すると、通常のk-meansで実行されます。
#k-means++のモデル実行(クラスタリング)
clusters = kmeans.fit(df)
df['cluster'] = clusters.labels_
#結果をcsvファイルに出力
df.to_csv("kmeans++.csv", index=False )
#Elbow法の実装(モジュール追加)
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#クラスタリングに用いるデータの再読込み
df = df.iloc[:,0:4]
#SSEの算出
SSE=[]
for i in range(1,11):
model = KMeans(n_clusters=i,
init='k-means++',
random_state=0)
model.fit(df)
SSE.append(model.inertia_)
#Elbow法のグラフ描画
plt.plot(range(1,11), SSE, marker='o')
plt.xticks(np.arange(1,11,1))
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()
上記のSSEのグラフを見るとちょうど3で肘のあたりになっていることが分かります。
よって、今回のデータの場合は3つのクラスタで分けることが最も統計量的にきれいにクラスタ分類ができるという意味を表します!
まとめ
今回は「k-meansによるクラスタリングモデルの作成方法」について解説しました。
k-meansは解釈のしやすさと手軽さから実際のビジネスでの活用性が高いモデルです。
今回は教師なしのクラスタリングモデルを紹介しましたが、教師ありの分類モデルに興味がある方はこちらの記事もご覧下さい。
-
コピペで動くXGBoost |Pythonで最強分類モデルの実装
Pythonで分類モデル作りたいけど、結局何を使うのがいいの? 高度なモデルって高スペックなPCじゃないと動かない? 今回はビジネスシーンで必要になることが多い、分類モデルについて説明していきます! ...
データサイエンティストとして、キャリア形成を考えている人は以下の記事も参考になります。
-
【完全版】Python習得のロードマップ|初心者プログラミング知識0から年収800万円へ
年収上げたいけど、プログラマって稼げるの? プログラマって知識0からでもなれるの? という質問をもらいますが、「Python」と「データ分析」を武器にすれば6ヶ月で年収800万円以上を狙うことは十分可 ...
それでは、また次の記事でお会いしましょう。
最近のコメント