# 【5分でわかりやすく解説】k-means法とは？RとPythonで実装してみよう！

> 当サイト【スタビジ】の本記事では、非階層クラスター分析のk-means法について徹底的に解説していきます。メリットとデメリットがあるので使う際は注意しましょう！x-means法という改良手法も合わせて一緒に見ていきますよー！

- URL: https://toukei-lab.com/k-means
- 公開: 2022.11.29 / 更新: 2025.01.29
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、非階層クラスター分析のk-means法について徹底的に解説していきます。メリットとデメリットがあるので使う際は注意しましょう！x-means法という改良手法も合わせて一緒に見ていきますよー！
:::

こんにちは！

データサイエンティストのウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

大学院時代は、クラスター分析を用いて回帰分析の精度を高める手法の研究などを行っていました。

[クラスター分析](/%e3%82%af%e3%83%a9%e3%82%b9%e3%82%bf%e3%83%bc%e5%88%86%e6%9e%90)は非常に便利な手法でビジネスの場でもよく使われます。

<https://toukei-lab.com/%e3%82%af%e3%83%a9%e3%82%b9%e3%82%bf%e3%83%bc%e5%88%86%e6%9e%90>

そんなクラスター分析には**実は階層的クラスター分析と非階層的クラスター分析がある**ということをご存知でしょうか？

階層的クラスター分析は分かりやすく、結果が出た後に分類の様子からクラスタ数を決めることが可能です。

ただ<mark>データ量が多くなると計算に時間がかかるというデメリットがあります。</mark>

一方非階層的クラスター分析は、クラスタ数をあらかじめ決めておかなくてはいけませんが<mark>膨大なデータでも比較的計算が早く終わるというメリットがあります。</mark>

どちらの手法も一長一短ですが、**一般的にビジネスの場では膨大なデータを扱うことが多いため非階層的クラスター分析が良く用いられます。**

この記事では、そんな**非階層的クラスター分析の中で最もよく用いられるk-means法についてまとめていきます。**

k-means法を進化させたx-means法についても紹介していきますので是非参考に！

:::talk{who="umatan"}
k-means法についてどこよりも詳しくまとめていくよ！
:::

