Graphviz

Twitterのフォローしている人が増えてきたのでソーシャルマップを作って関係性を理解しようとしたら結構理解できた話

動機

Twitterは昔から利用していたのですが、ずっとフォローしている人の数は100人くらいでした。
一説によると、人間が関係性を把握できる数は150人くらいまでと言います。(ちなみにその数をダンバー数というそうです)
自分の実感としては、確かに150人以上いると、だんだんその人たちのライフイベントや関係性などを把握するのが難しくなる印象です。

しかし、エンジニアたるもの、見地を広げ、世界を広げ、人間関係を成長させていく以外に道はありません。安心できる人間関係だけでなく、未知なる人間関係を探っていく必要があるわけです。

そういうわけで気になった人はどんどんフォロー⚡していきました。3ヶ月くらいそういう作業を続けていたら、フォロワーが1000人近くになったのです。色んな情報がTwitterのタイムラインに流れていて、なんだフォロワー増えても問題ないどころかむしろ楽しいじゃん。タイムラインのスピード感がたまらないと夢中になっていました。

しかし楽しい日々の裏で危険な事態が忍び寄っていたのです。ある日こんなことがリアルにありました。

山本さんですね。相互フォロワーしてます。いつもツイート楽しく読んでます:grin:

全然知らない人でした。いや確かに私フォローしてました。私はその人を知らないだけでなく、その人がどういう関係性にいるのかわかりませんでした。いつフォローボタンを押したのかもよくわかりませんでした。これがダンバー数を突破した弊害なのでしょうか。

あ、はい。私もいつも楽しく読んだり、読まなかったりしてます:rolling_eyes:

大人のコミュニケーションでその場を乗り切ったのですが、若干乗り切れてない感じでした。人と人とを結びつける技術は進んだのに、相変わらず人間はダンバー数の壁を突破する方法はないままです。この人類の未来に関わる難問を解決するためには、人間関係を視覚化したり図示する必要がありそうです。
そこで今回はフォローしている人のソーシャルマップを作成することを思いつきました!

ソーシャルマップ

SNSが世界に流行すると同時に、人々の関係が初めて一元的にデータ化できた時代が到来しました。そこで急速に発達したのは、ソーシャルグラフ、人間関係を可視化する手法です。有名な話だと6人経由すれば世界中の人とつながってるというのもこのへんと深い関係があります。
今回はフォローしている人の関係を大雑把で構わないので理解したいということで可視化するためにソーシャルマップを作ります。

技術選択

意気込んでみたものの、正直に言ってこういう問題どうやって解けばいいのかまったくわかりませんでした。私、知らないことだらけです。そこで日本が世界に誇るウィザード級プログラマ秋葉拓哉先生に相談してみました。
image.png
・・・全然わかりませんが、たぶんGraphvizとかでもできるはず、みたいです。

Graphviz

Graphvizはグラフを書くプログラムです。専用言語(dot言語と言うそうです)をGraphvizに渡すと適切に作図をしてくれるそうです。dot言語は例えば以下のようなものです。

digraph{a -> b; b -> c; c -> a; b -> a;}

これをGraphavivに与えるとグラフを描画してくれます。ちょっとTwitterのカオスマップを表現し切れるかまだわからない感じですね。はたしてうまくできるのでしょうか。

目標設定

今回のテーマは結果に対する定量的評価方法がありません。そこで作る前に何となくイメージを残しておきます。自分のフォローしている人をぼんやりとマッピングするとこんなイメージでした。こんな感じで自分のフォローしている人たちがクラスタ化できたら最高の成果だとしておきます。
9K731dztIQnOjit1523869312.png

実際にやってみた

まずTwitterで私がフォローしている人(約1000人)がそれぞれフォローしている人を取得する必要があります。これが相当大変です。TwitterのAPI制限が厳し過ぎです。API制限に引っかからないようにプログラムを動かしましたが、これにはほぼ一日近くかかりました:sob:
続いて獲得した情報をGraphvizに放り投げてみました。使ったアルゴリズムはsfdp(ばねモデルによるグラフ)です。nodeの枠やnodeを結ぶ線は設定で透明にしました。またnode接続数が少ない人は省略しました。またアイコンがかぶって見えない人もいるかも知れません。見つけられなかった方すいません🙇🙇🙇
sample.png

考察

image.png
とりあえず、図から大雑把な傾向を書いてみました。ひとつずつ見ていきましょう。
①左上、将棋クラスタです。すごくわかりやすいです。なんて言ってもアイコンが将棋の駒の人が多い。あと他のクラスタと比較しても密度が濃いです。相互にフォローしあっている割合が高いのでしょうか。
②左下、これはコンピュータ将棋クラスタでしょう。めっちゃニッチな世界なのですが、私のフォローしている人たちの中ではしっかりクラスタするほど一大勢力みたいですね。てっきり右下のプログラミングクラスタに吸収されるのではと思ってたのですが、少しだけ距離がある世界なんですね。
③右下、プログラミング・人工知能クラスタですね。ここも相当スッキリ出ている印象です。少し意外だったのは教育・研究関係がこの中にすっぽり入っていることですね。こちらはもっとはっきり別クラスタになるのではと思ってたのですが、違いました。
④右上、ビジネス系クラスタの集合でしょうか。ここは他のクラスタよりもはっきりしません。そもそも私もあまり詳しくない人が多いです。面積としても大きく、実はそれほどクラスタじゃないかもしれません。

問題点としては、フォロー情報が不足している孤立気味なnodeの配置は不安定ということです。例えば、秋田を応援している超神ネイガーさんは私のフォロワーからはほとんどフォローされてないので情報が不足しており、コンピュータ将棋クラスタプログラミング・人工知能クラスタの間の下のほうにいます。多分ネイガーさんプログラミング得意じゃないと思うので、この配置はおかしいですよね。


ただ、ある程度以上フォロー被フォローがある人はかなりいい場所にある気がします。当初の予想ともそこまでズレてなくて良い結果が取れたんじゃないかな:grin:

感想

たぶんGraphvizとかでもできるはずのようです。ありがとう秋葉先生🙏🙏🙏
フォロー情報だけでかなり正しく分類できて、正直とても驚きました。少なくとも自分が手で配置するよりよっぽどうまく配置できてると思います。当初はフォローしている人が喋っていることをword2vec系でベクトル化して、t-SNE系で2次元に写像する手法を考えていたのですが、さっとやるだけならフォロー情報だけで相当なことがわかるのですね。驚きました(2度目)。似たような問題にあたったら次は自然言語処理系から何かしらのアプローチをしてみます。
記事が楽しかったらTwitterフォロー⚡してね。