日本の中心はどこか？~R言語、igraphによる中心性解析~【グラフ理論】

日本の中心はどこか？やれ兵庫県西脇市だの、やれ群馬県渋川市だの言われている。
今回は、日本の鉄道網における中心はどこか？を考えてみる。

以下の図は、沖縄を除く日本の各都道府県の代表的な駅を節点として、JRの鉄道網を可視化したグラフである。（ただし九州新幹線開通前）
各辺の重みはそれぞれその間の移動時間となっている。

![スクリーンショット 2018-04-17 13.17.33.png](https://qiita-image-store.s3.amazonaws.com/0/242486/fa9850f5-7232-63f7-ac45-23524d1debfd.png)

このグラフをR言語[^1]で解析していくことにする。
まずはグラフのデータをhttps://www.db.soc.i.kyoto-u.ac.jp/~asano/japangraph_pajek_xy2.net よりダウンロードする。

解析にはigraphライブラリを用いる。Rコンソールで以下のコマンドによりインストール

```R
> install.packages("igraph")
```

手始めにグラフを読み込んでみよう。

```R
> library(igraph) #ライブラリのロード

> japangraph <- read.graph("japangraph_pajek_xy2.net", format = "pajek")
```

さてここからが本題だ。今回は、中心を定義するために離心数というものを考えてみる。
例えば鳥取を例に取ってみよう。鳥取から各市に行くためには、それぞれ最短経路が存在するはずだ。例えば松江に行く最短経路の長さは、図からも明らかなように"79"だ。
このような最短経路長のうち最大のものを、その点における「離心数」と呼ぶ。次の実行結果からわかるように[^2]、鳥取からだと、札幌に行くのに最も時間がかかり、離心数は"938"となる。

```R
> 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
```

グラフを入力として各点の離心数をリストで出力する関数を書いた。

```R
> 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)
}
```

最小の離心数を持つ点をグラフの「中心」、中心の離心数を「半径」と呼ぶ。このグラフの中心は「横浜」となる。

```R
> eccentricities <- weighedEccentricity(japangraph) #離心数
> weighedRadius <- min(eccentricities) #半径
> centerOfJapan <- which(eccentricities == weighedRadius) #中心
> V(japangraph)[centerOfJapan]$id
[1] "横浜"
```

各点の離心数を可視化してみる。今、各点の大きさを離心数の3乗に反比例するように設定したグラフをプロットしてみる。大きな点ほど、離心数が小さい。

![スクリーンショット 2018-04-17 13.51.57.png](https://qiita-image-store.s3.amazonaws.com/0/242486/81c10540-aede-6340-3451-dbe42d37b334.png)

首都圏や東海道新幹線沿いほど点が大きいという結果になった。地理的にはそれほど真ん中ではないように見えるのに、首都圏が中心になるというのは、首都圏を中心に鉄道網が発達してきたことの証とも言えるのではないだろうか？興味深い結果である。

[^1]: https://www.r-project.org/
[^2]: shortest.paths関数は、その点から各点への最短経路長を計算してくれる関数。グラフによって適切なアルゴリズムを自動で選択して動いてくれる優れもの。

#####参考にした書籍
<a href="https://www.amazon.co.jp/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%88%86%E6%9E%90-%E7%AC%AC2%E7%89%88-R%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9-%E9%88%B4%E6%9C%A8-%E5%8A%AA/dp/4320113152/ref=as_li_ss_il?ie=UTF8&qid=1523947312&sr=8-1&keywords=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%88%86%E6%9E%90+(R%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9+8)&linkCode=li3&tag=zalgo-22&linkId=deae76be286b2c4eed1044f006b5c691" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4320113152&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=zalgo-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=zalgo-22&l=li3&o=9&a=4320113152" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />