단원 1-7Reachability Matrix & Strong/Weak Components
도달가능성 행렬과 강한·약한 컴포넌트
- 오늘의 질문 (Today's Question)
- 도달가능성 행렬의 정의 (Definition of Reachability)
- 왜 를 더하는가 (Why Add the Identity)
- 손 계산 — 25칸 전부 더하기 (Summing All 25 Cells)
- 행과 열로 읽기 (Reading Rows and Columns)
- 강한 컴포넌트 — (Strong Components)
- 약한 컴포넌트 — 방향을 지우고 보기 (Weak Components)
- R 검증 (Verification in R)
- 교실 해석 (Classroom Interpretation)
- 연습문제 (Exercises)
- 연습문제 해설과 답 (Solutions)
1. 오늘의 질문 (Today's Question)
단원 1-6에서 거리행렬 를 만들었다. 오늘은 거기서 숫자를 버리고 0/1만 남긴다.
이 두 질문의 답이 도달가능성 행렬과 컴포넌트다. 단원 1-6의 를 보면 답이 이미 절반은 보인다 — 가 아닌 칸이 곧 "닿는" 칸이다.
오늘은 이 을 거리행렬 없이 곧바로 만드는 법(§2~§4)과, 에서 학생 집단을 갈라내는 법(§6~§7)을 배운다.
2. 도달가능성 행렬의 정의 (Definition of Reachability)
정의. 도달가능성 행렬(reachability matrix) 은
이며, 행렬로는 다음과 같이 계산한다:
세 부분으로 나눠 읽는다.
| 부분 | 뜻 | 왜 필요한가 |
|---|---|---|
| 0걸음 — 제자리 | 관례를 반영 (§3에서 자세히) | |
| 1걸음, 2걸음, … 걷기의 개수 | 길이가 몇이든 하나라도 있으면 닿는다 | |
| 에서 멈춤 | 4걸음까지 () | 경로는 최대 걸음 — 단원 1-6 §2와 같은 이유 |
| 양수면 1, 0이면 0 | 개수는 버리고 유무만 남긴다 |
더하는 이유는 "합"이 필요해서가 아니다. 실제로 필요한 건 논리합(OR) —
중 어느 하나라도 그 칸이 0이 아니면 1이다.
행렬은 음수가 없으므로 그냥 더한 뒤 > 0을 씌워도 결과가 같아서 이렇게 쓴다.
그래서 §4에서 나오는 합계 숫자 8, 7, 4 …는 버려질 값이다. 개수 자체에는 의미를 두지 말 것
(단원 1-3에서 배운 대로, 그 숫자는 걷기의 개수라 부풀려져 있다).
3. 왜 를 더하는가 (Why Add the Identity)
를 빼고 만 더하면 대각선이 어떻게 되는지 보자. 단원 1-3에서 대각선의 뜻은 "자기에게 돌아오는 순환"이었다.
| 학생 | 없는 합 | 순환에 속하는가 | ||||
|---|---|---|---|---|---|---|
| M1 | 0 | 2 | 1 | 4 | 7 > 0 | 예 — M1→M3→M1 |
| M2 | 0 | 0 | 1 | 0 | 1 > 0 | 예 — M2→M3→M1→M2 |
| M3 | 0 | 1 | 1 | 2 | 4 > 0 | 예 |
| M4 | 0 | 0 | 0 | 0 | 0 | 아니오 — 나가는 화살표가 없다 |
| M5 | 0 | 1 | 0 | 2 | 3 > 0 | 예 — M5→M1→M5 |
가 없으면 M4는 자기 자신에게조차 도달하지 못한다고 기록된다. 그러면 "M4는 어느 컴포넌트에도 속하지 않는" 이상한 결과가 나온다. 를 더하는 것은 "누구나 자기 자신에게는 0걸음으로 닿아 있다"는 관례를 행렬에 심는 일이다. 수학적으로는 이므로 는 "0걸음 걷기"를 세는 항이라고 봐도 된다.
4. 손 계산 — 25칸 전부 더하기 (Summing All 25 Cells)
다섯 행렬 를 칸별로 더한다. 단원 1-6 §1에 다 있는 값이다. 0인 항도 빼지 않고 다섯 항을 전부 쓴다.
| 칸 | 합 | ||||||
|---|---|---|---|---|---|---|---|
| 1 | 0 | 2 | 1 | 4 | 8 | 1 | |
| 0 | 1 | 0 | 2 | 1 | 4 | 1 | |
| 0 | 1 | 1 | 2 | 3 | 7 | 1 | |
| 0 | 0 | 1 | 1 | 2 | 4 | 1 | |
| 0 | 1 | 0 | 2 | 1 | 4 | 1 | |
| 0 | 0 | 1 | 0 | 2 | 3 | 1 | |
| 1 | 0 | 0 | 1 | 0 | 2 | 1 | |
| 0 | 1 | 0 | 1 | 1 | 3 | 1 | |
| 0 | 0 | 1 | 0 | 1 | 2 | 1 | |
| 0 | 0 | 0 | 1 | 0 | 1 | 1 | |
| 0 | 1 | 0 | 2 | 1 | 4 | 1 | |
| 0 | 0 | 1 | 0 | 2 | 3 | 1 | |
| 1 | 0 | 1 | 1 | 2 | 5 | 1 | |
| 0 | 1 | 0 | 1 | 1 | 3 | 1 | |
| 0 | 0 | 1 | 0 | 2 | 3 | 1 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 1 | 0 | 0 | 0 | 0 | 1 | 1 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 0 | 1 | 0 | 2 | 1 | 4 | 1 | |
| 0 | 0 | 1 | 0 | 2 | 3 | 1 | |
| 0 | 0 | 1 | 1 | 2 | 4 | 1 | |
| 0 | 0 | 0 | 1 | 1 | 2 | 1 | |
| 1 | 0 | 1 | 0 | 2 | 4 | 1 |
합계 행렬과 그 결과인 :
§1에서 거리행렬의 를 0으로 바꿔 만든 과 정확히 같다 ✓. 두 길(거리행렬에서 오는 길 / 행렬 거듭제곱을 더하는 길)이 같은 답을 준다는 것은 라는 관계를 확인해 주는 셈이다.
5. 행과 열로 읽기 (Reading Rows and Columns)
단원 1-4에서 행합·열합의 뜻이 달랐던 것처럼, 의 행과 열도 다른 질문에 답한다. 자기 자신(대각선)은 빼고 센다.
| 학생 | 행합 − 1 out-reach | 내가 소식을 보낼 수 있는 사람 | 열합 − 1 in-reach | 나에게 소식을 보낼 수 있는 사람 |
|---|---|---|---|---|
| M1 | 4 | 전원 | 3 | M2, M3, M5 |
| M2 | 4 | 전원 | 3 | M1, M3, M5 |
| M3 | 4 | 전원 | 3 | M1, M2, M5 |
| M4 | 0 | 아무도 없음 | 4 | 전원 |
| M5 | 4 | 전원 | 3 | M1, M2, M3 |
M4는 완벽한 비대칭이다 — 도달 범위 0, 피도달 범위 4. 반면 나머지 넷은 모두 out-reach 4(전원에게 닿는다). 즉 도달가능성만으로는 M1~M3, M5를 구별할 수 없다. "닿냐 안 닿냐"는 거친 질문이라 학생 간 차이를 대부분 지워 버린다. 그래서 얼마나 빨리 닿는지(거리, 단원 1-6)와 얼마나 중심적으로 닿는지(중심성, 2단계)를 따로 재는 것이다.
6. 강한 컴포넌트 — (Strong Components)
정의. 두 학생 가 강하게 연결(strongly connected)되어 있다는 것은 와 가 둘 다 가능하다는 뜻이다:
강한 컴포넌트(strongly connected component)는 이렇게 서로 오갈 수 있는 학생들의 최대 집합이다.
는 의 행과 열을 바꾼 것이므로 다. 따라서 과 를 칸끼리 곱하면(둘 다 1일 때만 1) 양방향 도달 여부가 나온다. 의 4행만 0이므로 는 4열만 0이다:
칸별로 곱한다. 값이 갈리는 칸(4행·4열)만 전개해 보면:
| 칸 | 곱 | 읽기 | ||
|---|---|---|---|---|
| 1 | 0 | 0 | M1→M4는 되지만 M4→M1이 안 된다 → 강하게 연결 아님 | |
| 0 | 1 | 0 | 위와 같은 쌍을 반대에서 본 것 | |
| 1 | 0 | 0 | M4는 누구와도 상호 도달이 안 된다 | |
| 1 | 1 | 1 | M1→M2 M1→M2, M2→M1 M2→M3→M1 ✓ | |
| 1 | 1 | 1 | M2→M5 3걸음, M5→M2 2걸음 ✓ | |
| 1 | 1 | 1 | 자기 자신과는 항상 강하게 연결 (를 더한 효과) |
(M4를 맨 아래로 옮겨 적었다. 이렇게 순서를 바꾸면 1로 채워진 정사각 블록이 드러난다.)
결과. 강한 컴포넌트는 2개다:
- — 크기 4. 이 넷은 서로 오갈 수 있다.
- — 크기 1. 혼자다.
의 블록이 학생을 깔끔하게 분할한다는 것(겹치지도, 남지도 않는다)은 "강하게 연결됨"이 동치관계이기 때문이다 — 자기 자신과 연결되고(반사), 면 이고(대칭), , 면 다(추이). 뒤에 나오는 클리크(단원 3단계)와 달리 컴포넌트는 서로 겹칠 수 없다.
7. 약한 컴포넌트 — 방향을 지우고 보기 (Weak Components)
정의. 약한 컴포넌트(weakly connected component)는 화살표 방향을 모두 무시했을 때 서로 연결된 학생의 최대 집합이다. 계산은 단원 1-5의 대칭화(OR 규칙)를 먼저 하고 도달가능성을 구하면 된다: 로 바꾼 뒤 .
M4는 M3에게서 지명을 받았으므로, 방향을 지우면 M3–M4 선이 생긴다. 그러면:
전부 1이므로 약한 컴포넌트는 1개(크기 5)다. 세 지표를 나란히 놓으면:
| 약한 컴포넌트 | 강한 컴포넌트 | |
|---|---|---|
| 개수 | 1 | 2 |
| 크기 | 5 | 4, 1 |
| 뜻 | "방향을 무시하면 반이 한 덩어리다" — 그림이 조각나 있지 않다 | "소식이 돌아오는 집단은 넷뿐이다" — M4는 그 순환에서 빠져 있다 |
강한 ⊆ 약한, 항상. 양방향으로 닿으면 방향을 무시해도 닿으므로, 강한 컴포넌트는 반드시 어떤 약한 컴포넌트 안에 들어간다. 따라서 강한 컴포넌트 개수 ≥ 약한 컴포넌트 개수다. 무방향 네트워크에서는 둘의 구분이 사라져 그냥 "컴포넌트"라 부른다.
8. R 검증 (Verification in R)
library(igraph)
g <- graph_from_adjacency_matrix(A, mode = "directed")
igraph::components(g, mode = "strong")
# $membership M1 M2 M3 M4 M5
# 1 1 1 2 1 ← M4만 다른 번호
# $csize 4 1
# $no 2
igraph::components(g, mode = "weak")$no # 1
is_connected(g, mode = "strong") # FALSE
is_connected(g, mode = "weak") # TRUE
두 가지 함정.
① sna를 함께 불러오면 components가 가려지므로
igraph::components()로 명시해야 한다(안 하면
"as.edgelist.sna input must be an adjacency matrix…" 에러).
② $membership의 번호 1, 2는 이름표일 뿐 순위나 크기 순이 아니다.
연습문제 2에서는 같은 네트워크 구조인데도 M4가 1번, 나머지가 2번으로 붙는다.
컴포넌트를 크기순으로 보려면 $csize를 따로 정렬할 것.
§2의 정의를 직접 구현해 손 계산과 맞춰 본다:
I <- diag(5)
P <- I; SUM <- I
for (k in 1:4) { P <- P %*% A; SUM <- SUM + P } # I + A + A^2 + A^3 + A^4
R <- (SUM > 0) * 1
R
# M1 M2 M3 M4 M5
# M1 1 1 1 1 1
# M2 1 1 1 1 1
# M3 1 1 1 1 1
# M4 0 0 0 1 0
# M5 1 1 1 1 1 ← §4 손 계산과 동일
rowSums(R) - diag(R) # 4 4 4 0 4 도달 범위
colSums(R) - diag(R) # 3 3 3 4 3 피도달 범위
R * t(R) # 강한 연결 블록 — §6과 동일
# 거리행렬에서 오는 길 (단원 1-6과의 연결)
all( (distances(g, mode="out") < Inf) * 1 == R ) # TRUE
# sna 패키지
library(sna)
reachability(A) # 위 R과 동일
component.dist(A, connected = "strong")$csize # 4 1
component.dist(A, connected = "weak")$csize # 5
9. 교실 해석 (Classroom Interpretation)
① 약한 컴포넌트가 2개 이상이면 학급이 쪼개져 있다. 이것이 가장 먼저 확인할 진단이다. 약한 컴포넌트가 여러 개라는 것은 "방향을 무시해도 두 무리 사이에 선이 하나도 없다"는 뜻으로, 서로 완전히 모르는 집단이 공존한다는 강한 신호다(전학생 집단, 남녀 분리, 통학 구역 분리 등). 우리 반은 1개이므로 이 문제는 없다.
② 강한 컴포넌트는 "소식이 돌아오는 집단"이다. 안에서는 누가 말을 꺼내도 결국 다시 자기에게 돌아온다. 소문이 증폭되고, 서로에 대한 평판이 순환한다. M4는 이 순환 밖에 있어 반의 대화가 M4를 거치지 않고 돌아간다.
③ 도달가능성은 무딘 칼이다. §5에서 봤듯 M1, M2, M3, M5는 도달 범위가 모두 4로 동일하다. "모두에게 닿는다"는 사실만으로는 인기 학생과 그렇지 않은 학생을 구별할 수 없다. 컴포넌트 분석은 학급의 큰 조각을 찾는 데 쓰고, 개별 학생 비교는 중심성으로 해야 한다.
④ 설문 문항이 방향을 결정한다. "같이 놀고 싶은 친구"처럼 일방 지명이 가능한 문항은 방향 네트워크이므로 강한/약한 컴포넌트가 갈린다. 반면 "짝 활동을 함께 한 친구"처럼 사실 관계를 묻는 문항은 본래 무방향이라 컴포넌트가 하나뿐이다. 어떤 컴포넌트를 보고할지는 문항의 성격에서 정해진다.
⑤ 주의 — 컴포넌트는 "무리"가 아니다. 약한 컴포넌트 1개는 "반 전체가 어떻게든 이어져 있다"는 뜻일 뿐, 반 안에 또래 무리가 없다는 뜻이 아니다. 30명 학급은 거의 항상 컴포넌트가 1개로 나오므로 그것만으로는 아무 정보가 없다. 한 덩어리 안에서 촘촘한 부분집단을 찾는 일은 커뮤니티 탐지의 몫이다. → 3단계
10. 연습문제 (Exercises)
문제 1. M4가 M3을 지명했다고 하자( 추가). ① 새 의 M4 행 다섯 칸을 채우시오 (힌트: M4에서 나가는 길은 모두 M3을 거치므로, 기존 의 M3 행을 이용할 수 있다). ② 의 M4 행·열은 어떻게 바뀌는가? ③ 강한 컴포넌트는 몇 개가 되는가?
문제 2. 반대로 M3이 M4를 지명하지 않았다고 하자(으로 삭제). ① 새 에서 M4 행과 M4 열을 각각 쓰시오. ② 강한 컴포넌트 개수와 약한 컴포넌트 개수는 각각 몇 개인가? ③ 두 개수 중 하나는 변하지 않고 하나만 변한다. 어느 쪽이 변하며, 그 차이가 교실 진단에서 왜 중요한가?
먼저 스스로 풀고 §11 해설과 맞춰 볼 것.
11. 연습문제 해설과 답 (Solutions)
11-1. 문제 1 — M4가 지명을 하면 (Giving M4 an Out-Tie)
① M4 행 채우기. 이 유일한 나가는 지명이므로, M4에서 출발하는 모든 길의 첫 걸음은 M3이다. 따라서 "M4가 에 닿는다 ⟺ M3이 에 닿는다(또는 가 M3 자신)". 기존 의 M3 행이 전부 1이었으므로 그대로 옮겨진다. 칸마다 근거를 붙여 쓰면:
| 칸 | M4→M3 | M3이 에 닿는가 | 새 | 실제 경로 |
|---|---|---|---|---|
| 1 | 1 | M4→M3→M1 | ||
| 1 | 1 | M4→M3→M1→M2 | ||
| 1 | (목적지가 M3 자신) | 1 | M4→M3 | |
| — | (M3→M4 지명이 살아 있다) | 1 | M4→M3→M4 — 순환 발생 | |
| 1 | 1 | M4→M3→M1→M5 |
② . 새 은 25칸이 모두 1이 되었다. 그러면 도 전부 1이므로 칸별 곱도 전부 1이다. 특히 §6에서 0이었던 칸들을 다시 확인하면:
| 칸 | 곱 | 바뀐 이유 | ||
|---|---|---|---|---|
| 1 | 1 (전엔 0) | 1 | M4→M3→M1이 새로 생겼다 | |
| 1 | 1 (전엔 0) | 1 | M4→M3→M1→M2 | |
| 1 | 1 (전엔 0) | 1 | M4→M3 — 이제 M3·M4가 상호 지명 | |
| 1 | 1 (전엔 0) | 1 | M4→M3→M1→M5 |
답
① 새 의 M4 행 = — 즉 전체가 1로 가득 찬다.
② 의 M4 행·열도 모두 1이 되어 0이 사라진다.
③ 강한 컴포넌트는 1개(크기 5) — 반 전체가 하나의 강한 컴포넌트가 된다
(is_connected(gx, "strong") = TRUE, 단원 1-6 연습문제 2와 같은 결론).
왜 한 줄 추가로 이렇게 바뀌는가: 이미 나머지 넷이 강한 컴포넌트를 이루고 있었고 M4로 들어오는 길도 있었다. 부족한 것은 나가는 길 하나뿐이었다. 연결정도로 말하면 이 된 것이고, 그 한 걸음이 M4를 순환 안으로 끌어들였다.
11-2. 문제 2 — M4로 가는 유일한 통로를 끊으면 (Cutting M4's Only In-Tie)
① 새 의 M4 행과 열. 가 M4로 들어오는 유일한 지명이었다 (단원 1-4에서 ). 이것을 지우면 M4는 나가는 것도 들어오는 것도 없는 완전 고립자가 된다. 행·열을 각각 근거와 함께 쓰면:
| 방향 | M1 | M2 | M3 | M4 | M5 | 근거 |
|---|---|---|---|---|---|---|
| M4 행 | 0 | 0 | 0 | 1 | 0 | — 원래부터 나갈 수 없었다 (변화 없음) |
| M4 열 | 0 | 0 | 0 | 1 | 0 | 이 되어 전원 1 → 전원 0으로 바뀜 |
(대각선 은 를 더했기 때문에 남는다 — §3.)
② 컴포넌트 개수. 두 정의를 각각 적용한다:
| 원래 | M3→M4 삭제 후 | 이유 | |
|---|---|---|---|
| 강한 컴포넌트 | 2개 (4, 1) | 2개 (4, 1) | M4는 전에도 혼자였다 — 상호 도달이 없었으므로 이미 별도 컴포넌트 |
| 약한 컴포넌트 | 1개 (5) | 2개 (4, 1) | 방향을 지웠을 때 M4를 잇던 유일한 선 M3–M4가 사라졌다 |
답 ① M4 행 = , M4 열 = . ② 강한 컴포넌트 2개(크기 4, 1) — 변화 없음. 약한 컴포넌트 1개 → 2개(크기 4, 1) — 변화 있음. ③ 약한 컴포넌트만 변한다.
왜 중요한가: 강한 컴포넌트 개수(2)만 보고하면 지명이 하나 사라져 학생이 완전히 떨어져 나간 사건을 전혀 감지할 수 없다. 같은 "2개"가 삭제 전에는 "M4가 순환 밖에 있다"였고, 삭제 후에는 "M4가 반과 단절되었다"를 뜻한다. 두 지표를 함께 봐야 어떤 종류의 고립인지 구별된다: 약한 컴포넌트가 1개면 "받기만 하는 학생", 2개면 "완전 고립 학생"이다.
# 문제 1
Ax <- A; Ax["M4","M3"] <- 1
gx <- graph_from_adjacency_matrix(Ax, mode="directed")
Rx <- (distances(gx, mode="out") < Inf) * 1
Rx["M4", ] # 1 1 1 1 1 ✓
all(Rx == 1) # TRUE — R 전체가 1
igraph::components(gx, "strong")$no # 1 ✓
# 문제 2
Ay <- A; Ay["M3","M4"] <- 0
gy <- graph_from_adjacency_matrix(Ay, mode="directed")
Ry <- (distances(gy, mode="out") < Inf) * 1
Ry["M4", ]; Ry[ , "M4"] # 0 0 0 1 0 / 0 0 0 1 0 ✓
igraph::components(gy, "strong")$csize # 1 4 ← 개수 2, 그대로
igraph::components(gy, "weak")$csize # 4 1 ← 개수 1에서 2로!
sum(Ay) / (5*4) # 0.3 ← 밀도는 0.35에서 거의 안 움직인다
igraph::degree(gy, mode="all") # 5 2 3 0 2 ← M4의 총 연결정도가 0
다음 단원 — 1-8: 무방향(대칭)·가중 네트워크의 행렬 표현.
지금까지 쓴 5명 방향 네트워크를 졸업하고, 2단계(중심성)에서 계속 쓸
7명 무방향 네트워크를 새로 만든다. 여기에는 "다리 역할 학생"이 심어져 있다.
· 이 문서: notes/07_단원1-7_도달가능성_강한약한컴포넌트.html