ノードの中心性#

Hide code cell source
import numpy as np
import networkx as nx

%matplotlib inline

クイズ#

Q1: 近接中心性#

以下のグラフ\(G_{bull}\)に属する各ノードの近接中心性について,closeness_centrality関数を用いずに計算するコードを書きなさい.

../../../_images/e5a8ae4ed36bcbb870c749435e9c9a21411b41bf4fac862c36beefacc4a15cf9.png
import networkx as nx

# グラフの定義
G_bull = nx.Graph([(0, 1), (1, 2), (2, 0), (1, 3), (2, 4), (4, 5)])

# 各ノードについて近接中心性の計算をする
for node_from in G_bull.nodes():
    dists = []
    for node_to in G_bull.nodes():
        if node_from != node_to:
            shortest_path = nx.shortest_path(G_bull, node_from, node_to)
            dist = len(shortest_path) - 1
            dists.append(dist)

    closeness_centrality = len(dists) / sum(dists)
    print(f'ノード{node_from}の近接中心性:', closeness_centrality)
ノード0の近接中心性: 0.5555555555555556
ノード1の近接中心性: 0.625
ノード2の近接中心性: 0.7142857142857143
ノード3の近接中心性: 0.4166666666666667
ノード4の近接中心性: 0.5555555555555556
ノード5の近接中心性: 0.38461538461538464

Q2: どんなグラフ?#

ノード数が5のグラフのうち,以下の条件を満たすノードを持つグラフの例を考えなさい.

  1. 次数中心性,近接中心性,媒介中心性のいずれも最大値を持つノードが同一であるような無向グラフ

  2. 次数中心性,近接中心性,媒介中心性の値がすべてのノードで同じになる無向グラフ

  3. 出次数中心性は最大値を取るが,媒介中心性は最小値を取るノードが存在する有向グラフ

# グラフの定義
G_Q2_1 = nx.star_graph(4)
nx.draw(G_Q2_1, **DRAW_CONFIG)

# 各中心性スコア
print('次数中心性:', nx.degree_centrality(G_Q2_1))
print('近接中心性:', nx.closeness_centrality(G_Q2_1))
print('媒介中心性:', nx.betweenness_centrality(G_Q2_1))
次数中心性: {0: 1.0, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25}
近接中心性: {0: 1.0, 1: 0.5714285714285714, 2: 0.5714285714285714, 3: 0.5714285714285714, 4: 0.5714285714285714}
媒介中心性: {0: 1.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}
../../../_images/7fa609cb18b625f4492dfc7ea190cb51e9b83eda43caf2458180d7bdc5ab420b.png
# グラフの定義
G_Q2_2 = nx.complete_graph(5)
nx.draw(G_Q2_2, **DRAW_CONFIG)

# 各中心性スコア
print('次数中心性:', nx.degree_centrality(G_Q2_2))
print('近接中心性:', nx.closeness_centrality(G_Q2_2))
print('媒介中心性:', nx.betweenness_centrality(G_Q2_2))
次数中心性: {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0}
近接中心性: {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0}
媒介中心性: {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}
../../../_images/1756d3f251650ed6585514462bc517995ed912a9c37bb5461d98185f8f52f8d2.png
# グラフの定義
G_Q2_3 = nx.DiGraph([
    (0, 1), (0, 2), (0, 3), (0, 4),
#    (1, 0), (2, 0), (3, 0), (4, 0),
    (1, 2), (2, 3), (3, 4), (4, 1)
])
pos = nx.spring_layout(G_Q2_3, seed=123)
nx.draw(G_Q2_3, pos, **DRAW_CONFIG)

# 各中心性スコア
print('出次数中心性:', nx.out_degree_centrality(G_Q2_3))
print('近接中心性:', nx.closeness_centrality(G_Q2_3))
print('媒介中心性:', nx.betweenness_centrality(G_Q2_3))
出次数中心性: {0: 1.0, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25}
近接中心性: {0: 0.0, 1: 0.5714285714285714, 2: 0.5714285714285714, 3: 0.5714285714285714, 4: 0.5714285714285714}
媒介中心性: {0: 0.0, 1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25}
../../../_images/c0e259962189879f850b87fd92249258731f46a6d040764a49148a789ed3abdf.png

