Personality Insightsの結果をクラスタリングして散布図にPlotする（Jupyter）

# ちょっと今っぽいことをしてみる

Python流行ってるな、Jupyter/Pandasとかよく名前聞くな、データ分析とかすらすらできないとこれからご飯食べていけないな。 でもこれといってネタもないし何から勉強しよう？ ということで無料でできそうで、かつ、ちょっとそれっぽいことをやってみる。

使う技術（最初に読まなくてもいいです）

- IBMさまの Personality Insights
  **BIG DATA**をつかって、テキスト情報やTwitterアカウントをもとに**性格診断**をするクラウドサービスです。
  使うためには IBM Cloud のライトアカウントで十分ですが、試すだけならWebサイト上から試すことも可能です。

- Jupyter(Pythonとその仲間たち）
  Pythonを使ったデータ分析を対話的に行うことができる便利エディタ兼実行環境です。
  こちらは自分の環境へのインストールをお願いします。

使う統計的な手法（最初に読まなくてもいいです）

- K-means
  クラスタリングをざっくり行うための手法です。とりあえず精度はおいておいて**よくわからないけどクラスタリングできる**という強みがあります。

- PCA
  主成分分析といわれるものです。例えば、軸が5つもあるようなデータの場合、グラフにプロットできなくて可視化が難しいです。見ることができないと、あってる・まちがってる、の議論もできないので、5つの軸を2つの軸に無理やり近似させるという**次元圧縮**という必殺技みたいなことができます。（統計ででてくる名前はいちいち必殺技っぽい名前が多い気がします） 2軸のデータになれば簡単に散布図などのグラフ化が可能になります。


## なにをしてみるのか？

今回してみるのは下記です。

  1. Personality Insights で性格診断をしてみて、性格診断結果を数値にする。
  2. Jupyter上でK-meansを使って性格診断結果をクラスタリングする。
  3. Jupyter上でPCAを使って2軸にしてクラスタリング結果を散布図にしてみて眺める。
  4. ああぁぁ、人ってこういうタイプいるよねー という雑談をする。※ 仕事であれば「タイプ毎にマーケティング施策を打つ」とかになります

# やってみる

極力手順だけを端的に書きます。
詳しい説明はしません（できません……）

## **1. IBM Personality Insights で性格を数値化する**

IBM CloudのライトアカウントをとってAPIをたたいてください。
※ここは完全にこの記事外の話なので……いろいろ調べてやってください

もしさくっと試してみたいだけなら下記サイトにアクセスしてみてください。
https://personality-insights-demo.ng.bluemix.net/
例えば、バラク・オバマのスピーチを解析してみたり、任意テキストでの解析ができたりします。

例えばこんなのがでているでしょうか？ この値をつかっていきたいと思います。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/33095/fd5d3d30-0dde-f891-2b62-0f97636462e4.jpeg)

任意テキストでの解析などを駆使して5名分くらいのデータを作ってください。今回は適当に5名分作ってみました。

|name   |変化許容性|現状維持|自己超越|快楽主義|自己増進|
|-------|--------:|------:|------:|------:|------:|
|オバマ  |0.42     |0.16   |0.16   |0.05   |0.03   |
|ガンジー|0.58     |0.02   |0.32   |0.03   |0.00   |
|漱石    |0.27    |0.07   |0.91   |0.00   |0.00   |
|キング  |0.19    |0.02   |0.95   |0.01   |0.15   |
|AKIRA  |0.81    |0.99   |0.90   |0.31   |0.47   |

※ AKIRAは映画の会話シーンをとりだして分析してみました... なので金田君もてつおも混在 ＾＾


## **2. Jupyterを使ってクラスタ分析してみる**

Jupyterのセットアップと使い方は略です。
ここも良記事たくさんあるので参考にしてください。
とりあえずコマンドをうって ``1+2 [Shift+Enter]`` とかで ``3`` と出るくらいまでできたらOKです。

### **データを作る**

Jupyter上で以下のコマンドをいれて``Shift+Enter``なりで実行してください。

