Scikit-learnのKMeansの使い方を徹底解説!Pythonでデータをグループ分けしよう

Python

「手元にある大量のデータを、何か意味のあるグループに自動で分けたい…」

データ分析の現場では、顧客リストや製品データ、センサーログなど、様々なデータを扱う中でこのような課題によく直面します。そんな時に絶大な効果を発揮するのが、機械学習の手法の一つであるKMeansクラスタリングです。

この記事では、Pythonの定番ライブラリScikit-learnを使ってKMeansを実装し、データをグループ分けする方法を、初心者の方でもつまずかないように徹底的に解説します。

この記事を読み終える頃には、あなたは以下のスキルを身につけているはずです。

  • KMeansがどのようなアルゴリズムなのかを理解できる
  • Scikit-learnを使ったKMeansの具体的な使い方・手順がわかる
  • データをクラスタリングし、その結果を可視化できるようになる
  • データに最適なグループ数を探すための「エルボー法」が使えるようになる

サンプルコードはコピー&ペーストで動かせるものを用意しました。さっそく、データグループ分けの世界に飛び込んでみましょう!

KMeansクラスタリングとは?データを自動でグループ分けする手法

まず、KMeansがどのような技術なのか、その概要を掴んでおきましょう。

KMeans(K平均法)は、正解ラベルのないデータの中から、似た特徴を持つデータ同士を集めて、指定した数(K個)のグループ(クラスタ)に自動で分類するアルゴリズムです。このような学習方法は「教師なし学習」と呼ばれ、データに潜む構造やパターンを発見するのに非常に役立ちます。

なぜKMeansが便利なのか?(活用シーン)

KMeansの使い方は非常にシンプルですが、その応用範囲は驚くほど広いです。

  • 顧客のグループ分け: 購買金額や頻度、閲覧履歴などから顧客を「優良顧客」「新規顧客」「離反懸念顧客」といったグループに分け、それぞれに適したアプローチを考える。
  • ECサイトの商品推薦: ユーザーが閲覧した商品と似た特徴を持つ商品を同じグループとして扱い、「この商品を見た人はこちらも見ています」といった推薦に応用する。
  • 異常検知: 正常なデータの集団から大きく外れたデータ点を「異常」として検出する。

このように、KMeansの使い方をマスターすれば、データから新たな知見を引き出す強力な武器になります。

準備しよう!KMeansを使うための環境構築

それでは、実際に手を動かす準備を始めます。Pythonと、いくつかのライブラリがあればすぐに始められます。

必要なライブラリをインストール

Scikit-learnをまだインストールしていない場合は、以下のコマンドを実行してください。データ操作に使うNumpyと、結果の可視化に使うMatplotlibも一緒にインストールします。

pip install scikit-learn numpy matplotlib

分析に使うサンプルデータを準備

今回は、Scikit-learnが提供しているダミーデータ生成機能make_blobsを使い、クラスタリングの練習に最適なデータセットを作成します。

この関数を使うと、指定した数の塊(グループ)を持つ2次元データを簡単に作ることができます。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

# サンプルデータを作成
# n_samples: データ点の数
# centers: グループ(クラスタ)の数
# random_state: いつ実行しても同じ結果にするための固定値
X, y_true = make_blobs(n_samples=400, centers=4, cluster_std=0.60, random_state=0)

# どんなデータができたか散布図で確認
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.title("Sample Data")
plt.grid()
plt.show()

実行すると、なんとなく4つのグループに分かれているように見えるデータ点のプロットが表示されます。今回は、このデータをKMeansできちんとグループ分けできるか試していきます。

Scikit-learnを使ったKMeansの基本的な使い方【3ステップ】

ここからが本題です。Scikit-learnを使ったKMeansの使い方は、たったの3ステップで完了します。非常にシンプルなので、一つずつ見ていきましょう。

ステップ1:モデルを準備する (KMeansのインスタンス化)

まず、sklearn.clusterからKMeansクラスをインポートし、モデルを準備します。このとき、「データをいくつのグループに分けたいか」をn_clustersという引数で指定します。今回は見た目で4つと分かっているので4を指定します。

from sklearn.cluster import KMeans

# KMeansモデルを準備する
# n_clustersに分けたいグループの数を指定
# n_init='auto'は、安定した結果を得るためのおまじない(推奨設定)
kmeans_model = KMeans(n_clusters=4, n_init='auto', random_state=0)

ステップ2:モデルを学習させる (fitメソッド)

次に、準備したモデルにfit()メソッドを使って、先ほど作成したサンプルデータXを渡して学習させます。これだけで、モデルがデータ点の配置を計算し、最適なグループ分けを実行してくれます。

