顧客同士の類似性をMDS(多次元尺度構成法)を使って5分で可視化する

今回は[前回](http://qiita.com/double-y/items/a6ff8b0ba194b909b773)同様、顧客をセグメンテーションしてみたいと思いますが、前回のようにただ単純に5つのグループにクラスタリングするのではなく、顧客同士の類似性もしくは違いを"距離"という概念を使ってもう少し詳しく見ていきたいと思います。

基本的には、まずその"距離"を計算し、それをMDS(多次元尺度構成法)というアルゴリズムを使って２次元の座標に落とし、それを散布図を使って可視化することによって、顧客同士の類似性をより直感的に理解するといった手法がデータサイエンスの現場では使われます。今回は、その具体的なやり方を見ていきます。

今回も引き続き、[前回の顧客セグメンテーション](http://qiita.com/double-y/items/a6ff8b0ba194b909b773)で使った[ワインのキャンペーンに対する顧客の反応のサンプルデータ](https://www.dropbox.com/s/bg2owhkfx6d2x0g/campaign_customer_table.csv?dl=0)を使います。

# ツール
今回もプログラミングなしでデータサイエンスができる[Exploratory](https://exploratory.io/)を使います。

# データのインポート

Data Framesの右の+アイコンから、"Import File Data"を選択します。

<img width="458" alt="Screen Shot 2017-05-18 at 10.19.41 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/abcf52f5-e8f8-f47a-22f1-a1db2c30932d.png">

そこで開くダイアログから、Localタブ、Text File(CSV, delimited)を選択します。
<img width="703" alt="Screen Shot 2017-05-20 at 2.56.08 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/d5125736-8786-6e9b-04a7-c6a2e8d93c66.png">

[こちら](https://www.dropbox.com/s/bg2owhkfx6d2x0g/campaign_customer_table.csv?dl=0)からダウンロードした、campaign_customer_table.csvを選択し、インポートします。これは、あるキャンペーンにどの顧客が反応してくれたのかというデータになります。テーブルビューを見てみましょう。
<img width="808" alt="Screen Shot 2017-05-20 at 3.08.50 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/60a2784f-7971-39f5-fee4-e9143006c578.png">

キャンペーンのIDを行に置き、顧客の名前を列に持ってくることによって、それぞれの顧客がそれぞれのキャンペーンに反応したかどうかを比べやすくします。こちらは、Pivotというコマンドを使って簡単に行うことができます。
左上の"+"アイコンから、Pivotを選択します。
<img width="1234" alt="Screen Shot 2017-05-23 at 10.40.32 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/3c8b85f1-e4ce-810b-71ba-ad6bb2539638.png">

Rowに"campaign_id"、Columnsに"customer"を選択します。

<img width="1208" alt="Screen Shot 2017-05-23 at 12.32.41 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/1bc81f87-1715-0569-a918-394abee0a844.png">

これを実行すると、このように、0と1が入ったテーブルになります。1はその該当するキャンペーンにそれぞれの顧客が反応したということを示します。例えば、下記の例ですとBakerは7と10のキャンペーンに反応したということになります。

<img width="809" alt="Screen Shot 2017-05-24 at 7.25.47 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/22959c0f-1b70-a49c-533e-c548ff9457ec.png">


まず、この0、1のパターンがcustomer同士でどれだけ異なっているか（距離）を計算します。


左上の"+" アイコンから、"Run Analytics..." -> "Calculate Distance"を選択します。

<img width="1028" alt="Screen Shot 2017-05-23 at 1.15.07 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/7e166bb2-ad2f-3a0e-8cf5-77fdd8d7a178.png">

今回、"campaign_id"以外の各列がそれぞれの顧客をあらわしていて、それらの間の距離を求めたいので、Which distance do you want to see?に"Distance among columns"、Select Columnsで"Exclude"と"Select Column Names"、"campaign_id"を選択します。Distance Methodは、今回、値が全て0, 1なので"Binary"を選択します。

<img width="950" alt="Screen Shot 2017-05-24 at 8.11.56 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/57673083-003c-ad03-3148-6c94516682e5.png">

これを実行すると、以下のようにすべての顧客の名前の組み合わせに対しての距離が計算されました。

<img width="521" alt="Screen Shot 2017-05-24 at 8.27.55 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/703656bc-c0fd-3c72-8f00-0c5e2ffba50e.png">

一旦これを可視化してみましょう。Vizタブに移り、Typeを"Heatmap"、X Axisを"pair.name.x"、Y Axisを"pair.name.y"、Colorを"value"にします。すると、以下のようなヒートマップが表示されます。

<img width="804" alt="Screen Shot 2017-05-24 at 3.17.34 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/41520a36-87e5-4341-951c-a487c823b60c.png">


このチャートでは、赤は１に近い数値、青は０に近い数値になっています。こちらで現在可視化している数値というのは距離なので、赤ければ赤いほど数値が大きい、つまり距離が遠いということで、逆に青ければ青いほど数値が小さいということで距離が近い、もしくは似ているということになります。

このチャートを使って、例えば、MorrisとJohnsonは似ているということを発見することができますが、それぞれの顧客の組み合わせを見ていくよりも全体として似通った顧客のグループを可視化することを可能にするアルゴリズムにMDS(多次元尺度構成法)というものがあります。こちらは、都市を地図上に配置するようなものだと考えると想像しやすいかと思われます。例えば、東京、大阪、名古屋とあった場合に、それぞれの都市の距離にフォーカスするのではなく、この3都市を地図上で、経度、緯度をもとに配置することで全体としての関係性を可視化できるわけです。この、それぞれの距離から、経度、緯度にあたるものを計算するというのがMDS(多次元尺度構成法)のアルゴリズムです。

2次元での座標を求めるには、先程のdo_dist関数で、Output Typeに"Position values in X/Y coordinates"を選択します。

<img width="996" alt="Screen Shot 2017-05-24 at 11.14.21 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/c64638a6-2855-c1d0-638f-0011a33f3c87.png">

結果はこのようになり、各顧客の座標がV1, V2として表されます。

<img width="804" alt="Screen Shot 2017-05-23 at 1.28.09 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/d81cce59-7ada-be5e-9f77-19da07e2518d.png">

これを、散布図を使って可視化してみましょう。Vizタブに行き、Typeを“Scatter”、X Axisに“V1"、Y Axisに“V2”を割り当て、さらにLabelに“name”を割り当てることによって、それぞれの点の上にマウスを持っていくとそれぞれの顧客の名前がわかります。

<img width="1021" alt="Screen Shot 2017-05-24 at 11.46.32 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/75a2193d-ba52-3de8-7f0f-e7953769ea39.png">

これによって、顧客の分布が可視化されました。

ここから、この位置情報を、前回使ったのと同じクラスタリングのアルゴリズムであるK-meansを使って幾つかのグループに自動的に分けてみましょう。

左上の + アイコンからK-meansを呼び出します。

<img width="694" alt="Screen Shot 2017-05-23 at 2.08.47 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/dcdcd4df-7fd6-d7a8-bd4b-ced63021dc4c.png">

今回は、各行が顧客で、それを座標に基いてクラスタしたいので、What do you want to cluster?に"Rows into clusters (groups)"、Select Columnsで"Include"と"Select Column Names"、"V1"、"V2"を選択します。Number of Clustersは、[前回](http://qiita.com/double-y/items/a6ff8b0ba194b909b773)と同じく、5にします。

<img width="982" alt="Screen Shot 2017-05-24 at 12.13.07 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/d555edc8-bf31-9094-2042-017c783f7da6.png">

これで、各行にクラスタラベルが割り振られます。

これを、先程の散布図に表示させてみましょう。
Vizタブに戻り、Colorを"cluster"にします。
すると、以下のようにプロットされます。

<img width="804" alt="Screen Shot 2017-05-24 at 12.19.28 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/5e080daf-1c87-22ea-c2e7-0d0cb790ad77.png">


さらに、それぞれのクラスタのサークルも表示させてみます。
Colorの歯車アイコンから、Show Circlesで"Filled Circles"を選びます。

<img width="811" alt="Screen Shot 2017-05-24 at 12.23.08 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/fcaef219-910a-a952-53ed-8b5690b71e83.png">

今回のクラスタが[前回](http://qiita.com/double-y/items/a6ff8b0ba194b909b773)と違う点としては、視覚化されているので議論をしやすかったり、クラスタがどれくらいまとまっているか、分散しているかといった情報も"見える"というメリットがあります。

このようにして、顧客の購買行動の類似性にもとづいて、顧客の分布を2次元で可視化し、クラスタ化することが数分で出来ました。

# まとめ

[前回](http://qiita.com/double-y/items/a6ff8b0ba194b909b773)は、顧客をセグメンテーションすること自体が目的でしたのでK-meansというアルゴリズムを使って一気にクラスタリングをかけてみましたが、今回は顧客がどうセグメンテーションされるかもさることながら、顧客同士の違いをもっと細かく直感的に理解したいということが目的でしたので、まずはその違いの程度(距離)を計算し、さらにMDS(多次元尺度構成法)というアルゴリズムを使ってその情報を2次元で表すことによって、顧客同士の類似性もしくは違いを可視化して、把握しやすくしました。結果として、顧客をセグメンテーションするにあたって、前回以上の細かで有用な情報が抽出されました。

このように、そういった情報を直感的に可視化できるということは、実際にデータを探索的に分析していくときに役立つのはもちろんですが、そこでの洞察を他の人に説明するときにこそ非常に役立ちます。結局、分析した結果というものは他の人と共有し、さらにそこから実際のビジネスに影響のある行動を促すということをもって初めて意味を持ちますので。

もし、何か質問やご要望などありましたら、support@exploratory.ioにご連絡ください。

# データ分析をさらに学んでみたいという方へ

来月、シリコンバレーのExploratory社によって行われる[データサイエンス・ブートキャンプ](https://exploratory.io/training-jp)が東京で行われます。本格的に上記のようなデータサイエンスの手法をプログラミングなしで学んでみたい方、そういった手法を日々のビジネスに活かしてみたい方はぜひこの機会に、参加を検討してみてはいかがでしょうか。[こちら](https://exploratory.io/training-jp)に詳しい情報がありますのでぜひご覧ください。