# Alluvial plot: 다층 흐름 시각화를 위한 개요 Alluvial plot은 다층 구조에서 항목 간의 흐름을 시각적으로 표현하는 다이어그램으로, 주로 시간 변화나 여러 연속적 차원 간의 카테고리 전환을 직관적으로 보여주는 데 사용된다. 각 층(layer)은 한 시점의 카테고리 집합을 나타내고, 층 사이의 흐름(flow)은 카테고리 간 전환의 규모를 ribbon 형태로 표현한다. 흐름의 너비는 해당 흐름의 가중치에 비례하며, 같은 층의 카테고리 너비 역시 그 카테고리의 가중치에 비례한다. - 영어 용어: Alluvial plot, Alluvial diagram, Flow diagram, Sankey-like visualization - 용도: 인구 구성의 변화, 설문 응답의 전환, 사용자 행동의 경로 분석 등 다차원적 카테고리 변화의 시각화에 적합 --- ## 개요 및 정의 - 목적: 다중 단계 간의 카테고리 변화 양상을 한눈에 파악하고, 주요 흐름과 전환을 식별한다. - 핵심 아이템 - 층(layer): 각 단계의 카테고리 집합 - 카테고리(category): 각 층에 속하는 고유한 값 - 흐름(flow): 한 층의 카테고리에서 다음 층의 카테고리로의 전환량 - 관계식(수학적 모델) - t 번째 층의 카테고리 집합을 \(C_t\)라 하고, 각 카테고리의 가중치를 \(n_{t,c}\) (단, \(c \in C_t\))로 둔다. - 층 t와 t+1 사이의 흐름을 \(f_t(c \to d)\)로 두고, \(c \in C_t\), \(d \in C_{t+1}\)에 대해 정의한다. - 흐름의 제약 - 각 카테고리의 보유량 보존: \(\sum_{d \in C_{t+1}} f_t(c \to d) = n_{t,c}\) for all \(c \in C_t\) - 다음 층의 카테고리 합계 보존: \(\sum_{c \in C_t} f_t(c \to d) = n_{t+1,d}\) for all \(d \in C_{t+1}\) - 노드 너비와 흐름 너비 - 층의 카테고리 너비는 \(n_{t,c}\)에 비례한다. - 흐름의 너비는 \(f_t(c \to d)\)에 비례한다. - 수식 요약: 각 층에서의 질량 보존을 만족하는 흐름 행렬 \(F_t = [f_t(c \to d)]\)가 존재한다. --- ## 구성 요소 - Layer(층): 시점 또는 차원을 나타내는 축으로, 예를 들어 시간의 각 단계(t=1,2,...,T) 또는 서로 다른 속성 차원들. - Stratum(스트래텀): 층 내의 각 카테고리를 시각화하는 블록. 너비는 해당 카테고리의 가중치를 반영한다. - Flow ribbon(흐름 리본): 인접 층 사이를 연결하는 곡선 또는 다각형. 너비는 흐름의 크기 \(f_t(c \to d)\)에 비례한다. - 축(selection): 시각화의 축은 일반적으로 층의 순서를 유지하고, 각 층의 카테고리를 나열한다. --- ## 데이터 구조 및 준비 - 데이터 형식 - 일반적으로 "long" 형식의 데이터가 선호된다. 각 관측치는 특정 층의 카테고리 값을 가지며, 여러 층 간의 전환 정보를 추출하는 방식으로 처리한다. - 예시 데이터 포맷 - Columns: id, stage1, stage2, stage3, weight - 각 행은 한 개의 관찰 단위가 여러 층에 걸쳐 어떤 카테고리 값을 가지는지 나타낸다. - 두 가지 접근 방식 - 다층 원시 데이터에서 흐름 매트릭스 생성: 각 단계 t에서 \(f_t(c \to d)\)를 계산하여 모든 흐름을 합친다. - tidy 데이터에서 직접 흐름 형상 생성: 각 인접 층 간의 전환을 관측치 단위로 계산하여 누적 흐름을 만들어낸다. - 예시(간단한 수치 예시) - Stage 1: A=25, B=15 - Stage 2: X=23, Y=17 - 흐름: A→X=20, A→Y=5, B→X=3, B→Y=12 - 확인: \(\sum_{d} f_1(A \to d) = 25\), \(\sum_{c} f_1(c \to X) = 23\), 총합은 40으로 보존된다. - 시각적 설계 팁 - 카테고리 수가 많아지면 시각이 복잡해지므로 주요 흐름만 강조하거나 색상/정렬을 통해 핵심 흐름을 돋보이게 한다. - 색상 팔레트는 색맹 친화 palette를 고려하고, 같은 카테고리의 흐름은 같은 색으로 연결되는 것이 좋다. --- ## 구현 방법 - R: ggplot2 + ggalluvial 패키지 조합 - 기본 아이디어: geom_alluvium으로 흐름을 그리고, geom_stratum으로 각 카테고리를 시각화한다. - 간단 예시 - 데이터: long 형식의 데이터프레임 with columns stage1, stage2, weight - 코드 흐름(요지) - ggplot(df, aes(axis1 = stage1, axis2 = stage2, y = weight)) + geom_alluvium(aes(fill = stage1), width = 1/12) + geom_stratum(width = 1/12, fill = "grey70") + geom_text(stat = "stratum", aes(label = after_stat(stratum))) - 참고: ggalluvial 패키지는 다층 전환 데이터를 시각화하기에 특화된 도구로 널리 사용된다. - Python: Plotly를 활용한 Sankey 스타일 접근 - Alluvial plot과 Sankey diagram은 흐름 표현 방식이 유사하므로, Plotly의 Sankey 차트를 응용해 구현 가능. - 주의: Plotly Sankey는 기본적으로 노드와 링크의 인덱스 매핑이 필요하므로, 데이터 전처리에서 각 층의 카테고리 순서를 고정해야 한다. - 데이터 준비의 예시(요약) - R 예시 포맷: df <- data.frame(stage1 = c("A","A","B","B"), stage2 = c("X","Y","X","Y"), weight = c(20,5,3,12)) - Python 예시 포맷: nodes = [{"name": "A"}, {"name": "B"}, {"name": "X"}, {"name": "Y"}], links = [{"source": 0, "target": 2, "value": 20}, ...] - 실무 팁 - 라벨의 가독성: 흐름이 겹치지 않도록 층 간 정렬, 레이블의 위치 조정 - 색상 관리: 카테고리 수에 따라 색상 수를 제한하고, 비슷한 흐름에는 동일 색상 사용 - 데이터 정합성: 모든 층 간 흐름의 합이 전후 층의 합과 일치하는지 확인 --- ## 활용 사례 - 사회과학: 구성원의 이동이나 변화 분석 - 시장 연구: 소비자 선호의 연속적 변화 추적 - 생물학/의학: 특정 표적군의 진화적 흐름, 질환의 병인 경로 추적 - 정책 평가: 시간에 따른 정책 영향의 흐름 시각화 --- ## 모범 사례 및 한계 - 모범 사례 - 핵심 흐름에 집중하고, 너무 세분화되지 않도록 층의 수를 적절히 조정한다. - 색상과 레이블을 통해 흐름의 방향성과 카테고리 간 연결을 명확히 한다. - 데이터의 성격에 따라 정렬 순서를 고정해 비교를 용이하게 한다. - 한계 - 카테고리 수가 많아지면 시각적으로 지나치게 복잡해져 해석이 어려워진다. - 계층 간 값이 작고 비슷한 흐름이 얽히면 분리 선이 모호해질 수 있다. - 다양한 층 간 정합성 여부를 사전에 확인해야 한다. --- ## 관련 용어 비교 - Alluvial plot vs Sankey diagram - Alluvial plot은 주로 이질적인 카테고리 간 전환을 시각화하는 데 초점을 두고, Sankey diagram은 에너지/물질의 흐름 등 물리적 흐름을 넓은 범위에서 표현하는 데 자주 사용된다. - Alluvial diagram - Alluvial diagram은 Alluvial plot의 변형으로도 불리며, 비슷한 원리로 다중 차원의 흐름을 시각화한다. --- ## 수식 예시(Inline) - 층 t의 카테고리별 가중치: \(n_{t,c}\) ( \(c \in C_t\) ) - 층 t와 t+1 사이의 흐름: \(f_t(c \to d)\) ( \(c \in C_t\), \(d \in C_{t+1}\) ) - 흐름의 합계 제약: \(\sum_{d \in C_{t+1}} f_t(c \to d) = n_{t,c}\) for all \(c \in C_t\) - 다음 층 합계 제약: \(\sum_{c \in C_t} f_t(c \to d) = n_{t+1,d}\) for all \(d \in C_{t+1}\) - 노드 너비와 흐름 너비의 비례 관계: 노드 너비 \(\propto n_{t,c}\), 흐름 너비 \(\propto f_t(c \to d)\) --- ## 참고 자료와 추가 읽을거리 - ggplot2 + ggalluvial에 관한 공식 문서 - Sankey diagram의 이론 및 구현 가이드 - 데이터 시각화에서 다층 흐름의 해석 방법에 대한 연구 문헌 --- 관련 문서: [[데이터 시각화]]