初心者にもわかる!k-means法でデータ分析を始めよう

たくさんのデータの中から、似た者同士を自動でグループ分けしたいと思ったことはありませんか?そんなときに役立つのが、機械学習の手法の一つである「k-means法(k平均法)」です。

この記事では、データ分析の初学者でも理解できるように、k-means法がどのようなもので、どのように機能するのか、そしてどんなことに使えるのかを、専門用語を避けつつ分かりやすく解説していきます。

k-means法とは?

k-means法とは、大量のデータを指定した「k」個のグループ(クラスタ)に自動で分けるための代表的なアルゴリズムです。

もう少し詳しく言うと、k-means法は「クラスタリング」という手法の一種です。クラスタリングとは、正解ラベルがないデータ(教師なしデータ)の中から、データの持つ特徴に基づいて類似性の高いものを集め、グループ分けすることです。

k-means法は、その中でも「非階層クラスタリング」に分類されます。これは、あらかじめ決めた数のグループに、それぞれのデータがどのグループに属するかを割り振っていく方法です。名前の「k」は分けるグループの数を、「means」は各グループの「平均(重心)」を使って計算することに由来しています。

アルゴリズムがシンプルで理解しやすく、計算も高速なため、大規模なデータの分析にも利用しやすいという特徴があります。

k-means法のアルゴリズム

k-means法は、以下の簡単なステップを繰り返すことで、データをグループ分けしていきます。

  1. Step 1: グループの中心(重心)をランダムに決める
    最初に、データをいくつのグループに分けたいか(kの数)を決めます。そして、その数だけランダムにデータ空間上に「グループの中心(重心)」を配置します。
  2. Step 2: 各データを一番近い重心のグループに割り当てる
    すべてのデータについて、Step 1で決めた各重心との距離を計算します。そして、それぞれのデータを最も距離が近い重心のグループに割り振ります。
  3. Step 3: グループの重心を再計算する
    Step 2でグループ分けされたデータを使って、各グループの新しい重心を計算します。新しい重心は、そのグループに所属するデータの平均的な位置になります。
  4. Step 4: 重心が変化しなくなるまで繰り返す
    Step 3で計算した新しい重心の位置が、前回の重心の位置とほとんど変わらなくなるまで、Step 2とStep 3の処理を何度も繰り返します。重心が動かなくなったら、グループ分けが完了です。

k-means法の長所と短所

k-means法は非常に強力な手法ですが、万能ではありません。長所と短所を理解して、適切に使うことが重要です。

項目説明
長所
  • シンプルで理解しやすい: アルゴリズムが直感的で、初心者でも仕組みを理解しやすいです。
  • 計算が高速: 各データと重心との距離計算が主な処理のため、計算コストが低く、大規模なデータセットにも迅速に適用できます。
  • 実装が容易: 多くのプログラミング言語やライブラリで簡単に実装できます。
短所
  • kの値を事前に決める必要がある: 最適なグループ数を事前に知ることは難しく、適切なkの値を設定するには試行錯誤が必要です。
  • 初期値に依存する: 最初の重心のランダムな選び方によって、最終的なグループ分けの結果が変わることがあります。
  • 外れ値に弱い: 極端に離れたデータ(外れ値)があると、重心がそれに引っ張られてしまい、適切なグループ分けができなくなることがあります。
  • 複雑な形のデータには不向き: 球状でない、細長いクラスタや複雑な形状のクラスタをうまく認識できない場合があります。

k-means法の活用事例

k-means法は、そのシンプルさと効率性から、様々なビジネスシーンや研究で活用されています。

  • 顧客セグメンテーション
    マーケティング分野で最もよく使われる例の一つです。顧客の年齢、性別、購買履歴、ウェブサイトの閲覧行動などのデータから、似たような特性を持つ顧客グループを自動で発見します。これにより、「お得情報に敏感なグループ」「新商品を好むグループ」といったセグメントごとに、最適なマーケティング戦略を立てることが可能になります。
  • 画像圧縮・減色
    画像の色情報をk-means法でクラスタリングし、似た色をグループ化して代表的な色(重心の色)に置き換えることで、使用する色数を減らし、データサイズを圧縮することができます。
  • 異常検知
    工場のセンサーデータや金融取引データなどから、正常なデータの集まりをクラスタとして定義します。どのクラスタにも属さない、または中心から大きく外れたデータを「異常」として検出することができます。
  • 文書分類
    ニュース記事や論文などを、単語の出現頻度といった特徴量に基づいてクラスタリングし、「スポーツ」「政治」「経済」といったトピックごとに自動で分類します。

Python (scikit-learn) による実装例

Pythonの機械学習ライブラリであるscikit-learnを使うと、k-means法は非常に簡単に実装できます。

ここでは、仮想的なデータを作成し、それを3つのクラスタに分ける簡単なコードを紹介します。

# 必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# --- 1. データセットの作成 ---
# scikit-learnのmake_blobsを使って、クラスタリング用の仮想データを作成します。
# n_samples: データ点の総数
# centers: 生成するクラスタの数
# n_features: データの特徴量(次元)の数
# cluster_std: クラスタ内のデータのばらつき
# random_state: 乱数のシード(結果を再現可能にするため)
X, y_true = make_blobs(n_samples=300, centers=3, n_features=2, cluster_std=0.8, random_state=0)
# --- 2. k-meansモデルの構築と学習 ---
# KMeansクラスのインスタンスを作成します。
# n_clusters: 分割するクラスタの数(kの値)
# init: 重心の初期値を決める方法 ('k-means++'が推奨されます)
# n_init: 異なる重心の初期値で何回アルゴリズムを実行するか
# random_state: 乱数のシード
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=0)
# fit_predictメソッドで、データの学習とクラスタの予測を同時に行います。
y_kmeans = kmeans.fit_predict(X)
# --- 3. 結果の可視化 ---
# 元のデータを散布図としてプロットします。
# y_kmeansの値(0, 1, 2)に応じて色分けします。
plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s=50, c='lightgreen', marker='s', edgecolor='black', label='cluster 1')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s=50, c='orange', marker='o', edgecolor='black', label='cluster 2')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s=50, c='lightblue', marker='v', edgecolor='black', label='cluster 3')
# 各クラスタの重心をプロットします。
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=250, marker='*', c='red', edgecolor='black', label='centroids')
plt.legend()
plt.grid()
plt.show() 

まとめ

k-means法は、データの中に隠れた構造を見つけ出し、似たもの同士をグループ分けするためのシンプルかつ強力な手法です。

アルゴリズムが分かりやすく、計算も高速なため、データ分析の第一歩として非常に有用です。マーケティングから異常検知まで、その応用範囲は多岐にわたります。

一方で、グループ数kを事前に決める必要があるなどの注意点も存在します。この記事をきっかけに、ぜひk-means法をあなたのデータ分析に活用してみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です