グラフのエッジリストから次数分布等をプロットするスクリプト書いた
グラフのデータを手に入れたらまずは次数分布をプロットするのが定石だけど、なぜか毎回毎回実装しなおしててアホだったから反省してちゃんと書いた。
次数分布とそのCDF、CCDFをプロットする。
要Numpy, Scipy, Matplotlib, Networkx。
使い方
言わずと知れたEnron email networkで試してみる。
まずデータをSNAPから取ってくる。
余談だけどSNAPにはいろんなネットワークデータがあって、これ眺めてるだけで楽しくなってくるね。
$ wget http://snap.stanford.edu/data/email-Enron.txt.gz $ gunzip email-Enron.txt.gz
最初の4行は余計なものが入ってるので消す(tailで+5と指定すると5行目から最後までを出力してくれる便利機能があったなんて知らなかった)。
$ head -n4 email-Enron.txt # Directed graph (each unordered pair of nodes is saved once): Email-Enron.txt # Enron email network (edge indicated that email was exchanged, undirected edges) # Nodes: 36692 Edges: 367662 # FromNodeId ToNodeId $ tail -n +5 email-Enron.txt > enron $ head -n5 enron 0 1 1 0 1 2 1 3 1 4
各行にはエッジで繋がれてるノードのペアがタブ区切り(スペースでもOK)で記述されている必要がある。左がsource、右がdestination。
あとはedgelistのファイルを指定して実行するだけ。
$ python basic_plot.py enron
結果としてenron_{in|out}degree_{distribution|cdf|ccdf}.epsの6個のプロットが出力される。
ちなみにEnronのネットワークは無向グラフなのでindegreeもoutdegreeも同じになる。
enron_indegree_distribution.eps
enron_indegree_cdf.eps
enron_indegree_ccdf.eps
実装
Networkxでedgelistを読み込んでscipy.sparseに変換してから次数分布を計算してるけどこれが良いのか悪いのか分からない。多分悪い。