ネットワークをグラフにしたいけどやり方が分からない…
Pythonって分析に使えるって聞いたけど、ネットワーク分析もできる?
NetworkXの使い方を知りたい!
「ネットワークを可視化したい。」そういう機会はあまり多くないかもしれませんが、いざやるとなると困ってしまいますよね。
こんにちは、現役エンジニアでPythonライターの遠藤です!
今回の記事では、ネットワークをNetworkXというライブラリを使って分析し、Matplotlibで可視化するまでの手順を解説致します!
この記事はこんな方へ向けて書きました。
- Pythonでネットワーク分析を行いたい方
- ネットワークをグラフ化したい方
ここでは描画までの基本を説明致します。ここでやり方を覚えたら、ドキュメントを元に応用させていく事が可能です。
是非最後までお付き合いください!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
Pythonでネットワーク分析をするにあたって
事前知識
実際に使う前に、これだけは覚えておいてください。
ノード:ネットワークにおける要素
エッジ:ネットワークにおける繋がり
NetworkXとは?
Pythonでグラフ分析を行う際に必要なライブラリを「NetworkX」と言います。ドキュメントは以下になります。
まずはこのライブラリをインストールしましょう。以下のコマンドを実行して、インストールしてください。
$pip install networkx
Pythonを実行する際にインポートできていればOKです!
Matplotlibとは?
Matplotlibはグラフを描画する際に必要なライブラリです。
こちらもインストールして使います。以下コマンドを実行して、インストールしてください。
$pip install matplotlib
環境
今回記載するコードは、Pythonの以下のバージョンで記述しました。
Python 3.7.3
完成形イメージ
この記事では、以下のようなネットワークのグラフを描画を致します。
データの準備
今回の記事では、以下のようなサンプルデータを用意しました。
- ノード:人物A~Z
- エッジ:100個のエッジをランダムで抽出
- エッジの向きは無し
実際のデータ: edgelist.txt
実際にNetworkXを使ってみよう
それでは、NetworkXを実際に使って見ましょう。
ノード・エッジの追加、数の出力
はじめに、基本的な操作を紹介します。NetworkXにノードとエッジを追加し、ノード数とエッジ数をそれぞれ出力してみましょう。
#インポート
import networkx as nx
import string
#新規グラフを作成
G = nx.Graph()
#ノードを追加
G.add_node("A")
#ノード数を出力
print(nx.number_of_nodes(G))
#リストも追加可能
G.add_nodes_from(string.ascii_uppercase)
print(nx.number_of_nodes(G))
#エッジを追加
G.add_edge("A", "B")
#エッジ数を出力
print(nx.number_of_edges(G))
#リストも追加可能
list_edge = [("C","D"), ("E", "F"), ("G", "H")]
G.add_edges_from(list_edge)
print(nx.number_of_edges(G))
実行結果:
1
26
1
4
ファイル読み込み
今度は先ほど準備したデータを読み込んでみましょう。
#インポート
import networkx as nx
G = nx.read_edgelist('edgelist.txt', nodetype=str)
# ノード数とエッジ数を出力
print(nx.number_of_nodes(G))
print(nx.number_of_edges(G))
実行結果:
26
73
100個のサンプルデータですが、エッジの重複によって数が減っています。
Matplotlibと組み合わせて描画する
ここでMatplotlibの登場です。以下のように実装することで、実際に描画することが可能になります。
#インポート
import networkx as nx
import matplotlib.pyplot as plt
G = nx.read_edgelist('edgelist.txt', nodetype=str)
#図の作成。figsizeは図の大きさ
plt.figure(figsize=(10, 8))
#図のレイアウトを決める。kの値が小さい程図が密集する
pos = nx.spring_layout(G, k=0.8)
#ノードとエッジの描画
# _color: 色の指定
# alpha: 透明度の指定
nx.draw_networkx_edges(G, pos, edge_color='y')
nx.draw_networkx_nodes(G, pos, node_color='r', alpha=0.5)
#ノード名を付加
nx.draw_networkx_labels(G, pos, font_size=10)
#X軸Y軸を表示しない設定
plt.axis('off')
#図を描画
plt.show()
実行結果:
描画はできましたが、これだけでは分析はしにくいですね。もう少し見やすい図にしましょう。
PageRank()の活用
ここで必要になるのが、PageRank()です。PageRankを実行すると、ノードの重要性をランク付けして返してくれます。
実際にPageRankを実行してみましょう。
#インポート
import networkx as nx
G = nx.read_edgelist('edgelist.txt', nodetype=str)
#PageRankの実行
print(nx.pagerank(G))
実行結果:
{'A': 0.08699871150542401, 'B': 0.039735446504893815, 'C': 0.047207314786221276, 'D': 0.03943263279649297, 'E': 0.04697942650608507, 'F': 0.04032661179150954, 'G': 0.07113707915463546, 'H': 0.04034750410677654, 'I': 0.033481322194051796, 'J': 0.034531194908522196, 'K': 0.02925575948648859, 'T': 0.02409427174592306, 'N': 0.023995509753481255, 'O': 0.045383972469482496, 'P': 0.04424116193031533, 'U': 0.03584730134160993, 'Y': 0.021625931971301002, 'W': 0.02122781775250271, 'R': 0.042806772141748106, 'Q': 0.046437940326838706, 'M': 0.03216046229996273, 'L': 0.028701775362845475, 'X': 0.05088846066175935, 'V': 0.01194856161353257, 'S': 0.02121604292846156, 'Z': 0.03999101395913429}
このように、各ノードの数値が表示されます。1に近い程重要性が高いノードです。
これを図の描画に反映させてみましょう。
#インポート
import networkx as nx
import matplotlib.pyplot as plt
G = nx.read_edgelist('edgelist.txt', nodetype=str)
plt.figure(figsize=(7, 7))
pos = nx.spring_layout(G, k=0.7)
#PageRankの追加
pr = nx.pagerank(G)
nx.draw_networkx_edges(G, pos, edge_color='y')
#node_sizeにPageRankの値を組み込む
nx.draw_networkx_nodes(G, pos, node_color='r', alpha=0.5, node_size=[5000*v for v in pr.values()])
nx.draw_networkx_labels(G, pos, font_size=10)
plt.axis('off')
plt.show()
実行結果:
円の大きさが変わりました。これを見れば、円が大きい程重要である事が分かりますね。
大きさだけでなく、値によってノードの色を変えてみても良いかも知れません。
今回はサンプルデータがかなり少ないので大きな差はありませんが、サンプルデータが増える程分かりやすい違いが出てくるかと思います。
このように、各ノードの重要性を分析することを「中心性解析」と言います。PageRankは中心性解析の一種です。
まとめ
いかがでしたでしょうか?
今回の記事では、NetworkXとMatplotlibを使ってネットワークのグラフを描画するまでの手順と、中心性解析について簡単に触れました。
NetworkXのドキュメントは英語の為読みにくいかも知れませんが、基礎さえ覚えてしまえば追加で読み進めていく事はそこまで難しくないかと思います。
是非ここで基礎を覚えて、役立ててください!
なお、今Pythonを学習している方は以下の記事もどうぞ。
はじめてPythonを使う方でもわかりやすいように、Pythonでできることやその学習法などを中心にまとめています。
復習にも使えると思いますので、ぜひ一度ご覧になってみてくださいね。
【Python 入門完全攻略ガイド】