マネジメントやワークフローのプロセスを評価・管理・追跡するためのアプローチをネットワーク解析といいます。
また、データ分析は、構造のノードと要素のグラフィカルな図を作成するのに役立ちますが、ネットワーク図は、ワークフローとは異なり、イベント、目的、割り当ての時系列のシリーズと、それらの時間枠と依存関係を調べ、ツリーまたはガントチャートのような表として視覚的に描画されます。
プロジェクトリーダーは、プロジェクトプランを作成する際に、以下のような要因に対処するために、ネットワーク分析が必要になることがあります。
- タスクの相互依存性
- タスクの相互依存性 ・アクションとアクションの間の期間と効果的なバッファー方法
- 開始日と終了日、最も古いものから最新のものの一つまで。
- 活動間隔
- 最も重要なタスクとアクティビティのための経路を開発します。
ネットワーク分析法は、設計から開発段階まで、プロジェクト管理を強化し、タスクが予算内で納期内に納品されるようにするために、一般的に使用される方法です。
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() |
グラフのデータメトリクスの追加
メトリックスは、ネットワークを研究するための networkx python パッケージに存在する多種多様なアルゴリズムです。
この例では、3つのデータメトリクスを使ってグラフを描きました。
その機能と目的を理解しましょう。
- 度数中心性(Degree Centrality)。Degree centrality: ノードが持つエッジの数。
- Closeness(中心性): ノードが持つエッジの数。ノード間の距離が最も小さいノードを見つける。これにより、ノードのデータ転送の効率性を測ることができる。
- Betweenesscentrality: 最短経路の探索。Betweeness centrality: 最短経路の探索。
Pythonによるネットワーク解析のための完全なコード
出力
結論
この記事では、ネットワーク分析グラフの詳細とそのプロット方法について説明します。
パブリック・ドメインで利用可能なレコードのネットワーク・グラフをプロットし、そこから関係を引き出す方法を学びました。
また、networkxのメトリクスとその呼び出し方、使い方についても学びました。
参考文献
- Networkx メトリクス