準備
library(igraph) # ライブラリの読み込み
library(visNetwork)
library(dplyr)
データの準備
Network data よりLes Miserablesのデータを使います。
すでにネットワーク(グラフ)用のフォーマットになっていますが、応用が効かないので使用頻度の高いデータフレームに直してから操作します。
g <- read.graph("lesmis.gml", format = "gml") # データの読み込み
### ノードデータ
dat.node <- data.frame(id = V(g)$id + 1, # 元データのidが0から始まっているので+1で補正
label = V(g)$label) # 登場人物の名前
head(dat.node)
## id label
## 1 1 Myriel
## 2 2 Napoleon
## 3 3 MlleBaptistine
## 4 4 MmeMagloire
## 5 5 CountessDeLo
## 6 6 Geborand
### エッジデータ(つながり)
dat.edge <- data.frame(get.edgelist(g))
colnames(dat.edge) <- c("from", "to")
head(dat.edge)
## from to
## 1 1 2
## 2 1 3
## 3 1 4
## 4 3 4
## 5 1 5
## 6 1 6
visNetwork(dat.node, dat.edge, width = "100%")
# 分析用にグラフオブジェクトの作成
edge_graph <- graph.edgelist(as.matrix(dat.edge) , directed = T)
# グループ分け
dat.node$group <- spinglass.community(edge_graph, weights = E(g)$value, spins = 50)$membership
head(dat.node)
## id label group
## 1 1 Myriel 4
## 2 2 Napoleon 4
## 3 3 MlleBaptistine 4
## 4 4 MmeMagloire 4
## 5 5 CountessDeLo 4
## 6 6 Geborand 4
visNetwork(dat.node, dat.edge, width = "100%")
グループ名をグループ内で中心性が最も高い登場人物の名前とする。
# グループの中心性の算出
dat.node$betweenness <- betweenness(edge_graph, directed=T) / 100000
# グループ内で中心性が最も高い登場人物の名前を抽出
temp.gr <- group_by(dat.node, group)
center <- function(y, z){
dat <- data.frame(y, z)
dat[which.max(dat$y),"z"]
}
group.name <- summarise(temp.gr, group_name = center(betweenness, label))
dat.node <- full_join(dat.node, group.name, "group")
head(dat.node)
## id label group betweenness group_name
## 1 1 Myriel 4 0 Myriel
## 2 2 Napoleon 4 0 Myriel
## 3 3 MlleBaptistine 4 0 Myriel
## 4 4 MmeMagloire 4 0 Myriel
## 5 5 CountessDeLo 4 0 Myriel
## 6 6 Geborand 4 0 Myriel
dat.node_sub <- dat.node
dat.node_sub$group <- dat.node_sub$group_name
visNetwork(dat.node_sub, dat.edge, width = "100%") %>%
visOptions(selectedBy = "group") # グループで選択可能にする
dat.node_sub$title <- paste0("登場人物", dat.node_sub$id, "<br>",
dat.node_sub$label, "<br>",
"group:", dat.node_sub$group_name)
visNetwork(dat.node_sub, dat.edge, width = "100%") %>%
visOptions(selectedBy = "group")
dat.edge$width = E(g)$value
visNetwork(dat.node_sub, dat.edge, width = "100%") %>%
visOptions(selectedBy = "group")
ノードデータとエッジデータをvisNetwork()に入れることで描画します。
描画用のパラメータをノードデータとエッジデータのカラムに持たせる仕組みになっています。
ノードデータ
エッジデータ
「データから価値を創造する」一般社団法人データマーケティングラボラトリー
Copyright© DML All Rights Reserved.