見出し画像

【人文情報学散歩(6)】 Pythonによるネットワーク分析 : NetworkX ‐ 第一回


1.はじめに


こんにちは、今日からしばらくPythonを通じたネットワーク分析を勉強しようと思います。 私がなぜこの技術に興味を持つようになったかというと、最近参加したあるデジタル人文学カンファレンスに参加し、この技術が見せる視覚的な新鮮さに大きく魅了されたからです。

どうすればこの技術を学べるか悩んでいたところ、NetworkXというPythonライブラリを知りました。NetworkXはグラフ理論とネットワーク分析に特化したツールで、さまざまな分野での接続関係をモデル化し、視覚化するために使用されます。このライブラリは、学術研究から実際のビジネスアプリケーションまで、さまざまなコンテキストで広く使われています。ITエンジニアという職業の裏側に歴史研究者という2つのアイデンティティを持つ私にとって、かなり魅力的なツールであることは間違いありません。 長々と説明するまでもなく、さっそくNetwrokXの使い方を紹介します!


2. ネットワークの定義と基本用語


ネットワーク(Network)
ネットワークは相互接続されたノードと幹線の集合です。

ノード(Node)
ノードはネットワーク上のオブジェクトを表します。例えば、ソーシャルネットワークでは、ノードはそれぞれの個人プロフィールを意味します。

幹線(Edge)
幹線はノード間の関係を表す線であり、ソーシャルネットワークでは二人間の友達関係を表します。

重み(Weight)
重みは接続の強さを表す数値です。例えば、友達関係の強さを1から10までの数字で表現することができます。

3. ネットワークの種類


無方向グラフ(Undirected Graph)
無方向グラフは、幹線が双方向のグラフです。AとBが友達なら、AからBへの幹線とBからAへの幹線の両方が存在します。

方向グラフ(Directed Graph)
方向グラフは幹線が一つの方向を持つグラフです。AからBへの幹線があるからといって、BからAへの幹線が自動的に存在するわけではありません。

3. グラフ理論の核心概念


次数(Degree)
次数は、ノードに接続された幹線の数を意味します。 次数が高いほど、そのノードが重要であることを示します。

パス(Path)
パスは二つのノード間をつなぐ幹線の順序列を意味します。最短経路は最も短い経路を意味します。

接続性(Connectivity)
接続性は、グラフ内のノードや幹線がどれだけ接続されているかを示します。 高い接続性は、ネットワークの強い統合性を示します。

4. NetworkXライブラリの使用


まず、Google Colabにアクセスして作業を進めます。


4.1 インストール

pip install networkx


4.2 無方向グラフ

下記のコードを入力します。

import networkx as nx
import matplotlib.pyplot as plt

# シンプルな無向グラフの作成
G = nx.Graph()

# 人々を表すノードを追加
people = ["Lee", "Choi", "Jeong", "Kito"]
G.add_nodes_from(people)

# つながりを表すエッジを追加
connections = [("Lee", "Choi"), ("Choi", "Jeong"), ("Jeong", "Kito"), ("Kito", "Lee")]
G.add_edges_from(connections)

# グラフの可視化
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, font_weight='bold', node_size=700, node_color='skyblue', edge_color='gray')

plt.title("シンプルな海外のソーシャルネットワーク")
plt.show()

# 基本的なネットワークメトリクスの計算と出力
print("ノードの数:", G.number_of_nodes())
print("エッジの数:", G.number_of_edges())
print("次数中心性:", nx.degree_centrality(G))
print("平均クラスタリング係数:", nx.average_clustering(G))

Number of nodes: 4
Number of edges: 4
Degree centrality: {'Lee': 0.6666666666666666, 'Choi': 0.6666666666666666, 'Jeong': 0.6666666666666666, 'Kito': 0.6666666666666666}
Average clustering coefficient: 0.0

単純な無方向グラフを生成し、グラフのノードと幹線を定義します。 次に、spring_layout関数を使用してグラフのレイアウトを決定し、nx.draw関数を使用して視覚化します。最後にいくつかの基本的なネットワークメトリックを計算して出力します。

参考までに、クラスタリング係数(clustering coefficient)は、ネットワーク内のあるノードの隣のノード間で実際に接続された幹線の数と隣のノード間で可能な最大接続数との比率を表します。この値は0から1の間の範囲を持ち、高いほどノードの周りに密接な群集が形成されていることを示します。一般的に以下のように評価することができます。

  • 高い群集化:0.7以上

  • 中程度の群集化: 0.3 ~ 0.7

  • 低い群集化:0.3未満

つまり、クラスタリング係数が0なので、完全に独立しているという意味になりますね。


4.3 方向グラフ

import networkx as nx
import matplotlib.pyplot as plt

