클러스터의 수 KKK를 결정하는 것은 클러스터링에서 중요한 문제 중 하나입니다. KKK의 값이 잘못 설정되면 클러스터링 결과의 품질에 큰 영향을 미칠 수 있습니다. 적절한 클러스터 수를 결정하기 위한 몇 가지 일반적인 방법을 소개하겠습니다.
### 1. 엘보우 방법 (Elbow Method)
엘보우 방법은 비용 함수인 관성 (inertia)을 사용하여 최적의 클러스터 수를 찾습니다. 관성은 클러스터 내 데이터 포인트와 클러스터 중심 간의 거리 제곱합을 의미합니다. 클러스터 수를 증가시키면서 관성의 변화를 관찰하고, 관성이 급격히 감소하다가 완만해지는 지점(엘보우 포인트)을 찾습니다.
```python
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 예시 데이터 생성
np.random.seed(42)
data = np.random.rand(100, 2)
df = pd.DataFrame(data, columns=['x', 'y'])
# 엘보우 방법을 사용하여 최적의 K 찾기
inertia = []
K = range(1, 11)
for k in K:
kmeans = KMeans(n_clusters=k, random_state=42).fit(df)
inertia.append(kmeans.inertia_)
# 엘보우 그래프 그리기
plt.plot(K, inertia, 'bo-')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia')
plt.title('Elbow Method For Optimal K')
plt.show()
```
### 2. 실루엣 분석 (Silhouette Analysis)
실루엣 분석은 각 데이터 포인트의 실루엣 계수(silhouette coefficient)를 계산하여 클러스터링의 품질을 평가합니다. 실루엣 계수는 -1에서 1 사이의 값을 가지며, 1에 가까울수록 잘 클러스터링된 것입니다. 평균 실루엣 계수가 최대가 되는 KKK를 선택합니다.
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs
# 1. 샘플 데이터 생성
print("샘플 데이터 생성 중...")
X, y_true = make_blobs(n_samples=300, centers=4, n_features=4,
random_state=42, cluster_std=1.5)
df = pd.DataFrame(X, columns=['feature1', 'feature2', 'feature3', 'feature4'])
print(f"데이터 형태: {df.shape}")
print("첫 5개 행:")
print(df.head())
# 2. 데이터 전처리 (스케일링)
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
# 3. 실루엣 분석
print("\n실루엣 분석 수행 중...")
silhouette_scores = []
K = range(2, 11)
for k in K:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
kmeans_labels = kmeans.fit_predict(df_scaled)
score = silhouette_score(df_scaled, kmeans_labels)
silhouette_scores.append(score)
print(f"K={k}: Silhouette Score = {score:.3f}")
# 4. 결과 시각화
plt.figure(figsize=(10, 6))
plt.plot(K, silhouette_scores, 'bo-', linewidth=2, markersize=8)
plt.xlabel('Number of Clusters (K)', fontsize=12)
plt.ylabel('Silhouette Score', fontsize=12)
plt.title('Silhouette Analysis For Optimal K', fontsize=14)
plt.grid(True, alpha=0.3)
plt.xticks(K)
# 최적 K 표시
optimal_k = K[np.argmax(silhouette_scores)]
max_score = max(silhouette_scores)
plt.axvline(x=optimal_k, color='red', linestyle='--', alpha=0.7)
plt.text(optimal_k, max_score, f'Optimal K={optimal_k}\nScore={max_score:.3f}',
verticalalignment='bottom', horizontalalignment='center')
plt.tight_layout()
plt.show()
print(f"\n최적의 클러스터 수: K = {optimal_k}")
print(f"최고 실루엣 점수: {max_score:.3f}")
```
### 3. 갭 통계 (Gap Statistic)
갭 통계는 주어진 데이터의 클러스터링과 무작위 데이터의 클러스터링을 비교하여 최적의 클러스터 수를 찾는 방법입니다. 갭 통계는 구현이 비교적 복잡하므로 라이브러리를 사용합니다.
```python
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
from gap_statistic import OptimalK
# 예시 데이터 생성
np.random.seed(42)
data = np.random.rand(100, 2)
df = pd.DataFrame(data, columns=['x', 'y'])
# 갭 통계를 사용하여 최적의 K 찾기
optimalK = OptimalK(parallel_backend='joblib')
n_clusters = optimalK(df, cluster_array=np.arange(1, 11))
print('Optimal number of clusters:', n_clusters)
```
### 4. 도메인 지식 활용
도메인 지식과 문제의 특성을 고려하여 클러스터 수를 결정할 수 있습니다. 예를 들어, 고객 세분화에서 특정 수의 고객 그룹이 필요할 경우, 해당 수를 클러스터 수로 설정할 수 있습니다.
### 5. 결합 방법 (Combination of Methods)
여러 방법을 결합하여 최적의 클러스터 수를 결정할 수도 있습니다. 예를 들어, 엘보우 방법과 실루엣 분석을 함께 사용하여 최적의 KKK를 결정하는 것이 일반적입니다.
### 결론
적절한 클러스터 수를 결정하는 것은 클러스터링의 품질을 높이는 데 중요합니다. 엘보우 방법, 실루엣 분석, 갭 통계 등의 방법을 사용하여 최적의 KKK를 찾아야 합니다. 경우에 따라서는 도메인 지식을 활용하여 KKK를 결정할 수도 있습니다. 이러한 방법들을 결합하여 최적의 클러스터 수를 선택하는 것이 일반적입니다.