ウェブサイト検索

Python によるネットワーク分析


ネットワークは、ノードと、それらのノード間の関係または接続を表すエッジの集合です。ノードは個人、組織、遺伝子、Web サイトなどのさまざまなエンティティを表すことができ、エッジはそれらの間の接続または相互作用を表します。

ネットワーク分析は、ネットワークとして表現されるノードであるこれらのエンティティ間の関係を研究するものです。この記事では、Python を使用してネットワーク分析を実装する方法を見ていきます。これには、多くの数学的、統計的、計算的手法の使用が含まれます。ネットワーク分析は、複雑なシステムの動作に関する洞察を提供し、さまざまなドメインで情報に基づいた意思決定を行うのに役立ちます。

Python は、複雑なネットワークの作成、操作、分析に非常に役立つ networkx と呼ばれるパッケージを提供します。記事を進める前に、ターミナルで次のコマンドを使用して、Python でネットワーク分析用の networkx をインストールします。


pip install networkx

単純なグラフの作成

ここでは、networkx ライブラリを使用して単純なグラフを作成します。これは 3 つのノードと 3 つのエッジで構成されます。次に各ノードの次数とクラスタリング係数を計算し、最後にグラフを描画します。

ノードの次数: グラフ内でノードが持つ隣接ノードの数。ノードに接続されているエッジの数をカウントすることで計算できます。

クラスタリング係数: ノードの近隣ノードが互いに接続されている程度の尺度。言い換えれば、これは、特定のノードの周囲のグラフ内のローカル接続の密度の尺度です。これは、ノードの隣接ノード間に存在するエッジの数を、そのようなエッジの最大可能数で割ることによって計算されます。


import networkx as nx
import matplotlib.pyplot as plt

# create an empty graph
G = nx.Graph()

# add nodes
G.add_node(1)
G.add_node(2)
G.add_node(3)

# add edges
G.add_edge(1, 2)
G.add_edge(2, 3)
G.add_edge(3, 1)

print("Node degree:")
for node in G.nodes():
   print(f"{node}: {G.degree(node)}")
# clustering coefficient
print("Node clustering coefficient:")
for node in G.nodes():
   print(f"{node}: {nx.clustering(G, node)}")
# draw the graph
nx.draw(G, with_labels=True)
plt.show()

出力


Node degree:
1: 2
2: 2
3: 2
Node clustering coefficient:
1: 1.0
2: 1.0
3: 1.0

コミュニティの特定

グラフ内のコミュニティの識別は、同様の特性に基づいてグラフのノードをグループまたはクラスターに分割するプロセスです。これを行うために、Louvain アルゴリズムが使用されます。これは反復アルゴリズムであり、特定のコミュニティ構造のモジュール性を測定する品質関数を最適化することで機能します。モジュール性は、コミュニティ内のエッジの数が、ランダム グラフ内の予想されるエッジの数と比較してどの程度多いかを測定します。

Louvain アルゴリズムは、次の 2 つのフェーズで機能します。

  • このアルゴリズムは、各ノードを独自のコミュニティに割り当てます。次に、モジュール性を高めるために、コミュニティ間でノードを繰り返し移動します。このプロセスは、モジュール性を改善する余地がなくなるまで継続的に繰り返されます。

  • 次に、アルゴリズムは、最初のフェーズからコミュニティを表す新しいグラフ リーチ ノードを構築します。エッジは、コミュニティ間のエッジの合計の重みを表します。最後に、第 1 フェーズがこの新しいグラフに適用され、より粗い粒度レベルでコミュニティを識別できるようになります。

Louvain アルゴリズムは非常に効率的で、数百万のノードとエッジを含む大規模なグラフ内のコミュニティの検出に役立ちます。


import networkx as nx
import matplotlib.pyplot as plt

G = nx.gnm_random_graph(7,10)

# draw the graph
print("Original graph:")
nx.draw(G,with_labels=True)
plt.show()

print("Node degree:")
for node in G.nodes():
   print(f"{node}: {G.degree(node)}")

print("Node betweenness centrality:")
bc = nx.betweenness_centrality(G)
for node in bc:
   print(f"{node}: {bc[node]}")

# community identification using Louvain algorithm
communities = nx.algorithms.community.modularity_max.greedy_modularity_communities(G)

# print the communities and the number of nodes in each community
i = 1
for c in communities:
   print(f"Community {i}: {c}")
   i += 1
   print(f"Number of nodes: {len(c)}")

color_map = []
for node in G.nodes():
   for i in range(len(communities)):
      if node in communities[i]:
         color_map.append(i)

print("Graph with communities marked:")

nx.draw(G, node_color=color_map, with_labels=True)
plt.show()

出力


Node degree:
0: 5
1: 3
2: 2
3: 2
4: 2
5: 4
6: 2
Node betweenness centrality:
0: 0.5666666666666667
1: 0.1
2: 0.0
3: 0.0
4: 0.0
5: 0.2
6: 0.0
Community 1: frozenset({0, 2, 3, 4})
Number of nodes: 4
Community 2: frozenset({1, 5, 6})
Number of nodes: 3

相同性の分析

同性愛とは、個人が、信念、価値観、年齢、性別、人種などの人口統計のように、同様の特性を持つ、または自分自身を訓練する他の個人と付き合う傾向のことです。

これは十分に裏付けられた社会現象であり、ネットワークの分析に役立ちます。

私たちは、類似したノードが互いに接続する傾向を含むネットワークの構造を形成するための同質性の役割を研究します。

類似したノードが接続される傾向を測定するグラフの相同性係数は、nx.attribute_assortativity_coefficient() 関数を使用して計算され、-1 から 1 の範囲になります。正の値は可能性が高いことを示し、負の値は可能性が低いことを示します。

以下のコードでは、同相係数を計算するだけでなく、各ノードにバイナリ属性「type」を割り当ててノードをマークし、それがグループ A に属するかグループ B に属するかを示します。また、ノードが次の色で色付けされたグラフも描画しました。同性愛のあらゆるパターンを視覚化するタイプです。


import networkx as nx
import matplotlib.pyplot as plt

G = nx.gnm_random_graph(50, 100)

# binary attributes for each node for indication of it’s type
for node in G.nodes():
   G.nodes[node]['type'] = 'A' if node < 25 else 'B'

# draw the graph and colour the nodes with their corresponding types A or B
color_map = ['red' if G.nodes[node]['type'] == 'A' else 'blue' for node in G.nodes()]
nx.draw(G, node_color=color_map, with_labels=True)
plt.show()

homophily_coeff = nx.attribute_assortativity_coefficient(G, 'type')
print(f"Homophily coefficient: {homophily_coeff}")

出力


Homophily coefficient: -0.0843989769820972

結論

ネットワーク分析は、ソーシャル ネットワークを含む複雑なシステムの構造とダイナミクスを研究するのに非常に役立ちます。 Python ではこれを行うためのさまざまなライブラリが提供されていますが、最も一般的に使用されるのは networkx です。 Python でのネットワーク分析を使用すると、研究者やアナリストは、主要なノードとコミュニティの特定、ネットワークの堅牢性と回復力の測定、同性愛と社会的影響のパターンの検出など、さまざまな研究上の質問に答えることができます。ネットワーク分析は複雑な技術分野ですが、データの準備とクリーニングに細心の注意を払うことで、現実世界の多くの問題に対処できるだけでなく、ビジネスの成長にも役立ちます。