# より複雑な有向グラフの作成
DG = nx.DiGraph()
DG.add_nodes_from(["Lee", "Choi", "Jeong", "Kito", "Kim", "Park", "Yoon"])
DG.add_edges_from([("Lee", "Choi"), ("Choi", "Kito"), ("Jeong", "Kito"), ("Kito", "Lee"), ("Lee", "Kito"),
                   ("Kim", "Kito"), ("Kito", "Jeong"), ("Kito", "Kim"), ("Kito", "Park"), ("Kito", "Yoon"),
                   ("Yoon", "Kito"), ("Yoon", "Choi")])

# 有向グラフの可視化
plt.title("Complex Social Network For Overseas")
nx.draw(DG, with_labels=True, font_weight='bold', node_color='lightcoral', font_color='black')

# ノード中心性の計算
centrality = nx.degree_centrality(DG)

# ノード中心性を使用した可視化
plt.figure()
plt.title("Complex Social Network For Overseas Based on Node Centrality ")
node_size = [centrality[node] * 1000 for node in DG.nodes]
nx.draw(DG, with_labels=True, font_weight='bold', node_color='lightcoral', font_color='black', node_size=node_size)

# メトリクスの解釈
print("Number of nodes:", DG.number_of_nodes())
print("Number of edges:", DG.number_of_edges())
print("Degree centrality:", centrality)
print("Average clustering coefficient:", nx.average_clustering(DG))
print("Eigenvector centrality:", nx.eigenvector_centrality(DG))

plt.show()
Number of nodes: 7
Number of edges: 12
Degree centrality: {'Lee': 0.5, 'Choi': 0.5, 'Jeong': 0.3333333333333333, 'Kito': 1.6666666666666665, 'Kim': 0.3333333333333333, 'Park': 0.16666666666666666, 'Yoon': 0.5}
Average clustering coefficient: 0.24506387921022066
Eigenvector centrality: {'Lee': 0.3054376506109987, 'Choi': 0.2758752643567031, 'Jeong': 0.3054376506109987, 'Kito': 0.6763372283574863, 'Kim': 0.3054376506109987, 'Park': 0.3054376506109987, 'Yoon': 0.3054376506109987}


方向だけを表現したグラフ
ノードの中心性が反映された方向グラフ
中心性が大きいほどノードのサイズが大きく表示されます。

ちなみに、方向性グラフの場合、クラスタリング係数(clustering coefficient)が0.24程度なので、緩く繋がっていることを意味します。

4.4 中心性の種類

中心性(Centrality)と固有ベクトル中心性(Eigenvector Centrality)は、ネットワーク分析でノードの重要性を測定するために使用される2つの異なる指標です。 この2つの概念の違いは、中心性はノードの接続状態のみに依存するのに対し、固有ベクトル中心性は接続されたノードの重要性が高い場合、そのノードの中心性も上昇します。

中心性(Centrality)

  • 定義:中心性は、ネットワークで一つのノードがどれだけ重要であるかを示す指標です。

  • 活用:ノードの中心性が高いほど、そのノードはネットワークで重要な役割を果たしていると考えられます。

  • 種類:次数中心性(Degree Centrality)、近接中心性(Closeness Centrality)、媒介中心性(Betweenness Centrality)などがあります。

  • 次数中心性(Degree Centrality):ノードの直接接続数。nx.degree_centrality() 関数を利用します。

  • 近接中心性(Closeness Centrality): ノードが他のノードにどれだけ近いかを測定する指標。nx.closeness_centrality(G) 関数を利用。

  • 媒介中心性(Betweenness Centrality):あるノードが他のノード間の最短経路でどれだけ頻繁に登場するかを測定。nx.betweenness_centrality(G) 関数を利用します。

固有ベクトル中心性(Eigenvector Centrality)

  • 定義: 固有ベクトル中心性は、あるノードの重要性をそのノードに接続された他のノードの重要性と関連付けます。

  • 活用:固有ベクトル中心性は、ネットワーク内でどのノードが影響力のあるノードに接続されているかを考慮して重要性を評価します。

  • 特徴:接続されたノードが高い中心性を持つと、そのノードの中心性も上昇する特徴があります。


5.終わりに


私はネットワーク分析理論を応用して、来年の日本歴史学会で発表をしようと思っています。1920年代の韓国人300人程度を調査した昔の資料があるのですが、単純に年齢、学歴などの統計分析を越えて、これら間のネットワーク関係を分析することができそうです(今からワクワクしますね)。

次の時間は、いくつかの補足していかなければならない概念、すなわち、重み付け、強く連結された構成要素(SCC)、弱く連結された構成要素(WCC)、クラスタリングによるコミュニティ検出、各種ネットワークモデリングなどを整理してみます。


デジタル歴史家
ソンさん


この記事が気に入ったらサポートをしてみませんか?