SNA 이론 · 단계별 학습 차례

단원 1-4Degree: Row Sums & Column Sums

연결정도 — 행합과 열합

SNA 이론 · 단계별 학습STAGED+ 스터디

1. 오늘의 질문 (Today's Question)

단원 1-2·1-3에서는 행렬을 곱했다. 오늘부터는 더한다. 곱셈이 "몇 걸음 걸어 닿는가"를 세는 연산이라면, 덧셈은 "한 사람에게 화살표가 몇 개 붙어 있는가"를 센다.

"우리 반에서 누가 인기 있는가"를 인접행렬에서 어떻게 읽는가?

답은 행을 따라 더하느냐, 열을 따라 더하느냐에 달려 있고, 이 둘은 전혀 다른 질문이다. 방향 네트워크에서 행과 열을 혼동하면 "친구를 많이 사귀려 하는 학생"과 "친구들이 좋아하는 학생"이 뒤섞인다.

네트워크는 계속 같은 학생 5명이다. 지명 7건:

M1→M2 M1→M3 M1→M5 M2→M3 M3→M1 M3→M4 M5→M1

5명 방향 네트워크
화살표가 나가는 개수 = 행합, 들어오는 개수 = 열합
A=M1M2M3M4M5M101101M200100M310010M400000M510000 A=\begin{array}{c|ccccc} & M_1 & M_2 & M_3 & M_4 & M_5\\ \hline M_1 & 0 & 1 & 1 & 0 & 1\\ M_2 & 0 & 0 & 1 & 0 & 0\\ M_3 & 1 & 0 & 0 & 1 & 0\\ M_4 & 0 & 0 & 0 & 0 & 0\\ M_5 & 1 & 0 & 0 & 0 & 0 \end{array}

2. 세 가지 연결정도의 정의 (Out-, In-, Total Degree)

정의. 단원 1-1의 약속대로 A[i,j]=1A[i,j]=1은 "iijj를 지명함"이다.

dout(i)=j=1nA[i,j]을 따라 더한다din(j)=i=1nA[i,j]을 따라 더한다dtotal(i)=dout(i)+din(i) \underbrace{d_{\text{out}}(i) = \sum_{j=1}^{n} A[i,\,j]}_{\textbf{행}\text{을 따라 더한다}} \qquad \underbrace{d_{\text{in}}(j) = \sum_{i=1}^{n} A[i,\,j]}_{\textbf{열}\text{을 따라 더한다}} \qquad d_{\text{total}}(i) = d_{\text{out}}(i) + d_{\text{in}}(i)

doutd_{\text{out}}의 합에서 움직이는 첨자는 jj(열 번호)이고 ii는 고정, dind_{\text{in}}의 합에서 움직이는 첨자는 ii(행 번호)이고 jj는 고정이다. 어느 첨자가 움직이는지만 보면 행합인지 열합인지 바로 안다.

이름계산세는 것교실 언어
외향 연결정도
out-degree
행합 jA[i,j]\sum_j A[i,j]내가 지명한 사람 수내가 좋아한다고 말한 친구 수
내향 연결정도
in-degree
열합 iA[i,j]\sum_i A[i,j]나를 지명한 사람 수인기 — 친구들이 나를 고른 횟수
전체 연결정도
total degree
행합 + 열합붙어 있는 화살표 총수관계에 얼마나 얽혀 있는가

"인기"는 내향 연결정도다. 자기가 친구를 많이 적어 낸 학생(외향 큼)과 친구들이 많이 적어 준 학생(내향 큼)은 다른 학생일 수 있다. 오늘 예제에서 실제로 갈린다.

3. 손 계산 ① 외향 연결정도 = 행합 (Out-Degree by Hand)

dout(1)d_{\text{out}}(1)AA1행을 가로로 훑으며 다 더한다. 0인 항도 빼지 않고 다섯 항 전부 쓴다:

dout(1)=j=15A[1,j]=A[1,1]0+A[1,2]1+A[1,3]1+A[1,4]0+A[1,5]1=0+1+1+0+1=3 d_{\text{out}}(1)=\sum_{j=1}^{5}A[1,j] = \underbrace{A[1,1]}_{0} + \underbrace{A[1,2]}_{1} + \underbrace{A[1,3]}_{1} + \underbrace{A[1,4]}_{0} + \underbrace{A[1,5]}_{1} = 0+1+1+0+1 = \mathbf{3}

다섯 학생 모두 같은 방식으로. 각 항이 어느 지명인지까지 적는다:

iiA[i,1]A[i,1]A[i,2]A[i,2]A[i,3]A[i,3]A[i,4]A[i,4]A[i,5]A[i,5]doutd_{\text{out}}어떤 지명인가
M1011013M1→M2 M1→M3 M1→M5
M2001001M2→M3
M3100102M3→M1 M3→M4
M4000000없음 — 아무도 지명하지 않았다
M5100001M5→M1
dout=(3,  1,  2,  0,  1) d_{\text{out}} = (\,3,\;1,\;2,\;0,\;1\,)

dout(4)=0d_{\text{out}}(4)=0이 뜻하는 것. 단원 1-3에서 A3A^3의 M4 행이 전부 0이었던 이유가 바로 이 한 숫자다. 나가는 화살표가 없으면 어떤 길이의 걷기도 시작할 수 없다. 행합 0 ⟺ 어떤 AkA^k에서도 그 행은 0.

4. 손 계산 ② 내향 연결정도 = 열합 (In-Degree by Hand)

이번에는 을 세로로 훑는다. din(1)d_{\text{in}}(1)은 "M1을 지명한 사람이 몇 명인가":

din(1)=i=15A[i,1]=A[1,1]0+A[2,1]0+A[3,1]1+A[4,1]0+A[5,1]1=0+0+1+0+1=2 d_{\text{in}}(1)=\sum_{i=1}^{5}A[i,1] = \underbrace{A[1,1]}_{0} + \underbrace{A[2,1]}_{0} + \underbrace{A[3,1]}_{1} + \underbrace{A[4,1]}_{0} + \underbrace{A[5,1]}_{1} = 0+0+1+0+1 = \mathbf{2}

첫 항의 첨자가 A[1,1],A[2,1],A[3,1],A[1,1], A[2,1], A[3,1], \dots앞자리가 변한다는 점을 눈으로 확인할 것. §3에서는 뒷자리가 변했다.

jjA[1,j]A[1,j]A[2,j]A[2,j]A[3,j]A[3,j]A[4,j]A[4,j]A[5,j]A[5,j]dind_{\text{in}}누가 지명했나
M1001012M3, M5
M2100001M1
M3110002M1, M2
M4001001M3
M5100001M1
din=(2,  1,  2,  1,  1) d_{\text{in}} = (\,2,\;1,\;2,\;1,\;1\,)

두 벡터를 나란히 놓고 읽기 (Reading Both Together)

학생doutd_{\text{out}} 내가 지명dind_{\text{in}} 나를 지명 (인기)dtotald_{\text{total}}읽기
M1325가장 활발하고 인기도 최고 — 중심 인물
M2112조용한 편, 균형
M3224M1과 함께 인기 1위 (2표), 지명도 함
M4011지명받았지만 본인은 아무도 지명 안 함
M5112M1과만 연결 — 주변부

5. 두 합이 같다 — 악수 정리 (Sum of Degrees = Number of Ties)

두 벡터의 합을 각각 구해 보면:

idout(i)=3+1+2+0+1=7jdin(j)=2+1+2+1+1=7 \sum_i d_{\text{out}}(i) = 3+1+2+0+1 = \mathbf{7} \qquad \sum_j d_{\text{in}}(j) = 2+1+2+1+1 = \mathbf{7}

우연이 아니다. 둘 다 행렬의 모든 칸을 한 번씩 더한 것이기 때문이다. 더하는 순서만 다르다:

idout(i)=ijA[i,j]=모든 칸A[i,j]=jiA[i,j]=jdin(j) \sum_i d_{\text{out}}(i) = \sum_i \sum_j A[i,j] = \sum_{\text{모든 칸}} A[i,j] = \sum_j \sum_i A[i,j] = \sum_j d_{\text{in}}(j)

그리고 그 값은 1의 개수 = 지명(엣지)의 총 개수 = 7이다. "가로로 먼저 더하고 세로로 합치기"와 "세로로 먼저 더하고 가로로 합치기"가 같다는, 아주 단순하지만 검산에 유용한 사실이다.

검산 습관. 손으로 연결정도를 구한 뒤 두 벡터의 합이 서로 같은지 확인하라. 다르면 어딘가에서 칸을 빼먹었거나 두 번 셌다는 뜻이다. 무방향 네트워크에서는 이 값이 엣지 수의 2배가 되는데(단원 1-8), 사람 수만큼 악수를 세면 악수마다 두 번 세어지기 때문이다 — 그래서 악수 정리라 부른다.

6. 평균 연결정도 (Mean Degree)

dˉout=1nidout(i)=75=1.4dˉin=75=1.4 \bar{d}_{\text{out}} = \frac{1}{n}\sum_i d_{\text{out}}(i) = \frac{7}{5} = \mathbf{1.4} \qquad \bar{d}_{\text{in}} = \frac{7}{5} = \mathbf{1.4}

§5의 항등식 때문에 외향 평균과 내향 평균은 언제나 같다. "평균적으로 한 학생이 1.4명을 지명했고, 평균적으로 1.4표를 받았다"는 같은 사실의 두 표현이다. 따라서 평균 연결정도는 방향을 구별하지 못한다 — 학급의 활발함 정도를 나타내는 한 숫자일 뿐이다. 누가 인기 있는지는 반드시 dind_{\text{in}} 벡터를 봐야 한다.

참고로 이 값은 다음 단원의 밀도와 직결된다: dˉ=1.4\bar{d} = 1.4, 가능한 최대 지명 수는 n1=4n-1 = 4명이므로 1.4/4=0.351.4 / 4 = 0.35 — 이것이 곧 밀도다. → 단원 1-5에서 다룸

7. 헷갈리는 이웃 지표들 (Degree vs Related Quantities)

연결정도와 비슷해 보이지만 다른 것을 세는 값들을 한 표에 모아 구별해 둔다. 지금까지 배운 것이 전부 여기 모인다:

계산M1의 값세는 것
dout(1)d_{\text{out}}(1)AA의 1행 합3M1이 지명한 사람 수
din(1)d_{\text{in}}(1)AA의 1열 합2M1을 지명한 사람 수
(A2)[1,1](A^2)[1,1]A2A^2의 대각2상호 지명 수 (M1↔M3, M1↔M5)
(A3)[1,1](A^3)[1,1]A3A^3의 대각1M1이 참여한 삼각 순환
j(A2)[1,j]\sum_j (A^2)[1,j]A2A^2의 1행 합42걸음 걷기의 수 (사람 수가 아님)

A2A^2의 행합은 "친구의 친구 수"가 아니다. A2A^2의 1행은 (2,0,1,1,0)(2,0,1,1,0)이고 합은 4이지만, 이 4는 걷기의 개수다. 단원 1-3에서 본 대로 그중 2개는 제자리로 돌아오는 걷기다. "몇 과 2걸음 안에 이어지는가"를 세려면 도달 가능한 사람 수를 세야 한다. → 단원 1-7 도달가능성

8. R 검증 (Verification in R)

A <- matrix(c(0,1,1,0,1,
              0,0,1,0,0,
              1,0,0,1,0,
              0,0,0,0,0,
              1,0,0,0,0), 5, 5, byrow = TRUE)
dimnames(A) <- list(paste0("M",1:5), paste0("M",1:5))

rowSums(A)              # M1 M2 M3 M4 M5 →  3  1  2  0  1   외향
colSums(A)              # M1 M2 M3 M4 M5 →  2  1  2  1  1   내향
rowSums(A) + colSums(A) # 5 2 4 1 2                        전체

sum(A)                  # 7   ← 지명 총수
sum(rowSums(A)) == sum(colSums(A))   # TRUE  ← §5 검산
mean(rowSums(A))        # 1.4

# sna 패키지는 cmode 인자로 세 가지를 한 함수로 처리한다
library(sna)
degree(A, cmode = "outdegree")   # 3 1 2 0 1
degree(A, cmode = "indegree")    # 2 1 2 1 1
degree(A, cmode = "freeman")     # 5 2 4 1 2   ← 기본값, 전체 연결정도

함정. sna::degree(A)를 인자 없이 부르면 전체 연결정도(freeman)가 나온다. "인기"를 보려 했는데 외향+내향이 섞인 값을 보게 되므로, 방향 데이터에서는 항상 cmode를 명시하는 습관이 안전하다. igraph에서는 degree(g, mode = "in") / "out" / "all"이다.

9. 교실 해석 (Classroom Interpretation)

① 인기는 열합으로만 본다. 설문지를 걷어 "친구 이름을 많이 쓴 학생"을 세는 것은 외향 연결정도이고, 이는 성실성·사교성·설문 이해도에 좌우된다. 학생의 사회적 위치를 보려면 내향 연결정도(받은 표)를 봐야 한다. M1과 M3이 각각 2표로 인기 1위인데, M1은 3명을 지명했고 M3은 2명을 지명했다 — 인기 순위와는 무관하다.

② 외향 0은 "고립"이 아니다. M4는 dout=0,din=1d_{\text{out}}=0, d_{\text{in}}=1이다. M3이 M4를 지명했으므로 친구가 없는 학생이 아니다. 다만 본인이 아무 이름도 적지 않았다. 설문 미응답, 이름 쓰기를 꺼림, 실제로 특정 친구를 고르지 못함 — 모두 가능하다. 숫자로는 구별되지 않으니 담임의 확인이 필요한 지점이다.

③ 진짜 고립 후보는 내향 0이다. 아무도 지명하지 않은 학생, 즉 din(j)=0d_{\text{in}}(j)=0인 열이 전부 0인 학생이 사회적 고립 위험군이다. 우리 예제에는 없다(모두 최소 1표). 실제 학급 데이터에서는 이 열합 0인 학생을 가장 먼저 확인한다.

④ 외향과 내향의 차이가 말해 주는 것. doutdind_{\text{out}} - d_{\text{in}}를 보면 M1은 +1+1(지명을 더 많이 함), M4는 1-1(받기만 함)이다. 차이가 크게 양수인 학생은 관계를 원하지만 아직 받지 못하는 상태일 수 있고 (일방 지명이 많다는 뜻 — 단원 1-2의 diag(A2)\operatorname{diag}(A^2)로 확인), 크게 음수인 학생은 주변의 관심은 받지만 본인은 관계 표현을 안 하는 상태다.

⑤ 평균 1.4의 의미. "친구 3명을 적어라"고 했는데 평균이 1.4라면 많은 학생이 3명을 채우지 못했다는 뜻이다. 학급 전체의 관계 밀도가 낮거나, 설문 상황이 편안하지 않았을 수 있다. 평균은 개인이 아니라 학급을 진단하는 숫자다.

10. 연습문제 (Exercises)

문제 1. 아래 상황을 반영해 지명 한 건을 추가한 행렬 AA'을 생각하자 — M4가 M1을 지명했다 (즉 A[4,1]=1A'[4,1]=1, 나머지는 AA와 같다). 이때 ① doutd_{\text{out}}dind_{\text{in}} 두 벡터를 다시 구하고 ② 지명 총수와 평균 연결정도가 어떻게 바뀌는지 쓰고 ③ 단원 1-3에서 "M4 행이 전부 0이라 A3A^3의 M4 행도 0"이었던 사실이 이제 어떻게 되는지 판단하시오.

