← SNA 입문 · R로 시작하기 차례
9편Interpretation and Common Pitfalls
담임이 읽는 법과 흔한 함정
SNA 입문 · R로 시작하기STAGED+ 스터디
9. 담임이 읽는 법 — 해석 종합 (Putting It Together)
지금까지 계산한 것을 학급에 대한 다섯 문장으로 압축한다. 분석의 목적은 표를 만드는 게 아니라 여기까지 오는 것이다.
| 발견 | 근거 숫자 | 실천 |
|---|---|---|
| ① 남녀가 거의 완전히 갈렸다 | E-I = −0.84 (성별 넘는 지명 88개 중 7개). 커뮤니티 5개가 모두 성별 순수. Q = 0.4387 | 9세에서는 전형적. 다만 성별 섞은 모둠이 겉도는 이유를 설명해 준다. 섞으려면 아래 ③의 다리 학생을 지렛대로 쓴다 |
| ② 절대 강자는 없다 | 연결정도 중심화 0.275, 차수 동류성 −0.0996 | 인기가 흩어져 있고 서열이 없다. 건강한 편 |
| ③ 두 무리를 잇는 통로가 두 명 | 매개 1042 = 128.3, 1006 = 102.0. 단, 절단점은 0개 — 누가 빠져도 학급은 안 쪼개지고 평균 거리만 2.27 → 2.42~2.48로 늘어난다 | 모둠 편성 때 이 둘을 어디 두느냐가 지렛대. 다만 "이 학생이 없으면 학급이 무너진다"고 말할 근거는 없다 — 대체 통로가 서로에게 있다 |
| ④ 관계가 이미 안정적이다 | 상호성(edgewise) 0.5, 전이성 0.457 (밀도 0.135의 3.4배), 4-코어 16명(61%) | 대부분의 학생이 두꺼운 핵심 안에 있다. 학기 초라면 관계 형성이 잘 진행된 것 |
| ⑤ 확인이 필요한 학생 3명 | 1024(완전 고립), 1030·1036(지명 0개 수신) | 셋을 같이 묶어 보면 안 된다 — 아래 참조 |
⑤에 대해 — 이 안내서에서 실무적으로 가장 중요한 구분
- 1024: 지명 0개 보냄 / 0개 받음. 데이터 자체를 먼저 의심한다. 결석·미응답·설문 거부일 수 있다. 네트워크 분석이 아니라 출석부 확인이 먼저다.
- 1030 · 1036: 지명을 했는데 하나도 못 받았다. 이건 데이터 문제가 아니다. 관계를 맺으려는 시도가 있었고 응답이 없었다는 관측이다. 그림 3에서 화살표가 밖으로만 나가는 게 보인다.
- 1033: indegree가 0은 아니라 지표상 눈에 안 띈다. 그런데 연결이 딱 두 개다 — 받은 지명은 1036 하나뿐(호감도 2)이고, 보낸 지명은 1051 하나뿐(호감도 1점, 최저). 1036과 함께 2-코어에 있다. 1036이 전학 가면 1033의 indegree는 0이 되어 위 두 학생과 같은 처지가 된다. (연결이 끊기지는 않는다 — 1051 쪽 지명이 남는다.)
마지막으로, 하면 안 되는 것 — 이 표를 그대로 학생·학부모에게 보여 주면 안 된다.
"1024는 고립아"라는 라벨은 자기충족적 예언이 된다.
소시오그램은 교사가 자기 관찰을 점검하는 도구이지 진단서가 아니다.
그리고 이 자료는 한 시점의 한 질문일 뿐이다 — 지명 개수를 5개로 제한했다면 그림은 달라졌을 것이다.
10. 초보자가 자주 걸리는 함정 (Common Pitfalls)
| 증상 | 원인 | 해결 |
|---|---|---|
unused argument | igraph가 sna 함수를 가림 | sna::closeness(...)처럼 ::를 붙인다 |
| 근접 중심성이 전부 0 | 고립자가 있어 | cmode = "suminvdir" |
| 정점이 1000개 넘게 생김 | ID를 숫자로 읽음 | colClasses = "character" |
| 고립자가 사라짐 | 엣지리스트만 줌 | graph_from_data_frame(..., vertices = nod) |
| 성별이 엉뚱한 학생에게 붙음 | 행렬 순서 ≠ 노드표 순서 | identical(rownames(adj), nod$name) 확인 |
| 그릴 때마다 그림이 달라짐 | 배치가 무작위 초기값 | set.seed() + 좌표를 변수에 저장해 재사용 |
| 한글이 □□ | quartz 장치 폰트 문제 | ragg::agg_png()를 쓴다 |
| 커뮤니티 결과가 매번 바뀜 | Louvain은 비결정적 | cluster_walktrap() 또는 cluster_edge_betweenness() |
| 전이성이 두 패키지에서 다르게 나옴 | igraph는 방향 무시 | 방향을 살리려면 sna::gtrans() |
| 중심화가 두 패키지에서 다르게 나옴 | centr_degree()의 loops=TRUE 기본값 | loops = FALSE로 맞춘다 |
identical()이FALSE | 값은 같고 타입만 integer/double | all(x == y) 또는 all.equal() |
| 상호성이 0.86이라 이상하게 높음 | grecip() 기본값이 "dyadic" | measure = "edgewise" |
습관 하나만 들인다면 — 새 함수를 쓰기 전에
args()를 찍어 본다.
args(sna::closeness)
function (dat, g = 1, nodes = NULL, gmode = "digraph", diag = FALSE,
tmaxdev = FALSE, cmode = "directed", geodist.precomp = NULL,
rescale = FALSE, ignore.eval = TRUE)
위 함정 표의 절반이 기본값을 확인하지 않아서 생긴 것이다.
cmode="directed", loops=TRUE, measure="dyadic" —
전부 args() 한 줄이면 미리 보인다.