クラスター分析とは
データのグループ化を含む機械学習技術になる。クラスターとは「集団」「群れ」を意味する英語で、その名の通り、データ全体をいくつかの集団(グループ)に分類する分析手法である。分類にあたっては、サンプル同士がお互いに「似ているか」または「似ていないか」を基準に分ける事ができる。この類似度・非類似度をもとにしたグループ分けの考え方の違いによって、多数のバリエーションが存在する。以下はクラスター分析の代表的な手法の「階層的手法」と「非階層的手法」について説明する。
クラスター分析は多様な産業に使われる手法で、例えば下記のような使い方がある。
One to Oneマーケティング
クラスター毎に求められる情報やアクションを予測し、ポジショニング確認を目的としたブランドの分類や、クラスターに応じておすすめ情報や配信キャンペーンに変化を付けるなど、最適なアプローチ戦略に役立することに用いられる。
小売
小売でも商圏分析・価格弾力性分析・顧客分析・売り上げ予測といった様々な分析方法がある。その中でも顧客分析で、顧客を分類する事によってキャンペーン施策に繋げて、売り上げ増加を行う分析方法のときにクラスター分析が活躍する。
例えば顧客の来店分析を以下のようにする事でクラスター分析を用いる。
以下のグラフは、ある店の会員カードの使用回数である。
来店キャンペーン等で、初回は割引クーポン配布しており、利用で増えるがその後中々利用してもらえないのがネックであった。平均利用回数は、約4.2回のため5回利用の壁を突破するために5回利用した人に何か更にクーポンを渡そうか考えた。しかしよく上のグラフを見て欲しい。初回のキャンペーンで作ってそのままの人が多く、またヘビーユーザー層もおり、微妙に中間で使う人達がいるといった状態になっている。こういった層を上手くクラスタリングしてくれるのがクラスター分析である。例えば以下になる。
このクラスター別に、最適な販促を行っていく事が売り上げに繋がった。平均回数は分かりやすいが、個別事情といったものまで分析に取り入れられないのでデータ分布を確認し、分析をする事で最適なキャンペーン施策を立案する事が可能になった。
2種類のクラスター分析
階層的手法
全てのデータ間の類似度(または非類似度)を計算した後、ある基準で似たもの同士を併合していく方法です。デンドログラム型(図1)の出力になるのが特徴になります。デンドログラムの縦軸は距離となっており、グループが結合した距離のところで線分が結合するようになっています。
図1:デンドログラム型
非階層的手法
全体をあらかじめ決めておいたクラスター数に分割していく方法です。サンプル数が大きいビッグデータを分析するときに適しています。ただし、あらかじめいくつのクラスターに分けるかは、分析者が決める必要があり、最適クラスター数を自動的には計算する方法は確立されていません。代表的な手法としてk平均法(K-Means法)/Two-step法があります。情報量を用いて、最適なクラスター数に調整する事もできます。
図2:クラスター分析(非階層的手法)
Pythonでクラスター分析は、以下のように行う。
<pre><code><? $str = <<<‘EOD’
import pandas as pd
from sklearn import datasets
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
result = KMeans(n_clusters=3).fit_predict(df[[‘sepal length (cm)’,’sepal width (cm)’, ‘petal length (cm)’,’petal width (cm)’]])
</code></pre>
また数理的に最適だと思われる最適な数は以下のようにElbow plotを用いる事ができる。
<pre><code>
distorsions = []
for k in range(2, 6):
kmeans = KMeans(n_clusters=k)
kmeans.fit(df[[‘sepal length (cm)’,’sepal width (cm)’, ‘petal length (cm)’,’petal width (cm)’]])
distorsions.append(kmeans.inertia_)
fig = plt.figure(figsize=(15, 5))
plt.plot(range(2, 6), distorsions)
plt.grid(True)
plt.title(‘Elbow curve’)
</code></pre>
出てきた図
大きくカーブが落ちているところのクラスター数を採用するのがElbow curveのクラスター数決め方になる。この場合だと3になる。