이번 포스팅에서는 방향성 있는 가중 네트워크 시각화 (directed and weighted network visualization)에 대해서 소개하겠습니다.

 

 - R igraph package 를 사용해서

 - 심리학 저널의 상호인용 빈도 데이터

  (* source : Lattin, Carroll and Green, 2003)

 

를 대상으로 논문 상호인용 빈도 네트워크를 그려보겠습니다.

 

먼저, 방향성 있는 가중 네트워크에 대해서 한번 더 소개하자면, 아래와 같이 화살표로 방향이 있고, 연결선에 가중치(weight)가 있는 네트워크를 말합니다.

 

 

[ 방향성 있는 가중 네트워크 (Directed and Weighted Network) ]

 

 

 

심리학 저널의 상호인용 빈도를 행렬 형태로 나타내보면 아래와 같습니다.

행렬의 요소 (i, j) 빈도는 저널 i의 논문이 저널 j에 인용된 회수입니다.

 - 예) (1, 2) = 32 : AJP 논문 32편이 JASP 논문에 인용됨

        (2, 1) = 8 : JASP 논문 8편이 AJP 논문에 인용됨

 

[ 심리학 저널 간 상호 인용 빈도 ]

 

[1] AJP

 [2] JASP

[3] JAP 

[4] JCPP 

[5] JCP 

[6] JEDP 

[7] JEXP 

[8] PKA 

[1] AJP

119

32 

35 

125 

[2] JASP

510 

116 

19 

[3] JAP

16 

84 

11 

[4] JCPP

21 

11 

533 

70 

[5] JCP

73 

225 

13 

[6] JEDP

52 

[7] JEXP

85 

119 

16 

126 

12 

27 

586 

13 

[8] PKA

10 

15 

58 

 

 

library()함수로 R의 igraph package를 로딩해서 시각화를 해보겠습니다.

igraph package는 데이터 포맷이 ID1, ID2, Weight or Frequency 의 행렬(matrix) 입니다.

아래에 위의 표를 행렬로 입력해서 불러들였는데요, 빈도(3번째 열)에 +1 을 해주었습니다.

(0이면 에러가 나는지 안되네요)

 

R script는 'R을 활용한 사회네트워크분석 입문'의 예시를 거의 대부분 사용하였으며,

그래프의 설정 parameter를 이리 저리 숫자를 조절해보면서 살짝 바꿔보았습니다.

 

> ############################################# > ## Network Analysis - igraph package > ############################################# > library(igraph) > > psych_edgelist <- matrix( + c(0, 1, 32, 0, 2, 2, 0, 3, 35, 0, 4, 6, 0, 5, 4, + 0, 6, 125, 0, 7, 2, 1, 0, 8, 1, 2, 8, 1, 3, 8, + 1, 4, 116, 1, 5, 9, 1, 6, 19, 1, 7, 5, 2, 0, 4, + 2, 1, 16, 2, 3, 0, 2, 4, 11, 2, 5, 7, 2, 6, 6, + 2, 7, 5, 3, 0, 21, 3, 1, 11, 3, 2, 1, 3, 4, 1, + 3, 5, 0, 3, 6, 70, 3, 7, 0, 4, 0, 0, 4, 1, 73, + 4, 2, 7, 4, 3, 0, 4, 5, 3, 4, 6, 0, 4, 7, 13, + 5, 0, 1, 5, 1, 9, 5, 2, 8, 5, 3, 1, 5, 4, 7, + 5, 6, 0, 5, 7, 2, 6, 0, 85, 6, 1, 119, 6, 2, 16, + 6, 3, 126, 6, 4, 12, 6, 5, 27, 6, 7, 13, 7, 0, 2, + 7, 1, 4, 7, 2, 10, 7, 3, 1, 7, 4, 7, 7, 5, 5, 7,6, 15), + byrow = T, ncol = 3) + 1 > > psych_edgelist [,1] [,2] [,3] [1,] 1 2 33 [2,] 1 3 3 [3,] 1 4 36 [4,] 1 5 7 [5,] 1 6 5 [6,] 1 7 126 [7,] 1 8 3 [8,] 2 1 9 [9,] 2 3 9 [10,] 2 4 9 [11,] 2 5 117 [12,] 2 6 10 [13,] 2 7 20 [14,] 2 8 6 [15,] 3 1 5 [16,] 3 2 17 [17,] 3 4 1 [18,] 3 5 12 [19,] 3 6 8 [20,] 3 7 7 [21,] 3 8 6 [22,] 4 1 22 [23,] 4 2 12 [24,] 4 3 2 [25,] 4 5 2 [26,] 4 6 1 [27,] 4 7 71 [28,] 4 8 1 [29,] 5 1 1 [30,] 5 2 74 [31,] 5 3 8 [32,] 5 4 1 [33,] 5 6 4 [34,] 5 7 1 [35,] 5 8 14 [36,] 6 1 2 [37,] 6 2 10 [38,] 6 3 9 [39,] 6 4 2 [40,] 6 5 8 [41,] 6 7 1 [42,] 6 8 3 [43,] 7 1 86 [44,] 7 2 120 [45,] 7 3 17 [46,] 7 4 127 [47,] 7 5 13 [48,] 7 6 28 [49,] 7 8 14 [50,] 8 1 3 [51,] 8 2 5 [52,] 8 3 11 [53,] 8 4 2 [54,] 8 5 8 [55,] 8 6 6 [56,] 8 7 16 > > psych.w <- graph.edgelist(psych_edgelist[, 1:2]) > psych.w IGRAPH D--- 8 56 -- + edges: [1] 1->2 1->3 1->4 1->5 1->6 1->7 1->8 2->1 2->3 2->4 2->5 2->6 [13] 2->7 2->8 3->1 3->2 3->4 3->5 3->6 3->7 3->8 4->1 4->2 4->3 [25] 4->5 4->6 4->7 4->8 5->1 5->2 5->3 5->4 5->6 5->7 5->8 6->1 [37] 6->2 6->3 6->4 6->5 6->7 6->8 7->1 7->2 7->3 7->4 7->5 7->6 [49] 7->8 8->1 8->2 8->3 8->4 8->5 8->6 8->7 > > E(psych.w)$weight <- psych_edgelist[,3] > psych.w IGRAPH D-W- 8 56 -- + attr: weight (e/n) + edges: [1] 1->2 1->3 1->4 1->5 1->6 1->7 1->8 2->1 2->3 2->4 2->5 2->6 [13] 2->7 2->8 3->1 3->2 3->4 3->5 3->6 3->7 3->8 4->1 4->2 4->3 [25] 4->5 4->6 4->7 4->8 5->1 5->2 5->3 5->4 5->6 5->7 5->8 6->1 [37] 6->2 6->3 6->4 6->5 6->7 6->8 7->1 7->2 7->3 7->4 7->5 7->6 [49] 7->8 8->1 8->2 8->3 8->4 8->5 8->6 8->7 > > psych.diag <- c(119, 510, 84, 533, 225, 52, 586, 58) > > psych.name <- c("AJP", "JASP", "JAP", "JCPP", "JCP", "JEDP", "JEXP", "PKA") > > plot(psych.w, + layout = layout.circle, + vertex.size = 2, + vertex.shape = "none", + vertex.size = psych.diag, + vertex.label = psych.name, + vertex.label.font = 2, + vertex.label.cex = sqrt(psych.diag)/10, + edge.width=2 + E(psych.w)$weight/10, + edge.arrow.width = E(psych.w)$weight/100 + )

 

 

 

 

 

