ネットワークグラフ は、物の関係をわかりやすく見せる方法として便利です。
ネットワークの絵を描けるフリーソフトは、いろいろあるようです。 ここでは、応用がいろいろできそうなigraphについて。 なお、以下は、A-A型のグラフの作り方です。
※ フォルダの場所や、ファイル名等は、一例です。
(1) パソコンに、R、をダウンロードして、インストールする。
(2) igraphをダウンロードして、Rのモジュールとして使えるようにしておく。
(3) Cドライブに「Rtest」というフォルダを作る。
(4) 1行目と1列目に、頂点の名前が書いてある数値データを、「NetSample.csv」というcsvファイルにして、「Rtest」フォルダに置く。
下記の例は、 サンプルファイル をRtestフォルダにおいて、実行しています。
library(igraph) # igraphを読み込み
setwd("C:/Rtest") # 作業用ディレクトリを変更
DM <- read.csv("NetSample.csv", header=T, row.names=1) # データを読み込み。拡張子は、列名、行名の読み込みと、カンマ区切りの指定。
DM.mat = as.matrix(DM) # データフレームを行列として読み込み
DM.g<-graph.adjacency(DM.mat,weighted=T, mode = "undirected") # グラフ用のデータを作る
plot(DM.g) # プロットする
最後の行を下記にすると、データの数値で太さが変わります。 行列の対角成分の値が違う場合、大きい方の太さになります。
plot(DM.g, edge.width=E(DM.g)$weight) # プロットする
データの数値をそのまま太さの情報に使うので、
負の数は使えませんし、正の数だとしても、0から1の範囲になっていると、数値の違いを太さの違いとして見えるようにできません。
例えば、
多変量データの相関分析
のページのグラフでは、データを絶対値にした後に10倍することで、
-1から1の範囲にあるデータを、0から10の範囲にあるデータに変換してから、グラフにしています。
最後の2行を下記にすると、矢印付きのグラフになります。 下の例では、片方しか向きのない矢印が1本あり、他は両方に向きがある様子がわかります。
DM.g<-graph.adjacency(DM.mat,weighted=T, mode = "directed") # グラフ用のデータを作る
plot(DM.g, edge.width=E(DM.g)$weight) # プロットする
ネットワークグラフの悩みどころのひとつに、項目が多くなると、文字が重なり合ってわからなくなって来る点があります。 インタラクティブなグラフを作ると、グラフをつまんでグリグリ動かすことが可能になります。
networkD3では、有向グラフは作れないようです。 重み付きグラフについては、以下のsimpleNetworkのところを、forceNetworkにするのですが、forceNetworkにすると、手間がvisNetworkとあまり変わらないです。
library(igraph) # ライブラリを読み込み
library(networkD3) # ライブラリを読み込み
setwd("C:/Rtest") # 作業用ディレクトリを変更
DM <- read.csv("NetSample.csv", header=T, row.names=1) # データを読み込み。拡張子は、列名、行名の読み込みと、カンマ区切りの指定。
DM.mat = as.matrix(DM) # データフレームを行列として読み込み
DM.g<-graph.adjacency(DM.mat) # グラフ用のデータを作る
DM.g2 <- data.frame(as_edgelist(DM.g)) # グラフ用のデータを作る
simpleNetwork(DM.g2, fontSize = 14, nodeColour = "0000A2", opacity = 1, fontFamily = "Meiryo UI") # プロットする
このグラフは、マウスでクリックした部分をグリグリ動かせます。
visNetworkは、グリグリ動かせますし、有向グラフや、重み付きのグラフも作れます。
頂点用と辺用で、入力用のファイルを2つ用意するのは不便ですが、頂点や辺ごとの細かい設定ができる利点があります。
重みは、valueの最大値と最小値から自動的に決められるようになっています。
そのため、「0」にしていても線が引かれてしまうところが不便です。
arrowsの列がなければ、無向グラフになり、valueの列がなければ、重みなしのグラフになります。
library("visNetwork") # ライブラリを読み込み
setwd("C:/Rtest") # 作業用ディレクトリを変更
D1 <- read.csv("Data1.csv", header=T) # データを読み込み
D2 <- read.csv("Data2.csv", header=T) # データを読み込み
visNetwork(D1,D2,height = "200px",width = "100%") # プロットする
このグラフは、マウスでクリックした部分をグリグリ動かせます。
ネットワークグラフには、ちょっとしたコツがあります。
下のデータの場合、上にあるシンプルグラフを使って、グラフを作るとゴチャゴチャとしたグラフになります。
これでは何もわかりません。
このような時は、小さな値は思い切って0にします。 スパースモデリング とも言えます。 ここでは、0.8未満の数字は0にしてみます。
library(igraph) # igraphを読み込み
setwd("C:/Rtest") # 作業用ディレクトリを変更
DM <- read.csv("NetSample.csv", header=T, row.names=1) # データを読み込み。拡張子は、列名、行名の読み込みと、カンマ区切りの指定。
DM.mat = as.matrix(DM) # データフレームを行列として読み込み
DM.mat[DM.mat < 0.8] <- 0 # 相関係数の絶対値が0.8未満の場合は0にする(非表示にする)
DM.g<-graph.adjacency(DM.mat,weighted=T, mode = "undirected") # グラフ用のデータを作る
plot(DM.g) # プロットする
つながりの強いところが明確になりました。
下のデータの場合、上にあるシンプルグラフは作れます。
重み付きグラフにすると、ネットワークグラフとは言い難いものになります。
このような時は、値が0から10くらいの間に収まるように調整します。
library(igraph) # igraphを読み込み
setwd("C:/Rtest") # 作業用ディレクトリを変更
DM <- read.csv("NetSample.csv", header=T, row.names=1) # データを読み込み。拡張子は、列名、行名の読み込みと、カンマ区切りの指定。
DM.mat = as.matrix(DM) # データフレームを行列として読み込み
DM.mat <- DM.mat / max(DM.mat) * 10 # 値は0から10の間に収まるようにする
DM.g<-graph.adjacency(DM.mat,weighted=T, mode = "undirected") # グラフ用のデータを作る
plot(DM.g, edge.width=E(DM.g)$weight) # プロットする
重み付きのネットワークグラフらしくなりました。
値が10よりも大きい場合を例にしましたが、1よりも小さいデータばかりの場合も、0から10までに調整する方法は有効です。
例えば、下のデータの場合、重み付きグラフを作っても、重みの違いがわかりません。
このような時は、0から10に調整するコードを使うと、重みの違いがわかるようになります。
0から10の間に収まるように調整するノウハウですが、グラフを描く時にデータの値を線の太さとして使っていることが原因になります。 一般的なグラフでは、データの範囲に対して、色分けや枠の範囲を自動的に合わせるようになっているので、 このようなノウハウがいらないのですが、ネットワークグラフの場合は知らないと思うようなグラフにできないです。
「ネットワーク分析 Rで学ぶデータサイエンス 8」 鈴木努 著 共立出版 2009
ネットワークのグラフの描き方について、Rのsnaやigraphを使った計算方法が書いてあります。
「テキストデータの統計科学入門 」 金明哲 著 岩波書店 2009
テキストマイニング
の本です。第6章がネットワーク分析になっています。
この章の内容は、
https://www1.doshisha.ac.jp/~mjin/R/61/61.html
(著者ご本人のホームページ)に、ほぼ同じ内容があります。
igraphの初歩的な使い方が、丁寧にまとまっています。
Rで解析:インタラクティブな編集!ネットワーク図をぐりぐり動かせ!「visNetwork」パッケージの紹介
visNetworkの説明があります。
https://www.karada-good.net/analyticsr/r-144
Introduction to visNetwork
英語ですが、visNetworkの詳しい説明があります。
https://cran.r-project.org/web/packages/visNetwork/vignettes/Introduction-to-visNetwork.html