Pythonを使ったネットワークの可視化

本記事は、[Mohit Mayank](https://mohitmayank.medium.com/)氏による「[Visualizing Networks in Python](https://towardsdatascience.com/visualizing-networks-in-python-d70f4cbeb259)」（2021年1月26日公開）の和訳を、著者の許可を得て掲載しているものです。

#Pythonを使ったネットワークの可視化
>ネットワークを「見る」のに役立つツールの実践ガイド

![](https://miro.medium.com/max/1400/1*hGSB_iuTvjU59oycsswd7A.jpeg)
Photo by [Scott Webb](https://unsplash.com/@scottwebb?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/network?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)

>この記事のコードは、この[リポジトリ](https://github.com/imohitmayank/got_network_viz_python)ですべて公開されています。
>**【更新情報】2021年2月2日**：ネットワーク可視化のためのpythonパッケージ[Jaal](https://github.com/imohitmayank/jaal)をリリースしました。後述のリストのオプション4と考えることができます。ぜひ使ってみてください。詳細については、[このブログ](https://mohitmayank.medium.com/introducing-jaal-interacting-with-network-made-easy-124173bb4fa)に記載があります。

##はじめに

ネットワークまたはグラフは、相互に関係を持つエンティティの特別な表現です。ネットワークは、(1) ノード（エンティティ）と (2) エッジ（2つのノード間の接続）の、2つの汎用オブジェクトのコレクションで構成されています。複雑なネットワークでは、各ノードやエッジに関連付けられた属性や特徴もあります。例えば、人物のノードは、年齢、性別、給与などの属性、「友人」という2人の人物間のエッジでは、friends_since、last_meetingなどの属性を持つ場合があります。この複雑な性質のため、ネットワークを直感的に描き、できるだけ多くの情報を見せることが必要不可欠です。そのためにはまず、利用可能なさまざまなツールについて知る必要があります。それがこの記事のテーマであり、ネットワークの可視化に役立つさまざまなオプションについて説明します。それでは、さっそく始めましょう！

##NetworkXを使ったネットワーク分析

ネットワークの可視化に入る前に、まずPythonの[NetworkX](https://networkx.org/)を使って、グラフデータの見え方とメモリにロードする方法を理解しましょう。次は、ゲーム・オブ・スローンズ（GoT）のソーシャルネットワークを表形式で表したものです。ここでは、GoTの登場人物がノードで、2人の人物間のエッジは、人物の名前が本の中の15語以内で共起していることを意味します。

![](https://miro.medium.com/max/700/1*bkhcMu3Euqy0MEXFgxw0-Q.png)

最初の2列はノード（GoTの登場人物）で、SourceとTargetの1組は2人の人物間のエッジです。1冊目のデータセットだけを見ると、187の一意の人物と684の接続（行）があります。また、weightの列は接続の重要性を示し、1冊目で（上で定義した通り）近辺の2人の人物の名前が出た回数です。ネットワークを管理しやすくするために、`weights>10`のエッジを残すことで、強い接続だけを対象にします。これにより、グラフは80ノード（人物）と175エッジ（接続）にトリミングされます。

ネットワークとしてこのpandasデータフレーム形式のデータをロードするのは、非常に簡単です。NetworkXを使って、次のように行います。

![](https://miro.medium.com/max/700/1*DzztJtikTXXcHdOB7gXZvQ.png)

できました！変数`G`は、グラフ関連の操作ができるNetworkXのグラフになりました。さて、前提条件を満たしたので、さまざまな可視化オプションを1つずつ見ていきましょう。

##オプション1：NetworkX

NetworkXには独自の[描画](https://networkx.org/documentation/stable/reference/drawing.html)モジュールがあり、プロット用オプションが複数用意されています。次は、パッケージ内のいくつかの描画モジュールの可視化です。どのモジュールも使い方はかなり簡単で、モジュールを呼び出して`G`グラフ変数を渡すだけです。残りはパッケージがしてくれます。

![](https://miro.medium.com/max/700/1*39Werzs2P1eP6kdGjySxqA.png)

可視化オプションは、デフォルトのpythonグラフパッケージに組み込まれており、非常に簡単に呼び出すことができますが、直感に反し、小規模ネットワークにしか適していません。大規模ネットワークでは、ほとんどの場合、組み込みモジュールの呼び出しはあまり意味がありません。そのため、比較的大規模なネットワークデータを使っている場合は、このオプションはあまり良い選択ではありません。もう1つの欠点は、インタラクティブではないため、プロットが固定されたグラフになることです。手動でグラフを操作できるオプションが他にあるので、これは大きな欠点です。この点を踏まえて、次のオプションに行きましょう。

##オプション2：PyVis

[PyVis](https://pyvis.readthedocs.io/en/latest/index.html)は、インタラクティブなネットワーク可視化のPythonパッケージで、NetworkXグラフを入力として受け取ります。ノード、エッジ、レイアウト全体をカスタマイズする[複数のスタイルオプション](https://pyvis.readthedocs.io/en/latest/tutorial.html)も提供します。最も良いのは、設定ペインを使って、すぐに実行でき、さまざまなオプションを試して、最終的な設定をpython辞書形式でエクスポートできることです。この辞書は、後で関数を呼び出す時にconfigとして渡して、ネットワークをそのまま描画することができます。また可視化では、ズーム、選択、ホバーなどの基本的なオプションがあります。いいでしょう？😉

デフォルトでは、GoTネットワークの描画は、次の方法で簡単にできます。

![](https://miro.medium.com/max/700/1*kL0jDPq_OhwYOKvjjB3hfw.png)

次のようにネットワークをプロットします。

![](https://miro.medium.com/max/700/1*o8k89els_3FwF0t0Bxpb4A.gif)

##オプション3：Dashでvisdcc

これまでのオプションの主な欠点は、[Dash](https://plotly.com/dash/)などのインタラクティブなダッシュボードで使うのが非常に難しいことです。これはパッケージが、選択やズームなどの手動操作をサポートするだけでなく、データ変更やプロパティの変更などのプログラム操作を自動的に調整する必要があるためです。この機能は、Pythonに[visjs](https://github.com/visjs/vis-network)を移植した[visdcc](https://github.com/jimmybow/visdcc)でサポートされています。コールバックを使って、グラフやグラフの一部の選択されたプロパティを変更するのがかなり簡単になります。コールバックは、Dashは、ボタンやラジオ選択オプションなどのウィジェットに接続できます。次は、GoTデータセットのDashアプリの例です。

![](https://miro.medium.com/max/700/1*1vkbHSQ1oSsJACM4WM7NsQ.png)

ここでは、先のようにGoTネットワークをプロットしています。また、グラフにコールバックを追加し、オプションを選択するとグラフ全体の色が変更されるようにしています。なお、これはダミー例なので、検索オプションの追加（任意の登場人物の検索）や、フィルタの重みの調整（固定値10から変更）など、適用範囲は非常に広いです。次は、ダミー例を使ったDashアプリです。

![](https://miro.medium.com/max/700/1*byYVXPzCQQkfpDT3QIsQ6g.gif)

##おわりに

この記事の目的は、ネットワークデータを可視化するためのPythonのさまざまなオプションを紹介することです。オプションリストは、小さくて複雑でない（接続が少ない）グラフを可視化できる、組み込みNetworkXプロットモジュールから始めました。より大きなグラフの場合は、自動レイアウト（ノードをできるだけ離す）と手動操作（ズーム、ドラッグ、選択など）をサポートするPyVisがあります。最後に、ノードとエッジのプロパティに関するネットワークの変化を分析して、ネットワークをさらに操作するという大掛かりな場合です。visdccを使ってDashでネットワークをプロットし、コールバックを使って機能をグラフに接続できます。お役に立てれば嬉しいです🙂　ありがとう。

##翻訳協力

この記事は以下の方々のご協力により公開する事ができました。改めて感謝致します。

Original Author: [Mohit Mayank](https://mohitmayank.medium.com/) ([website](http://mohitmayank.com/), [Linkedin](https://www.linkedin.com/in/imohitmayank/), [Twitter](https://twitter.com/imohitmayank))
Original Article: [Visualizing Networks in Python](https://towardsdatascience.com/visualizing-networks-in-python-d70f4cbeb259)
Thank you for letting us share your knowledge!

選定担当: @gracen
翻訳担当: @gracen
監査担当: -
公開担当: @gracen

##ご意見・ご感想をお待ちしております
今回の記事はいかがでしたか？
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。
頂いたお声は、今後の記事の質向上に役立たせて頂きますので、お気軽に
コメント欄にてご投稿ください。[Twitter](https://twitter.com/BabyDegu?lang=ja)でもご意見を受け付けております。
皆様のメッセージをお待ちしております。