이름에 답이 들어 있습니다
k가 무엇이고 평균이 무엇인지 알면 방법의 절반이 보입니다.
중심에서 가까운 것끼리 묶는 대표적인 방법이 k-평균 군집 분석(k-means clustering)입니다. 이름의 두 조각인 k와 평균에 각각 뜻이 담겨 있습니다.
k — 군집의 개수
몇 무리로 나눌지를 우리가 미리 정해 넣는 숫자입니다. k = 3이면 데이터가 어떻게 생겼든 세 무리가 나옵니다. 데이터가 알려 주는 값이 아닙니다.
평균(means) — 중심점을 정하는 방법
각 군집의 중심점(centroid)을 그 군집에 속한 데이터들의 평균 위치에 둡니다. 이름의 「평균」이 가리키는 것이 이 계산입니다.
중심점은 데이터가 아닙니다
중심점은 계산으로 만들어 낸 가상의 지점입니다. 실제 데이터 위에 놓일 수도 있지만, 대개는 아무 데이터도 없는 빈자리에 놓입니다. 반 학생들의 평균 키가 반드시 누군가의 키와 같지는 않은 것과 같습니다.
한 문장으로 줄이면
군집 개수 k를 정하고, 중심점을 찾아,
각 데이터를 가장 가까운 중심점에 딸려 보낸다
「가깝다」를 어떻게 측정할까?
두 점 사이의 거리를 숫자로 나타내는 방법입니다.
「가장 가까운 중심점」을 찾으려면 거리를 측정할 줄 알아야 합니다. 측정하는 방법은 여러 가지인데, 두 가지가 널리 쓰입니다.
유클리드 거리
두 점을 곧게 이은 직선의 길이입니다. 가로 차이와 세로 차이를 각각 제곱해 더한 뒤 제곱근을 씌웁니다.
(1, 1)에서 (3, 3)까지라면 √(2² + 2²) = √8 ≈ 2.83
맨해튼 거리
축을 따라 꺾어 간 길이입니다. 가로 차이와 세로 차이의 절댓값을 그냥 더합니다. 바둑판처럼 난 길을 걸어가는 것과 같습니다.
같은 두 점이라면 |3−1| + |3−1| = 4
같은 두 점인데 2.83과 4로 값이 다릅니다. 거리를 측정하는 방법이 다르면 「가장 가까운 것」도 달라질 수 있고, 그러면 군집도 달라집니다. 보통은 유클리드 거리를 씁니다. 아래 설명도 모두 유클리드 거리를 쓴 것입니다.
거리를 측정하려면 숫자여야 합니다
k-평균 군집 분석은 거리를 계산해야 하므로 속성값이 수치형이어야 합니다. 「좋아하는 색」이나 「사는 동네」 같은 값은 그대로는 뺄셈이 되지 않으므로 쓸 수 없습니다. 이런 속성을 쓰려면 먼저 숫자로 바꾸는 처리가 필요합니다.
중심점을 어떻게 찾아낼까?
처음 중심점은 아무 데나 찍고 시작합니다.
중심점을 알면 군집을 나눌 수 있고, 군집을 알면 중심점을 구할 수 있습니다. 둘 다 모르는데 어느 쪽을 먼저 해야 할까요? k-평균은 중심점을 아무 데나 찍어 놓고 시작한 뒤, 둘을 번갈아 고쳐 나갑니다.
-
1
군집의 개수 k를 정한다
몇 무리로 나눌지 사람이 정합니다. 여기서는 k = 2로 하겠습니다.
-
2
초기 중심점 k개를 무작위로 찍는다
어디에 놓든 다음 단계부터 고쳐 나갑니다. 다만 어디서 출발했는지에 따라 도착하는 답이 달라질 수 있습니다.
-
3
데이터를 가장 가까운 중심점에 할당한다
점 하나하나마다 어느 중심점이 더 가까운지 측정해 그쪽 군집에 넣습니다.
-
4
중심점을 그 군집의 평균 위치로 옮긴다
방금 모인 점들의 평균 자리로 중심점을 다시 놓습니다.
-
5
중심점이 더 움직이지 않을 때까지 3과 4를 반복한다
중심점이 옮겨졌으니 가장 가까운 중심점이 바뀐 점이 생길 수 있습니다. 그러면 다시 나누고, 다시 옮깁니다. 더 이상 움직이지 않으면 끝입니다.
3과 4가 서로를 고쳐 줍니다
3번은 중심점이 정해졌다고 보고 군집을 고칩니다. 4번은 군집이 정해졌다고 보고 중심점을 고칩니다. 한쪽을 고치면 다른 쪽이 어긋나므로 다시 고쳐야 하고, 이것을 반복하면 어긋남이 차츰 줄어들다가 반드시 멈춥니다. 다만 멈춘 자리가 가장 좋은 자리라는 보장은 없습니다. 더 나은 답이 있는데도 주변보다 낫다는 이유로 그 자리에 머물 수 있고, 초기 중심점을 어디에 찍었느냐에 따라 다른 답에서 멈추기도 합니다. 그래서 실제로는 시작점을 바꿔 가며 여러 번 실행해 보고 가장 나은 결과를 고릅니다.
손으로 한 번 실행해 봅시다
점 여섯 개면 연필로 끝까지 따라갈 수 있습니다.
상황
학교 축제에 부스 여섯 개가 운동장 여기저기에 섭니다. 짐을 맡아 줄 물품 보관소를 두 곳 두려고 합니다. 어느 부스를 어느 보관소가 맡고, 보관소는 어디에 두어야 할까요? k = 2인 k-평균 군집 분석이 정확히 이 문제를 풉니다.
| 부스 | 가 | 나 | 다 | 라 | 마 | 바 |
|---|---|---|---|---|---|---|
| 가로 위치 | 1 | 3 | 2 | 7 | 9 | 8 |
| 세로 위치 | 1 | 1 | 4 | 6 | 6 | 9 |
이해를 돕기 위해 만든 가상의 값입니다.
초기 중심점은 일부러 나쁘게 잡아 보겠습니다. 둘 다 왼쪽에 몰아서 (1, 1)과 (2, 4)에 찍습니다. 이렇게 시작해도 제자리를 찾아가는지 보는 것이 목적입니다.
첫 번째 반복
각 부스에서 두 중심점까지의 거리를 측정해 가까운 쪽에 넣습니다.
| 부스 | (1, 1)까지 | (2, 4)까지 | 가까운 쪽 |
|---|---|---|---|
| 가 (1, 1) | 0 | 3.16 | 1군집 |
| 나 (3, 1) | 2 | 3.16 | 1군집 |
| 다 (2, 4) | 3.16 | 0 | 2군집 |
| 라 (7, 6) | 7.81 | 5.39 | 2군집 |
| 마 (9, 6) | 9.43 | 7.28 | 2군집 |
| 바 (8, 9) | 10.63 | 7.81 | 2군집 |
이제 중심점을 각 군집의 평균 자리로 옮깁니다.
1군집 = 가, 나 → 가로 (1+3)÷2 = 2,
세로 (1+1)÷2 = 1 → 중심점 (2, 1)
2군집 = 다, 라, 마, 바 → 가로 (2+7+9+8)÷4 = 6.5,
세로 (4+6+6+9)÷4 = 6.25 → 중심점 (6.5, 6.25)
두 번째 반복
중심점이 움직였으니 다시 나눕니다.
| 부스 | (2, 1)까지 | (6.5, 6.25)까지 | 가까운 쪽 |
|---|---|---|---|
| 가 (1, 1) | 1 | 7.60 | 1군집 |
| 나 (3, 1) | 1 | 6.31 | 1군집 |
| 다 (2, 4) | 3 | 5.03 | 1군집 ← 바뀜 |
| 라 (7, 6) | 7.07 | 0.56 | 2군집 |
| 마 (9, 6) | 8.60 | 2.51 | 2군집 |
| 바 (8, 9) | 10.00 | 3.13 | 2군집 |
부스 「다」가 2군집에서 1군집으로 옮겨 갔습니다. 처음에는 중심점이 마침 「다」 위에 놓여 있어서 2군집이었지만, 중심점이 오른쪽 위로 멀어지자 이제는 왼쪽 무리가 더 가까워진 것입니다. 한 번 나누고 끝내면 이런 점을 잘못된 군집에 남겨 두게 되므로 반복합니다.
1군집 = 가, 나, 다 → (1+3+2)÷3 = 2,
(1+1+4)÷3 = 2 → 중심점 (2, 2)
2군집 = 라, 마, 바 → (7+9+8)÷3 = 8,
(6+6+9)÷3 = 7 → 중심점 (8, 7)
세 번째 반복 — 그리고 끝
새 중심점 (2, 2)와 (8, 7)로 다시 나누어 보면 가 · 나 · 다는 그대로 1군집, 라 · 마 · 바는 그대로 2군집입니다. 군집이 그대로이니 평균도 그대로이고, 중심점이 더 이상 움직이지 않습니다. 여기서 멈춥니다.
답이 나왔습니다
보관소는 (2, 2)와 (8, 7)에 두고, 가 · 나 · 다는 첫 번째 보관소가, 라 · 마 · 바는 두 번째 보관소가 맡습니다. 중심점 두 곳 모두 부스가 없는 빈자리입니다.
여기서는 거리가 운동장 위의 거리였습니다
부스의 가로 · 세로 위치였으니 거리도 운동장 위의 실제 거리였습니다. 하지만 대부분의 군집 분석에서 두 축은 장소가 아닙니다. 가로축이 대출 권수, 세로축이 방문 횟수일 수도 있습니다. 그때의 「거리」는 두 이용자가 얼마나 다른가를 뜻하고, 중심점은 그 무리의 평균적인 이용 습관을 뜻합니다. 계산은 똑같고 뜻만 바뀝니다.
움직이는 것으로 보고 싶다면
k-평균 군집화 시뮬레이터에서 점을 직접 찍고 「다음 단계」 버튼으로 한 단계씩 실행하며 중심점이 옮겨 다니다 멈추는 모습을 볼 수 있습니다. 「중심점 생성」을 다시 눌러 초기 중심점을 새로 뽑아 보는 것도 해 보세요.
같은 여섯 부스에 k = 3으로 하면 어떻게 될까요? k = 6이면요? k를 키울수록 각 부스와 보관소 사이의 거리는 대체로 짧아지고, k = 6이면 0이 됩니다. 그렇다면 k는 크면 클수록 좋은 걸까요?
단위가 다르면 무슨 일이 벌어질까?
군집 분석에서 자주 빠뜨리는 준비 작업입니다.
부스 예에서는 가로 위치와 세로 위치가 둘 다 같은 단위라 문제가 없었습니다. 그런데 실제 데이터에서는 속성마다 값의 크기가 딴판인 경우가 흔합니다.
도서관 이용자를 묶어 본다면
| 속성 | 값의 범위 | 두 사람의 차이 |
|---|---|---|
| 한 해 대출 권수 | 1 ~ 100권 | 많아야 99 |
| 머문 시간 | 1,000 ~ 10,000분 | 많으면 9,000 |
거리를 계산하면 머문 시간의 차이가 대출 권수의 차이를 덮어 버립니다. 권수에서 아무리 크게 차이 나도 99인데, 시간 쪽은 수천씩 벌어지기 때문입니다. 결국 머문 시간 하나만 보고 묶은 것과 다름없는 결과가 나옵니다.
정규화 — 눈금을 맞춰 준다
정규화는 서로 다른 속성값의 눈금을 맞추는 작업입니다. 방법은 여럿입니다. 모든 속성을 0에서 1 사이로 다시 늘어놓는 최소-최대 정규화도 있고, 평균을 빼고 표준 편차로 나누는 표준화도 있습니다. 어느 쪽이든 눈금을 맞추면 권수든 시간이든 거리에 비슷한 몫으로 보탭니다. 속성의 단위가 서로 다르면 정규화가 꼭 필요합니다.
선형 회귀에서는 정규화를 하지 않아도 예측 결과가 크게 달라지지 않습니다. 속성마다 계수가 따로 붙어서, 단위가 크면 계수가 작아지며 저절로 맞춰지기 때문입니다. 그러나 거리를 측정하는 방법은 다릅니다. 군집 분석은 물론이고 가까운 데이터 k개를 찾아 답을 내는 k-최근접 이웃도 모든 속성을 한데 모아 거리 하나를 냅니다. 조절해 줄 계수가 없으니 큰 숫자를 가진 속성이 거리를 좌우합니다.
실습 — 점을 직접 찍어 묶어 보기
이번 실습은 데이터를 내려받지 않고 직접 그립니다.
오렌지에는 라는 위젯이 있습니다. 빈 좌표평면에 마우스를 끌어 점을 찍으면 그것이 곧 데이터가 됩니다. 모양을 직접 정해 두고, k-평균이 그 모양을 어떻게 묶는지 확인합니다.
데이터 만들기
묶음에서 를 꺼내 엽니다. 를 골라 좌표평면에 마우스를 끌면 점이 뿌려집니다.
동글동글한 무리를 서너 개 만들어 두세요. 그리고 나중에 초승달 모양도 한 번 그려 볼 것입니다. 을 이어 붙이면 내가 찍은 점들이 x와 y 두 속성을 가진 표로 바뀐 것을 확인할 수 있습니다.
군집으로 묶기
에 를 잇습니다. 설정할 것이 두 가지입니다.
| 설정 | 하는 일 |
|---|---|
| k를 하나로 못 박지 않고 범위로 준다. 예를 들어 2에서 8까지로 두면 오렌지가 각각 해 보고 실루엣 계수가 가장 큰 k를 먼저 보여 준다 | |
| 속성값의 눈금을 맞춰 준다. 0에서 1 사이로 늘어놓는 것이 아니라, 평균을 빼고 표준 편차로 나누는 표준화 방식으로 맞춘다 |
오렌지가 k를 비교하는 데 쓰는 실루엣 계수는 각 군집 안은 비슷하고 군집끼리는 잘 구분되었는지를 측정하는 숫자로, 1에 가까울수록 잘 나뉘었다는 뜻입니다. 다만 점수가 가장 큰 k가 우리 목적에 맞는 k라는 보장은 없어서, 오렌지가 보여 준 k는 후보로 삼습니다. 지금은 k를 고르는 데 쓰이는 잣대가 있다는 것까지만 씁니다.
결과 확인하기
에 을 잇습니다. 데이터에 Cluster와 Silhouette이라는 새 열이 만들어져 있을 것입니다. 를 Cluster로 바꾸면 군집이 색으로 나뉘어 보입니다.
어느 한 군집만 따로 살펴보고 싶다면 에 와 을 차례로 잇고, 조건을 Cluster is C1처럼 주면 됩니다.
꼭 해 볼 것 세 가지
- 초승달 두 개를 그려 보세요. k-평균이 초승달을 가운데로 잘라 버리는지 확인합니다.
- 같은 그림에 k만 바꿔 보세요. k = 2, 3, 5로 두면 군집이 어떻게 달라지나요? 뭉침이 세 덩어리인데 k = 5를 주면 무슨 일이 벌어지나요?
- 점을 아주 고르게, 뭉침 없이 흩어 놓아 보세요. 그래도 오렌지는 k개의 군집을 만들어 냅니다. 이 결과에 뜻이 있을까요?
세 번째에서 보듯이 k-평균은 뭉침이 없어도 반드시 답을 내놓습니다. 나온 군집이 진짜인지 판단하는 것은 프로그램이 아니라 사람입니다.
친구와 거의 같은 모양으로 점 그림을 그려 각자 k-Means를 실행했더니 한 사람은 세 무리가 깔끔하게 나뉘고, 다른 사람은 한 무리가 둘로 쪼개졌습니다. 둘 중 한 사람이 설정을 잘못한 것일까요? 점의 자리가 조금만 달라도 중심점이 출발하는 자리와 멈추는 자리가 달라질 수 있다는 점을 떠올려 답해 보세요.
핵심 정리
k-평균 군집 분석
k-means clustering
- k — 군집의 개수. 데이터가 아니라 사람이 정한다
- 평균 — 중심점을 그 군집의 평균 위치에 둔다
- 중심점은 데이터가 아니라 계산으로 만든 대표 지점
군집화 과정
멈출 때까지 반복
- k를 정하고 중심점을 무작위로 찍는다
- 가장 가까운 중심점에 할당 → 중심점을 평균으로 이동
- 중심점이 움직이지 않으면 끝
- 반드시 멈추지만 멈춘 자리가 최선이라는 보장은 없다. 시작점에 따라 답이 달라질 수 있어 여러 번 실행해 비교한다
거리와 정규화
묶기 전의 준비
- 거리를 계산해야 하므로 속성값이 수치형이어야 한다
- 범위가 큰 속성이 거리를 독차지한다
- 그래서 정규화로 눈금을 맞춘 뒤 묶는다
실습에서 쓴 위젯
점을 찍어 바로 확인
- → →
- 로 k의 범위, 로 표준화 방식의 눈금 맞추기
- 뭉침이 없어도 k개의 군집은 반드시 나온다
확인 퀴즈
배운 내용을 확인해 봅시다.
k-평균 군집 분석에서 k는 무엇인가?
중심점(centroid)에 대한 설명으로 옳은 것은?
k-평균 군집화가 멈추는 시점은?
대출 권수(1~100)와 머문 시간(1,000~10,000분)으로 이용자를 묶으려 합니다. 정규화를 하지 않으면 어떤 일이 벌어지나?
점을 뭉침 없이 고르게 흩어 놓은 데이터에 k = 3으로 k-평균을 실행했습니다. 결과는?