準備

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()に入れることで描画します。
描画用のパラメータをノードデータとエッジデータのカラムに持たせる仕組みになっています。

ノードデータ

  • “id” : エッジデータと関連付けに必要
  • “label” : ノードのラベル
  • “group” : グループ情報
  • “value” : ノードのサイズ
  • “title” : ツールチップス(HTMLが使用できる)

エッジデータ

  • “from” : 始点のノードID
  • “to” : 終点のノードID
  • “label” : エッジのラベル
  • “width” : エッジの太さ

リンク


「データから価値を創造する」一般社団法人データマーケティングラボラトリー

Copyright© DML All Rights Reserved.