문제 2. 원래 행렬 AA에서 dind_{\text{in}}이 가장 큰 학생은 M1과 M3(각 2표)로 동점이다. "인기 1위"를 하나만 뽑아야 한다면 어떤 추가 근거를 볼 수 있는지, 지금까지 배운 값 (doutd_{\text{out}}, dtotald_{\text{total}}, diag(A2)\operatorname{diag}(A^2), diag(A3)\operatorname{diag}(A^3)) 중에서 골라 각각 M1·M3의 값을 비교해 판단하시오. 정답이 하나로 정해지지 않아도 좋다 — 어떤 값을 근거로 삼았는지를 쓰는 것이 문제의 목적이다.

먼저 스스로 풀고 §11 해설과 맞춰 볼 것.

11. 연습문제 해설과 답 (Solutions)

11-1. 문제 1 — 지명 한 건이 바꾸는 것 (Adding One Tie)

무엇이 달라지는가. A[4,1]=1A'[4,1]=1M4 행에 1이 하나 생긴다:

A=M1M2M3M4M5M101101M200100M310010M410000M510000 A'=\begin{array}{c|ccccc} & M_1 & M_2 & M_3 & M_4 & M_5\\ \hline M_1 & 0 & 1 & 1 & 0 & 1\\ M_2 & 0 & 0 & 1 & 0 & 0\\ M_3 & 1 & 0 & 0 & 1 & 0\\ M_4 & \color{#dc2626}{1} & 0 & 0 & 0 & 0\\ M_5 & 1 & 0 & 0 & 0 & 0 \end{array}

