PowerBI Network Navigator Chart で Twitter のフォロー関係を可視化する

先日PowerBI勉強会に参加してグラフをつかった発表がとても楽しそうだったので、やってみた

#環境
- Windows10
- PowerBIデスクトップ
- カスタムビジュアル=Network Navigator Chart

#やってみたこと
**Twitterのフォロー関係をビジュアライズ**

<blockquote class="twitter-tweet" data-lang="ja"><p lang="et" dir="ltr">PowerBI Network Navigator Chart <a href="https://t.co/znkvt5opM9">pic.twitter.com/znkvt5opM9</a></p>&mdash; gebo (@gebogebogeboge) <a href="https://twitter.com/gebogebogeboge/status/1005741087611236352?ref_src=twsrc%5Etfw">2018年6月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- 赤＝自分、黄色＝自分がフォローしているユーザー、青＝自分がフォローしているユーザーがフォローしているユーザー。
- 一瞬「おおっ！」となるが、レポートとしての価値はほぼ無い。
- すなわち、観賞用。

##最初にざっくりまとめると

###SourceはCSVファイル
twex.csv

|列名|説明|
|:--------|:----------|
|source_id|フォローしているユーザーID|
|source_name|フォローしているユーザー名|
|target_id|フォローされているユーザーID|
|target_name|フォローされているユーザー名|

###PowerBIテーブル
twexテーブル

|列名|説明|
|:--------|:----------|
|source_id|フォローしているユーザーID|
|target_id|フォローされているユーザーID|
|weight|ユーザーの重要度|
|source_node_color|ノード色|
|target_node_color|ノード色|

###カスタムビジュアル

Network Navigator Chart

|Network Navigator Chartのフィールド|twexテーブルのフィールド|
|:--------|:----------|
|Source Node|source_id|
|Target Node|target_id|
|Source Node Color|source_node_color|
|Target Node Color|target_node_color|
|レポートレベルフィルター|weight|

#～ここから手順～

#1.リストをCSV形式で作成する

##1-1.データ調査
- 自分がフォローしているユーザーは18人。（少ない・・・）
- 各ユーザーがフォローしているユーザーを表にするとこんな感じ。

| 自分がフォローしているユーザー|このユーザーがフォローしているユーザーの数|
|:----------------:|------------------:|
|A|81|
|B|31|
|C|379|
|D|280|
|E|1039|
|F|6799|
|G|18061|
|H|356|
|I|984|
|J|415|
|K|943|
|L|654|
|M|5065|
|N|1220|
|O|199|
|P|139|
|Q|221|
|R|191|

##1-2.データ作成

**※スクリーンショットのユーザーID、nameは判別できないように加工しています。**

