카페에 앉아서
동네 카페에 앉아 오가는 손님들을 무심코 관찰한다고 해봅시다. 손님마다 키와 몸무게가 다르고, 얼핏 보면 두 무리 정도로 나뉘는 것 같기도 합니다. 그런데 정말 두 무리일까요? 세 무리는 아닐까요? 아니면 그냥 하나의 큰 덩어리일까요?
이 질문— "데이터가 몇 개의 군집으로 나뉘는가" — 은 통계학에서 생각보다 까다로운 문제입니다. 대부분의 군집화 기법(k-means가 대표적입니다)은 이 질문에 답하기 전에 먼저 "몇 개로 나눌지"를 사람이 정해줘야 합니다. K=2로 나눠보고, K=3으로도 나눠보고, 결과를 비교해서 "그나마 나은 것"을 고르는 식이죠. 하지만 이건 답을 찾는 게 아니라 답을 미리 정해놓고 데이터를 거기에 끼워 맞추는 것에 가깝습니다.
비모수 베이지안(Nonparametric Bayesian) 기법은 이 질문 자체를 데이터에게 돌려줍니다. "몇 개인지는 네(데이터)가 알려줘"라는 태도로 접근하는 것이죠. 오늘은 이 개념을 카페 손님의 (키, 몸무게) 데이터라는 익숙한 예시로 풀어보려 합니다.
왜 "베이지안"인가
베이즈 정리는 다음과 같은 형태를 가집니다.
$$P(H \mid E) = \frac{P(E \mid H) \, P(H)}{P(E)}$$
여기서 $H$는 가설, $E$는 관찰값입니다. 우리 예시에서는:
- $H$ = "군집이 몇 개이고, 각 군집의 중심(평균 키·몸무게)이 어디이며, 각 손님이 어느 군집에 속하는가"를 통째로 지정하는 가설
- $E$ = 실제로 관찰한 손님들의 (키, 몸무게) 데이터
베이지안 접근의 핵심은 이 과정을 기존 믿음 → 데이터 관찰 → 수정된 믿음이라는 3단계 흐름으로 본다는 점입니다.
1단계. 사전 믿음 (Prior)
카페에 손님이 들어오기도 전에, 우리는 이미 막연한 사전 지식을 갖고 있습니다. "성인 신체 사이즈는 대략 2~3개의 뭉치로 나뉠 것 같다", "평균 키는 165cm 근방일 것 같다" 같은 느슨한 직관입니다. 이 직관을 확률분포의 형태로 표현한 것이 사전분포 $P(H)$입니다.
2단계. 데이터 관찰 (Likelihood)
손님 100명이 들어왔고, 각각의 (키, 몸무게)를 기록했습니다. 특정 가설 — 예를 들어 "군집이 2개, 중심은 각각 (163cm, 56kg)과 (174cm, 71kg)"이라는 가설 — 을 세워보고, 이 가설이 맞다면 실제 관찰된 100명의 데이터가 나올 확률(가능도, $P(E\mid H)$)을 계산합니다. 만약 데이터가 정말 두 뭉치로 깔끔하게 나뉘어 있다면, "군집 2개" 가설의 가능도는 "군집 1개"나 "군집 10개" 가설보다 훨씬 높게 나옵니다.
3단계. 수정된 믿음 (Posterior)
사전 믿음과 가능도를 곱해서 사후분포 $P(H\mid E)$를 얻습니다. 이 과정에서 벌어지는 일을 직관적으로 표현하면 이렇습니다.
사전분포 가능도 사후분포
"몇 개일지 모름, → "관찰된 100명이 → "군집은 2개일 확률이
대략 이 근방일 듯" 이 가설에서 나올 가장 높고, 각 손님은
가능성이 이 정도" 이 정도 확률로 이
군집에 속함"
데이터가 많고 신호가 강할수록 사전분포의 영향력은 옅어지고, 데이터(가능도)가 결론을 지배하게 됩니다. 이게 "왜 베이지안인가"에 대한 답입니다 — 기존 믿음을 고정된 정답이 아니라 데이터로 계속 갱신해나가는 대상으로 다루기 때문입니다.
왜 "비모수"인가
여기서 "비모수(nonparametric)"이라는 말은 흔히 오해를 삽니다. "파라미터가 없다"는 뜻이 아니라, "파라미터의 개수가 미리 고정되지 않는다"는 뜻입니다.
| 모 (예: k-means) | 비모수 (예: DP 기반 군집화) | |
| 군집 개수 | 사람이 미리 지정 (K=3) | 데이터를 보고 사후적으로 결정 |
| 새 손님 추가 시 | 모델 구조 불변 | 필요하면 새 군집이 자연스럽게 생성 |
| 개수에 대한 불확실성 | 표현 불가 | 사후분포로 표현 가능 |
이걸 가능하게 하는 수학적 도구가 디리클레 과정(Dirichlet Process, DP)입니다.
디리클레 과정이란 무엇인가
디리클레 과정은 한마디로 "확률분포 위의 확률분포"입니다. 이게 무슨 말인지 카페 예시로 풀어보겠습니다.
일반적인 확률분포(예: 정규분포)는 숫자 하나(키가 170cm일 확률이 얼마인지)에 확률을 매깁니다. 그런데 DP는 한 단계 위에서 작동합니다 — "카페 손님들의 (키, 몸무게) 분포 자체가 어떤 모양일지"에 대한 확률을 매기는 것입니다. DP에서 표본을 하나 뽑으면, 숫자가 아니라 분포 하나가 나옵니다. 그리고 그 분포는 항상 유한하거나 셀 수 있게 많은(countably infinite) 점들에만 확률 질량이 몰려 있는 이산분포(discrete distribution) 형태를 띱니다 — 설령 원래의 기저분포가 연속분포였다고 해도 그렇습니다. 이 성질이 바로 "손님들이 자연스럽게 몇 개의 뭉치로 뭉치는" 군집화 효과를 만들어냅니다.
DP는 수학적으로 두 개의 파라미터로 정의됩니다.
$$G \sim \text{DP}(\alpha, G_0)$$
- 기저분포(base measure) $G_0$: "만약 군집이 새로 생긴다면, 그 군집의 중심(평균 키·몸무게)은 대략 어디쯤일 것 같은가"에 대한 사전 믿음입니다. 카페 예시에서는 "성인 키는 대략 150~190cm, 몸무게는 45~90kg 범위에 퍼져 있을 것"이라는 넓은 정규분포 정도로 생각하면 됩니다. 새로운 군집의 중심은 이 $G_0$에서 뽑힙니다.
- 집중 파라미터(concentration parameter) $\alpha$: 뽑힌 표본 분포 $G$가 $G_0$ 주변에 얼마나 "촘촘하게(concentrated)" 뭉치는지를 조절합니다. $\alpha$가 작으면 소수의 군집에 손님이 몰리는 경향이 강해지고(테이블 몇 개에 손님이 집중), $\alpha$가 크면 새로운 군집이 자주 열리며 더 잘게 쪼개지는 경향을 보입니다.
정리하면, $G_0$는 "새 군집이 어디에 생길지"를 결정하고, $\alpha$는 "새 군집이 얼마나 쉽게 생길지"를 결정하는 다이얼인 셈입니다.
세 가지 등가의 시선: CRP, Stick-breaking, Pólya urn
DP 자체는 무한 차원의 추상적인 확률과정이라 다루기 까다롭기 때문에, 실제로 이해하고 구현할 때는 이와 수학적으로 동치인 세 가지 구체적 구성(construction)을 주로 사용합니다.
- 중국집 프로세스 (CRP) — 손님이 한 명씩 들어올 때 어느 테이블에 앉을지를 순차적으로 결정하는 관점. 바로 다음 절에서 자세히 다룹니다.
- 막대 쪼개기 구성 (Stick-breaking construction) — 길이 1짜리 막대 하나를 상상하고, 이를 계속 무작위로 쪼개어 각 군집에 배정되는 "가중치(비율)"를 만들어내는 방식입니다. 첫 번째 조각을 베타분포에서 뽑은 비율만큼 떼어 군집 1의 가중치로 주고, 남은 막대에서 다시 같은 비율로 떼어 군집 2에 주고... 이 과정을 무한히 반복합니다. 이렇게 하면 "군집별 상대적 비중"이 자연스럽게 등비수열처럼 감소하는 형태로 정해지며, 이론적으로는 무한 개의 군집에 대한 가중치를 모두 생성하지만 뒤로 갈수록 가중치가 0에 급격히 가까워져 사실상 유한한 개수만 유의미하게 남습니다.
- 폴리아 항아리 (Pólya urn) 모델 — 색깔 있는 공이 든 항아리에서 공을 하나 뽑고, 그 공을 다시 넣을 때 같은 색 공을 하나 더 추가해서 넣는 과정입니다. 이미 많이 뽑힌 색(=군집)일수록 다음에 또 뽑힐 확률이 높아지는 "부익부(rich-get-richer)" 성질을 보여주는데, 이게 CRP에서 손님이 많은 테이블에 합석 확률이 높아지는 것과 정확히 같은 현상입니다.
이 세 가지는 겉모습은 다르지만 모두 같은 DP에서 나오는 동일한 확률적 구조를 다른 각도에서 바라본 것입니다. 이 중 카페 손님 비유로 가장 직관적인 것이 CRP이기 때문에, 아래에서는 CRP를 중심으로 이어가겠습니다.
중국집 손님 앉히기
무한히 많은 테이블이 준비된 중국집을 상상해봅시다. 손님(=카페의 데이터포인트)이 한 명씩 들어옵니다.
- 첫 손님은 무조건 첫 번째 테이블에 앉습니다.
- 두 번째 손님부터는 두 가지 선택지가 있습니다: 이미 누군가 앉아있는 테이블에 합석하거나, 완전히 새로운 테이블에 혼자 앉거나.
- 기존 테이블에 앉을 확률은 그 테이블에 이미 앉은 손님 수에 비례합니다 — 사람이 많은 테이블일수록 더 매력적으로 보이는 것이죠. 새 테이블을 여는 확률은 집중 파라미터(concentration parameter) α라는 값에 비례합니다.
카페 예시로 옮기면: 손님이 한 명씩 들어올 때마다, "이 사람의 (키, 몸무게)가 기존 군집 중 하나와 비슷한가, 아니면 지금까지와 다른 새로운 부류인가"를 확률적으로 판단하며 자리를 잡아가는 셈입니다. 손님이 100명 들어왔는데 실제로는 두 부류만 존재한다면, 자연스럽게 두 개의 테이블만 붐비고 나머지는 열리지 않습니다. 만약 111번째 손님이 지금까지와 확연히 다른 체형이라면, 모델을 처음부터 다시 설계할 필요 없이 그냥 세 번째 테이블이 열립니다.
"무한 차원"이라는 말의 정확한 의미
여기서 중요한 포인트가 하나 있습니다. "무한한 군집을 가정한다"는 것은 실제로 무한 개의 군집이 존재한다는 뜻이 아닙니다. 중국집에는 테이블이 무한히 준비되어 있지만, 손님이 100명이면 실제로 앉는 테이블은 많아야 100개 이하, 대개는 훨씬 적은 수(3~5개)에 그칩니다.
정확히 말하면 이렇습니다.
군집에 대한 사전분포 자체가 무한 차원의 확률 공간 위에 정의되어 있고, 그중 데이터가 실제로 "사용하는" 군집만 사후적으로 유한하게 드러난다.
"무한"은 사전분포가 가진 잠재력에 대한 이야기이고, "유한"은 데이터를 보고 난 뒤 실현되는 결과에 대한 이야기입니다. 이 둘을 구분하는 것이 비모수 개념을 제대로 이해하는 핵심입니다.
실제로 어떻게 계산하는가: 깁스 샘플링
지금까지 이야기한 건 "모델을 어떻게 정의할 것인가"였습니다. DP(혹은 CRP)가 바로 그 모델입니다. 그런데 모델을 정의했다고 사후분포가 $P(H\mid E)$저절로 계산되는 건 아닙니다. 실제로는 사후분포 를 정확한 수식으로 구하는 게 거의 불가능하기 때문에, 표본을 뽑아 근사하는 방법이 필요합니다. 여기서 등장하는 것이 깁스 샘플링(Gibbs sampling)입니다.
깁스 샘플링은 이렇게 작동합니다: 손님 한 명을 제외한 나머지 99명의 자리 배정을 그대로 둔 채, 그 한 명만 "지금 이 순간 어느 테이블에 앉는 게 가장 그럴듯한가"를 다시 뽑습니다. 이걸 모든 손님에 대해 반복하고, 전체를 여러 번 순회하면서 표본을 충분히 모으면, 그 표본들의 분포가 사후분포의 근사치가 됩니다.
즉,
- 디리클레 과정 = 무엇을 믿을 것인가를 정의하는 모델
- 깁스 샘플링 = 그 믿음을 데이터로 어떻게 갱신할지 계산하는 추론 알고리즘
이 둘은 같은 층위의 개념이 아니라, 서로 다른 역할을 하는 짝입니다. (실무에서는 순수 깁스 샘플링 외에도 truncated weak-limit sampler, variational inference 등 계산 효율을 고려한 대안들도 함께 쓰입니다.)
정리
카페에 앉아 손님들의 키와 몸무게를 관찰하는 이 소박한 예시 안에, 사실 세 가지 층위의 개념이 겹쳐 있습니다.
- 베이지안: 군집 구조에 대한 기존 믿음을, 관찰된 데이터를 통해 수정해나가는 프레임
- 비모수: 군집의 개수를 미리 고정하지 않고, 무한 차원의 사전분포 위에서 데이터가 스스로 몇 개가 필요한지 드러내도록 열어두는 설계
- 디리클레 과정 + 깁스 샘플링: 이 아이디어를 실제로 계산 가능한 형태로 구현하는 모델과 알고리즘의 조합
"몇 개로 나눌지 모르겠다"는 흔한 고민을, "몇 개인지는 데이터가 알려줄 것이다"라는 태도로 뒤집는 것 — 이것이 비모수 베이지안이 던지는 질문의 본질입니다.
'데이터 분석 > 군집화' 카테고리의 다른 글
| 디리클레 과정에서 기저 분포 (0) | 2026.08.06 |
|---|---|
| 군집 개수 미리 지정하지 않고 찾기: 디리클레 과정 (0) | 2026.08.06 |
| 군집 개수 미리 정하지 않고 찾기: 중국집 프로세스 (0) | 2026.08.06 |
| 깁스 샘플링 예시: 1) 공의 무게 군집, 2) 손님 키와 몸무게 쌍 군집 (0) | 2026.08.06 |
| 마르코프 체인 -> 깁스 샘플링 -> 결합 분포 (수식 포함) (0) | 2026.08.05 |