日本の中心はどこか?やれ兵庫県西脇市だの、やれ群馬県渋川市だの言われている。
今回は、日本の鉄道網における中心はどこか?を考えてみる。
以下の図は、沖縄を除く日本の各都道府県の代表的な駅を節点として、JRの鉄道網を可視化したグラフである。(ただし九州新幹線開通前)
各辺の重みはそれぞれその間の移動時間となっている。
このグラフをR言語1で解析していくことにする。
まずはグラフのデータをhttps://www.db.soc.i.kyoto-u.ac.jp/~asano/japangraph_pajek_xy2.net よりダウンロードする。
解析にはigraphライブラリを用いる。Rコンソールで以下のコマンドによりインストール
> install.packages("igraph")
手始めにグラフを読み込んでみよう。
> library(igraph) #ライブラリのロード
> japangraph <- read.graph("japangraph_pajek_xy2.net", format = "pajek")
さてここからが本題だ。今回は、中心を定義するために離心数というものを考えてみる。
例えば鳥取を例に取ってみよう。鳥取から各市に行くためには、それぞれ最短経路が存在するはずだ。例えば松江に行く最短経路の長さは、図からも明らかなように"79"だ。
このような最短経路長のうち最大のものを、その点における「離心数」と呼ぶ。次の実行結果からわかるように2、鳥取からだと、札幌に行くのに最も時間がかかり、離心数は"938"となる。
> shortest.paths(japangraph, v = 32) # 32はグラフにおける鳥取の点番号
札幌 青森 盛岡 秋田 仙台 山形 福島 新潟 前橋 宇都宮 水戸 大宮 東京 千葉
鳥取 938 628 525 621 456 509 434 492 403 387 420 363 338 376
横浜 甲府 長野 富山 静岡 名古屋 岐阜 金沢 福井 大津 京都 津 奈良 和歌山
鳥取 317 397 384 340 262 204 222 303 254 176 167 253 198 229
大阪 神戸 岡山 鳥取 松江 広島 山口 高松 徳島 松山 高知 博多 佐賀 長崎
鳥取 150 125 108 0 79 149 234 163 227 273 299 292 326 393
大分 熊本 宮崎 鹿児島
鳥取 413 366 553 429
グラフを入力として各点の離心数をリストで出力する関数を書いた。
> weighedEccentricity <- function(graph)
{
result <- c()
for(node in 1 : gorder(graph)) {
shortestPaths <- shortest.paths(graph, v = node)
maxShortestPaths <- max(shortestPaths)
result <- c(result, maxShortestPaths)
}
return(result)
}
最小の離心数を持つ点をグラフの「中心」、中心の離心数を「半径」と呼ぶ。このグラフの中心は「横浜」となる。
> eccentricities <- weighedEccentricity(japangraph) #離心数
> weighedRadius <- min(eccentricities) #半径
> centerOfJapan <- which(eccentricities == weighedRadius) #中心
> V(japangraph)[centerOfJapan]$id
[1] "横浜"
各点の離心数を可視化してみる。今、各点の大きさを離心数の3乗に反比例するように設定したグラフをプロットしてみる。大きな点ほど、離心数が小さい。
首都圏や東海道新幹線沿いほど点が大きいという結果になった。地理的にはそれほど真ん中ではないように見えるのに、首都圏が中心になるというのは、首都圏を中心に鉄道網が発達してきたことの証とも言えるのではないだろうか?興味深い結果である。
-
shortest.paths関数は、その点から各点への最短経路長を計算してくれる関数。グラフによって適切なアルゴリズムを自動で選択して動いてくれる優れもの。 ↩