クラスタリング
Clustering ・ くらすたりんぐ
正解ラベルなしで、似たデータどうしを距離に基づきグループに分ける手法
✦ 30秒で試す — 航海塊の数を正しく言い当てても、正しく分けられないことがあるこのまま回し続けると、分け方は?予想してみる概要
クラスタリングは、正解ラベルのないデータを「似たものどうし」のグループ(クラスタ)に自動で分ける手法の総称です。似ているかどうかはデータ間の距離(ユークリッド距離など)で測り、「クラスタ内の距離は近く、クラスタ間の距離は遠く」なるような分け方を探します。何が正解かをデータが教えてくれない中で構造を見つけ出すため、「教師なし学習」の代表格と呼ばれます。
典型的な出番は、顧客のセグメンテーションです。購買履歴から「まとめ買い層」「セール狙い層」「新商品好き層」のようなグループが浮かび上がれば、施策をグループごとに変えられます。ほかにも、文書の自動分類、遺伝子の発現パターンのグループ化、異常検知(どのクラスタからも遠い点を外れ値とみなす)など、応用範囲は広大です。
クラスタリングは仮説を検証する手法ではなく、データの構造に当たりを付ける探索的データ分析の道具です。「答え」を出すというより「良い問いを見つける」ための手法だと捉えると、結果との正しい距離感が保てます。
なぜ生まれたか
出発点は生物学の分類問題です。多数の生物や標本を、複数の測定値に基づいて客観的に分類したい — 分類学者の主観ではなく数値で系統を整理したいという要求から、1950〜60年代に「数値分類学」が興り、距離に基づいて似たものを段階的にまとめる階層クラスタリングの手法群が整備されました。同時期に心理学・人類学でも、調査対象を型に分ける手法として同様のアイデアが独立に育っています。
その後、計算機の発達とデータの大規模化が第二の推進力になりました。全ペアの距離を管理する階層的手法は数万件を超えるデータには重すぎるため、「クラスタ数を先に決め、中心の更新を繰り返す」という軽量な発想の k-means 法(1950年代に原型、1967年に命名)が普及します。ラベル付けのコストを掛けずに大量データから構造を発見したいという需要は、機械学習の時代に入っていっそう強まり、クラスタリングは教師なし学習の中心的な手法群として発展を続けています。
詳細
k-means法 — 中心の更新を繰り返す
最も広く使われる k-means 法は、クラスタ数 k を先に決めて、次の手順を繰り返します。
k-means が最小化しているのは「各点から、所属するクラスタの中心までの距離の2乗の合計」(クラスタ内平方和)です。割り当ての手順では中心を固定したまま各点を最寄りの中心へ移すので、この合計は下がるか変わらないかのどちらかです。中心の更新の手順では割り当てを固定したまま中心をメンバーの平均へ動かしますが、平均は「メンバーからの距離の2乗和を最小にする点」なので、ここでも合計は下がります。どちらの手順も合計を増やさず、点の割り当て方は有限通りしかないので、繰り返しは必ずどこかで止まります。
ただし止まった場所が最良とは限りません。各手順は「いまより良くなる方向」にしか動けないため、初期配置しだいで、1つの塊を2つに割り、別の2つの塊を1つにまとめたような局所解に落ち着くことがあります。そこで初期値を変えて複数回実行し、クラスタ内平方和が最小の結果を採る(あるいは、互いに離れた点を優先して初期値に選ぶ k-means++ を使う)のが定石です。また k-means は「各クラスタは中心のまわりに丸く、同じくらいの広がりで分布する」ことを暗黙に仮定しているため、細長いクラスタや三日月形のクラスタ、大きさの極端に違うクラスタはうまく分けられません。
この2手順は、実際に1手ずつ自分の手で回してみると仕組みが腑に落ちます。下の部品では、うっすら塗られた領域が「その中心がいちばん近い場所」(ボロノイ領域)を表しています。割り当てとは、点がどの領域に入っているかを読むことにほかなりません。中心をドラッグで置き直したり、「局所解の例」を選んだりして、止まる場所が初期値で変わることを確かめてみてください。
×がクラスタの中心(わざと左上に固めてあります)。うっすらした色の領域は「その中心がいちばん近い場所」です。 「① 割り当て」と「② 中心を移動」を交互に押してみてください。×はドラッグで置き直せます。
× = クラスタの中心(ドラッグで移動)。薄い色の領域 = その中心が最寄りになる範囲。右 = クラスタ内平方和の推移
階層クラスタリング — 樹形図で構造を見る
もう一つの主要な流派が階層クラスタリングです。凝集型では、まず各データ点を1つのクラスタとみなし、最も近い2つのクラスタを併合する操作をすべてが1つになるまで繰り返します。この併合の履歴を樹形図(デンドログラム)として描くと、どの高さで切るかによって任意のクラスタ数の分割が得られます。
クラスタ数を事前に決めずに全体の階層構造を眺められるのが強みで、「どの粒度で分けるのが自然か」をデータに語らせることができます。ただしクラスタ間の距離の定義(最短距離法・最長距離法・ウォード法など)によって結果が変わり、計算量の面で大規模データには不向きです。最短距離法は鎖のように細長くつながったクラスタを作りやすく(連鎖効果)、最長距離法はコンパクトな塊を好みます。実務ではウォード法が「クラスタ内のばらつきの増加が最小になるように併合する」性質から、k-means と同じ基準で考えられ、バランスのよい分割を得やすいとしてよく選ばれます。
距離の設計と標準化 — 結果を左右する土台
クラスタリングの結果は、アルゴリズム以前に「距離をどう測るか」で決まります。変数の単位がばらばらのまま距離を計算すると、スケールの大きい変数だけが距離を支配してしまうため、事前の標準化が実質的に必須です。また、変数が多すぎると高次元空間では距離の差が付きにくくなる(次元の呪い)ため、主成分分析で次元を削減してからクラスタリングする組み合わせも定番です。文書なら単語の出現ベクトルのコサイン類似度、購買履歴なら共通購入の割合など、データの性質に合った距離・類似度を選ぶこと自体が分析設計の中心になります。また、平均を中心に使う k-means は2乗距離で測るため、遠く離れた外れ値が1つあるだけで中心が大きく引っ張られます。外れ値を先に確かめるか、中心に平均ではなく実在のデータ点を使う k-medoids のような頑健な手法を選ぶのが対策です。
クラスタ数 k の決め方
k-means では「いくつに分けるか」を分析者が決めなければなりません。代表的な目安が2つあります。エルボー法は、k を増やしながらクラスタ内のばらつきの合計を折れ線で描き、改善が鈍る「肘」の位置を採用する方法です。シルエット分析は、各点について「自分のクラスタへの近さ」と「隣のクラスタへの近さ」の差を点数化し、分割の良し悪しを定量化します。ただしどちらも絶対の基準ではなく、最終的には「そのグループ分けが業務上意味を持つか・説明できるか」が判断の軸になります。
確率モデルとしてのクラスタリング
k-means が各点を1つのクラスタに固く割り当てるのに対し、「データは複数の分布の混ざり合いから生成された」と考え、各点がどの分布から来たかの確率を推定する流儀もあります。これが混合分布モデル(代表は混合正規分布・GMM)によるクラスタリングで、実は k-means はその特殊な場合(各クラスタが同じ大きさの球状分布で、割り当てを0か1に固定した場合)とみなせます。確率的な扱いにすると「この顧客はクラスタ1に70%、クラスタ2に30%所属」といった柔らかい割り当てができます。さらに、パラメータを最尤推定(EMアルゴリズム)で求める統計モデルになるので、BIC などの情報量規準でクラスタ数を比べるといった、統計モデルの道具立ても使えるようになります。ほかにも、密度の高い領域をクラスタとみなし、形が不定形でもクラスタ数の指定なしで分けられる密度ベースの手法(DBSCAN など)も実務でよく使われます。
落とし穴 — クラスタは「見つかってしまう」
最大の落とし穴は、クラスタリングは構造のないデータに対してもそれらしいグループを返してしまうことです。k=3 と指定すれば、一様なデータでも必ず3つに分かれます。得られたクラスタが実在の構造なのか、アルゴリズムが作り出した幻なのかは、散布図や主成分の平面に落として分布を確かめる、別のサンプルで再現するか試す、クラスタ間で他の変数に意味のある差があるか調べる、といった検証で見極める必要があります。クラスタに「若年アクティブ層」のような名前を付けた瞬間にそれが実在すると錯覚しやすいので、命名は解釈の仮説にすぎないと意識しておくことが大切です。結果を報告するときも、クラスタごとの平均値の表だけで済ませず、クラスタの重なり具合や大きさの偏りまで見せる(データ可視化の原則)ことで、読み手が「どれほどはっきり分かれているのか」を判断できるようになります。
試問
平面上の点が、3つの塊をなしています。k-means は、k 個の中心(×)から出発して「各点をいちばん近い中心に割り当てる」「中心を割り当てられた点の平均へ動かす」をくり返し、点を k 組に分けます。ただし出発点しだいでは、最良ではない分け方に落ち着いてそこから抜け出せなくなることがあり、これを局所解と呼びます。中心(×)をドラッグして、自分で初期配置を作ってください。
×がクラスタの中心(わざと左上に固めてあります)。うっすらした色の領域は「その中心がいちばん近い場所」です。 「① 割り当て」と「② 中心を移動」を交互に押してみてください。×はドラッグで置き直せます。
× = クラスタの中心(ドラッグで移動)。薄い色の領域 = その中心が最寄りになる範囲。右 = クラスタ内平方和の推移
