← R 실습 — 손으로 돌려 보기 차례
1편The R SNA Ecosystem
R의 SNA 생태계 — 네 패키지의 역할 분담
R 실습 — 손으로 돌려 보기STAGED+ 스터디
1.1 누가 무엇을 맡는가 (Division of Labor)
R에서 네트워크를 다루는 패키지는 두 계보로 갈린다. 이 사실을 모르고 시작하면 반드시 헤맨다.
| 패키지 | 계보 | 맡는 일 |
|---|---|---|
| network | statnet | 자료구조. 분석 함수는 거의 없다. 네트워크를 담는 그릇(network 객체)을 정의하고,
정점·간선에 속성을 붙이는 일을 한다. sna와 ergm이 이 그릇 위에서 돌아간다. |
| sna | statnet | 사회학 전통의 분석 도구. 함수 273개.
중심성, 블록모델링, QAP 검정 등 사회학 문헌에 나오는 지표가 강하다.
인접행렬(matrix)을 그대로 받아 준다는 게 큰 장점. |
| igraph | 독립 | 그래프 이론·전산 전통의 분석 도구. C로 짜여 빠르고,
커뮤니티 탐지·k-코어·무작위 그래프 모형이 압도적으로 풍부하다.
대신 igraph 전용 객체만 받는다. |
| intergraph | 다리 | 번역기. asIgraph() / asNetwork() 두 함수가 사실상 전부다.
속성까지 같이 옮겨 준다. |
실무에서 쓰는 방식은 "둘 중 하나를 고른다"가 아니라
"둘 다 켜 두고 필요한 쪽 함수를 쓴다"이다.
매개 중심성은 어느 쪽이든 같지만, 커뮤니티 탐지는 igraph에만 있고
블록모델링·QAP는 sna에만 있다. 그래서 이 안내서도 둘을 같이 쓴다.
install.packages(c("network", "sna", "igraph", "intergraph"))
library(network) # 자료구조
library(sna) # 사회학 지표
library(igraph) # 그래프 알고리즘
library(intergraph) # 변환
이 프로젝트에 깔린 판본: network 1.20, sna 2.8, igraph 2.3.3, intergraph 2.0.4, ergm 4.12 (R 4.5.1).
1.2 가장 먼저 부딪히는 벽: 이름 충돌 (Function Masking)
위 순서로 패키지를 켜면 콘솔에 이런 경고가 쏟아진다.
The following objects are masked from 'package:sna':
betweenness, bonpow, closeness, components, degree,
dyad.census, evcent, hierarchy, is.connected, neighborhood,
triad.census
같은 이름의 함수가 양쪽에 다 있다. 나중에 켠 igraph가 sna를 가려서(mask), 그냥 degree()라고 쓰면 igraph 것이 불린다. 문제는 두 함수의 인자 이름이 서로 다르다는 점이다.
closeness(adj, cmode = "suminvdir")
Error in closeness(adj, cmode = "suminvdir") :
unused argument (cmode = "suminvdir")
교재대로 썼는데 에러가 난다. 코드가 틀린 게 아니라 다른 패키지의 함수가 불린 것이다. sna는 cmode=, igraph는 mode=를 쓴다.
해결책은 하나뿐이다 — 항상 네임스페이스를 붙여 쓴다.
sna::closeness(adj, gmode = "digraph", cmode = "suminvdir") # ✔ 확실
igraph::closeness(g, mode = "out") # ✔ 확실
closeness(adj, cmode = "suminvdir") # ✘ 어느 쪽인지 모름
conflicts.policy 옵션은 경고만 없애 줄 뿐,
어느 함수가 불릴지는 바꾸지 않는다. 경고를 껐다고 문제가 사라진 게 아니다.
충돌하는 이름 중 초보자가 실제로 자주 쓰는 것: degree, closeness, betweenness, evcent, components, dyad.census, triad.census, neighborhood. 이 여덟 개는 예외 없이 ::를 붙이는 습관을 들이는 게 제일 싸게 먹힌다.