Pythonのnetworkxモジュールを使ってネットワーク解析、可視化を実装する方法

スポンサーリンク

マネジメントやワークフローのプロセスを評価・管理・追跡するためのアプローチをネットワーク解析といいます。

また、データ分析は、構造のノードと要素のグラフィカルな図を作成するのに役立ちますが、ネットワーク図は、ワークフローとは異なり、イベント、目的、割り当ての時系列のシリーズと、それらの時間枠と依存関係を調べ、ツリーまたはガントチャートのような表として視覚的に描画されます。

プロジェクトリーダーは、プロジェクトプランを作成する際に、以下のような要因に対処するために、ネットワーク分析が必要になることがあります。

  • タスクの相互依存性
  • タスクの相互依存性 ・アクションとアクションの間の期間と効果的なバッファー方法
  • 開始日と終了日、最も古いものから最新のものの一つまで。
  • 活動間隔
  • 最も重要なタスクとアクティビティのための経路を開発します。

ネットワーク分析法は、設計から開発段階まで、プロジェクト管理を強化し、タスクが予算内で納期内に納品されるようにするために、一般的に使用される方法です。

スポンサーリンク

Python でネットワーク解析を実装する方法

Pythonでネットワーク解析を行う方法はたくさんあります。

また、ネットワーク解析のグラフを描画するためのツールも多くありますが、今回は特に強力なネットワーク描画ツールであるnetworkxとmatplotlibを使用します。

ここでは、オンラインで利用可能ないくつかのユーザデータベースを用いて、ネットワークプロットを理解することにします。

この例では、有名な小説の作者が生きていた時代に住んでいたかもしれない、16世紀ベースの中国の人口記録を2つ取得し、彼を知っていたかもしれない人々のグラフを作成してみます。

まず、パッケージのインポートから始めましょう

import networkx as nx
import matplotlib.pyplot as plt

データベースを抽出するためのGithubリンクです。

gitフォルダには複数のファイルがありますが、今回は’edges.tsv’と’nodes.tsv’のみを使用します。

これらのワードファイルには、すべての履歴データが含まれています。

def data_extraction(name_ofile):
    # Here, data loading will be done through a context manager
    with open(name_ofile, 'r', encoding='utf8') as rf:
        # transform file into string and split along new line
        filelines = rf.read().split("
"
)
 
        # new line will be created at tab spaces
        filedata = [line.split(" ") for line in filelines]
 
        # picks the header
        fileheader = filedata[0]
 
        # header gets deleted
        filedata = filedata[1:]
 
    # return header and data
    return fileheader, filedata
 
# load data in from file
headerofnode, data_ofnode = data_extraction('nodes.tsv')
headerofedge, data_ofedge = data_extraction('edges.tsv')

これらの履歴データベースは.tsvファイル形式です。

上の画像にあるように、データはばらばらでフィルタリングされていない状態です。

このデータをグラフ化するには、データを分離して、コンパイラが簡単にデータを読み込めるようにする必要があります。

以下のコードでは、これらのファイルを (get_data) メソッドにロードして、必要に応じて分離する方法を示します。

Graph = nxnas.Graph()
 
# graph gets data of node added to it
for nxnode in data_ofnode:
    # sequentially adding id, name, chinese name, and index year
    Graph.add_node(int(nxnode[0]), pname=nxnode[1], chinese_name=nxnode[2], year_inindex=int(nxnode[3]))
 
#  graph gets data of edge added to it
for nxedge in data_ofedge:
    # sequentially adding node 1, node 2, kin, and label
    Graph.add_edge(int(nxedge[0]), int(nxedge[1]), nxkin=nxedge[2], nxlabel=nxedge[3])
degree_centrality = nxnas.degree_centrality(Graph)
closeness_centrality = nxnas.closeness_centrality(Graph)
betweenness_centrality = nxnas.betweenness_centrality(Graph)

グラフを作成し、ノード情報を追加します。

import networkx as nxnas
import matplotlib.pyplot as myplot
 
# This function is employed to extract data from the .tsv files
def data_extraction(name_ofile):
    # Here, a data loading will be done through a context manager
    with open(name_ofile, 'r', encoding='utf8') as rf:
        # transform file into string and split along new line
        filelines = rf.read().split("
"
)
 
        # new line will be created at tab spaces
        filedata = [line.split(" ") for line in filelines]
 
        # picks the header
        fileheader = filedata[0]
 
        # header gets deleted
        filedata = filedata[1:]
 
    # return header and data
    return fileheader, filedata
 
# load data in from file
headerofnode, data_ofnode = data_extraction('nodes.tsv')
headerofedge, data_ofedge = data_extraction('edges.tsv')
 
# create graph object
Graph = nxnas.Graph()
 
# graph gets data of node added to it
for nxnode in data_ofnode:
    # sequentially adding id, name, chinese name, and index year
    Graph.add_node(int(nxnode[0]), pname=nxnode[1], chinese_name=nxnode[2], year_inindex=int(nxnode[3]))
 
#  graph gets data of edge added to it
for nxedge in data_ofedge:
    # sequentially adding node 1, node 2, kin, and label
    Graph.add_edge(int(nxedge[0]), int(nxedge[1]), nxkin=nxedge[2], nxlabel=nxedge[3])
 
# Data metrics for the graph
degree_centrality = nxnas.degree_centrality(Graph)
closeness_centrality = nxnas.closeness_centrality(Graph)
betweenness_centrality = nxnas.betweenness_centrality(Graph)
 
# The process of depicting the graph
nxnas.draw_spring(Graph)
myplot.show()

グラフのデータメトリクスの追加

rawdata-csv.png

メトリックスは、ネットワークを研究するための networkx python パッケージに存在する多種多様なアルゴリズムです。

この例では、3つのデータメトリクスを使ってグラフを描きました。

その機能と目的を理解しましょう。

  • 度数中心性(Degree Centrality)。Degree centrality: ノードが持つエッジの数。
  • Closeness(中心性): ノードが持つエッジの数。ノード間の距離が最も小さいノードを見つける。これにより、ノードのデータ転送の効率性を測ることができる。
  • Betweenesscentrality: 最短経路の探索。Betweeness centrality: 最短経路の探索。

Pythonによるネットワーク解析のための完全なコード

segregate-data.png

出力

graph-output.png

結論

この記事では、ネットワーク分析グラフの詳細とそのプロット方法について説明します。

パブリック・ドメインで利用可能なレコードのネットワーク・グラフをプロットし、そこから関係を引き出す方法を学びました。

また、networkxのメトリクスとその呼び出し方、使い方についても学びました。

参考文献

  • Networkx メトリクス
タイトルとURLをコピーしました