Pythonでネットワークを分析・可視化しよう!必要手順まとめ


ネットワークをグラフにしたいけどやり方が分からない…
Pythonって分析に使えるって聞いたけど、ネットワーク分析もできる?
NetworkXの使い方を知りたい!

「ネットワークを可視化したい。」そういう機会はあまり多くないかもしれませんが、いざやるとなると困ってしまいますよね。

こんにちは、現役エンジニアでPythonライターの遠藤です!

今回の記事では、ネットワークをNetworkXというライブラリを使って分析し、Matplotlibで可視化するまでの手順を解説致します!

この記事はこんな方へ向けて書きました。

  • Pythonでネットワーク分析を行いたい方
  • ネットワークをグラフ化したい方

ここでは描画までの基本を説明致します。ここでやり方を覚えたら、ドキュメントを元に応用させていく事が可能です。

是非最後までお付き合いください!

Pythonでネットワーク分析をするにあたって

事前知識

実際に使う前に、これだけは覚えておいてください。

ノード:ネットワークにおける要素
エッジ:ネットワークにおける繋がり

NetworkXとは?

Pythonでグラフ分析を行う際に必要なライブラリを「NetworkX」と言います。ドキュメントは以下になります。

NetworkXのドキュメントはこちらから

まずはこのライブラリをインストールしましょう。以下のコマンドを実行して、インストールしてください。

$pip install networkx

Pythonを実行する際にインポートできていればOKです!

Matplotlibとは?

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()

実行結果:

Matploglibを使っての描画

描画はできましたが、これだけでは分析はしにくいですね。もう少し見やすい図にしましょう。

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 入門完全攻略ガイド

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

遠藤貴大

遠藤貴大

1991年生まれ。双子座。
理系大学で認証システムを学んだ後、アプリ開発者となる。
新しく学ぶ人に寄り添った記事を心がけて執筆します。
芸術が好き。いつか猫と暮らすのが夢。