LoginSignup
39
28

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-17

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

概要

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

39
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
28