地図上に大学間のネットワーク図を書く

#1　はじめに
[以前の記事](https://qiita.com/restructure/items/094eb4683b75713ba7fd)で書いた緯度・経度を反映したネットワーク図の描画について、少しずつ方法が分かってきたのでメモしておきます。

今回は、サンプルとして旧帝国大学とMARCH、関関同立の架空のネットワークデータを用意して、地図に記載しました。
参考にさせて頂いた方法は以下のとおりです。

- 「Rで学ぶデータサイエンス8 ネットワーク分析 第2版」（共立出版・2017年）第11章p302
- 同著著者の鈴木努先生のブログ記事（「[地図上に航空路線を描く](https://snatool.hatenadiary.org/entry/40123580)」）

#2　データの準備
まず、大学の座標（緯度・経度）とタイプ（国立・私立）を記載したcsvファイル「univ.csv」を用意します。
univ.csv↓
![スクリーンショット 2020-01-26 12.09.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/2fb8c2cc-8785-a364-8f68-5a06119c221f.png)


また、それぞれの大学の架空のネットワークを記載したcsvファイル「univnetwork.csv」を用意します。（下の部分が見切れています。本当はもう少しあります。）
univnetwork.csv↓
![スクリーンショット 2020-01-26 12.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/c304dd65-9dce-4930-c297-ff3dbe5f464b.png)

#3　コード
以下のとおり記載します。

```ruby:R
#必要なパッケージの読み込み
library(network)
library(sna)
library(maps)
library(ggplot2)
library(GGally)

#データの読み込み（macで日本語が含まれたcsvデータを読み込む場合、「fileEncoding="CP932"」と記載。）
univs <- read.csv("univ.csv", header = TRUE,fileEncoding="CP932")
rownames(univs) <- univs$univ

reserch <- read.csv("univnetwork.csv", header = TRUE,fileEncoding="CP932")
#読み込んだデータをnetworkオブジェクト「reserch.net」に変換
reserch.net <- network(reserch[,1:2], directed = FALSE)

#networkオブジェクト「reserch.net」に、頂点の属性として、緯度(lat)、経度(lon)、国立・私立の別(type)、次数(degree)を与える。
reserch.net %v% "lat" <- 
 univs[network.vertex.names(reserch.net), "latitude"]
reserch.net %v% "lon" <- 
 univs[network.vertex.names(reserch.net), "longitude"]
reserch.net %v% "type" <- 
 as.character(univs[network.vertex.names(reserch.net), "type"])
reserch.net %v% "degree" <- degree(reserch.net, gmode = "graph") 

#日本地図の描画に関する設定。
jpn <- ggplot(map_data("world2", "japan"), aes(x = long, y = lat)) +
 geom_polygon(aes(group = group), color = "grey65",fill = "grey90")

#ggnetworkmap()関数で地図とネットワークを描画する。（大学の種類（国立・私立）を頂点の色、次数を頂点の大きさと輪郭の色で表す。）
ggnetworkmap(jpn, reserch.net, size = 7, node.group = type,
 node.alpha = 0.6, weight = degree, ring.group = degree,
 great.circle = TRUE,  segment.color = "steelblue", segment.alpha = 0.4)
```

#4　出力結果
こんな感じで出力されます。
![スクリーンショット 2020-01-26 12.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/746a79b6-b3dc-8fea-bdd3-a9e3d0901598.png)



#5　今後の課題

- 凡例の日本語フォント（大学の種類（国立・私立））が表示されないため、表示させたい。
- 地図が横に伸びている感じがするので直したい。
- 大学のネットワークを記載したcsvファイル「univnetwork.csv」について、ソシオマトリックスの形式から直接networkオブジェクトに変換したい。

もし方法をご存知の方がいらっしゃいましたら、アドバイス頂けますと幸いです。

#6　追記1
ソシオマトリックスの形式からnetworkオブジェクトへの変換については、以下の方法でできました。
まず、以下のようなソシオマトリックスのcsvファイル「univnetwork2.csv」を用意します。
（各大学が３つのプロジェクト（P1,P2,P3）について、参画している場合は「1」、参画していない場合は「0」とする。）
univnetwork2.csv↓
![スクリーンショット 2020-01-26 17.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/902c51e4-368c-ffe6-3065-4126d77a5f19.png)

そして、以下のとおり読み込み、行列に変換して転置行列を乗じてnetworkオブジェクトに変換します。

```ruby:R
univ <- read.csv("univnetwork2.csv", row.names = "univ",fileEncoding="CP932") 
univ <- as.matrix(univ)#行列に変換。
resultuniv <- univ%*%t(univ)#転置行列を乗じる。
reserch.net <- network(resultuniv, directed = FALSE)
```
あとは、先ほどと同様の方法で出力します。
結果、以下のように出力されます。
![スクリーンショット 2020-01-26 12.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/88675159-710b-c90f-9ffa-6dd15409d97b.png)