igraph plot 의 parameter 기능은 아래와 같습니다. 

parameter를 바꿔가면서 최적의 이쁜 그래프를 찾아가 보시기 바랍니다.

 

 

1) Layout : 점의 좌표를 정하는 알고리즘

 

 - layout.circle : 원 배치 (위의 예시)

 

 - layout.random : 무작위 배치

 

 

- layout.fruchterman.reingold : Fruchterman Reingold 배치 알고리즘

 

 

 - layout.kamada.kawai : kamada Kawai 배치 알고리즘

 

 

 

 - layout.lgl : 대규모 네트워크를 위한 배치 알고리즘

 

 

 

2) Edge : 선 관련 파라미터

 

- edge.color : 선 색 지정 (default = "darkgrey")

- edge.width : 선 폭

 

- edge.arrow.size : 화살 크기

- edge.arrow.width : 화살 폭

- edge.arrow.mode : 화살 머리 유형 (0 : 없음,  1 : 역방향,  2 : 순방향,   3 : 양방향)

                            (무방향 네트워크의 경우 default = 0)

 

- edge.lty : 선 유형 ("solid", "dashed", "dotted", "dotdash", "longdash", "twodash")

- edge.label : 선 레이블

- edge.label.family : 선 레이블 종류 ("serif", "sans", "mono" 등)

- edge.label.font : 선 레이블 글자형 (1 : plain text, 2 : bold, 3 : italic, 4 : bold italic)

- edge.label.cex : 선 레이블 크기 (default = 1)

- edge.label.color : 선 레이블 색 (default = "navy")

 

 

3) Vertex : 점 관련

 

- vertex.size : 점 크기, vector도 가능 (default = 15)

- vertex.color : 점 색 (default = "SkyBlue2")

- vertex.frame.color : 점 윤곡의 색 (default = "black")

- vertex.shape : 점 형태 ("circle", "square", "rectangle", "none", default = "circle")

 

- vertex.label : 점 레이블 (vector)

- vertex.label.family : 점 레이블 종류 ("serif", "sans", "mono" 등)

- vertex.label.font : 점 레이블 글자형 (1 : plain text, 2 : bold, 3 : italic, 4 : bold italic)

- vertex.label.cex : 점 레이블 크기 (default = 1)

- vertex.label.dist : 점 중심과 레이블 간 거리 (default = 0)

- vertex.label.degree : 점 레이블 방향(radian) (좌 : 0, 우 : pi, 상 : -pi/2, 하 : pi/2)

- vertex.label.color : 점 레이블 색 (default = "navy")

 

 

네트워크 그래프 하나 그리는데 무슨 놈의 파라미터가 종류가 이렇게 많은 건지 놀랍기도하고, 이걸 언제 다 설정하나 부담되기도 하지요?

 

default 설정 값을 이용해서 한번 얼른 그려보시고요, 원하는 모양이 아니다 싶으면 parameter 종류 중에서 살짝 살짝 손을 좀 봐가면서 몇 번 더 그래프를 그려보시기 바랍니다. 

 

R이 제공하는 이런 다양한 그래프 옵션이면 못할 것이 없겠지요?!

 

[Reference]

- R을 활용한 사회네트워크분석 입문, 허명회 저, 자유아카데미, 2012

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요.

 

 

728x90
반응형
Posted by Rfriend
,