클러스터의 수 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를 결정할 수도 있습니다. 이러한 방법들을 결합하여 최적의 클러스터 수를 선택하는 것이 일반적입니다.