Edited at

TwitterのフォロワーをNetworkX, Cytoscapeで可視化

More than 1 year has passed since last update.

初投稿です.緊張してます.


概要

Twitterの指定したユーザのフォロワーたちをCytoscapeで可視化してみました.

定番のテーマですね.ネットワークの操作には,導入の簡単さを考慮してNetworkXを使用します.

また,ここでは知り合いのアカウント4つのフォロワーを取得・可視化しています.


環境


  • Python 3.6.2


    • tweepy 3.5.0

    • Networkx 2.1



  • Cytoscape 3.5.1


流れ


  1. Python, tweepyを用いてTwitterの指定ユーザのフォロワー一覧を取得します.

  2. NetworkXを用いてフォロワー一覧をグラフオブジェクトに変換します.

  3. gml形式で保存します.

  4. Cytoscapeで保存したgmlファイルを読み込みます.

※ Twitter APIは操作できる前提とします.


API認証

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)

auth.set_access_token(ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRET)

api = tweepy.API(auth, wait_on_rate_limit=True)


フォロワー取得

def getFollowers_ids(api, id):

# Get Id list of followers
followers_ids = tweepy.Cursor(api.followers_ids, id=id, cursor=-1).items()

followers_ids_list = []
try:
followers_ids_list = [followers_id for followers_id in followers_ids]
except tweepy.error.TweepError as e:
print(e.reason)

return followers_ids_list


取得したデータを辞書型に整形

NetworkXでは,辞書型のデータをそのままネットワークに変換することができるので,そのために整形をしています.Keyは「指定したユーザのid」,Valueは「フォロワーのidのリスト」です.

また,指定したユーザの情報がidのみだと不便なので,「screen_name」「フォロー数」「フォロワー数」も取得し,辞書型に整形しています.Keyは「ユーザのid」,Valueは「上記3つをキーに持つ辞書」です.

(idとscreen_nameは違うものなので注意.@~~~の部分がscreen_nameです.)


center_to_followers = {}
node_attrs = defaultdict(dict)

# center account: @hoge, @hogehoge
CENTER_ACCOUNTS = ['hoge', 'hogehoge']

for center_screen_name in CENTER_ACCOUNTS:

# get center account information (node attributes)
center_info = api.get_user(screen_name=center_screen_name)

# get id of center account
center_id = center_info.id

node_attrs[center_id]['screenName'] = center_screen_name
node_attrs[center_id]['followersNum'] = center_info.followers_count
node_attrs[center_id]['followNum'] = center_info.friends_count

center_to_followers[center_id] = getFollowers_ids(api=api, id=center_screen_name)

# set empty value to account attribute that is not center
for follower_id in center_to_followers[center_id]:
node_attrs.setdefault(follower_id, {'screenName': '', 'followersNum': '', 'followNum': ''})


NetworkXのグラフオブジェクトに変換 / gml形式で保存

NetworkXにあるfrom_dict_of_lists()を使用することでネットワークオブジェクトを作成できるので,先程の辞書からネットワークオブジェクトを作成.さらに,「screen_name」などを含むノード情報を,set_node_attributes()を用いてネットワークの各ノードに持たせます.

最後に,write_gml()を用いてgml形式で保存すればPythonの操作はおしまいです.

graph = nx.from_dict_of_lists(center_to_followers)

nx.set_node_attributes(graph, node_attrs)
nx.write_gml(graph, 'twitter.gml')


Cytoscapeで読み込み

Cytoscapeを起動して,先程作成したgmlファイルをドラッグ・ドロップで読み込みます.

恐らく,最初は,デカい1つのノードのような物が表示されると思うので,メニューバーからLayout -> Apply Preferred Layoutを選択する事で,それっぽく見えるようになるかと思います.

image.png

あとは,目的や好みに合わせてレイアウトを編集すればOK.

Cytoscapeはgmlファイルに含まれるノード情報などもしっかりと保持してくれているので,フォロワー数によってノードの大きさなどを変えることも可能です.

image.png

下の画像は,以下の処理をしたものです.少し大きいノードが今回指定した知り合いの4つのアカウントですね.



  • Styledefaultからdefault blackに変更

  • Control Panelから,Style -> Size -> Column, Mapping Type を変更してノードのサイズを変更


  • View -> Show Tool Panelでスケールを変更


  • Layout -> Bundle Edges -> All Nodes and Edgesでエッジを束ねる


  • Layout -> Circular Layoutでレイアウトを変更

image.png


あとがき

定番の可視化をやってみました.今回はgmlファイルを経由しましたが,Jupyter上で簡単にCytoscapeを操作できるようなので,その辺もおいおい触ってみたいです.

あと,編集時,画像サイズ制限知らなくて,ちょっと詰んでました.


参考

TweepyでフォロワーのIDを全て取得してみた - Research Tips

Cytoscape / cyRESTとpy2cytoscapeを用いたIPython Notebook上でのグラフ解析と可視化 Part 1 - Qiita