- データをCSVで作成します。
- PythonのTweepyでフォローしているユーザーをCSV出力します。
- ソースコードは **[コチラ ( GitHub )](https://github.com/gebogebogebo/TweepyFriendCSVExport/blob/master/twexport.py)**
- **【注意】上記プログラムはTwitterのAPIを連射するのでAPI制限に引っ掛かります。引っかかったら17分Waitして処理再開します。実行する際はその辺をご理解の上お願いします。**
- 上記ソースの詳細解説は [Windows10にUbuntu入れてPythonでTwitterAPIでフォローしているユーザーをCSVでエクスポートしてみる](https://qiita.com/gebo/items/a45094b99b4633989924) を見てください。

##1-3.出来上がったCSVファイル

- ファイル名=twex.csv
- 文字コード=UTF-8で出来上がるので、サクラエディタなどでUnicodeに手動で変換した。なぜならPowerBIはUTF-8のCSVは読めなかったから・・・
- CSV形式、カンマ区切りで下表の通り
	- source_id = フォローしているユーザーのID
	- source_name = フォローしているユーザーのname
	- target_id = フォローされているユーザーのID
	- target_name = フォローされているユーザーのname

|source_id|source_name|target_id|target_name|
|:--------|:----------|:----------|:----------|
|99999|gebo|99999|hogehoge|
|...|...|...|...|

#2.PowerBI - テーブル作成

##2-1.データのインポート-その①
- データを取得→CSV→twex.csv→twexという名前でインポート

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/5c8bd2a5-832b-444a-ee77-7b47cf9e26db.png" width=70%>

- source_idとtarget_idは文字列に型変換する

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/2ea90fa0-f74a-68fd-30e8-873f3f9a0406.png" width=70%>

##2-2.データのインポート-その②
- データを取得→CSV→twex.csv
- target_idは文字列に型変換する。
- target_id列を選択して→グループ化してカウントをするようにしてOKする。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/2d1bb388-fe2d-84f8-4c00-121dfa222348.png" width=70%>

- target_idと「カウント」という列のテーブルができるのでFollwerCountというテーブル名で保存する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/190c1284-ed77-a782-1ea0-42fc61a2c133.png" width=50%>

##2-3.リレーションシップ設定
- 出来上がった2つのテーブル(twexとFollwerCount)のリレーションを設定する→自動的にリレーション設定されている！
- 左側のアイコンからリレーションを確認する（赤丸）。リレーションの設定を変更する場合はリレーションシップの管理（青丸）から。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/c0bea68b-1f8b-ac92-1ee3-5b46eae0b8c0.png" width=70%>

##2-4.テーブルのマージ
- 「クエリを編集」→PowerQueryエディタを開く
- 画面左から「twexテーブル」を選択→クエリのマージ を選択
- マージ画面→twexテーブルのtarget_id列を選択→中央のコンポボックスから「FollwerCountテーブル」を選択→FollwerCountテーブルのtarget_id列を選択。結合の種類は「左外部」を選択してOKする。
- SQLでいうところのtwex.target_idとFollwerCount.target_idをLEFTJOINするという意味

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/24820ecd-5579-8302-6ac3-6f6cae660006.png" width=80%>

- PowerQueryエディタに戻るとtwexテーブルに「FollwerCount」列が追加されているが、中身が「Table」と表示されていて？な状態なので、列をクリックして「展開」→「カウント」を選択してOK。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/0e1107cc-41bc-b012-9ab8-3f1974e61f2b.png" width=70%>

- これでtwexテーブルに「FollwerCount」列が追加されて、その値はtargetがフォローされている数が表示されるようになる。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/ca78268f-a25b-6209-2cc6-8b13c866434b.png" width=70%>

##2-5.ユーザーの重要度パラメータ
私の作ったCSVではユーザーは35,107人おりまして、このユーザーをNetwork Navigator Chartで一気に表示すると制限を超えて全部表示できなかった残念。
仕方がないので、以下のルールでユーザーの重みをつけて、より重要度の高いユーザーだけを表示するようにした。

- 自分がフォローしているユーザーは重要
- たくさんの人にフォローされている人は重要

以下の手順でtwexテーブルに上記ルールに基づいたフィールドweightを追加します

- 「データビュー」でtwexテーブルを表示
- メニューから「モデリング」を選択
- 「新しい列」を追加して以下のDAX関数を設定

```
weight = if (twex[source_name]="gebo",999,twex[FollwerCount.カウント])

※gebo(自分)のフォロワーだったらweightを999にして、それ以外はフォローされているカウントをweightとする
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/9f5f35d4-68ca-5346-4ae8-386b873c5601.png" width=70%>


※最初の動画でノードが増えていくように見えるのは、このパラメータをいじってる

##2-6.ノードの色
全部同じ色で表示するよりも少しカラフルな方がいいかな、という事で、色を付ける。
- 赤＝自分
- 黄色＝自分がフォローしているユーザー
- 青＝自分がフォローしているユーザーがフォローしているユーザー

これも同様にtwexテーブルに列を追加します。

|列名|説明|DAX関数|
|:--------|:----------|:----------|
|source_node_color|自分だったらRed、それ以外はGold|source_node_color = if (twex[source_name]="gebo","Red","Gold")|
|target_node_color|自分のフォローユーザーだったらGold、それ以外はCornflowerBlue|target_node_color = if (twex[source_name]="gebo","Gold","CornflowerBlue")|


##2-7.テーブルできた

テーブル=twex

|列名|説明|備考|
|:--------|:----------|:----------|
|source_id|フォローしているユーザーID||
|source_name|フォローしているユーザー名||
|target_id|フォローされているユーザーID||
|target_name|フォローされているユーザー名||
|FollowerCount.count|フォローされているユーザーが他のユーザーにフォローされている数||
|weight|ユーザーの重要度||
|source_node_color|ノード色||
|target_node_color|ノード色||

#3.PowerBI ビジュアライズ
ここからは簡単

##3-1.MarketPlaceからNetwork Navigator Chartを追加

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/3cbc9947-cc9b-3046-d53a-c125bde47fc4.png" width=70%>

##3-2.マッピング

Network Navigator Chartのフィールドとtwexテーブルのマッピング

|Network Navigator Chartのフィールド|twexテーブルのフィールド|
|:--------|:----------|
|Source Node|source_id|
|Target Node|target_id|
|Source Node Color|source_node_color|
|Target Node Color|target_node_color|
|レポートレベルフィルター|weight|

##3-3.ビジュアライズ
レポートレベルフィルターを色々変更して鑑賞しましょう。
Nodeが1000を超えるくらいでMAXのようです（悲・・・

#おつかれさまでした

# 参考
- [グラフ構造のデータモデルをPower BIで可視化してみた](https://www.slideshare.net/cdatajapan/power-bi-100071632)