Q3: 都道府県の近接中心性,次数中心性,媒介中心性#

../../../_images/e907301cbc12c3485693a66da047913d6f2c8a350abaf155b70babeb3c483764.png

上のグラフ\(G_{prefecture}\)は,沖縄県を除く日本の都道府県をノード,都道府県間の陸路の存在をエッジとして可視化したものである. グラフ\(G_{prefecture}\)に含まれる各ノード(都道府県)について,その近接中心性,次数中心性,媒介中心性を計算し,各指標の上位3件を求めなさい.

なお,グラフ\(G_{prefecture}\)に関するデータはコチラからダウンロード可能である. また,以下のコードを書くとダウンロードしたファイルをNetworkX形式のグラフとして読み込める.

import networkx as nx

# ダウンロードしたデータは`data/prefecture/prefecture.adjlist`にあると想定
G_prefecture = nx.read_adjlist("data/prefecture/prefecture.adjlist")
# 近接中心性
sorted(nx.closeness_centrality(G_prefecture).items(), key=lambda x: -x[1])[:3]
[('三重県', 0.26011560693641617),
 ('岐阜県', 0.2571428571428571),
 ('京都府', 0.2556818181818182)]
# 次数中心性
sorted(nx.degree_centrality(G_prefecture).items(), key=lambda x: -x[1])[:3]
[('長野県', 0.17777777777777778),
 ('埼玉県', 0.15555555555555556),
 ('岐阜県', 0.15555555555555556)]
# 媒介中心性
sorted(nx.betweenness_centrality(G_prefecture).items(), key=lambda x: -x[1])[:3]
[('兵庫県', 0.4714646464646465),
 ('京都府', 0.45496477035870975),
 ('長野県', 0.3308831387467748)]

Q4: 空港の次数中心性,媒介中心性,固有ベクトル中心性#

from IPython.display import IFrame
IFrame("../../airport.html", width=750, height=650)

上のグラフ\(G_{airport}\)は,日本の主要な空港をノード,空港間でANA(全日空)の航路が存在することをエッジとして可視化したものである. グラフ\(G_{airport}\)に含まれる各ノード(空港)について,その次数中心性,媒介中心性,固有ベクトル中心性を計算し,各指標の上位5件を求めなさい.

なお,グラフ\(G_{airport}\)に関するデータはコチラからダウンロード可能である. また,以下のコードを書くとダウンロードしたファイルをNetworkX形式のグラフとして読み込める.

import networkx as nx

# ダウンロードしたデータは`data/airport/ana.adjlist`にあると想定
G_ana = nx.read_adjlist("../data/airport/ana.adjlist")
# 次数中心性
sorted(nx.degree_centrality(G_ana).items(), key=lambda x: -x[1])[:5]
[('東京(羽田)', 0.7),
 ('札幌(新千歳)', 0.3833333333333333),
 ('沖縄(那覇)', 0.3333333333333333),
 ('大阪(伊丹)', 0.3),
 ('名古屋(中部)', 0.25)]
# 媒介中心性
sorted(nx.betweenness_centrality(G_ana).items(), key=lambda x: -x[1])[:5]
[('東京(羽田)', 0.6089280368093929),
 ('鹿児島', 0.14800690521029508),
 ('札幌(新千歳)', 0.132759359284783),
 ('沖縄(那覇)', 0.11018556459234428),
 ('大阪(伊丹)', 0.09039116878099929)]
# 固有ベクトル中心性
sorted(nx.eigenvector_centrality(G_ana).items(), key=lambda x: -x[1])[:5]
[('東京(羽田)', 0.457999320160654),
 ('沖縄(那覇)', 0.3074869102083056),
 ('札幌(新千歳)', 0.3064340279779271),
 ('大阪(伊丹)', 0.29359335171993056),
 ('名古屋(中部)', 0.27764154174853667)]