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_)
```