Python/NetworkXで簡単ネットワーク分析

slaさん主催のNumpy/Scipy勉強会でLTをします。
内容はNetworkXというPythonのネットワーク分析パッケージの紹介です。


ネットワーク分析と言えば、PajekやRのigraphが定評有りますが、
これらはどうしてもサブグラフの扱いに不満がありました。
ネットワークからサブグラフを抽出するところまでは出来ますが、
各サブグラフがどのような性質を持つか分析したい場合、
指定したサブグラフを形成しているノード、エッジ、重みの情報を簡単に取り出す方法がありません。
NetworkXであれば、指定したノードやエッジだけ隣接行列や辺行列の形で入出力することが可能です。
また、ネットワーク分析は非常に計算量が大きく、高速な演算が求められるため、データをNumpyへ簡単に渡せること、
ネットワークに重みや様々な属性を持たせることが出来る事など、
前述のPajekやRのigraphには無い嬉しい機能があります。
ただ、よくある中心性や密度、距離を求める機能はigraph等の方がずっと充実しています。
igraphとNetworkXの機能は、お互い足りたいところを補完し合える関係にあるため、
上手く連携させていければ心強いツールになりそうです。
ネットワーク全体のざっとした分析はigraphに任せて、
サブグラフの編集・加工や独自でアルゴリズム実装して行う分析はNetworkXに任せるなど。
特に実データを解析する場合、Webアプリを作成したりクローラーを回したりといった処理も必要になりますが、
NetworkXなら、それらをPythonでシームレスに実装出来ます。
Pythonで面白いアプリケーションを作って、そのデータをどんどんNumpy/Scipyに渡して分析していきましょう!


今回のソース

from pylab import *
from networkx import *
import twitter

#コンシューマーキーやアクセストークンの情報を入力
api = twitter.Api(consumer_key = your_consumer_key,
		consumer_secret = your_consumer_secret, 
		access_token_key = your_access_token_key, 
		access_token_secret = your_access_token_secret, 
		input_encoding = "UTF-8")

#twitterからフォローしてる人のリストを取得
friends = api.GetFriends()

G = networkx.Graph()

#自分と自分がフォローしている人の間にエッジを張る
for friend in friends:
    G.add_edge(myname,friend.screen_name)

#自分がフォローしてる人と、その人がフォローしてる人との間にエッジを張る
for friend in friends:
    for user in api.GetFriends(friend.id):
    	if user in friends:
            G.add_edge(friend.screen_name,user.screen_name)

#バネ指向モデルというアルゴリズムで各ノードを見易いように配置
pos = spring_layout(G)

#ノードやエッジの見た目調整
draw_networkx_nodes(G, pos, node_size = 100, node_color = 'w')
draw_networkx_edges(G, pos, width = 1)
draw_networkx_labels(G, pos, font_size = 12, font_family = 'sans-serif', font_color = 'r')

xticks([])
yticks([])
savefig("egonetwork.png") 
show()