クラスタリング・
顧客セグメンテーション
「全顧客にメールを一斉送信したが反応が薄い」「優良顧客と離反しかけの顧客に同じクーポンを配っている」――こうした打ち手のぼやけは、顧客をひとかたまりとして扱っていることから生まれます。顧客セグメンテーションは、似た行動の顧客をグループに分け、グループごとに施策を変えるための土台です。その分け方を支えるのが、クラスタリングという教師なし学習の手法と、購買履歴から実務的にセグメントを作るRFM分析です。
クラスタリングは、正解ラベルを与えずにデータの構造を見つける教師なし学習の代表手法です。k-meansは重心を動かしながら指定した数のグループに分け、階層クラスタリングはグループ数を決めずに併合の樹形図を作ります。一方RFM分析は、最終購入からの日数(Recency)・購入回数(Frequency)・購入金額(Monetary)の3指標で顧客をスコア化する、解釈しやすいルールベースの手法です。実務では、まずRFMで分かりやすいセグメントを切り、より多くの行動データを使いたくなった段階でクラスタリングに進む、という順序が扱いやすくなります。重要なのは、分けること自体ではなくセグメントごとに違う施策を当て、効果を測るところまでつなぐことです。
01.まず結論:クラスタリングは『似た者同士をまとめる』教師なし学習
手元に1万人ぶんの購買履歴があるとします。このうち「よく買う人」「もう買わなくなった人」「買い始めたばかりの人」を見分けたい――しかし、誰がどのタイプかという正解ラベルは付いていません。クラスタリングは、この「答えのないデータから、似た者同士のかたまりを見つける」ための手法です。
セグメンテーションの方法は、大きく2通りあります。1つは、RFM分析のように「最終購入が90日以上前なら離反」といった人が決めたルールで分ける方法。もう1つは、クラスタリングのようにアルゴリズムにデータの構造から自動でグループを見つけさせる方法です。前者は解釈しやすく説明もしやすい、後者は人が気づかない切り口も拾える、という違いがあります。本記事は両方を扱い、使い分けまで整理します。
02.教師なし学習とクラスタリングの考え方
機械学習は、学習の仕方で大きく分けられます。教師あり学習は「この顧客は解約した/しなかった」という正解(ラベル)付きのデータで予測を学びます。回帰や分類がこれにあたります。これに対し教師なし学習は、正解を与えず、データそのものに潜む構造を見つけます。
図:クラスタリングは「正解ラベルがない」教師なし学習の代表手法
教師あり学習は「答え」を与えて予測を学ばせます。教師なし学習は答えを与えず、データそのものに潜む構造を見つけます。クラスタリングは後者の代表で、似た者同士をグループにまとめます。
教師あり学習
正解ラベルから予測を学ぶ
「この顧客は解約した/しなかった」という答え付きのデータで学習し、新しい顧客の解約を予測します。回帰・分類がこれにあたります。
教師なし学習
ラベルなしで構造を見つける
答えを与えず、購買行動の似ている顧客をまとめます。クラスタリングと次元削減が代表で、本記事はクラスタリングを扱います。
クラスタリングには「正解」がない。出てきたグループが使えるかは、人が解釈して決める。
教師なし学習の代表が、似た者同士をまとめるクラスタリングと、多数の特徴を少数の軸に圧縮する次元削減です。クラスタリングが「データを行方向にグループ分けする」のに対し、次元削減は「データを列方向に要約する」と捉えると違いが掴めます。
クラスタリングで「似ている」を判断するには、2つの顧客がどれだけ近いかを数値で測る距離・類似度が必要です。購入回数や金額のような数値データではユークリッド距離がよく使われます。距離や類似度の選び方そのものは、類似度・距離の指標と使い分けで詳しく扱っています。
教師あり学習なら「予測が当たったか」で精度を測れますが、クラスタリングには照合すべき正解がありません。アルゴリズムは指定された数のグループを必ず出力しますが、そのグループが意味のある区切りかどうかは保証しません。出てきたクラスタを見て「これは優良層、これは離反層」と意味づけし、施策に使えるかを判断するのは人の仕事です。後述するシルエット係数のような指標は分離の良さを測る助けになりますが、最終的な採否はビジネス上の解釈で決めます。
03.k-meansの仕組み|重心を動かしながらグループを決める
k-meansは、クラスタリングで最も広く使われる手法です。「k個の平均(mean)」という名前のとおり、k個のクラスタの重心(中心点)を動かしながら、各データ点をいちばん近い重心のグループに割り当てていきます。
図:k-meansは「割り当て」と「重心の更新」を繰り返して収束する
k-meansは、各点をいちばん近い重心に割り当て、その結果から重心を計算し直す、という2つの操作を交互に繰り返します。割り当てが変化しなくなった時点で完了です。
STEP 1
クラスタ数kを決める
いくつのグループに分けるかを先に決める。初期の重心をk個置く(置き方にランダム性がある)
STEP 2
各点を最寄りの重心へ
すべてのデータ点を、いちばん近い重心のクラスタに割り当てる
STEP 3
重心を計算し直す
各クラスタに集まった点の平均位置を、新しい重心とする
STEP 4
変わらなくなるまで反復
STEP 2〜3を繰り返し、割り当てが動かなくなったら収束(完了)
初期の重心の置き方にランダム性があるため、実行のたびに結果が少し変わることがある。
手順は単純で、「各点を最寄りの重心に割り当てる」と「割り当て結果から重心を計算し直す」の2つを交互に繰り返すだけです。繰り返すうちに重心の移動は小さくなり、やがて割り当てが変化しなくなります。これが収束で、そこでクラスタが確定します。重心が実際にどう動くかを、散布図で見てみます。
図:重心(◆)は「クラスタ内の点の平均位置」へ動いていく
丸い点が顧客、ひし形が重心です。左は今の重心に各点を割り当てた状態、右はその割り当てをもとに重心を点の平均位置へ動かした状態。これを繰り返すと重心の移動が止まり、クラスタが確定します。
STEP 2:今の重心に点を割り当てる
STEP 3:重心を点の平均位置へ動かす
重心は最初ずれた位置にありますが、「割り当て → 平均位置へ移動」を繰り返すうちにクラスタの真ん中へ収まります。重心が動かなくなった時点が収束です。
# 顧客を k-means で3グループに分ける(scikit-learn)
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
X = features # 例: 各顧客の [購入回数, 購入金額合計] など
# 軸ごとに尺度が違うので、まず標準化する(後述)
X_scaled = StandardScaler().fit_transform(X)
km = KMeans(n_clusters=3, n_init=10, random_state=0)
labels = km.fit_predict(X_scaled) # 各顧客のクラスタ番号(0,1,2)
print(labels)k-meansは高速で大規模データにも向きますが、得意・不得意があります。重心からの距離でグループを切るため、丸いかたまり状のクラスタは得意な一方、細長い形やリング状のクラスタはうまく分けられません。また、グループ数kを人が事前に指定する必要があり(決め方は次章)、初期の重心の置き方にランダム性があるため実行ごとに結果が少し変わることもあります。なお、scikit-learnの既定は重心を散らして置くk-means++という初期化方式で、純粋なランダム配置よりばらつきは抑えられます。
k-meansは距離でグループを決めるため、軸ごとの数値の尺度の違いに強く影響されます。たとえば「購入回数(1〜20回)」と「購入金額(1,000〜500,000円)」をそのまま使うと、金額の数字が桁違いに大きいため、距離はほぼ金額だけで決まり、購入回数は無視されます。これを防ぐには、各軸を平均0・標準偏差1にそろえる標準化(または0〜1に収める正規化)を前処理として必ず行います。上のコードで StandardScaler を挟んでいるのはこのためです。前処理を飛ばすと、意図しない軸だけでクラスタが切られます。
04.クラスタ数の決め方|エルボー法とシルエット係数
k-meansは「いくつのグループに分けるか」を人が決めなければなりません。やみくもに選ぶのではなく、データから目安を出す代表的な方法がエルボー法とシルエット係数です。
図:エルボー法は「減り方が緩む肘」をクラスタ数の目安にする
縦軸はクラスタ内平方和(各点と重心の距離の二乗和、小さいほど密)。クラスタ数を増やすほど下がりますが、ある点から下がり方が緩みます。その「肘」が、増やす意味の薄れる境目です。
肘がはっきり出ないことも多いため、エルボー法だけで決めず、シルエット係数や「分けたセグメントが施策に使えるか」も併せて判断します。
エルボー法は、クラスタ数kを変えながらクラスタ内平方和(各点と重心の距離の二乗和。小さいほどクラスタが密)を計算し、グラフに描く方法です。kを増やせば平方和は必ず下がりますが、ある点から下がり方が緩みます。その曲がり角(肘)が、「これ以上分けても密さがあまり改善しない」境目で、kの目安になります。
シルエット係数は、各点について「同じクラスタ内の点との近さ」と「最も近い別クラスタとの近さ」を比べ、-1〜1の値でクラスタの分離の良さを測ります。1に近いほどよく分かれており、全体の平均が最も高くなるkを選びます。
# エルボー法とシルエット係数でクラスタ数を探る(scikit-learn)
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
for k in range(2, 9):
km = KMeans(n_clusters=k, n_init=10, random_state=0).fit(X_scaled)
wcss = km.inertia_ # クラスタ内平方和(小さいほど密)
sil = silhouette_score(X_scaled, km.labels_) # -1〜1(大きいほど分離が良い)
print(f"k={k}: クラスタ内平方和={wcss:.0f}, シルエット係数={sil:.3f}")| 決め方 | 見るもの | 向き・注意点 |
|---|---|---|
| エルボー法 | クラスタ内平方和の「肘」 | 直感的だが、肘がはっきり出ないことも多い |
| シルエット係数 | 分離の良さ(-1〜1)の平均が最大のk | 数値で比較でき判断しやすい。計算はやや重い |
| ビジネス上の制約 | 施策を当てられるセグメント数か | 運用できるのは3〜6程度。指標が示すkでも多すぎれば見直す |
どちらの指標も「正解のk」を一意に教えてはくれません。エルボー法の肘は曖昧なことが多く、シルエット係数が最大のkが運用上は多すぎることもあります。最後は「そのセグメント数で実際に施策を打ち分けられるか」というビジネス上の制約と突き合わせて決めます。10個のクラスタに分かれても、10通りの施策を運用できなければ意味がありません。
05.階層クラスタリングとの使い分け
クラスタリングにはk-means以外の手法もあります。実務でよく比較されるのが階層クラスタリングです。これは、最初は全データ点をそれぞれ1つのクラスタとみなし、近いもの同士を順に併合していく方法(凝集型)です。併合の過程はデンドログラムと呼ばれる樹形図で表され、どの高さで切るかで最終的なクラスタ数を後から選べます。
図:デンドログラムは「どの高さで切るか」でクラスタ数が決まる
階層クラスタリングは、各顧客を1つのクラスタとして始め、近いもの同士を下から順に併合します。併合の高さ=つながりの遠さです。横線(切る高さ)を上下に動かすだけで、後からクラスタ数を選べます。
切る高さを下げればクラスタ数は増え、上げれば減ります。k-meansのように事前にクラスタ数を決めなくてよいのが、階層クラスタリングの利点です。
| k-means | 階層クラスタリング | |
|---|---|---|
| クラスタ数 | 事前に指定する必要がある | 樹形図を作った後から、切る高さで選べる |
| 計算量・データ規模 | 高速。大規模なデータにも対応しやすい | 計算コストが高く、規模が大きいと重くなりやすい |
| 結果の見え方 | グループの割り当てのみ | デンドログラムで併合の階層構造が見える |
| 向いている場面 | 規模が大きく、おおよそのk感がある | 規模が小さく、構造やkを探索したい |
使い分けの目安はシンプルです。データが大きく、分けたいグループ数の見当がついているならk-means。データが小さめで、いくつに分かれるか・どんな入れ子構造かをまず探りたいなら階層クラスタリングです。実務では、階層クラスタリングでデンドログラムを見て構造とkの当たりを付け、本番の大規模データはk-meansで回す、という併用もよく行われます。
k-meansと階層クラスタリングは入門の二大手法ですが、これがすべてではありません。たとえばDBSCANのような密度ベースの手法は、点が密集している領域をクラスタとみなし、まばらな点はどのクラスタにも属さない外れ値として扱います。クラスタ数を指定せずに済み、丸くない形のかたまりも拾えるという特徴があります。まずはk-meansとRFMで始め、「丸いかたまりを前提とした分け方ではうまくいかない」と感じた段階で、こうした手法を検討する順序が現実的です。
06.RFM分析|購買履歴から顧客を実務的にセグメントする
ここまでのクラスタリングは「データから自動でグループを見つける」手法でした。これに対しRFM分析は、人が決めた3つの指標で顧客をスコア化する、解釈しやすいルールベースのセグメンテーションです。マーケティングの現場で長く使われてきた、実務の定番です。
図:RFMは3つの指標で顧客を測り、組み合わせでセグメントを作る
RFMは、購買履歴だけから計算できる3指標で顧客を評価します。各指標を5段階などでスコア化し、その組み合わせで「優良」「離反しかけ」「新規」といったセグメントに振り分けます。
最後に買ってから何日経ったか。短いほど良い
期間内に何回買ったか。多いほど良い
期間内の購入金額の合計。多いほど良い
優良顧客
R高・F高・M高。最近も買い、よく買い、よく使う
離反しかけの優良顧客
F高・M高だがR低。常連なのに最近来ていない
新規顧客
R高だがF低。買い始めたばかりで定着は未確認
同じ「R低」でも、Fが高ければ離反防止、Fも低ければ自然消滅と読み替えが変わる。3指標を組み合わせて初めて打ち手が決まる。
RFMは、購買履歴さえあれば計算できる次の3指標の頭文字です。
- Recency(最新性):最後に購入してから何日経ったか。期間が短いほど「今アクティブ」で高評価になります。
- Frequency(頻度):対象期間に何回購入したか。回数が多いほど「定着している」と見ます。
- Monetary(金額):対象期間の購入金額の合計。金額が大きいほど「事業への貢献が大きい」と見ます。
実務では、各指標を顧客全体の中での順位で5段階などにスコア化します。たとえばRecencyが上位20%なら5点、次の20%なら4点、というように分位で区切ります。3指標それぞれにスコアが付くと、その組み合わせで顧客を分類できます。
# 購買履歴から RFM スコアを作る(pandas)
import pandas as pd
snapshot = pd.Timestamp("2026-05-17") # 集計の基準日
rfm = orders.groupby("customer_id").agg(
recency=("order_date", lambda s: (snapshot - s.max()).days),
frequency=("order_id", "count"),
monetary=("amount", "sum"),
)
# 5分位でスコア化。Recency は日数が短いほど良いので逆順にする
# 同値が多い指標は rank(method="first") を挟み、分位の境界が重複するのを防ぐ
rfm["R"] = pd.qcut(rfm["recency"].rank(method="first"), 5,
labels=[5, 4, 3, 2, 1]).astype(int)
rfm["F"] = pd.qcut(rfm["frequency"].rank(method="first"), 5,
labels=[1, 2, 3, 4, 5]).astype(int)
rfm["M"] = pd.qcut(rfm["monetary"].rank(method="first"), 5,
labels=[1, 2, 3, 4, 5]).astype(int)
print(rfm[["R", "F", "M"]])| セグメント例 | RFMの傾向 | 状態の読み方 |
|---|---|---|
| 優良顧客 | R高・F高・M高 | 最近も買い、頻度も金額も高い。事業の中心 |
| 離反しかけの優良顧客 | F高・M高だがR低 | 常連だったのに最近購入がない。最優先のフォロー対象 |
| 新規顧客 | R高・F低 | 買い始めたばかり。2回目を引き出せるかが分かれ目 |
| 離反顧客 | R低・F低・M低 | 長く購入がなく頻度も低い。掘り起こしの優先度は低め |
RFM分析とクラスタリングは対立する手法ではありません。RFMの3指標を特徴量としてk-meansに渡し、スコアの区切りを人が決めるのではなく自動でグループ化する、という使い方もできます。まずはRFMのルールベースで分け、誰にでも説明できるセグメントを作るのが入りやすい順序です。指標が増えて手作業のルールでは扱いきれなくなったら、クラスタリングに切り替えます。RFMは購買履歴だけで完結する一方、Webの閲覧行動や問い合わせ履歴まで含めて多面的に分けたい場合は、クラスタリングの方が向きます。
07.セグメントを施策に落とす流れ
セグメンテーションは、分けること自体がゴールではありません。セグメントごとに違う施策を当て、その効果を測って初めて投資が回収されます。実務の流れは、次の4ステップに整理できます。
- 目的を1つに絞る。「離反を防ぐ」「優良顧客を育てる」「新規の2回目購入を増やす」など、何のために分けるかを先に決めます。目的が変われば、注目すべき指標も切り方も変わります。
- データを用意し、セグメントを切る。購買履歴からRFM、または行動データを加えてクラスタリングでグループを作ります。
- セグメントごとに施策を割り当てる。下表のように、状態に合った打ち手を1セグメント1施策で対応づけます。
- 効果を測り、見直す。施策の前後比較ではなく、同じセグメント内で施策ありとなしを比べるA/Bテストで効果を確かめます。
| セグメント | 状態 | 施策の方向 |
|---|---|---|
| 優良顧客 | 貢献が大きく、今もアクティブ | 値引きより、限定先行や上位プランの案内で関係を深める |
| 離反しかけの優良顧客 | 常連だが最近購入がない | 離反前に最優先でフォロー。理由を聞く・復帰特典を出す |
| 新規顧客 | 1回目を購入したばかり | 2回目を引き出すオンボーディングや使い方の案内 |
| 離反顧客 | 長く購入がない | コストをかけすぎない。反応する一部だけ掘り起こす |
ここで重要なのは、施策の効果検証です。「離反しかけの顧客にメールを送ったら半数が復帰した」という結果だけでは、メールを送らなくても復帰した分が切り分けられません。施策を当てる群と当てない群を分けて比べる発想は、コホート分析・リテンション・LTVのリテンション測定や効果検証の考え方と地続きです。セグメントごとの施策が本当に効いたかは、検証の枠組みとセットで判断します。
きれいなクラスタリング結果や精緻なRFMスコアができても、セグメントごとに施策を出し分けられなければ、分析は資料で止まります。10個のセグメントに分けても、用意できるメール文面やクーポンが1種類なら、実質的に分けていないのと同じです。逆に、3〜4個でも各セグメントに違う打ち手を当て、効果を測って改善できていれば、それは機能しているセグメンテーションです。分ける細かさは、施策を運用できる数から逆算して決めます。
- ✓ 分ける前に「何のために分けるか」の目的を1つに決める
- ✓ k-meansを使うなら、軸の標準化を前処理で必ず行う
- ✓ クラスタ数は指標(エルボー・シルエット)と運用可能数の両方で決める
- ✓ まずはRFMで説明しやすいセグメントを作り、必要に応じてクラスタリングへ
- ✓ セグメントごとに違う施策を当て、A/Bテストで効果を確かめる
08.よくある質問(FAQ)
顧客の分析は、k-meansとRFM分析のどちらを使うべきですか?
まずはRFM分析から始めるのが扱いやすい順序です。RFMは購買履歴さえあれば計算でき、「最近買っていない常連客」のようにセグメントの意味を誰にでも説明できます。一方、Webの閲覧行動・問い合わせ履歴・利用機能など多くの指標を使って多面的に分けたい場合は、k-meansなどのクラスタリングが向きます。両者は対立する手法ではなく、RFMの3指標を特徴量としてk-meansに渡す、という併用も可能です。説明しやすさを優先するならRFM、データの幅を活かすならクラスタリング、と捉えてください。
クラスタ数(k)はいくつにすればよいですか?
一意の正解はありません。エルボー法(クラスタ内平方和の下がり方が緩む肘)とシルエット係数(分離の良さが最大になるk)で、データからの目安を出します。ただし、これらの指標が示すkがそのまま実務の答えになるとは限りません。10個のセグメントに分かれても、10通りの施策を運用できなければ意味がないからです。最後は「そのセグメント数で施策を打ち分けられるか」というビジネス上の制約と突き合わせて決めます。実務で運用しやすいのは3〜6程度が目安です。
k-meansを実行するたびに結果が変わるのはなぜですか?
k-meansは初期の重心の置き方にランダム性があるため、初期値しだいで収束先(できるクラスタ)が変わることがあります。scikit-learnの初期化は純粋なランダム配置ではなく、重心を互いに散らして置くk-means++が既定で、これだけでもばらつきはかなり抑えられます。そのうえで対策は2つです。1つは、複数の初期値で試して最も良い結果を選ぶ設定(scikit-learnの n_init)を十分大きくすること。もう1つは、乱数の種(random_state)を固定し、同じ条件なら同じ結果が再現されるようにすることです。また、軸の標準化を忘れると、数字の大きい軸に結果が引っ張られて不安定になります。前処理と設定の両方を見直してください。
RFMのスコアは何段階・どの区切りで付ければよいですか?
5段階(5分位)、つまり顧客を上位20%ずつで区切るのが標準的ですが、絶対ではありません。顧客数が少ないときは3段階に減らす、Frequency(購入回数)のように特定の値に偏りやすい指標は順位で区切る、といった調整をします。重要なのは段階数そのものより、区切り方を決めた根拠を残し、期をまたいで一貫させることです。前期は5分位、今期は固定の閾値、と切り方を変えると、セグメントの増減が顧客行動の変化なのか集計方法の違いなのか分からなくなります。
顧客の分析やセグメント分けは、AIに任せられますか?
集計やクラスタリングのコード生成、RFMスコアの計算は AI(ChatGPT、Claude、Geminiなど)に任せられます。一方で、何のために分けるかの目的設定、どの指標を特徴量に使うか、クラスタ数をいくつにするか、出てきたグループにどんな意味を与え、どの施策につなぐかといった判断は人の領域です。クラスタリングには正解がないため、AIは「3つのセグメントに分けました」と必ず何かを出力しますが、それが施策に使える区切りかどうかは保証しません。AIの出力するセグメントは鵜呑みにせず、運用できる切り方になっているかを人が検証してください。
09.まとめ
顧客セグメンテーションは、ひとかたまりに見ていた顧客を「優良層」「離反しかけ」「新規」のように分け、グループごとに施策を変えるための土台です。その分け方には、正解ラベルなしでデータの構造を見つけるクラスタリングと、購買履歴の3指標で顧客を測るRFM分析があります。
実務で押さえる要点は3つです。第一に、クラスタリングには正解がない――アルゴリズムは必ずグループを出力しますが、それが使えるかを解釈し採否を決めるのは人です。第二に、k-meansを使うなら標準化が必須で、クラスタ数はエルボー法・シルエット係数と「運用できる数」の両面から決めます。第三に、分けることはゴールではない――セグメントごとに違う施策を当て、A/Bテストで効果を確かめて初めて、セグメンテーションは投資に見合います。最初はRFMの分かりやすいセグメントから始め、扱う行動データが増えた段階でクラスタリングに広げる順序が、現実的な進め方です。
コホート分析・リテンション・LTV
セグメント別の定着率や顧客生涯価値を測り、施策の効果検証につなげる考え方を整理します。
アトリビューション分析と MMM の基礎
どのチャネルや接点が成果に効いたかを数字で配分する、効果配分の基礎を整理します。
類似度・距離の指標と使い分け
クラスタリングの「似ている」を支える、コサイン類似度やユークリッド距離の使い分けです。
データ分析でよく使うアルゴリズム・指標まとめ
類似度・一致度・予測モデル評価の3カテゴリで指標を整理した総合解説です。
顧客セグメンテーションと施策設計のご相談を承ります
購買データからのセグメント設計、RFM・クラスタリングの実装、セグメント別施策の効果検証まで、データ分析の伴走支援を行っています。お気軽にお問い合わせください。
データ分析・アルゴリズム 基礎知識集
一覧に戻る →全体像とカテゴリ早見
データの可視化
個別指標カテゴリ
統計的推測の基礎
実務分析の手法
多変量解析
- ›多変量解析の基礎|目的で選ぶ手法マップ
- ›回帰分析の基礎|施策の 1 単位あたりの効きを数字で出す
- ›ロジスティック回帰分析|確率で出すから優先順位に使える
- ›クラスタリング・顧客セグメンテーション(この記事)
- ›構造方程式モデリングの基礎|パス解析でKPI波及を可視化

