技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く興味があります。

networkxでネットワーク特徴量の分析

networkxを触った時の備忘録。今回扱ったのは無向グラフに限る。
用語などの解説は別の記事に譲りたい。
(networkx(1.11.0) python(2.7.12))

適当なグラフを作成・可視化

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

# generate graph (WS model)
G = nx.watts_strogatz_graph(n=100,k=5,p=0.75)

# visualize
nx.draw(G)
plt.show()

ランダムグラフとして、WSモデルのグラフを生成した。

f:id:swdrsker:20161208184525p:plain:w400

他のデータ型からの読み込み,書き出しもできる

# load from binary numpy array
matrix = np.random.binomial(1,0.1,size=[100,100])
Gnp = nx.from_numpy_matrix(matrix)

# write to numpy array
connection = nx.to_numpy_matrix(G)
plt.imshow(connection,interpolation='none',cmap="gray")
plt.show()

# pandas dataframe
Gdf = nx.from_pandas_dataframe(DATAFRAME)
connection_df = nx.to_pandas_dataframe(G)

numpyのarrayとして扱うと、色々な計算もしやすくプロットもできる。
f:id:swdrsker:20161208184600p:plain:w300

色々な特徴量を見てみる

エッジ

具体的にどことどこがつながっているか

G.edges()

最短経路・経路長

辞書型で返ってくるので、知りたいノード間の番号を指定

print nx.shortest_path(G)[0][1]
print nx.shortest_path_length(G)[0][1]

[0, 62, 18, 41, 44, 1]
5

次数

辞書型で返ってくるので、知りたいノードの番号を指定

print nx.degree(G)[0] # degree of each node (return: dict)

3

平均最短経路長

print nx.average_shortest_path_length(G) # average shortest path length

3.426060606

平均次数

平均次数を直接出すものはないっぽい

print np.average(nx.degree(G).values()) # average degree

4.0

次数の分布を見てみる

bins = range(1,12)
plt.hist(G.degree().values(), bins=bins)
plt.show()

f:id:swdrsker:20161210001849p:plain:w250

pythonにこだわらないならネットワークの分析はRのigraphに任せたほうがいいらしい。
pythonはwebを扱うライブラリがあったりAPIを使えたりするのでデータを取得するところと連携して処理するには便利かもね。