非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Python】Scikit-learnでクラスタリングを使ってデータを可視化してみた

   

クラスタリングはデータを似た特徴でグループ化する手法です。教師なし学習の一種でラベルのないデータを探索的に分類します。たとえばユーザーの行動パターンの分析やマーケティングでのセグメント化に利用されます。

今回はクラスタリングを使わない場合と使った場合を比較しながらその効果を具体例で説明します。

クラスタリングを使わない例:データの単純な分布

以下の例では、2次元データをプロットし、クラスタリングを行わずに全体を可視化します。

import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成
np.random.seed(42)
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)

plt.scatter(x, y, c='gray', alpha=0.7)
plt.title("Without Clustering: Simple Distribution")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
 

 

ここではデータ全体が一色で表示され、グループの違いを視覚的に把握するのは難しいです。

 

クラスタリングを使った例:K-meansクラスタリング

次に、クラスタリング手法の一つであるK-meansを用いて、データを3つのグループに分けます。

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

# サンプルデータの作成
np.random.seed(42)
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)

# データを2次元配列に変換
data = np.column_stack((x, y))

# K-meansクラスタリング
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(data)

# クラスタリング結果をプロット
plt.scatter(x, y, c=clusters, cmap='viridis', alpha=0.7)
plt.title("With Clustering : K-means")
plt.xlabel("X")
plt.ylabel("Y")
plt.colorbar(label="Cluster")
plt.show()
 

 

この結果、データが3つの異なる色で区別され、それぞれのグループの特徴を視覚的に捉えられるようになります。

 

クラスタリングの効果

クラスタリングを使わない場合データ全体が均一に見えるため、どの部分が似ているか判断しにくいです。一方、クラスタリングを適用するとグループごとにデータを分類できるため、次のような利点があります:

  • データのパターンや傾向を把握しやすい
  • 分類結果を基にした意思決定が可能
  • 追加分析(たとえばグループごとの詳細な統計)が容易

このように、クラスタリングを活用することでデータの解釈が大幅に向上します。この記事では基本的なK-meansを例にしましたが、他にもDBSCANや階層型クラスタリングなどの手法があります。

 

K-meansクラスタリングの基本と特徴

K-meansクラスタリングは、データを指定した数のグループ(クラスタ)に分ける教師なし学習の手法です。手法の基本は以下の通り:

  1. クラスタの数(k)を指定する。
  2. データ空間内にランダムに(k)個の初期クラスタ中心(セントロイド)を配置。
  3. 各データ点を最も近いセントロイドに割り当てクラスタを形成。
  4. 各クラスタのセントロイドを再計算し位置を更新。
  5. 手順3と4を繰り返しセントロイドの移動が収束するまで実行。

この手法の特徴は、シンプルかつ高速であること。ただし、以下の課題もあります:

  • クラスタ数(k)を事前に指定する必要がある。
  • 初期セントロイドの選択に結果が影響される。
  • 球状のクラスタでない場合や外れ値に弱い。

K-meansはマーケティングやパターン認識などで広く使われています。

 

スポンサーリンク

 - Python