Networkxを始めよう!


Networkxを用いた社会的経済的ネットワークの分析

 Pythonのsite-package networkxがインストールされていることを前提とします。例えば、Anacondaを用いてPythonをインストールすると、networkxも一括してインストールされるので、即座に利用可能となります。グラフを表示するためには、matplotlibパッケージが必要なので、この使用方法についても知識があると想定します。PythonのページにあるTutorial #2を参照して下さい。質問や修正などは、mashiyam@eco.meijigakuin.ac.jp までお願いします。



・ Networkx Tutorial #1:簡単なネットワーク作成の方法

ネットワークを作成するためには、作成するネットワークに名前を付ける必要がある
import networkx as nx
G=nx.Graph()
と記述すると、 名前がGという(空の)ネットワークが作成される。このGに必要なノードとリンクを付け加えて、作成すべきネットワークを構成して行く。以下の例は10個のノードからなるネットワークを描くscriptである。Nはノードの集合、Eはリンクの集合を定義している。
G.add_nodes_from(N)
で、Nで与えられたノードを加え、
G.add_edges_from(E)
と書くと、集合Eのリンクをもつネットワークが出来上がる。# drawing ...以下の記述はこのネットワークをグラフィックに描くコードになっている。
*******************************
# -*- coding: utf-8 -*-
# creating a new network
import networkx as nx

G = nx.Graph()
N=[1,2,3,4,5,6,7,8,9,10]
E= [(1,2),(1,8),(2,3),(2,4),(4,5),(6,7),(6,8),(8,9),(8,10)]
G.add_nodes_from(N)
G.add_edges_from(E)
# drawing the created network
import matplotlib.pyplot as plt

nx.draw_networkx(G,with_labels=True, node_color='r')
plt.axis('off')
plt.title('an example')
plt.savefig("example.png") # save as png
plt.show()
**********************************
このscriptを実行すると、以下のようなネットワークの図が表示される。plt.savefig('example.png')は'example'という名前の画像ファイルをpng形式で保存させるための命令文である。




・ Networkx Tutorial #2:Networkxのグラフ作成関数generatorsの使用方法の例

ここでは、ネットワークを作成する組み込み関数generatorsを用いて、グラフを表示する例を提示します。
ランダムネットワークを描く。組み込み関数はerdos_renyi_graph(n, p)を用いた。


ノード総数がn、連結確率がpであるとき、エルデシュ_レーニイ型ランダム・ネットワークの次数分布は平均値(n-1)pのポアッソン分布に(近似的に)従うことが知られている。このケースでは、n=100,p=0.1である。 この例のランダムネットワークの次数分布は以下の図に示されている。ポアッソン分布で近似できることが分かる。
・source code py.scriptファイル

スモールワールド・ネットワークを描く。ここでの例は、ノード総数100で、各ノードが4人の隣人に連結している初期状態から、確率0.2でこのリンクを外してランダムに選んだ他のノードに連結される。Watts_Strogatz型のモデルである。組み込み関数はwatts_strogatz_graph(n, k, p)を用いた。


この例のスモールワールド・ネットワークの次数分布は以下の図に示される。
・source code py.scriptファイル

preferencial attachmentネットワークを描く。組み込み関数はbarabasi_albert_graph(p,m)を用いた。


Barabasi_Albert型ネットワークの次数分布は以下の通りである。
・source code py.scriptファイル


・ Networkx Tutorial #3:Networkxのalgorith 関数の使用方法の例

上記の次数分布のグラフを描くscriptは以下のようになる。このコードでは、ネットワークはWatts_Strogatz型の組み込み関数を使用している。次数系列(degree_sequence)は大きい順からソートしている。ソートしない場合には、degree_sequence = G.degree().values() と書く。kukan はヒストグラムの階層区間を指定している。histogram関数の変数で、normed=Trueと指定しているのは、確率密度関数にするためである。plt.hist関数を用いて描くこともできるが、ここでは、より簡単なplt.plot関数を用いた。
***********************************************************************************************
import netwrkx as nx
import numpy as np
import matplotlib.pyplot as plt

G=nx.watts_strogatz_graph(100,4,0.2)

degree_sequence=sorted(nx.degree(G).values(),reverse=True)
print ("Degree sequence = ", degree_sequence)
dmax=max(degree_sequence)
dmin =min(degree_sequence) #not necessary
kukan=range(0,dmax+2)
hist, kukan=np.histogram(degree_sequence,kukan,normed=True)

# drawing the degree histogram
plt.figure()
plt.plot(hist)
plt.xlabel('degree')
plt.ylabel('relative frequency')
plt.title('degree frequency')
plt.grid(True)
plt.savefig('degree_hist.png')
plt.show()
***********************************************************************************************
このscriptをコピーして、実行してみて下さい。
次に、中心化度という測度の計算をしてみよう。15世紀イタリア・フィレンツェで有力な家系間のネットワークを取上げ、その中でMedici家が強大な権力を維持できたかについて考えてみよう。

Medici家を含むこのネットワークで、betweenness cetrality(中継中心化度)の計算をすると、ノード順に
{0: 0.0055, 1: 0.1484, 2: 0.0714, 3: 0.1374, 4: 0.2582, 5: 0.6319, 6: 0.1429, 7: 0.0, 8: 0.1538, 9: 0.0, 10: 0.0, 11: 0.1429, 12: 0.0, 13: 0.2198, 14: 0.0}
になる。Medici家はノード番号5なので、この係数は0.6319であることが分かる。この係数値は15家系の中で突出して大きな値である。次に大きな係数値は0.2582のBarabadori家である。degree centrality係数はノード順に
{0: 0.2142, 1: 0.2857, 2: 0.2142, 3: 0.2142, 4: 0.2142, 5: 0.4285, 6: 0.2142, 7: 0.0714, 8: 0.2142, 9: 0.0714, 10: 0.0714, 11: 0.1428, 12: 0.0714, 13: 0.2142, 14: 0.0714}
と計算される。degree centralityの係数の値もMedici家が最大となっている。また、各家系の次数分布はノード順に
[3, 4, 3, 3, 3, 6, 3, 1, 3, 1, 1, 2, 1, 3, 1]
となっている。ノード番号5のMedici家が最も多いリンク数6をもつ。以下のような命令文を書けば、以上の結果が表示される。
***********************************************************************************************
print('the clustering coefficient for nodes = ',nx.clustering(G))
print('degeree sequence = ',G.degree().values())
print('degree histogram = ', nx.degree_histogram(G))
print('degree centrality = ',nx.degree_centrality(G))
print('betweenness centrality = ', nx.betweenness_centrality(G))
***********************************************************************************************

フィレンツェの家系ネットワークを分析したpy.ファイル

・ ネットワーク理論の解説pdf_ファイル
簡単なグラフ(ネットワーク)理論の解説については、 増山の講義ノートを参照ください。pdfファイルです。

Les Miserables の登場人物の人間関係を描くネットワークのためのgmlファイルは ここにあるファイルです。

空手クラブにおける人間関係を描くネットワークのためのgmlファイルは ここにあるファイルです。

トップページに戻る