속성과 가중치 — 동질성, 그리고 호감도 살리기

SNA 입문 · R로 시작하기STAGED+ 스터디

7. 속성과 연결하기 — 동질성 (Attributes and Homophily)

6.3절에서 눈으로 본 것을 숫자 하나로 만들어 보자. E-I 지수는 가장 널리 쓰이는 동질성 척도다.

E-I=EIE+I{E:집단 바깥으로 나간 간선 수I:집단 에 머문 간선 수\text{E-I} = \frac{E - I}{E + I} \qquad \begin{cases} E: \text{집단 \textbf{바깥}으로 나간 간선 수} \\ I: \text{집단 \textbf{안}에 머문 간선 수}\end{cases}

범위는 1-1(완전 동질) ~ +1+1(완전 이질), 0이면 무작위다.

fem <- setNames(nod$female, nod$name)
table(from = ifelse(fem[el$from], "여", "남"),
      to   = ifelse(fem[el$to],   "여", "남"))
    to
from 남 여
  남 40  2
  여  5 41
어느 칸계산
II — 같은 성별남→남 + 여→여40 + 4181
EE — 다른 성별남→여 + 여→남2 + 57
전체 간선81 + 788 ✔
E-I 지수(7 − 81) / 88 = −74 / 88−0.8409
# igraph의 assortativity로도 같은 이야기를 확인할 수 있다
igraph::assortativity_nominal(g, as.integer(factor(igraph::V(g)$female)))
[1] 0.8411          # 부호가 반대 방향으로 정의됨: +면 동질

igraph::assortativity_degree(g)
[1] -0.0996
두 지표의 부호 규칙이 반대다. E-I는 음수가 동질(같은 편끼리 뭉침), assortativity는 양수가 동질이다. 값도 −0.8409와 +0.8411로 크기까지 거의 같아 헷갈리기 딱 좋다. 어느 쪽을 쓰든 "음수가 뭉침인가 양수가 뭉침인가"를 문서에 명시해야 한다.
교실 해석
  • E-I = −0.84 — 거의 한계값(−1)에 가깝다. 지명 88개 중 성별을 넘어간 것이 단 7개다. "남녀가 좀 갈려 있다"가 아니라 "사실상 두 개의 학급"에 가깝다.
  • 7개가 워낙 적으니 그냥 다 들여다볼 수 있다. 이게 작은 학급 분석의 이점이다.
    지명방향호감도
    1027(여) → 1051(남)여→남5
    1036(남) → 1006(여)남→여4
    1063(여) → 1042(남)여→남3
    1069(여) → 1051(남)여→남3
    1027(여) → 1048(남)여→남2
    1042(남) → 1006(여)남→여2
    1006(여) → 1042(남)여→남1
    성별을 넘는 지명 7개에 관여한 학생은 8명뿐이고, 나머지 18명은 경계를 한 번도 넘지 않았다. 1006 ↔ 1042는 유일한 상호 지명인데 호감도가 1점과 2점으로 가장 낮다 — "친하다"기보다 "서로 안다"에 가깝다. 이 둘이 매개 1·2위인 이유가 여기 있다. 반대로 1027 → 1051은 5점 만점인데 되돌아오지 않았다.
  • 남→여 2개 vs 여→남 5개 — 여학생 쪽에서 건너가는 지명이 두 배 이상 많다. 표본이 작아 단정할 수는 없지만, 눈여겨볼 비대칭이다.
  • 차수 동류성 −0.0996 — 거의 0이다. 인기 있는 학생끼리 특별히 뭉치지도, 인기 학생이 주변 학생을 특별히 챙기지도 않는다. "인기 서열"은 없다는 뜻으로, 나쁘지 않은 신호다.

8. 가중치 다루기 (Weighted Networks)

이 자료의 liking은 1~5점이다. 지금까지는 이걸 버리고 0/1로만 봤다. 가중치를 살리면 무엇이 달라지는지 확인해 보자.

table(el$liking)
 1  2  3  4  5
15 17 22 22 12
mean(el$liking)
[1] 2.988636

gw <- igraph::graph_from_data_frame(el, directed = TRUE, vertices = nod)
sw <- igraph::strength(gw, mode = "in", weights = igraph::E(gw)$liking)
names(sw) <- igraph::V(gw)$name
sort(sw, decreasing = TRUE)[1:5]
1018 1078 1009 1051 1042
  28   28   26   26   22
순위비가중 (indegree)가중 (strength)
11051 (10)1018 · 1078 (28) 공동
21018 (9)1009 · 1051 (26) 공동
31042 (9)1042 (22)
41078 (8)
51006 (7)
ind2 <- igraph::degree(gw, mode = "in")
cor(rank(-sw), rank(-ind2), method = "spearman")
[1] 0.9119
순위 상관 0.91 — 거의 같지만 완전히 같지는 않다. 1위가 바뀌었다. 1051은 지명 개수가 제일 많았지만(10개), 1078은 지명 개수는 8개인데 받은 점수 합이 더 높다(28점). 1078을 지명한 학생들이 더 높은 호감도를 줬다는 뜻이다.

실무 판단: 가중치는 중심성 순위를 크게 바꾸지 않는다. 그러니 처음 분석은 0/1로 시작하고, 가중치는 "1위가 뒤집히는지"를 확인하는 용도로 나중에 쓴다. 매개·근접에 가중치를 넣으면 "가중치 = 거리인가 강도인가"를 뒤집어야 해서 실수하기 쉽다 (igraph의 weights=는 매개·근접에서 거리로 해석한다 — 호감도를 그대로 넣으면 "좋아할수록 멀다"가 된다).