# データを使ってモデルを学習させる
kmeans_model.fit(X)

ステップ3:結果を確認する (labels_とcluster_centers_)

学習が終わると、モデルの中に結果が格納されています。主に使うのは以下の2つです。

  • labels_: 400個の各データ点が、0〜3のどのグループに分類されたかを示すラベル。
  • cluster_centers_: 4つの各グループの中心点がどこにあるかを示す座標。

実際に中身を見てみましょう。

# 各データがどのグループに分けられたか確認(最初の10件)
print("所属ラベル:", kmeans_model.labels_[:10])

# 各グループの中心座標を確認
print("グループの中心座標:\n", kmeans_model.cluster_centers_)

これで、データに対するグループ分けは完了です。とても簡単ですね!

【実践】クラスタリング結果をグラフで可視化する

ステップ3で得られた結果(ラベル)を使って、グループ分けがうまくいったかを目で見て確認してみましょう。

Matplotlibで結果を分かりやすく表示

Matplotlibscatter関数には、データ点ごとに色を指定するcという引数があります。ここに先ほど取得したlabels_を渡すだけで、グループごとに自動で色分けされたグラフを作成できます。

中心点もプロットしてグループの中心を把握

さらに、各グループの中心点(cluster_centers_)を別のマーカーで上からプロットすることで、KMeansが各グループの中心をどこだと判断したのかも一目瞭然になります。

# グループ分けの結果を可視化
plt.figure(figsize=(8, 6))

# c=kmeans_model.labels_ とすることで、グループごとに色分けされる
plt.scatter(X[:, 0], X[:, 1], s=50, c=kmeans_model.labels_, cmap='viridis')

# グループの中心点をプロット
centers = kmeans_model.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.8, marker='X')

plt.title("KMeans Clustering Result")
plt.grid()
plt.show()

このコードを実行すると、データが綺麗に4色に分かれ、それぞれの中心に赤いバツ印が表示されたグラフが出力されます。これで、KMeansの使い方の基本はマスターです!

【応用】最適なグループ数(クラスタ数)を見つける方法:エルボー法

今回は「グループ数は4」と決め打ちで進めましたが、実際のデータでは最適なグループ数は分かりません。そんな時に役立つのがエルボー法です。

「なんとなく」で決めないためのエルボー法

エルボー法は、グループ数(K)を1, 2, 3, …と順番に増やしながらKMeansを実行し、それぞれのKでの「グループ内でのまとまり具合」をプロットする方法です。この「まとまり具合」はinertia_という値で取得できます。

グラフを描いたとき、inertia_の下がり方が急に緩やかになる点、つまりグラフが肘(エルボー)のように曲がって見える点が、最も効率の良いグループ数(最適K)の候補となります。

Pythonコードでエルボー法を実装

forループを使って、Kの数を1から10まで変えながらinertia_を記録し、グラフ化するコードは以下の通りです。

# エルボー法の実装
distortions = []
for k in range(1, 11):
    km = KMeans(n_clusters=k, n_init='auto', random_state=0)
    km.fit(X)
    # グループ内のまとまり具合(inertia_)をリストに追加
    distortions.append(km.inertia_)

# グラフ化
plt.figure(figsize=(8, 6))
plt.plot(range(1, 11), distortions, marker='o')
plt.xlabel('Number of clusters (K)')
plt.ylabel('Distortion (inertia)')
plt.title('Elbow Method for Optimal K')
plt.grid()
plt.show()

生成されたグラフを見ると、K=4を境に線の傾きがなだらかになっているのが分かります。これにより、このデータセットにはK=4が最適だろう、と客観的な根拠を持って判断することができます。

まとめ:KMeansの使い方をマスターしよう

この記事では、Scikit-learnを使ったKMeansの基本的な使い方から、応用的な最適なクラスタ数の決定方法までを徹底解説しました。

  • KMeansは、データを自動でグループ分けする教師なし学習の代表的な手法。
  • 使い方は**「モデル準備 → 学習 → 結果確認」**のシンプルな3ステップ。
  • n_clustersでグループ数を指定し、fit()で学習させる。
  • 結果のlabels_を使えば、Matplotlibで簡単に色分け・可視化できる。
  • 最適なグループ数が不明な場合はエルボー法で推定できる。

KMeansは、そのシンプルさと効果の高さから、あらゆるデータ分析の現場で重宝されています。ぜひ、今回学んだ使い方を参考にして、お手元のデータでグループ分けに挑戦してみてください!

コメント

タイトルとURLをコピーしました