D3.jsを用いたクラスタリングアルゴリズム(K-means)の可視化
こんにちは。
Data Visualization Advent Calendar 2014 - Qiitaおよび、
CYBIRDエンジニア Advent Calendar 2014 - Qiitaの12日目です。
自己紹介
フルスタックデータアナリスト(自称)*1のdr_paradiです。
データヴィジュアライゼーションハッカソンで作ったアプリの説明はこちら
第一回チキチキ秋のデータサイエンスアイデアソン&ハッカソン』開催報告会 アプリ名: 守備視え〜る
今回の内容
今回、私はD3.jsというわりと人気なJavaScriptライブラリ*2
を用いて、代表的なクラスタリング*3アルゴリズムであるK-meansを可視化したお話をします。
ソースとデモはこちらです。
データ可視化 (Data Visualization) について
弊社のデータアナリストの仕事としては、
があります。 *4
最後のアウトプットでデータを可視化し、レポートにまとめ、プレゼンテーションを行うため、可視化の善し悪しがデータ分析者の最終的な成果を大きく左右します。
いくら分析の精度や妥当性が高くとも可視化の出来次第で、提案が受け入れられないという事も大いにあります。
参考: 悪い可視化の事例集
機械学習について
データ分析業務の中では、知識発見的*5なアプローチを求められる事もあり、
と言われ、機械学習の利用を迫られることもままあります。
説明する側にとっても、説明を受ける側にとっても「機械学習」という言葉はなかなか威圧感があり、とっつきづらい印象があります。
そこで、可視化の力を借りて、アルゴリズムのイメージをしやすくしました。
概要を知らずに、「内容を知らないけどクラスタリング使って分析しました」と説明するよりは説得力が増すかと思います。
クラスタリングの可視化
クラスタリングの代表的なアルゴリズムであるK-meansは、その名の通り与えられたデータを「K」個の重心(mean) をもつ集合(クラスタ)に分割する手法です。
今回作成したデモの場合は、入力データとしてランダムに選んだ3点を中心にガウス分布を生成します。
K-meansのアルゴリズムは以下の通りです。
- 各データに対してランダムでクラスタを割り振る
- 各クラスタの重心を計算する(算術平均(ユークリッド距離))
- 各データに対して重心が最も近いクラスタに割り当て直す
- 移動しなくなるまで2.3 を繰り返す(移動しなくなったら終了)
発生する計算は上記の2番くらいで、難しい事はしていません。
// ユークリッド距離の計算
distance = Math.sqrt(
Math.pow((centroidArr[i - 1].x - d.x), 2) +
Math.pow((centroidArr[i - 1].y - d.y), 2)
);
ピタゴラスの定理さえできれば問題ないですね。
実際の分析では、多次元情報をクラスタリングすることになるので、
簡単に可視化できませんが 、デモのような二次元での可視化でも処理のイメージをつけることが出来るかと思います。
また、あまりアルゴリズムの詳細を知らずにRやSPSSなどのライブラリを使っている方にとっても、どういった処理をしているかを理解する手助けになれば幸いです。
入力などに気をつかって間違いを起こしづらくなること間違いありません。
今後はd3などについてもちょいちょい書いていこうかと思います。
*1:簡単な予測アルゴリズムも作るし、Webでの可視化ツールも作るし、Excelで事業規模の予測もするし、広告効果も検証するし、Rを使ったアドホック分析もするし、KPIの報告もするし、マーケティングもするし、社内イベントの音響もするみたいな広く浅い感じの便利屋さん
*4:所属会社のカレンダー初日のCYBIRD - エンジニアに想うこと - Qiita には「分析チームのアナリストがEMRをグリグリ回してくれてたり、」とありますが、あくまで一部です。Webエンジニアの方には勘違いされがちですが
*5:いわゆる教師なし学習
*6:いわゆるバズワード。いろいろなログを集めた大量のデータ
*7:いわゆる教師なし学習。。なのか?
*8:距離の取り方などいろいろ種類はありますが