R의 SNA 생태계 — 네 패키지의 역할 분담

R 실습 — 손으로 돌려 보기STAGED+ 스터디

1.1 누가 무엇을 맡는가 (Division of Labor)

R에서 네트워크를 다루는 패키지는 두 계보로 갈린다. 이 사실을 모르고 시작하면 반드시 헤맨다.

statnet 계보 독립 sna 사회학 지표 273개 ergm 통계 모형 network 자료구조 — 네트워크를 담는 그릇 위 둘이 이 그릇 위에서 돈다 igraph 그릇과 알고리즘을 자기 안에 다 가진다 커뮤니티 탐지 · k-코어 무작위 그래프 모형 대신 igraph 전용 객체만 받는다 intergraph asIgraph() / asNetwork() — 속성까지 같이 옮긴다
두 계보는 객체가 다르다. 그래서 오갈 때마다 번역기가 필요하다.
패키지계보맡는 일
networkstatnet자료구조. 분석 함수는 거의 없다. 네트워크를 담는 그릇(network 객체)을 정의하고, 정점·간선에 속성을 붙이는 일을 한다. snaergm이 이 그릇 위에서 돌아간다.
snastatnet사회학 전통의 분석 도구. 함수 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. 이 여덟 개는 예외 없이 ::를 붙이는 습관을 들이는 게 제일 싸게 먹힌다.