LoginSignup
2
4

igraphで参画機関のネットワーク図を作ってみる。

Last updated at Posted at 2019-11-29

数年前の書籍ですが、「日本のクラスター政策と地域イノベーション(松原宏[編])」の第4章「地域イノベーションのネットワーク分析(與倉豊)」を読んで、こんな感じの図をRで描いてみたいと思ったのでやってみました。

まだまだ分からないことばかりですので、不適切な点や他に良い方法などありましたらアドバイス頂けますと幸いです。

今回想定するのは、2部グラフで表すと以下のような関係にある研究テーマとその参画機関です。
スクリーンショット 2019-11-29 7.47.08.png
研究テーマT1にa,b,cという機関が参画し、T2にはa,d,eが参画している、という図です。
そして、この2部グラフから、共通のテーマを介した参画機関同士のネットワーク図を作成します。

まず、この2部グラフの関係をEXCEL上で行列で表すとこんな感じになります。
スクリーンショット 2019-11-25 21.13.25.png
参画機関が行、研究テーマが列に対応しており、研究テーマに参画していれば1、参画していなければ0になっています。

続いて、EXCELのTRANSPOSE関数でこの行列に対する転置行列を作成します。
スクリーンショット 2019-11-25 21.13.41.png

さらに、EXCELのMMULT関数で最初の行列に対して先ほど作成した転置行列を乗じた行列を作成します。
スクリーンショット 2019-11-25 21.13.58.png
できればこの行列を作る過程もRでできればよかったのですが、やり方がわかりませんでした。

とりあえず、この内容を「project.csv」として保存します。

#注1(2023/07/5)
なお、この時、保存先はユーザーフォルダの直下にする必要があります。Macの場合のユーザーフォルダの開き方は以下のとおりです。
Finder のメニューバーから「移動」>「フォルダへ移動」の順に選択し、「/ユーザ」と入力して「return」キーを押下。
https://support.apple.com/ja-jp/HT201548#:~:text=Finder%20%E3%81%AE%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8B%E3%82%89,%E3%83%A6%E3%83%BC%E3%82%B6%E3%80%8D%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%8C%E9%96%8B%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

#注2(2023/07/8)
このcsvファイルの値は必ず1か0で表す必要があります。
もし空欄があると、以下のエラーメッセージが出ます。

R
Error in betweenness(resultjpro3) : 
  At core/centrality/betweenness.c:109 : Weight vector must not contain NaN values. Invalid value

そして、以下のとおり記述して図を出力します。

R
project <- read.csv("project.csv", row.names = "PROJECT")
project <- as.matrix(project)
library("igraph")
project <- graph.adjacency(project, mode = "undirected", diag = FALSE)
plot(project)

するとこんな図ができます。
スクリーンショット 2019-11-25 21.18.16.png

このままだと、重複している辺(多重辺)が存在して見づらいので、これらをまとめます。
その際、重複している辺の数に応じた太さになるようにします。

R
#念のため最初から記載。
project <- read.csv("project.csv", row.names = "PROJECT")
project <- as.matrix(project)
library("igraph")
project<-graph_from_adjacency_matrix(project, mode = "undirected",weighted=TRUE,diag = FALSE)
plot(project,edge.width = abs(E(project)$weight)*2)

するとこんな感じになりました。

スクリーンショット 2019-11-25 21.48.41.png

なお、graph_from_adjacency_matrix()関数ではなくgraph.adjacency()関数で記述すると「(list) オブジェクトは 'double' に変換できません」というエラーメッセージが出て出力することができないことがありました。
matrixとdata.frameで型が違うことが関係しているのかもしれませんが、結局のところよくわかりませんでした...

ちなみに後日、改めてgraph.adjacency()関数でやってみたらできました。

#2019.12.7追記
konandoiruasa様に教えて頂いた方法で、2部グラフから、共通のテーマを介した参画機関同士のネットワーク図を作成する方法を追記します。

まず、これまでと同様、以下の状態のcsvファイルがあります。(ファイル名はproject.csv)
スクリーンショット 2019-12-07 11.00.45.png

R
#project.csvの読み込み
project <- read.csv("project.csv", row.names = "PROJECT") 
#matrix()で行列に変換
project <- as.matrix(project)
#resultというオブジェクトを作成。
#元のprojectに対する転置行列をt()で作成し、%*% 演算子で元の行列に転置行列を掛けた内容を格納。
result <- project%*%t(project)  
#この状態でresultをみると、以下の通り計算結果が表示される。
> result
  a b c d e f
a 3 2 2 2 1 1
b 2 2 2 1 0 1
c 2 2 2 1 0 1
d 2 1 1 2 1 1
e 1 0 0 1 1 0
f 1 1 1 1 0 1
#igraphでグラフを作成
library("igraph")
result<-graph_from_adjacency_matrix(result, mode = "undirected",weighted=TRUE,diag = FALSE)
plot(result,edge.width = abs(E(result)$weight)*2)

するとこんな感じになります。
スクリーンショット 2019-12-07 11.00.58.png

2
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4