K-means
-means는 대적인 비지도 학습(Unsupervised Learning) 알고리즘 중 하나로, 주어진 데이터를 K개의 클러스터(군집)로 나누는 데 사용됩니다. 클러스터링은 데이터의 유사성을 기반으로 그룹을 형성하여 데이터의 구조를 이해하고 패턴을 발견하는 데 중요한 역할을 합니다. 특히 K-means는 간단하면서도 효율적인 알고리즘으로, 다양한 분야에서 널리 활용되고 있습니다.
개요
K-means는 데이터 포인트들 사이의 거리 기반으로 유사한 특성을 가진 데이터를 그룹화하는 알고리즘입니다. 주어진 데이터셋에서 사용자가 지정한 K라는 숫자만큼의 중심점(Centroid)을 설정하고, 각 데이터 포인트를 가장 가까운 중심점에 할당함으로써 군집을 형성합니다. 이후 중심점을 업데이트하고 이 과정을 반복하여 최적의 클러스터를 도출합니다.
이 알고리즘은 정수 K를 사전에 지정해야 한다는 전제가 있으며, 결과는 초기 중심점의 위치에 따라 달라질 수 있습니다. 따라서 일반적으로 여러 번 반복 실행하거나 초기화 방법(예: K-means++)을 사용하여 안정적인 결과를 도출합니다.
알고리즘 원리
K-means는 다음과 같은 반복적인 절차를 통해 클러스터를 형성합니다.
1. 초기화
- 사용자가 결정한 클러스터 수 K를 설정합니다.
- 초기 중심점(K 개의 중심)을 무작위로 선택하거나, K-means++와 같은 전략적 방법을 사용하여 설정합니다.
2. 할당 단계 (Assignment Step)
- 각 데이터 포인트를 가장 가까운 중심점에 할당합니다.
- 거리 측정은 일반적으로 유클리드 거리(Euclidean Distance)를 사용합니다.
예: 데이터 포인트 ( x_i )와 중심점 ( c_j ) 사이의 거리
[
d(x_i, c_j) = \sqrt{\sum_{k=1}^{n} (x_{i,k} - c_{j,k})^2}
]
3. 업데이트 단계 (Update Step)
- 각 클러스터에 속한 데이터 포인트들의 평균 값을 새로운 중심점으로 설정합니다.
[
c_j = \frac{1}{|C_j|} \sum_{x_i \in C_j} x_i
]
여기서 ( C_j )는 j번째 클러스터에 속한 데이터 포인트 집합입니다.
4. 수렴 확인
- 중심점이 더 이상 크게 이동하지 않거나, 할당이 안정화될 때까지 2~3 단계를 반복합니다.
- 일반적으로 SSE(Sum of Squared Errors)가 수렴하면 알고리즘이 종료됩니다.
장점과 단점
✅ 장점
- 단순하고 이해하기 쉬움: 알고리즘이 직관적이며 구현이 간단합니다.
- 계산 효율성: 데이터 크기가 클 경우에도 비교적 빠르게 동작합니다.
- 광범위한 적용성: 이미지 압축, 고객 세분화, 문서 클러스터링 등 다양한 분야에 활용 가능.
❌ 단점
- K 값 사전 결정 필요: 최적의 K 값을 정하기 어려울 수 있습니다.
- 초기 중심점에 민감함: 초기값에 따라 지역 최적해에 수렴할 수 있습니다.
- 구형 클러스터 가정: K-means는 구형이고 크기가 비슷한 클러스터를 가정하므로, 비선형 또는 복잡한 형태의 클러스터에는 부적합합니다.
- 이상치에 민감함: 중심점이 평균을 기반으로 하기 때문에 이상치의 영향을 크게 받을 수 있습니다.
K 값 선택 방법
K-means에서 가장 중요한 결정 중 하나는 클러스터 수 K를 어떻게 정할 것인지입니다. 대표적인 방법은 다음과 같습니다.
엘보우 방법 (Elbow Method)
- 다양한 K 값에 대해 SSE(Sum of Squared Errors)를 계산하고, K에 따른 SSE 감소율을 그래프로 그립니다.
- 감소율이 뚝 떨어지는 "팔꿈치" 지점이 최적의 K로 간주됩니다.
실루엣 분석 (Silhouette Analysis)
- 각 데이터 포인트가 자신의 클러스터에 얼마나 잘 속해 있는지를 평가합니다.
- 실루엣 계수는 [-1, 1] 범위를 가지며, 1에 가까울수록 클러스터링이 잘 되었다는 의미입니다.
실루엣 계수 공식
[
s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))}
]
- ( a(i) ): 같은 클러스터 내 다른 포인트와의 평균 거리
- ( b(i) ): 가장 가까운 다른 클러스터 내 포인트와의 평균 거리
활용 사례
- 고객 세분화: 마케팅에서 고객을 유사한 구매 패턴에 따라 그룹화
- 이미지 압축: 픽셀 값을 K개의 색상으로 군집화하여 저장 용량 감소
- 문서 클러스터링: 유사한 주제의 문서를 그룹화하여 정보 조직
- 생물정보학: 유전자 발현 데이터를 기반으로 유사한 발현 패턴을 가진 유전자 군집화
관련 알고리즘 및 확장
- K-means++: 초기 중심점을 보다 효과적으로 선택하여 수렴 속도와 품질을 향상
- K-medoids (예: PAM 알고리즘): 중심점을 실제 데이터 포인트로 선택하여 이상치에 강함
- Fuzzy C-means: 하나의 데이터가 여러 클러스터에 소속될 수 있도록 허용 (퍼지 클러스터링)
- Gaussian Mixture Models (GMM): 확률 기반 모델로, 더 유연한 클러스터 형태를 허용
참고 자료 및 관련 문서
from sklearn.cluster import KMeans
import numpy as np
# 간단한 K-means 예제
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
print(kmeans.labels_) # 각 포인트의 클러스터 레이블
print(kmeans.cluster_centers_) # 중심점 좌표
K-means는 데이터 과학의 기초이자 핵심 도구 중 하나로, 복잡한 데이터 구조를 탐색하는 데 매우 유용합니다. 다만, 제한 사항을 이해하고 적절한 전처리 및 평가 방법을 함께 사용하는 것이 성공적인 클러스터링을 위한 핵심입니다.
군집화(Clustering) 관점에서의 특성
K-means 알고리즘의 핵심 목적은 데이터셋을 최적의 그룹으로 나누는 것이며, 이는 수학적으로 다음 두 가지 지표의 최적화로 설명됩니다.
- 군집 내 응집도(Cohesion) 극대화: 동일한 군집에 속한 데이터 포인트들이 서로 최대한 가깝게 위치하도록 하여, 군집 내부의 유사성을 높이는 것입니다. K-means는 각 군집의 SSE(Sum of Squared Errors)를 최소화함으로써 이를 달성합니다.
- 군집 간 분리도(Separation) 극대화: 서로 다른 군집의 중심점 사이의 거리를 최대한 멀게 하여, 군집 간의 구분을 명확히 하는 것입니다.
결과적으로 K-means는 군집 내 분산은 최소화하고 군집 간 분산은 최대화하는 방향으로 데이터를 분할합니다.
데이터 전처리와 군집화 성능
K-means는 유클리드 거리를 기반으로 유사도를 측정하므로, 각 특성(Feature)의 스케일(Scale)에 매우 민감합니다.
특성 스케일링의 필요성
특성 간의 단위(Unit)가 다를 경우, 값이 큰 특성이 거리 계산에 지배적인 영향을 미쳐 결과가 왜곡됩니다. 예를 들어, '연봉(단위: 원)'과 '나이(단위: 세)'라는 두 특성이 있을 때, 연봉의 수치 범위가 훨씬 크기 때문에 나이의 차이는 무시되고 연봉에 의해서만 군집이 결정되는 현상이 발생합니다. 따라서 표준화(Standardization) 또는 정규화(Normalization) 과정이 필수적입니다.
스케일링 전후 결과 비교 시각화 (예시)
| 구분 |
스케일링 전 (Raw Data) |
스케일링 후 (Standardized) |
| 특성 분포 |
특정 축(값이 큰 특성)으로 길게 늘어진 형태 |
모든 축이 유사한 범위(평균 0, 분산 1)로 조정됨 |
| 군집 형태 |
값이 큰 특성 방향으로 타원형으로 뭉침 |
데이터의 실제 밀도를 반영한 구형 군집 형성 |
| 결과 해석 |
수치 범위가 큰 변수에 의해 군집 결정 |
모든 변수가 동등한 가중치로 군집 결정에 기여 |
할당 방식의 분류: 하드 vs 소프트 클러스터링
K-means는 데이터 포인트가 반드시 하나의 군집에만 할당되는 하드 클러스터링(Hard Clustering) 방식을 취합니다. 이는 분석 결과가 명확하다는 장점이 있지만, 군집 경계에 위치한 데이터의 모호성을 처리하지 못한다는 한계가 있습니다.
| 비교 항목 |
하드 클러스터링 (Hard) |
소프트 클러스터링 (Soft) |
| 할당 방식 |
하나의 포인트 $\rightarrow$ 하나의 군집 (0 또는 1) |
하나의 포인트 $\rightarrow$ 모든 군집에 확률적 할당 |
| 대표 알고리즘 |
K-means, K-medoids |
GMM (Gaussian Mixture Model), Fuzzy C-means |
| 결과 형태 |
명확한 소속 레이블 (예: Cluster A) |
소속 확률/멤버십 값 (예: A: 70%, B: 20%, C: 10%) |
| 특징 |
계산이 빠르고 결과가 단순함 |
경계 영역의 불확실성을 표현 가능함 |
기하학적 제약: 볼록 집합과 비볼록 집합
K-means는 중심점으로부터의 거리를 기준으로 영역을 나누기 때문에, 기하학적으로 볼록 집합(Convex Set) 형태의 군집만 형성할 수 있습니다.
- 볼록 집합 (Convex Set): 집합 내의 임의의 두 점을 연결한 선분이 다시 그 집합 내에 완전히 포함되는 형태입니다. (예: 원형, 타원형, 사각형 등) $\rightarrow$ K-means로 군집화 가능
- 비볼록 집합 (Non-convex Set): 초승달 모양, 고리 모양, 얽혀 있는 형태 등 두 점을 연결한 선분이 집합 외부로 나가는 형태입니다. $\rightarrow$ K-means로 군집화 불가 (강제로 구형으로 나누려 하여 잘못된 결과 도출)
[군집화 예시 그림 개념]
- 성공 사례: 흩어져 있는 세 개의 둥근 구름 형태의 데이터 $\rightarrow$ K-means가 각 구름의 중심을 정확히 포착.
- 실패 사례: 두 개의 초승달이 서로 마주 보고 있는 형태 $\rightarrow$ K-means는 이를 반으로 뚝 잘라 두 개의 덩어리로 나누어 버림 (DBSCAN과 같은 밀도 기반 알고리즘 필요).
군집화 품질의 정량화
K 값 선택 방법인 엘보우 방법과 실루엣 분석은 단순히 숫자를 찾는 과정이 아니라, 군집화의 품질(Clustering Quality)을 정량적으로 측정하려는 시도입니다.
- SSE (Sum of Squared Errors): 군집 내 응집도를 측정하는 지표로, 값이 작을수록 데이터가 중심점에 밀집되어 있음을 의미합니다.
- 실루엣 계수 (Silhouette Coefficient): 응집도와 분리도를 동시에 고려한 지표입니다. 개별 데이터가 자신이 속한 군집과 얼마나 가깝고, 다른 군집과는 얼마나 먼지를 수치화하여 전체적인 군집화의 적절성을 평가합니다.
K-means
-means는 대적인 **비지도 학습**(Unsupervised Learning) 알고리즘 중 하나로, 주어진 데이터를 **K개의 클러스터**(군집)로 나누는 데 사용됩니다. 클러스터링은 데이터의 유사성을 기반으로 그룹을 형성하여 데이터의 구조를 이해하고 패턴을 발견하는 데 중요한 역할을 합니다. 특히 K-means는 간단하면서도 효율적인 알고리즘으로, 다양한 분야에서 널리 활용되고 있습니다.
---
## 개요
K-means는 데이터 포인트들 사이의 거리 기반으로 유사한 특성을 가진 데이터를 그룹화하는 알고리즘입니다. 주어진 데이터셋에서 사용자가 지정한 **K**라는 숫자만큼의 중심점**(Centroid)**을 설정하고, 각 데이터 포인트를 가장 가까운 중심점에 할당함으로써 군집을 형성합니다. 이후 중심점을 업데이트하고 이 과정을 반복하여 최적의 클러스터를 도출합니다.
이 알고리즘은 **정수 K를 사전에 지정해야 한다는 전제**가 있으며, 결과는 초기 중심점의 위치에 따라 달라질 수 있습니다. 따라서 일반적으로 여러 번 반복 실행하거나 초기화 방법**(예: K-means++)**을 사용하여 안정적인 결과를 도출합니다.
---
## 알고리즘 원리
K-means는 다음과 같은 반복적인 절차를 통해 클러스터를 형성합니다.
### 1. 초기화
- 사용자가 결정한 클러스터 수 **K**를 설정합니다.
- 초기 중심점(K 개의 중심)을 무작위로 선택하거나, K-means++와 같은 전략적 방법을 사용하여 설정합니다.
### 2. 할당 단계 (Assignment Step)
- 각 데이터 포인트를 가장 가까운 중심점에 할당합니다.
- 거리 측정은 일반적으로 **유클리드 거리**(Euclidean Distance)를 사용합니다.
예: 데이터 포인트 \( x_i \)와 중심점 \( c_j \) 사이의 거리
\[
d(x_i, c_j) = \sqrt{\sum_{k=1}^{n} (x_{i,k} - c_{j,k})^2}
\]
### 3. 업데이트 단계 (Update Step)
- 각 클러스터에 속한 데이터 포인트들의 평균 값을 새로운 중심점으로 설정합니다.
\[
c_j = \frac{1}{|C_j|} \sum_{x_i \in C_j} x_i
\]
여기서 \( C_j \)는 j번째 클러스터에 속한 데이터 포인트 집합입니다.
### 4. 수렴 확인
- 중심점이 더 이상 크게 이동하지 않거나, 할당이 안정화될 때까지 2~3 단계를 반복합니다.
- 일반적으로 SSE(Sum of Squared Errors)가 수렴하면 알고리즘이 종료됩니다.
---
## 장점과 단점
### ✅ 장점
- **단순하고 이해하기 쉬움**: 알고리즘이 직관적이며 구현이 간단합니다.
- **계산 효율성**: 데이터 크기가 클 경우에도 비교적 빠르게 동작합니다.
- **광범위한 적용성**: 이미지 압축, 고객 세분화, 문서 클러스터링 등 다양한 분야에 활용 가능.
### ❌ 단점
- **K 값 사전 결정 필요**: 최적의 K 값을 정하기 어려울 수 있습니다.
- **초기 중심점에 민감함**: 초기값에 따라 지역 최적해에 수렴할 수 있습니다.
- **구형 클러스터 가정**: K-means는 구형이고 크기가 비슷한 클러스터를 가정하므로, 비선형 또는 복잡한 형태의 클러스터에는 부적합합니다.
- **이상치에 민감함**: 중심점이 평균을 기반으로 하기 때문에 이상치의 영향을 크게 받을 수 있습니다.
---
## K 값 선택 방법
K-means에서 가장 중요한 결정 중 하나는 클러스터 수 **K**를 어떻게 정할 것인지입니다. 대표적인 방법은 다음과 같습니다.
### 엘보우 방법 (Elbow Method)
- 다양한 K 값에 대해 **SSE**(Sum of Squared Errors)를 계산하고, K에 따른 SSE 감소율을 그래프로 그립니다.
- 감소율이 뚝 떨어지는 "팔꿈치" 지점이 최적의 K로 간주됩니다.
### 실루엣 분석 (Silhouette Analysis)
- 각 데이터 포인트가 자신의 클러스터에 얼마나 잘 속해 있는지를 평가합니다.
- 실루엣 계수는 \[-1, 1\] 범위를 가지며, 1에 가까울수록 클러스터링이 잘 되었다는 의미입니다.
### 실루엣 계수 공식
\[
s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))}
\]
- \( a(i) \): 같은 클러스터 내 다른 포인트와의 평균 거리
- \( b(i) \): 가장 가까운 다른 클러스터 내 포인트와의 평균 거리
---
## 활용 사례
- **고객 세분화**: 마케팅에서 고객을 유사한 구매 패턴에 따라 그룹화
- **이미지 압축**: 픽셀 값을 K개의 색상으로 군집화하여 저장 용량 감소
- **문서 클러스터링**: 유사한 주제의 문서를 그룹화하여 정보 조직
- **생물정보학**: 유전자 발현 데이터를 기반으로 유사한 발현 패턴을 가진 유전자 군집화
---
## 관련 알고리즘 및 확장
- **K-means++**: 초기 중심점을 보다 효과적으로 선택하여 수렴 속도와 품질을 향상
- **K-medoids (예: PAM 알고리즘)**: 중심점을 실제 데이터 포인트로 선택하여 이상치에 강함
- **Fuzzy C-means**: 하나의 데이터가 여러 클러스터에 소속될 수 있도록 허용 (퍼지 클러스터링)
- **Gaussian Mixture Models (GMM)**: 확률 기반 모델로, 더 유연한 클러스터 형태를 허용
---
## 참고 자료 및 관련 문서
- Bishop, C. M. (2006). *Pattern Recognition and Machine Learning*. Springer.
- Scikit-learn 공식 문서: [https://scikit-learn.org/stable/modules/clustering.html#k-means](https://scikit-learn.org/stable/modules/clustering.html#k-means)
- Jupyter Notebook 예제: K-means를 활용한 고객 세분화 실습
```python
from sklearn.cluster import KMeans
import numpy as np
# 간단한 K-means 예제
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
print(kmeans.labels_) # 각 포인트의 클러스터 레이블
print(kmeans.cluster_centers_) # 중심점 좌표
```
---
K-means는 데이터 과학의 기초이자 핵심 도구 중 하나로, 복잡한 데이터 구조를 탐색하는 데 매우 유용합니다. 다만, 제한 사항을 이해하고 적절한 전처리 및 평가 방법을 함께 사용하는 것이 성공적인 클러스터링을 위한 핵심입니다.
## 군집화(Clustering) 관점에서의 특성
K-means 알고리즘의 핵심 목적은 데이터셋을 최적의 그룹으로 나누는 것이며, 이는 수학적으로 다음 두 가지 지표의 최적화로 설명됩니다.
* **군집 내 응집도(Cohesion) 극대화**: 동일한 군집에 속한 데이터 포인트들이 서로 최대한 가깝게 위치하도록 하여, 군집 내부의 유사성을 높이는 것입니다. K-means는 각 군집의 SSE(Sum of Squared Errors)를 최소화함으로써 이를 달성합니다.
* **군집 간 분리도(Separation) 극대화**: 서로 다른 군집의 중심점 사이의 거리를 최대한 멀게 하여, 군집 간의 구분을 명확히 하는 것입니다.
결과적으로 K-means는 군집 내 분산은 최소화하고 군집 간 분산은 최대화하는 방향으로 데이터를 분할합니다.
## 데이터 전처리와 군집화 성능
K-means는 유클리드 거리를 기반으로 유사도를 측정하므로, 각 특성(Feature)의 **스케일(Scale)**에 매우 민감합니다.
### 특성 스케일링의 필요성
특성 간의 단위(Unit)가 다를 경우, 값이 큰 특성이 거리 계산에 지배적인 영향을 미쳐 결과가 왜곡됩니다. 예를 들어, '연봉(단위: 원)'과 '나이(단위: 세)'라는 두 특성이 있을 때, 연봉의 수치 범위가 훨씬 크기 때문에 나이의 차이는 무시되고 연봉에 의해서만 군집이 결정되는 현상이 발생합니다. 따라서 **표준화(Standardization)** 또는 **정규화(Normalization)** 과정이 필수적입니다.
### 스케일링 전후 결과 비교 시각화 (예시)
| 구분 | 스케일링 전 (Raw Data) | 스케일링 후 (Standardized) |
| :--- | :--- | :--- |
| **특성 분포** | 특정 축(값이 큰 특성)으로 길게 늘어진 형태 | 모든 축이 유사한 범위(평균 0, 분산 1)로 조정됨 |
| **군집 형태** | 값이 큰 특성 방향으로 타원형으로 뭉침 | 데이터의 실제 밀도를 반영한 구형 군집 형성 |
| **결과 해석** | 수치 범위가 큰 변수에 의해 군집 결정 | 모든 변수가 동등한 가중치로 군집 결정에 기여 |
## 할당 방식의 분류: 하드 vs 소프트 클러스터링
K-means는 데이터 포인트가 반드시 하나의 군집에만 할당되는 **하드 클러스터링(Hard Clustering)** 방식을 취합니다. 이는 분석 결과가 명확하다는 장점이 있지만, 군집 경계에 위치한 데이터의 모호성을 처리하지 못한다는 한계가 있습니다.
| 비교 항목 | 하드 클러스터링 (Hard) | 소프트 클러스터링 (Soft) |
| :--- | :--- | :--- |
| **할당 방식** | 하나의 포인트 $\rightarrow$ 하나의 군집 (0 또는 1) | 하나의 포인트 $\rightarrow$ 모든 군집에 확률적 할당 |
| **대표 알고리즘** | **K-means**, K-medoids | GMM (Gaussian Mixture Model), Fuzzy C-means |
| **결과 형태** | 명확한 소속 레이블 (예: Cluster A) | 소속 확률/멤버십 값 (예: A: 70%, B: 20%, C: 10%) |
| **특징** | 계산이 빠르고 결과가 단순함 | 경계 영역의 불확실성을 표현 가능함 |
## 기하학적 제약: 볼록 집합과 비볼록 집합
K-means는 중심점으로부터의 거리를 기준으로 영역을 나누기 때문에, 기하학적으로 **볼록 집합(Convex Set)** 형태의 군집만 형성할 수 있습니다.
* **볼록 집합 (Convex Set)**: 집합 내의 임의의 두 점을 연결한 선분이 다시 그 집합 내에 완전히 포함되는 형태입니다. (예: 원형, 타원형, 사각형 등) $\rightarrow$ **K-means로 군집화 가능**
* **비볼록 집합 (Non-convex Set)**: 초승달 모양, 고리 모양, 얽혀 있는 형태 등 두 점을 연결한 선분이 집합 외부로 나가는 형태입니다. $\rightarrow$ **K-means로 군집화 불가** (강제로 구형으로 나누려 하여 잘못된 결과 도출)
**[군집화 예시 그림 개념]**
- **성공 사례**: 흩어져 있는 세 개의 둥근 구름 형태의 데이터 $\rightarrow$ K-means가 각 구름의 중심을 정확히 포착.
- **실패 사례**: 두 개의 초승달이 서로 마주 보고 있는 형태 $\rightarrow$ K-means는 이를 반으로 뚝 잘라 두 개의 덩어리로 나누어 버림 (DBSCAN과 같은 밀도 기반 알고리즘 필요).
## 군집화 품질의 정량화
K 값 선택 방법인 엘보우 방법과 실루엣 분석은 단순히 숫자를 찾는 과정이 아니라, **군집화의 품질(Clustering Quality)**을 정량적으로 측정하려는 시도입니다.
* **SSE (Sum of Squared Errors)**: 군집 내 응집도를 측정하는 지표로, 값이 작을수록 데이터가 중심점에 밀집되어 있음을 의미합니다.
* **실루엣 계수 (Silhouette Coefficient)**: 응집도와 분리도를 동시에 고려한 지표입니다. 개별 데이터가 자신이 속한 군집과 얼마나 가깝고, 다른 군집과는 얼마나 먼지를 수치화하여 전체적인 군집화의 적절성을 평가합니다.