군집화
고친 사람 github-actions[bot]
군집화는 데이터를 비슷한 것끼리 몇 덩어리로 묶어 줍니다. 어떤 덩어리를 만들지 미리 알려 주지 않아도 됩니다. 데이터끼리 얼마나 닮았는지만 보고 덩어리를 스스로 찾습니다. 고객을 구매 습관이 비슷한 사람끼리 나눠 보는 일이 군집화입니다.
쉽고 빠른 이해
군집화는 데이터 더미를 비슷한 것끼리 몇 덩어리로 나눠 줍니다. 고객 명단을 넣으면 「자주 오고 조금 쓰는 손님」과 「가끔 오고 많이 쓰는 손님」이 따로 모입니다.
데이터에 무엇이 섞여 있는지 모를 때가 많습니다. 그러면 나눌 기준부터 세울 수가 없습니다. 군집화는 기준 없이 데이터만 보고 첫 나눔을 만들어 줍니다.
- 데이터 하나하나를 숫자 몇 개로 바꿉니다
- 숫자끼리 얼마나 가까운지 잽니다
- 가까운 것끼리 묶습니다
대가도 있습니다. 덩어리를 몇 개로 나눌지는 대개 사람이 정합니다. 덩어리에 이름이 안 붙어서 사람이 보고 지어야 합니다. 잘 나눴는지 채점할 정답도 없습니다.
나눌 목록과 정답이 달린 예시가 이미 있으면 군집화 대신 분류를 씁니다.
상세
이사한 뒤 상자 하나에 물건이 뒤섞여 들어 있다고 해 봅시다. 책상 위에 꺼내 놓고 비슷한 것끼리 밀어 모읍니다. 펜과 연필이 한 무더기, 충전기와 케이블이 한 무더기가 됩니다. 「문구」나 「전자 제품」이라는 이름은 다 모은 뒤에야 붙입니다.
군집화는 데이터 모음을 받아 데이터마다 어느 덩어리에 드는지를 돌려주는 일입니다. 이 덩어리 하나를 군집 또는 클러스터(cluster)라고 부릅니다. 고객 가부터 바까지 여섯 명을 넣으면 「가·나·다는 군집 0, 라·마·바는 군집 1」 같은 답이 나옵니다. 군집 0 이 어떤 손님들인지는 알려 주지 않습니다.
잘 나눴는지 보는 기준은 둘입니다. 같은 군집 안의 데이터끼리는 많이 닮아야 합니다. 다른 군집의 데이터와는 덜 닮아야 합니다.
정답 없이 나누는 까닭
머신러닝에서는 데이터마다 정답 표시를 달아 두는 경우가 많습니다. 이 정답 표시를 레이블이라고 부릅니다. 메일마다 「스팸」이나 「정상」을 달아 두는 것이 레이블입니다.
군집화는 레이블 없이 돕니다. 데이터만 보고 그 안에 있는 군집을 찾습니다. 정답 없이 데이터에서 구조를 찾는 방식을 비지도학습이라고 부릅니다. 군집화는 비지도학습이 푸는 대표 문제입니다.
레이블을 붙이려면 사람이 데이터를 하나씩 봐야 합니다. 고객이 수십만 명이면 그 비용이 큽니다. 게다가 고객이 어떤 부류로 나뉘는지 아직 모른다면 붙일 레이블 목록부터 없습니다. 군집화는 이럴 때 첫 나눔을 줍니다.
분류와 가르는 선
군집화와 가장 헷갈리는 일은 분류입니다. 분류는 미리 정해 둔 목록에서 하나를 골라 붙입니다. 분류를 배우려면 레이블이 달린 예시가 있어야 합니다.
| 분류 | 군집화 | |
|---|---|---|
| 나눌 목록 | 미리 정해 둔다 | 데이터를 보고 나서 생긴다 |
| 레이블이 달린 예시 | 있어야 한다 | 없어도 된다 |
| 결과에 붙는 것 | 목록의 이름 | 군집 번호뿐 |
표의 마지막 줄이 쓸 때 가장 크게 느끼는 차이입니다. 군집화는 「군집 0」·「군집 1」 같은 번호만 돌려줍니다. 번호 1 이 「단골」인지 「큰손」인지는 사람이 군집 안을 들여다보고 정합니다.
데이터를 점으로 놓기
프로그램은 「구매 습관이 비슷하다」를 바로 알아듣지 못합니다. 그래서 데이터 하나를 숫자 몇 개로 옮겨 적습니다. 옮겨 적은 값 하나하나를 특성이라고 부릅니다. 특성을 줄지어 놓은 묶음은 특성 벡터라고 합니다.
고객 여섯 명을 특성 둘로 적으면 이렇습니다.
| 고객 | 한 달 방문 수 | 한 번에 쓰는 돈(만 원) |
|---|---|---|
| 가 | 12 | 1 |
| 나 | 10 | 2 |
| 다 | 11 | 1 |
| 라 | 2 | 9 |
| 마 | 1 | 10 |
| 바 | 3 | 8 |
특성이 둘이면 고객 하나를 평면 위의 점 하나로 찍을 수 있습니다. 가로축에 방문 수, 세로축에 쓰는 돈을 두는 식입니다. 가·나·다는 오른쪽 아래에, 라·마·바는 왼쪽 위에 모입니다. 군집화가 찾는 것이 이렇게 몰린 점들입니다.
닮음을 재는 거리
「몰려 있다」를 셈으로 바꾸려면 점 사이가 얼마나 먼지를 재야 합니다. 가장 흔히 쓰는 잣대는 유클리드 거리입니다. 평면에서 두 점 사이를 자로 잰 길이와 같습니다.
아래는 고객 가와 나, 가와 마 사이의 거리입니다. 값은 소수 셋째 자리까지 적었습니다.
import math
가, 나, 마 = (12, 1), (10, 2), (1, 10)
math.dist(가, 나) # 2.236
math.dist(가, 마) # 14.213
가와 나는 가깝습니다. 가와 마는 멉니다. 군집화는 이런 거리를 모든 점 사이에서 따져 가까운 점끼리 같은 군집에 넣습니다.
글처럼 길이가 제각각인 데이터에는 다른 잣대를 씁니다. 글은 흔히 낱말마다 몇 번 나왔는지를 특성으로 적습니다. 긴 글은 모든 낱말의 횟수가 큽니다. 그래서 유클리드 거리로 재면 내용이 같아도 짧은 글과 멀어집니다.
특성 벡터는 원점에서 그은 화살표로도 볼 수 있습니다. 화살표가 향하는 쪽이 방향입니다. 낱말 횟수가 모두 두 배가 되어도 방향은 그대로입니다.
두 특성 벡터의 방향이 얼마나 같은지를 재는 잣대가 코사인 유사도입니다. 긴 글과 짧은 글이라도 같은 낱말을 비슷한 비율로 쓰면 가깝다고 봅니다.
특성마다 단위를 맞추는 일
위 표에서 쓰는 돈을 만 원이 아니라 원 단위로 적었다고 해 봅시다. 가는 10000, 마는 100000 이 됩니다. 그러면 방문 수가 몇 번 차이 나는지는 거리에 거의 안 잡힙니다. 쓰는 돈의 차이가 거리를 전부 차지하기 때문입니다.
그래서 군집화 앞에는 특성마다 값의 폭을 비슷하게 맞추는 단계가 붙습니다. 이 단계를 특성 스케일링이라고 부릅니다. 흔한 방법은 특성마다 평균을 빼고 퍼진 정도로 나누는 것입니다.
대표 방식 k-평균
군집을 찾는 방법은 여럿입니다. 그중 가장 기본은 k-평균입니다. k 는 만들 군집의 수입니다. 돌리기 전에 사람이 정합니다.
k-평균은 군집마다 한가운데 점을 하나씩 둡니다. 이 점을 중심점이라고 부릅니다. 중심점은 그 군집에 든 점들의 평균 위치입니다.
flowchart TD
A["군집 수 k 를 정한다"] --> B["중심점 k 개를 아무 데나 찍는다"]
B --> C["점마다 가장 가까운 중심점의 군집에 넣는다"]
C --> D["군집마다 평균 위치로 중심점을 옮긴다"]
D --> E{"중심점이 움직였나"}
E -->|움직였다| C
E -->|안 움직였다| F["군집이 정해진다"]
고객 표에 k 를 2로 주면 가·나·다와 라·마·바로 갈립니다. 점을 나눠 담는 일과 중심점을 옮기는 일이 번갈아 돌다가 멈춘 결과입니다.
처음 중심점을 아무 데나 찍기 때문에 돌릴 때마다 결과가 달라질 수 있습니다. 그래서 여러 번 돌려 점들이 자기 중심점에 가장 가깝게 모인 결과를 고르기도 합니다. 첫 중심점을 서로 멀리 떨어뜨려 찍는 k-평균++도 같은 문제를 줄이려는 방법입니다.
군집을 정하는 기준에 따른 갈래
계층적 군집화와 DBSCAN(Density-Based Spatial Clustering of Applications with Noise, 밀도 기반 군집화)도 널리 씁니다. 방법마다 「무엇을 한 군집으로 볼지」의 기준이 다릅니다. 두 방법을 차례로 본 뒤 k-평균과 표로 견줍니다.
계층적 군집화는 점 하나하나를 군집 하나로 놓고 출발합니다. 가장 가까운 두 군집을 합치는 일을 하나가 남을 때까지 되풀이합니다. 합친 순서는 나무 모양으로 남습니다. 고객 표로 합쳐 나가면 아래 나무가 됩니다.
flowchart TD
T["전체"] --> L
T --> R
subgraph CUT["여기서 자르면 군집 두 개"]
L["가·나·다"]
R["라·마·바"]
end
L --> L1["가·다"]
L --> N["나"]
L1 --> G["가"]
L1 --> D["다"]
R --> R1["라·마"]
R --> B["바"]
R1 --> RA["라"]
R1 --> M["마"]
가와 다가 가장 먼저 합쳐집니다. 나는 그 뒤에 붙습니다. 나무에서 위쪽일수록 늦게, 더 먼 거리에서 합쳐진 것입니다. 나무의 높이는 두 군집을 합칠 때의 거리입니다.
이 나무를 원하는 높이에서 잘라 군집 수를 정합니다. 어느 거리에서 자르면 그보다 먼 거리에서 합친 것이 풀립니다. 맨 위 한 번만 풀면 가·나·다와 라·마·바, 군집 두 개가 남습니다.
DBSCAN 은 점이 빽빽하게 모인 구역을 한 군집으로 봅니다. 주변 가까이에 점이 충분히 많은 점이 군집의 몸통이 됩니다. 몸통끼리 가까우면 서로 이어져 한 군집을 이룹니다. 점 하나가 어디로 가는지는 아래처럼 두 번 갈립니다.
flowchart TD
A{"주변 가까이에 점이 충분히 많나"} -->|많다| B["몸통이 된다"]
A -->|적다| C{"가까이에 몸통이 있나"}
C -->|있다| D["그 몸통의 군집에 든다"]
C -->|없다| E["잡음으로 남는다"]
어느 몸통에도 안 이어지는 외딴 점이 잡음입니다. DBSCAN 은 이런 점을 억지로 군집에 넣지 않습니다.
| 방법 | 한 군집으로 보는 것 | 군집 수를 미리 받나 | 어느 군집에도 안 맞는 점 |
|---|---|---|---|
| k-평균 | 같은 중심점에 가장 가까운 점들 | 받는다 | 어딘가에 꼭 넣는다 |
| 계층적 군집화 | 가까운 것부터 차례로 합쳐 나간 점들 | 안 받는다. 나무를 자를 높이로 정한다 | 끝까지 혼자 남았다가 마지막에 합쳐진다 |
| DBSCAN | 점이 빽빽하게 모인 구역 | 안 받는다 | 잡음으로 남긴다 |
군집 수를 고르는 일
k-평균처럼 군집 수를 받는 방법은 그 수를 사람이 골라야 합니다. 정답이 없으니 몇 개가 맞는지도 데이터가 알려 주지 않습니다.
흔한 방법은 k 를 바꿔 가며 돌려 보는 것입니다. 돌린 결과마다 점과 자기 중심점 사이 거리를 제곱해 모두 더합니다. 이 합이 클러스터 내 제곱합입니다. 점들이 자기 중심점 둘레에 촘촘히 모일수록 작아집니다.
k 를 늘리면 이 합은 줄어듭니다. 점마다 더 가까운 중심점이 생기기 때문입니다. 그래서 합이 가장 작은 k 를 고르면 점 하나가 군집 하나가 되고 맙니다.
아래는 고객 표를 k 마다 가장 잘 나눴을 때의 합입니다. 가로축이 k, 세로축이 클러스터 내 제곱합입니다.
xychart-beta
x-axis "군집 수 k" [1, 2, 3, 4]
y-axis "클러스터 내 제곱합" 0 --> 220
line [216.3, 6.7, 3.7, 1.5]
k 가 1에서 2로 갈 때 합이 216.3 에서 6.7 로 뚝 떨어집니다. 그 뒤로는 3.7, 1.5 로 조금씩만 줄어듭니다. 그래서 이 고객 표에는 k 를 2로 줍니다.
이렇게 줄어드는 폭이 갑자기 작아지는 k 를 고르는 방법이 엘보 방법입니다. 그래프가 팔꿈치처럼 꺾이는 데서 붙은 이름입니다.
결과를 재는 일
군집화에는 맞혔는지 채점할 정답이 없습니다. 그래서 나눔이 얼마나 또렷한지를 대신 잽니다. 같은 군집끼리는 가깝고 다른 군집과는 먼지를 봅니다.
이 생각을 점 하나에 대고 셈한 값이 실루엣 계수입니다. 자기 군집 안 점들과의 평균 거리를 가장 가까운 다른 군집까지의 평균 거리와 견줍니다. 값은 -1 에서 1 사이입니다.
1 에 가까울수록 자기 군집에 잘 들어맞은 점입니다. 0 근처면 두 군집의 경계에 걸친 점입니다. 음수면 남의 군집에 더 가까운 점이라 잘못 들어갔다는 신호입니다. 모든 점의 값을 평균 내면 나눔 전체의 점수가 됩니다.
이 점수가 높아도 쓸모 있는 나눔이라는 뜻은 아닙니다. 군집 번호에 이름을 붙여 보고 일에 쓸 수 있는지는 사람이 판단합니다.
쓰는 때와 안 쓰는 때
군집화는 무엇이 섞였는지 모르는 데이터를 처음 훑을 때 씁니다. 고객을 구매 습관별로 나눠 보는 고객 세분화가 대표입니다. 글을 주제별로 묶는 문서 군집화도 같은 일을 글에 대고 하는 것입니다.
어느 군집에서도 먼 점은 드문 데이터라는 신호가 됩니다. 그래서 군집화는 평소와 다른 거래나 요청을 찾는 이상 탐지의 밑바탕으로도 쓰입니다. 사진 속 색을 몇 가지 대표색으로 줄이는 일도 비슷한 색끼리 묶는 군집화입니다.
나눌 목록과 레이블이 달린 예시가 이미 있으면 분류를 씁니다. 군집화는 돌릴 때마다 결과가 달라질 수 있습니다. 군집에 이름도 없습니다. 목록이 정해진 일에는 분류가 더 일정한 답을 냅니다.
서버 클러스터와 다른 말
백엔드에서 클러스터라고 하면 대개 서버 여러 대를 하나처럼 묶어 굴리는 구성을 뜻합니다. 데이터베이스 클러스터나 쿠버네티스 클러스터가 그 뜻입니다. 이 뜻은 클러스터 항목이 다룹니다.
군집화의 클러스터는 서버가 아니라 데이터를 묶은 군집입니다. 영어로는 둘 다 clustering 이라고 부를 때가 있어 문맥으로 가려야 합니다. 「군집화」라는 한국어는 데이터를 묶는 뜻으로만 씁니다.
관련 항목
군집화가 속하는 상위 분류
머신러닝 · 비지도학습 · 데이터 마이닝 · 데이터 분석 · 통계
군집화와 나란히 놓이는 머신러닝 문제
분류 · 회귀 · 차원 축소 · 이상 탐지 · 연관 규칙 · 밀도 추정
군집화를 이루는 구성 요소
특성 · 특성 벡터 · 중심점 · 레이블 · 덴드로그램 · 잡음
데이터끼리 닮음을 재는 잣대
유클리드 거리 · 맨해튼 거리 · 코사인 유사도 · 자카드 유사도 · 거리 함수 · 유사도
군집화 앞에 놓이는 처리 단계
특성 스케일링 · 표준화 · 특성 공학 · 임베딩 · 주성분 분석 · t-SNE · UMAP
군집을 찾는 알고리즘
k-평균 · k-평균++ · k-메도이드 · 계층적 군집화 · 단일 연결 군집 · DBSCAN · HDBSCAN · 가우시안 혼합 모델 · 평균 이동 · 스펙트럴 군집화
군집 결과를 재는 지표
실루엣 계수 · 엘보 방법 · 클러스터 내 제곱합 · 데이비스-볼딘 지수 · 조정 랜드 지수
군집화로 푸는 실무 작업
고객 세분화 · 문서 군집화 · 검색 결과 군집화 · 색 양자화 · 추천 시스템 · 토픽 모델링
클러스터라는 이름을 함께 쓰는 이웃
클러스터 · 데이터베이스 클러스터 · 쿠버네티스 · 클러스터드 인덱스 · 문자소 클러스터
다른 이름: clustering · Clustering · 클러스터링 · 군집 분석 · cluster analysis · 클러스터 분석