k-meansによるクラスタリングの例

・K-meansとは?

データをいくつかのグループに分ける手法の一つです。

・2次元データの例

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from sklearn.datasets import make_blobs

# ガウス分布に従う2変数データの塊を3つ作成
X, y = make_blobs(n_samples=100,centers=3, n_features=2, random_state=0, center_box=(-30,30))
# データフレームに格納
df_2 = pd.DataFrame(X,columns=["x1","x2"])
df_2["y"] = y
# プロット
sns.pairplot(df_2,hue="y")

このデータに対してクラスタリングをかけます。
試すクラスタ数は2〜5

from sklearn.cluster import KMeans

n_cluster_list = [2,3,4,5]
sse_list = []

for n_cluster in n_cluster_list:
    # KMeansの実行
    kmeans = KMeans(n_clusters=n_cluster,random_state=0).fit(df_2[["x1","x2"]])
    # ラベルの出力
    df_2["{}_cluster".format(n_cluster)] = kmeans.predict(df_2[["x1","x2"]])
    # クラスタ内誤差平方和(SSE)の出力
    sse_list.append(kmeans.inertia_)

エルボー図を確認しましょう

# SSE値の分布の確認
plt.plot(n_cluster_list,sse_list,"-o")
plt.title("sse distribution")
plt.xlabel("n_cluster")
plt.ylabel("sse")
plt.grid()

最適なクラスタ数は3であることが分かりました。

・3次元データの例

# ガウス分布に従う3変数データの塊を3つ作成
X, y = make_blobs(n_samples=100,centers=3, n_features=3, random_state=0, center_box=(-30,30))
# データフレームに格納
df_3 = pd.DataFrame(X,columns=["x1","x2","x3"])
df_3["y"] = y
# プロット
sns.pairplot(df_3,hue="y")

# 3Dでのプロット
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection="3d")

y_label_list = list(df["y"].unique())
y_label_list.sort()
for y_label in y_label_list:
    ax.scatter(df_3[df_3["y"]==y_label]["x1"],df_3[df_3["y"]==y_label]["x2"],df_3[df_3["y"]==y_label]["x3"],label=y_label)
ax.legend(loc=0)

このデータに対してクラスタリングをかけます。
試すクラスタ数は2〜5

n_cluster_list = [2,3,4,5]
sse_list = []

for n_cluster in n_cluster_list:
    # KMeansの実行
    kmeans = KMeans(n_clusters=n_cluster,random_state=0).fit(df_3[["x1","x2"]])
    # ラベルの出力
    df_3["{}_cluster".format(n_cluster)] = kmeans.predict(df_3[["x1","x2"]])
    # クラスタ内誤差平方和(SSE)の出力
    sse_list.append(kmeans.inertia_)

エルボー図を確認しましょう

# SSE値の分布の確認
plt.plot(n_cluster_list,sse_list,"-o")
plt.title("sse distribution")
plt.xlabel("n_cluster")
plt.ylabel("sse")
plt.grid()

前回と同様に、最適なクラスタ数は3であることが分かりました。

 

 

ikunobu
未分類