```python
import numpy as np
import pandas as pd

## PI(Personal Insights) data
pi_array = np.array([
  [ 0.42, 0.16, 0.16, 0.05, 0.03 ],
  [ 0.58, 0.02, 0.32, 0.03, 0.00 ],
  [ 0.27, 0.07, 0.91, 0.00, 0.00 ],
  [ 0.19, 0.02, 0.95, 0.01, 0.15 ],
  [ 0.81, 0.99, 0.90, 0.31, 0.47 ],
])

row_names = ['O','G','S','K','AKIRA']
column_names    = ['変化許容性','現状維持','自己超越','快楽主義','自己増進']

pi_df = pd.DataFrame( pi_array, columns=column_names, index=row_names )
pi_df
```

こんな結果がでてたら正解です。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/33095/dce0f149-f6d1-9242-330f-2c2f19f65adc.jpeg)

``DataFrame``という表の形式でデータの作成が完了しました。

### **クラスタリングをしてみる**

``sklearn.cluster``というパッケージを使って K-means でのクラスタリングをしてみます。
まずパッケージを import し、今回は 3 つのクラスタに分類（`n_clusters=3`） さらに、列名を加えて ``DataFrame`` を作ってみます。

```python
from sklearn.cluster import KMeans

pred = KMeans(n_clusters=3).fit_predict(pi_array)
pred_df = pd.DataFrame( pred, columns=['clustor'], index=row_names )
pred_df
```

こんな結果がでたでしょうか。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/33095/db760f1d-6ff8-92fa-5081-a15cd1316a02.jpeg)

オバマさんとガンジーは同じタイプで、漱石さんとキングさんは同じタイプ、AKIRAは特別です。
と、K-means では言ってます。

### **散布図にプロットしてみる**

PCAを使って 2次元 に落とし込んでみます。 ``PCA(n_components=2)`` で2軸を定義して ``pca.fit_transform(pi_df)`` で変換、その結果を ``decomposition_pi`` 配列にし保存します。

2軸に落とし込んだ ``decomposition_pi`` に、先ほど算出したクラスタリングの結果の列 ``pred_df`` を ``np.concatenate`` を使って追加します。

その後 ``matplotlib`` を使ってプロットしてみます。

```python
from sklearn.decomposition import PCA
from matplotlib import pyplot

# PCA
pca = PCA(n_components=2)
decomposition_pi = pca.fit_transform(pi_df)

# clustor結果の追加
decomposition_pi = np.concatenate( (decomposition_pi,pred_df), axis=1 )

# グラフ化
fig = pyplot.figure(figsize=(8,4),dpi=100)
ax = fig.add_subplot(1,1,1)
ax.scatter( decomposition_pi[:,0], decomposition_pi[:,1], c=decomposition_pi[:,2] )

for k,v in pd.DataFrame(decomposition_pi).iterrows():
    ax.annotate( row_names[k], xy=(v[0],v[1]), size=13 )

decomposition_pi
```

実行してみると、何もエラーがなければグラフがでます。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/33095/985c6b88-367a-671f-3925-c680199ed409.jpeg)

この縦・横の軸は何でしょう。 実はわからないです。 PCAがなんとなくうまい具合にだしてくれたものです。 
（いや、本当は係数などがわかるのですが。）
ここの縦・横の軸に想像力を働かせて、意味を見出して薄目でみつつ、なんだかうまい具合に3つにわけられてるのが確認できますね。ちなみにここで綺麗に3つになってなかったら、K-meansの `n_clusters=3` などの数値をいじって変えてみたりもします。

ということで、一通りDone.

## まとめ

なんとなくそれっぽいことが出来ました。

これをうまく使えば、例えば学校の先生なら小論文的なものをまとめて分析してクラスタリングして可視化してみるとか。（そんな雑な方法でクラスタリングがいいかという倫理的な話はおいておいて） 好きな小説を分析してクラスタリングして、読んだことのない作品が好みかどうかを事前に調べるとか（青空文庫とかで公開されてるものに限るかもですが。GoogleやAmazonの試し読みみたいなのでもできるかな？）