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

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

遠藤貴大

遠藤貴大

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