① 두 벡터 다시 구하기. 바뀌는 칸은 [4,1][4,1] 하나뿐이므로, 그 칸이 속한 4행1열만 다시 더하면 된다:

무엇전개이전이후
dout(4)d_{\text{out}}(4)1+0+0+0+01+0+0+0+001
din(1)d_{\text{in}}(1)0+0+1+1+10+0+1+1+123
나머지해당 행·열에 변화 없음그대로

답 ① dout=(3,1,2,1,1)d_{\text{out}} = (3,\,1,\,2,\,\mathbf{1},\,1), din=(3,1,2,1,1)d_{\text{in}} = (\mathbf{3},\,1,\,2,\,1,\,1)

답 ② 지명 총수 787 \to \mathbf{8}, 평균 연결정도 1.48/5=1.61.4 \to 8/5 = \mathbf{1.6}. 검산: 3+1+2+1+1=83+1+2+1+1 = 8, 3+1+2+1+1=83+1+2+1+1 = 8 — 두 합이 같다(§5). ✓

답 ③ 더 이상 0이 아니다. dout(4)=1d_{\text{out}}(4)=1이 되었으므로 M4에서 출발하는 걷기가 생긴다. 예를 들어 M4→M1→M3→M4는 3걸음이고, 세 학생이 모두 달라 삼각 순환이다. 즉 (A3)[4,4]1(A'^3)[4,4] \ge 1이 되어 M4가 순환에 참여하게 된다.

교실 해석. 화살표 하나가 추가되자 M4는 "받기만 하는 학생"에서 "고리에 참여하는 학생"으로 바뀌었다. 설문에서 이름 한 줄을 더 쓰는 것만으로 구조상 위치가 달라진다는 뜻이며, 반대로 말하면 미응답 한 건이 그 학생을 구조에서 지워 버린다. 연결정도 0을 보면 관계의 부재인지 응답의 부재인지 먼저 확인해야 하는 이유다.

11-2. 문제 2 — 동점을 가르는 근거 (Breaking a Tie)

M1과 M3의 값을 지금까지 배운 모든 지표로 나란히 놓는다(단원 1-2·1-3에서 구한 값):

근거M1M3무엇을 재는가동점을 가르는가
dind_{\text{in}}22받은 표동점
doutd_{\text{out}}32내가 지명한 수M1 우세
dtotald_{\text{total}}54붙은 화살표 총수M1 우세
(A2)[i,i](A^2)[i,i]21상호 지명 수M1 우세
(A3)[i,i](A^3)[i,i]11삼각 순환 참여동점
A2A^2 행합432걸음 걷기 수M1 우세

어떤 근거를 써도 M1이 M3보다 우세하거나 동점이므로, 하나를 뽑아야 한다면 M1이 타당하다. 다만 근거를 밝혀야 한다 — 가장 설득력 있는 것은 diag(A2)\operatorname{diag}(A^2): 상호 지명 수 (M1은 2건, M3은 1건)다.

왜 상호 지명이 더 나은 근거인가. dind_{\text{in}}의 2표 안에는 일방 지명(짝사랑)이 섞여 있을 수 있다. M3이 받은 2표는 M1과 M2에게서 온 것인데, M1↔M3은 상호지만 M2→M3은 일방이다(M3은 M2를 지명하지 않았다). 반면 M1이 받은 2표는 M3과 M5에게서 왔고 둘 다 상호다. "서로 친구라고 답한 관계"가 "한쪽만 좋아하는 관계"보다 안정적이므로, 같은 2표라도 질이 다르다.

주의 — doutd_{\text{out}}은 인기의 근거가 아니다. "M1이 3명을 지명했으니 더 인기 있다"는 논리는 틀렸다. 자기가 이름을 많이 적은 것은 자신의 행동이지 남들의 평가가 아니다. 위 표에서 doutd_{\text{out}}·dtotald_{\text{total}}이 M1 우세로 나오지만, 이것은 인기의 근거가 아니라 활발함의 근거다. 동점을 가를 때 무엇을 재는 값인지 반드시 확인해야 한다.

# 문제 1 검증
Ap <- A; Ap[4,1] <- 1
rowSums(Ap)   # 3 1 2 1 1
colSums(Ap)   # 3 1 2 1 1
sum(Ap)       # 8   → 평균 8/5 = 1.6
diag(Ap %*% Ap %*% Ap)   # 2 1 2 1 0  ← 4번째 값이 0에서 1로 (M4가 순환에 참여)

# 문제 2 검증 — 원래 A
diag(A %*% A)            # 2 0 1 0 1  ← 상호 지명: M1은 2, M3은 1
rowSums(A %*% A)         # 4 2 3 0 3

다음 단원 — 1-5: 밀도(density) — 방향 n(n1)n(n-1) vs 무방향 n(n1)/2n(n-1)/2. 오늘 구한 평균 1.4를 "가능한 최대"로 나누면 밀도가 된다. · 이 문서: notes/04_단원1-4_연결정도_행합과_열합.html