:::box{title="読み飛ばしガイド"}
・[k-means法のメリット](/k-means#k-means-2)\
・[k-means法のデメリット](/k-means#k-means-3)\
・[k-means法のデメリットを解消した最強の手法「x-means法」](/k-means#k-meansx-means)\
・[k-means法とx-means法をRで実装してみよう！](/k-means#k-meansx-meansR)\
・k[-means法をPythonで実装してみよう！](#k-means法をpythonで実装してみよう)
:::

以下の動画でも分かりやすく解説しているので是非チェックしてみてください！

::youtube{#V4PN2tjEqA8}

## k-means法とは

![](/wp-content/uploads/2019/04/52ceff2ccf51b6465679ab4c976fc8b0_s.jpg)

まず、初めにk-means法とは何か見ていきましょう！

> 1.代表点を適当に決める\
> 2.ユークリッド距離をもとにデータを代表点を持つクラスタに割り当て\
> 3.クラスタの重心点を代表点とする\
> 4.代表点が変わらなければ終了。変われば2へ

具体的にk-means法がどういうフローを取るのか図で見ていきます。

### 代表点を決める

まず代表点を適当に決めます。

![](/wp-content/uploads/2019/07/k-means1.jpg)

この際にクラスタが3つなら3つの代表点が選ばれます。

### クラスタに分ける

続いてStep2、[ユークリッド距離](/euclidean-manhattan-distance)を計算して各データはどの代表点に近いかでグループ分けします。

![](/wp-content/uploads/2019/07/k-means2.jpg)

最初の適当な点が今回は比較的良かったので綺麗に分かれていますが、毎回そうとは限りません。

### 重心点を計算する

続いてStep3、各クラスタの重心点を計算します。

![](/wp-content/uploads/2019/07/k-means3.jpg)このクラスタの重心点が次の代表点になります。

### クラスタを再分類

そしてまたStep2に戻って・・・を繰り返して最終的に代表点が動かなくなったら終了！

![](/wp-content/uploads/2019/07/k-means4.jpg)

今回は緑の〇が一つピンクになりました。

※イメージしやすいように手で作っているので少し違和感あるかも

非常に単純なアルゴリズムなんです。

## k-means法のメリット

![](/wp-content/uploads/2019/06/magic-cube-1976725_960_720.jpg)

そんなk-means法ですが、どんなメリットがあるのでしょうか？

### アルゴリズムが単純で分かりやすい

k-means法のアルゴリズムは<mark>図で考えると非常に単純で分かりやすいんです。</mark>

アルゴリズムを覚える必要はありませんが、ある程度説明できるのと説明できないのとでは説得力が違います。

### 計算負荷が少ない

アルゴリズムが単純であることと関連するのですが、<mark>その分計算負荷が少ないので膨大なデータに対しても素早く計算することが可能です。</mark>

そのため、大量のデータを扱うことの多いビジネスの場ではk-means法が好んで使用されます。

## k-means法のデメリット

![](/wp-content/uploads/2019/05/af0d3191cf5dcb300654db5edd754429_s.jpg)

ただ、一方でk-means法のデメリットも存在します。

### クラスタ数をあらかじめ決めなくてはいけない

先ほども書きましたが、<mark>k-means法はクラスタ数をあらかじめ決めなくてはいけません。</mark>

クラスタ数をいくつか動かしてみて最も最適なクラスタ数を探すと良いでしょう。

<mark>クラスタに意味を与えるのがマーケターの仕事なのです。</mark>

ちなみに自動で最適なクラスタ数を算出してくれる「**x-means法**」という手法もありますので後で見ていきましょう！

### 局所最適解になってしまう

代表点を決めてそこから逐次的に最適解を探していくため、<mark>局所最適になってしまい、大局的最適解であるとは限りません。</mark>

そのため**代表点の選び方によって結果が変わる**ことがあります。

## k-means法とk近傍法の違い

k-means法と**名前の似ている**手法に[k近傍法](/%ef%bd%8b%e8%bf%91%e5%82%8d%e6%b3%95)という手法があります。

これらの手法、**実は全然違うんです！！笑**

k-means法は教師なし学習であるのに対してk近傍法は[教師あり学習](/learning-nonlearning)！

k近傍法は周りの教師データから未知データのラベルを判別する分類系の機械学習手法です。

そしてkとは手法に与えるパラメーターで、近くに存在する学習データのクラス数を示しています。

たとえば、このような状況では

![](/wp-content/uploads/2018/02/66c19942ab4ba346fdb64ccc04cde373-3.png)

k＝3なので未知データの周りの3つのデータを判断材料とします。

実際に見てみると、青〇のクラスが2つ、緑△のクラスが1つなので、未知データは青〇と判断されます。

詳しくは以下の記事でまとめているのでご覧ください！

<https://toukei-lab.com/%ef%bd%8b%e8%bf%91%e5%82%8d%e6%b3%95>

## k-means法のデメリットを解消した最強の手法「x-means法」

![](/wp-content/uploads/2019/03/a94310ed4de4a08528a026f0badfdb2f_s-e1556972696222.jpg)

実はk-means法のデメリットを解消した「**x-means法**」という手法があるんです。

<mark>「x-means法」を使えば、最適なクラスタ数を自動で決めてくれます</mark>。

「x-means法」はPelleg and Moore(2000)によって名づけられたもので，始めに十分に小さなクラスタ分割から始めて、各クラスタについて2分割が適当であると判断される限り分割を繰り返すものです。

アルゴリズムは以下。

> １．クラスタ数をnとしk-means法を行う。⇛C1,C2,…Cn\
> ２．Ci(i=1,2,…,n)にクラスタ数を２としk-means法を行う。\
> ３．分割前のBIC （ベイズ情報量基準）と分割後のBICを比較し大きくなるならその分割をし，そうでないなら分割しない。\
> 4．2,3を分割できるクラスタがなくなるまで繰り返す。

BICはある種の[回帰分析](/%e5%9b%9e%e5%b8%b0%e5%88%86%e6%9e%90)の変数選択の場面で用いられることがある、サンプル数をペナルティ項として課した指標です。

AIC（赤池情報量基準）などと仲間です。

この時、BICの式を簡単に書くと以下のようになります。

BIC＝ー（尤度）＋k×(サンプル数)

サンプル数が大きければ大きいほどBICは大きくなり、尤度が小さければ小さいほどBICが大きくなります。

今回のケースでは、クラスタ内多変量正規分布のばらつきが小さいほど尤度は小さくなります。

そのため、**サンプルが多くてかつばらつきが少ない**クラスターができるとBICが大きくなるというイメージ。

そのロジックを使って、BICが大きくなるのであれば分割するというようなアルゴリズムになっているのがこの**x-means法**なのです。

これだけ聞くとx-means法の方が良さそうですが、<mark>k-means法は元々局所最適解に陥りやすいのにもかかわらずx-means法はさらに局所最適解に陥りやすくなっています。</mark>

簡易的に計算する分にはx-means法を使ってもよいかもしれませんが、最適なクラスタ数を精緻に探す場合はk-means法のほうが良いかもしれません。

詳しくは以下の論文（石岡\[2000]）を読んでいただくと良いと思います。

:::related
[x-means法改良の一提案 : k-means法の逐次繰り返しとクラスターの再併合](https://www.jstage.jst.go.jp/article/jscswabun/18/1/18_KJ00004375370/_article/-char/ja/)
:::

## k-means法とx-means法をRで実装してみよう！

![](/wp-content/uploads/2018/09/S_8608589564326.jpg)

それでは、最後に<mark>k-means法とx-means法をそれぞれRで実装</mark>していきましょう！

Rのパッケージ内に入っているk-means法と先ほどの石岡\[2000]の論文中のx-means法を使って比較してみます。

（x-means法はパッケージがないので別途実装が必要ですが、ネットにソースが落ちています）

データは、**iris**というめちゃんこ有名なR内のデータセット（150サンプル5変数で花びらの特徴を表したデータセット）を使います。

3つの花のタイプに分かれているので、その<mark>ラベルがk-means法とx-means法で上手く分類できるかどうか</mark>見ていきます。

```r title="kmeans-vs-xmeans.R"
data<-iris
data_train<-data[,-5]#5列目はラベルなので削除
km<-kmeans(data_train,3)
km$cluster
table(data[,5],km$cluster)#本物のラベルとグループ分けを比較

# ----xmeans------
xm<-xmeans(data_train,3)
table(data[,5],xm$cluster)#本物のラベルとグループ分けを比較
```

実際に行ってみた結果がこちら

■k-means法

<table border="0" cellspacing="0" cellpadding="0" class="table">
<colgroup>
<col span="4"> </colgroup>
<tbody>
<tr>
<td></td>
<td align="right">1</td>
<td align="right">2</td>
<td align="right">3</td>
</tr>
<tr>
<td>setosa</td>
<td align="right">0</td>
<td align="right">50</td>
<td align="right">0</td>
</tr>
<tr>
<td>versicolor</td>
<td align="right">48</td>
<td align="right">0</td>
<td align="right">2</td>
</tr>
<tr>
<td>virginica</td>
<td align="right">14</td>
<td align="right">0</td>
<td align="right">36</td>
</tr>
</tbody>
</table>

■x-means法

<table border="0" cellspacing="0" cellpadding="0" class="table">
<colgroup>
<col span="9"> </colgroup>
<tbody>
<tr>
<td></td>
<td align="right">1</td>
<td align="right">2</td>
<td align="right">3</td>
<td align="right">4</td>
<td align="right">5</td>
<td align="right">6</td>
<td align="right">7</td>
<td align="right">8</td>
</tr>
<tr>
<td>setosa</td>
<td align="right">28</td>
<td align="right">22</td>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
<tr>
<td>versicolor</td>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">18</td>
<td align="right">4</td>
<td align="right">6</td>
<td align="right">20</td>
<td align="right">0</td>
<td align="right">2</td>
</tr>
<tr>
<td>virginica</td>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">1</td>
<td align="right">13</td>
<td align="right">0</td>
<td align="right">0</td>
<td align="right">12</td>
<td align="right">24</td>
</tr>
</tbody>
</table>

k-means法は明示的にクラスタ数を3と指定しているのでそれなりに綺麗にクラスタが分かれていますが、<mark>x-mean法ではクラスタ数が8つに分かれてしまっています・・・</mark>

x-means法は非常に便利な手法ですが、気を付けて使わないといけないですね。

:::talk{who="umatan"}
やっぱりビジネスシーンではk-means法が無難だね！
:::

## k-means法をPythonで実装してみよう！

![PC](/wp-content/uploads/2018/08/PAK85_MBAdesagyou20140312_TP_V-e1557018085482.jpg)

k-means法は、RでもできますしもちろんPythonでも実装できちゃいます！

同じくirisデータを分類してみましょう！

```python title="kmeans.py"
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
pred_cluster = KMeans(n_clusters=3).fit_predict(df)
confusion_matrix(iris.target,pred_cluster)
accuracy_score(iris.target,pred_cluster)


```

やっていることはRと変わりません。

正答率は88％になりました！

RもPythonもk-means法を行う分にはそれほど変わりませんが、Pythonの方ができることの幅が広いのでPythonに慣れておくことをオススメします！

<https://toukei-lab.com/python-can>

Pythonの勉強方法については以下にまとめていますので参考にしてみてください！

<https://toukei-lab.com/python-learn>

## k-means法をビジネスで活かす場面

![データサイエンティスト](/wp-content/uploads/2019/09/e37be02ae3870ffbbf95e2a91fb2d4f8_s-e1568208400539.jpg)

さて、k-means法の種類や仕組み・そしてRでの実装について分かったところで<mark>どのようにビジネスに活かしていけばよいのか見ていきましょう！</mark>

ここでは2つの観点でk-means法の使いどころを見ていきます。

:::box
**・セグメントの可視化**\
**・教師あり学習の特徴量生成**
:::

### セグメントの可視化

![](/wp-content/uploads/2019/03/6852029bfb6542901ccc36755df22f67_s.jpg)

もう既にお分かりの通り、<mark>k-means法を使えばお客さんの行動データや属性データを基にいくつかのセグメントに分けることができます。</mark>

あるセグメントは、**年配の女性で購入金額が高い層**

もう一方のセグメントは、**若い男性で購入金額が低い層**、などが考えれます。

この2つのセグメントに対して行うコミュニケーションは変えるべきだということが分かりますね。

このように、<mark>セグメントの可視化を行いセグメントのユーザー像を明確にすることで、マーケティング活動を効率化することが可能になります。</mark>

このセグメントの可視化においてユーザー像を想像するのはマーケターの腕の見せ所で、クラスター数を変化させてどのようなセグメント定義であれば最適なコミュニケーション設計ができるのか考えていくことになります。

:::talk{who="umatan"}
可視化はビジネスにおいてもかなり優先度が高いからね！
:::

### 教師あり学習の特徴量生成

![ルービックキューブ](/wp-content/uploads/2019/06/magic-cube-1976725_960_720.jpg)

先ほども紹介しましたが、教師あり学習というのは正解が紐づいているデータを学習する手法のことを指しましたね。

教師あり学習を使うと、<mark>過去の顧客の購買という正解データから未来の購買を予測することが可能です。</mark>

そんな、顧客の購買を予測するときにクラスター分析で得られたクラスターを特徴量として新たに追加して使うことがあります。

これによりインプットされるデータがリッチになって、<mark>他の特徴量で表現できなかったことが表現できるようになる可能性があります。</mark>

つまりk-means法によって生成された特徴量を使って顧客の購買予測精度の向上が見込めるんです。

特徴量に関するテクニックは以下の記事で詳しくまとめています！

<https://toukei-lab.com/variable-engineering>

効果が本当に見込めるかどうかはデータによりますが、精度を向上させる手段として覚えておくとよいでしょう！

1つ目の可視化に関しては現状を把握することに重きが置かれていましたが、2つ目では予測の精度を高めるための1つの情報として使われました。

どちらもやっていることはさほど変わらないのですが、<mark>k-means法には色々な使い方があるということは理解しておきましょう。</mark>

## k-means法　まとめ

ここまでご覧いただきありがとうございました！

本記事では、k-mean法をメインに見てきました。

最後にk-means法についてまとめておきましょう！

:::point
**■k-means法のメリット**\
・計算負荷が少ない\
・アルゴリズムが単純で説明しやすい

**■k-means法のデメリット**\
・クラスタ数をあらかじめ決めなくてはいけない\
・局所最適解に陥りやすい
:::

k-mean法は<mark>とても優秀で汎用性の高い手法であり、様々なビジネスシーンで使われます。</mark>

是非使ってみてください！

ちなみに階層的クラスター分析に関してもっと詳しく知りたい方は以下の記事を参考にしてみてください。

<https://toukei-lab.com/%e3%82%af%e3%83%a9%e3%82%b9%e3%82%bf%e3%83%bc%e5%88%86%e6%9e%90>

また機械学習やデータサイエンスについてもっと詳しく知りたい方はぜひ以下の記事を参考にしてみてください！

<https://toukei-lab.com/machine-learning-study>

<https://toukei-lab.com/data-scientist>

当メディアでは、k-meansを含めた様々な機械学習手法やデータサイエンスの知識を体系的に学べる[スタアカ（スタビジアカデミー）](https://toukei-lab.com/achademy/)というスクールを展開していますので是非チェックしてみてください！

:::box
[業界最安値のデータサイエンス専門スクール「スタアカ」](https://toukei-lab.com/achademy/)
:::