K-평균 클러스터링에서는 주로 연속형 변수를 사용하지만, 변수의 유형과 데이터의 특성에 따라 몇 가지 추가적인 고려 사항이 필요합니다. 다음은 K-평균 클러스터링을 사용할 때 고려해야 할 사항들입니다. ### 1. 변수 유형 #### 연속형 변수 - K-평균 클러스터링은 유클리드 거리를 기반으로 하기 때문에 연속형 변수에서 잘 작동합니다. 연속형 변수는 값이 연속적이고 수치적인 데이터를 말합니다. #### 범주형 변수 - K-평균 클러스터링은 범주형 변수에 적합하지 않습니다. 범주형 변수를 포함하는 경우, 다른 클러스터링 알고리즘을 사용하는 것이 좋습니다. 예를 들어, K-모드(K-modes) 클러스터링은 범주형 변수에 적합합니다. ### 2. 데이터 전처리 #### 스케일링 (Scaling) - K-평균 클러스터링은 거리 기반 알고리즘이므로 각 변수의 단위와 범위가 결과에 영향을 미칩니다. 따라서, 각 변수의 범위를 표준화(standardization) 또는 정규화(normalization)하는 것이 중요합니다. - **표준화**: 평균이 0이고 표준편차가 1이 되도록 변환합니다. - **정규화**: 각 변수의 값이 0과 1 사이에 위치하도록 변환합니다. ```python from sklearn.preprocessing import StandardScaler # 데이터 스케일링 scaler = StandardScaler() scaled_df = scaler.fit_transform(df) ``` ### 3. 이상치 (Outliers) - K-평균 클러스터링은 이상치에 민감합니다. 이상치는 클러스터 중심의 위치에 큰 영향을 미칠 수 있습니다. 따라서, 클러스터링을 수행하기 전에 이상치를 처리하는 것이 좋습니다. ### 4. 초기화 (Initialization) - K-평균 알고리즘은 초기 클러스터 중심의 선택에 민감합니다. 잘못된 초기화는 수렴 속도를 느리게 하거나, 전역 최적해 대신 국소 최적해에 수렴하게 할 수 있습니다. 이를 해결하기 위해 K-평균++(K-means++) 초기화 방법이 사용됩니다. ```python # K-평균++ 초기화 사용 kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42).fit(scaled_df) ``` ### 5. 클러스터 수 (Number of Clusters) - 적절한 클러스터 수를 선택하는 것이 중요합니다. 엘보우 방법, 실루엣 분석, 갭 통계 등 다양한 방법을 사용하여 최적의 클러스터 수를 결정할 수 있습니다. ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from mpl_toolkits.mplot3d import Axes3D # 예시 데이터 생성 (3개의 변수) np.random.seed(42) data = np.random.rand(100, 3) # 100개의 샘플 데이터, 3개의 변수 df = pd.DataFrame(data, columns=['x', 'y', 'z']) # 데이터프레임 구조 확인 print("DataFrame Head:") print(df.head()) # 처음 5개 행 출력 print("\nDataFrame Info:") print(df.info()) # 데이터프레임 요약 정보 출력 print("\nDataFrame Describe:") print(df.describe()) # 수치형 데이터의 기초 통계량 출력 # 데이터 스케일링 scaler = StandardScaler() scaled_df = scaler.fit_transform(df) # K-평균 클러스터링 수행 (K-평균++ 초기화 사용) kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42).fit(scaled_df) df['cluster'] = kmeans.labels_ # 클러스터 시각화 (3D) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') scatter = ax.scatter(df['x'], df['y'], df['z'], c=df['cluster'], cmap='viridis') # 클러스터 중심 시각화 ax.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], kmeans.cluster_centers_[:, 2], s=300, c='red', label='Centroids') ax.set_title('K-Means Clustering (3D)') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('z') plt.legend() plt.show() # 클러스터 중심 출력 print("\nFinal Centroids (in original scaled dimensions):") print(kmeans.cluster_centers_) ```