NetworkXでネットワーク構造の分析

networkxはPythonのグラフ理論を扱うためのライブラリで、様々なタイプのグラフ(有向グラフ、無向グラフなど)の作成、操作、解析が可能です。このライブラリはグラフのノードやエッジの属性を簡単に扱え、複雑なネットワーク構造の分析に広く使われています。

この記事では簡単なソーシャルネットワークグラフを作成してみます。

networkx ライブラリを使用してグラフを作成します。

import networkx as nx

G = nx.Graph()

次にノードを追加します。

people = ["太郎", "花子", "次郎", "理子", "健"]
G.add_nodes_from(people)

add_nodes_fromで人物をノードとしてグラフに追加します。
次に各人物の友人関係をエッジとしてグラフに追加します。

relationships = [("太郎", "花子"), ("花子", "次郎"), ("次郎", "太郎"), ("花子", "理子"), ("理子", "健")]
G.add_edges_from(relationships)

add_edges_fromでエッジの追加を行います。

それでは、作成したソーシャルネットワークグラフを可視化してみます。

import plotly.graph_objects as go

pos = nx.circular_layout(G)

edge_x = []
edge_y = []
for edge in G.edges():
    x0, y0 = pos[edge[0]]
    x1, y1 = pos[edge[1]]
    edge_x.extend([x0, x1, None])
    edge_y.extend([y0, y1, None])

node_x = [pos[node][0] for node in G.nodes()]
node_y = [pos[node][1] for node in G.nodes()]

edge_trace = go.Scatter(
    x=edge_x, y=edge_y,
    line=dict(width=2, color='grey'),
    hoverinfo='none',
    mode='lines')

node_trace = go.Scatter(
    x=node_x, y=node_y,
    mode='markers+text', 
    text=[node for node in G.nodes()], 
    textposition="top center", 
    hoverinfo='text',
    marker=dict(showscale=False, size=10, color='lightgreen'))

fig = go.Figure(data=[edge_trace, node_trace],
                 layout=go.Layout(
                    title='ソーシャルネットワークグラフ',
                    titlefont_size=16,
                    showlegend=False,
                    hovermode='closest',
                    margin=dict(b=20,l=5,r=5,t=40),
                    annotations=[ dict(
                        text="Plotly graph",
                        showarrow=False,
                        xref="paper", yref="paper",
                        x=0.005, y=-0.002 ) ],
                    xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
                    yaxis=dict(showgrid=False, zeroline=False, showticklabels=False))
                )
fig.show()