ネットワークが可視化できるライブラリ「NetworkX」とは?
はじめに
Pythonは1991年にオランダで開発された歴史の長い言語で、統計処理や数値計算を得意とすることから、2022年時点ではAIやディープラーニング、ビッグデータシステムの構築に広く利用されている人気のプログラミング言語となっています。またPythonには多くのフレームワーク やライブラリが用意されていて開発の効率化、スピードアップをサポートしていますが、その中の一つに今回紹介する「NetworkX」というライブラリがあります。「NetworkX」は2000年代にリリースされたライブラリですが、これを利用することで、ネットワーク状況含め、頭の中だけではまとめづらいデータを一目でわかるようなグラフにして可視化できます。この記事ではネットワークの可視化がどういったものであるかを解説したうえで、NetworkXの概要、NetworkXを利用した可視化の方法について紹介していきます。データ分析のために可視化を行いたいという方、Pythonで分析をしたいという方はぜひご覧ください。
ネットワークの可視化とは?
この記事はIT関連の内容となるため、その中でネットワークという言葉を聞くとどうしても通信経路のことを想像しますが、ここでいるネットワークは広義であり、コンピュータ機器の通信経路はもちろん、物流や鉄道、エネルギー等様々なネットワークを可視化するのに利用できます。可視化するためにvertexやnodeと呼ばれる「頂点」と、edgeやarcと呼ばれる「辺」を利用して表現されます。なお頂点、辺はそれぞれ重み(weight)等の属性を持ち、頂点の持つ辺の数は「次数(degree)」と呼ばれ、これらの集まりをネットワークまたはグラフ(Graph)と呼ぶことになります。NetworkXで可視化を行う際には頂点、辺、次数、ネットワークという4つの要素を使って表現するということを抑えておきましょう。
「NetworkX」のインストール方法
NetworkXはPython本体に含まれる組み込み系のライブラリではないため、「pip」や「conda」といったコマンドでインストールする必要があります。pipは「Pip Installs Packages」の略で、Pythonで公式に登録されているパッケージのインストール・アンインストール時に利用されるコマンドです。condaは、Pythonの開発環境の一つであるAnaconda内で利用されるコマンドで、pip同様にパッケージのインストール・アンインストールが可能ですが、condaの場合はAnacondaで管理されているリポジトリからインストールが行われ、パッケージ間の依存関係チェックも行ってくれます。準備されている開発環境によってどちらかを使ってインストールをしてください。
なおpipコマンドの場合は「pip install network」、condaコマンドの場合は「conda install network」を実行することでインストール可能です。最新バージョンにアップグレードをしたい場合はそれぞれ「pip install --upgrade networkx」「conda update networkx」を実行しましょう。必須ではありませんが、Pythonには「matplotlib」というグラフ描画のためのライブラリがあり、こちらもあわせてインストールしておくと便利です。今回は「matplotlib」を含めての説明しています。インストールは「pip install matplotlib」というコマンドでできます。
またNetworkXをプログラム内で利用する際にはインポートの記述が必要となりますが、その際は「nx」という別名でインポートするというルールがあり、記述は「import networkx as nx」となります。
はじめに覚えておきたい表記や用語
NetworkXでは、グラフを表記するに当たってV、E、Gというアルファベットが利用されます。これらは前述したVertex(頂点)、Edge(辺)、Graph(グラフ)の頭文字をとったもので、例えばVとEからなるグラフを明示的にする際は「G(V,E)」と表すことができます。
次にグラフの種類ですが、全部で4つあります。具体的には単純グラフ(自己ループ含む)としての「Graph(無向グラフ)」「DiGraph(有向グラフ)」、多重グラフとしての「MultiGraph(無向グラフ)」「MultiDiGraph(有向グラフ)」があります。無向グラフでは辺を線で描画しますが、有向グラフの場合は矢印で描画します。またGraphやDiGraphは、辺が一意に決まるグラフを作成する際に利用し、MultiGraphやMultiDiGraphは、逆に辺が一意に決まらないグラフを作成する際に利用します。なお以上説明した中だけですでに普段聞き慣れない単語が多く含まれていることでしょう。NetworkXではグラフに関する独特な用語があり、覚えておくと便利なため以下に紹介します。
単純グラフ(simple graph)
自己ループ、多重辺のいずれも含まないグラフを指します。
多重グラフ(multi graph)
単純グラフに限定されないグラフ
無向グラフ(undirected graph)
無向辺のみからなるグラフ
有向グラフ(directed graph)
有向辺のみからなるグラフ
自己ループ(loop)
両端が同じ頂点となっている辺
多重辺(multiple edges)
2つの頂点の間に複数の辺がある状態を指します。
有向辺(directed edges)
向きを持つ辺です。
無向辺(undirected edges)
向きのない辺です。
歩道
ある頂点から別の頂点へたどり着ける辺のことです。
路
辺が重複しない歩道のことです。
パス(道)
頂点が重複しない路のことです。
閉路
始点と終点が同じ路のことです。
サイクル
始点と終点が同じパスのことです。
木(tree)
サイクルがなく連結しているグラフのことです。
森(forest)
サイクルがなく連結していない部分もあるグラフのことです。
「NetworkX」の基本的な使い方
それでは実際に簡単なプログラミング方法を紹介していきます。以下は一本の横に伸びた辺の両端に頂点AとBがあるネットワークが作成できるコードとなります。
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_node("A")
G.add_node("B")
G.add_edge("A", "B")
pos = {}
pos["A"] = (0, 0)
pos["B"] = (1, 0)
nx.draw(G, pos, with_labels=True)
plt.show()
まず冒頭の「import networkx as nx」は前述したようにnetworkxのインポートであり、2行目の「import matplotlib.pyplot as plt」は、グラフを描画する際のライブラリ「matplotlib」のpyplotというモジュールをインポートするための記述です。
次の「G = nx.Graph()」でグラフのオブジェクトを生成しています。その後「G.add_node(“A”)」「G.add_node("B")」で頂点A、Bを設定し、その間に辺を設けることを「G.add_edge("A", “B")」で定義し、「pos = {}」「pos["A"] = (0, 0)」「pos["B"] = (1, 0)」で頂点それぞれの座標を指定します。そして最後に「nx.draw(G, pos, with_labels=True)」でネットワークを描画、matplotlibのメソッド「plt.show()」で実際に表示させます。以上を実行することで左側にA、右側にBそれぞれの頂点があり、その間を一本の線(辺)でつなげたネットワークが表示されます。
なお複数の辺があり一つの辺だけを強調したい場合、辺に対して重みを付けることが可能です。重みをつけることで、大きい数字が指定された方の辺が太くなります。重みを付ける場合は「edge_weight = (1, 10)」のように記述します。
また「add_path」を利用して複数の頂点、辺を持つネットワークが作成可能ですが、このメソッドを利用すると「add_node」で頂点を指定しなくても、例えば「nw.add_path(G, [0, 1, 2, 3, 4, 5, 6, 7, 8])」というように入力すると0〜8の数字が自動的に頂点として設定されます。
すでに作成されているネットワークの情報を確認したい場合は「nx.info」というメソッドを利用します。例えば「print(nx.info(G))」のように実行すると、グラフの種類や頂点・辺の数等の情報を確認できます。他にも頂点の情報を確認する際の「G.number_of_nodes」「G.nodes」、辺の情報を確認する際の「G.number_of_edges」「G.edges」、各頂点の持つ次数(辺の数)の情報を確認する「G.degrees」といったメソッドもあります。
見た目のカスタムについて
NetworkXを使って図にすることでイメージでしか存在しないものを可視化することができ、重みを付けることで強調等も可能ですが、さらに資料に使えるような見やすさをプラスするには色付けや大きさを変更しての表現も必要となることでしょう。NetworkXではそれらが可能です。
頂点の色は「node_color」で指定できますが、初期値は「’C0’(薄い青)」となっています。例えば「node_color = “red”」というように色の名前で指定が可能です。頂点のサイズは「node_size」で指定できますが、初期値は「300」となっています。
辺の色は「edge_color」で指定できますが、初期値は「’black’(黒)」となっています。頂点の太さは「width」で指定できますが、初期値は「1」となっています。以下のように各項目を指定することで、色が緑でサイズが500の頂点、色が灰色で太さが5の辺が表示可能となります。
nx.draw(G, with_labels=True, node_color = "green", edge_color = "gray", node_size = 500, width = 5)
plt.show()
まとめ
NetworkXは、初めのうちは完成形を描きづらく慣れるまで時間がかかるかもしれません。しかし一度習得してしまえば見た目のカスタマイズも可能なため、ネットワークだけではなく、プレゼンの資料作りや自己分析のためのグラフ作り等、汎用的に利用できて便利なライブラリです。これからPythonを学習したいと思っている方は、ぜひ手始めにNetworkXを利用してみてはいかがでしょうか。なおPythonは人気のプログラミング言語であるためオンライン上の学習サイトや情報も充実しているので、つまづいた時はぜひこの記事含め、インターネット上の情報を一度検索してみることをおすすめします。