데이터 분석/Python
Kmeans 군집 분류
eunki
2021. 5. 27. 14:04
728x90
1. 2차원 군집 분석 (Kmeans)
- n_clusters: 군집의 갯수 (default=8)
- init: 초기화 방법. 'random'이면 무작위, 'k-means++'이면 K-평균++ 방법 (default=k-means++)
- n_init: centroid seed 시도 횟수. 무작위 중심위치 목록 중 가장 좋은 값을 선택 (default=10)
- max_iter: 최대 반복 횟수 (default=300)
- random_state: 시드값 (default=None)
1) 군집 분석
from sklearn.cluster import KMeans
x = preprocessed_df[['Attack', 'Defense']]
k_list = []
cost_list = []
for k in range(1, 6):
kmeans = KMeans(n_clusters=k).fit(x)
inertia = kmeans.inertia_
print("k:", k, "| cost:", inertia)
k_list.append(k)
cost_list.append(inertia)
plt.plot(k_list, cost_list)
관성(Inertia)에 기반하여 n 개수를 선택한다.
관성(Inertia) : 각 중심점(centroid)에서 군집 내 데이터간의 거리를 합산한 것으로 군집의 응집도를 나타낸다. 이 값이 작을수록 응집도가 높은 군집화를 의미한다.
kmeans = KMeans(n_clusters=4).fit(x)
cluster_num = kmeans.predict(x)
cluster = pd.Series(cluster_num)
preprocessed_df['cluster_num'] = cluster.values
preprocessed_df.head()
2) 군집 시각화
plt.scatter(preprocessed_df[preprocessed_df['cluster_num']==0]['Attack'],
preprocessed_df[preprocessed_df['cluster_num']==0]['Defense'],
s=50, c='red', label='Pokemon Group 1')
plt.scatter(preprocessed_df[preprocessed_df['cluster_num']==1]['Attack'],
preprocessed_df[preprocessed_df['cluster_num']==1]['Defense'],
s=50, c='green', label='Pokemon Group 2')
plt.scatter(preprocessed_df[preprocessed_df['cluster_num']==2]['Attack'],
preprocessed_df[preprocessed_df['cluster_num']==2]['Defense'],
s=50, c='blue', label='Pokemon Group 3')
plt.scatter(preprocessed_df[preprocessed_df['cluster_num']==3]['Attack'],
preprocessed_df[preprocessed_df['cluster_num']==3]['Defense'],
s=50, c='yellow', label='Pokemon Group 4')
plt.title("pokemon cluster")
plt.xlabel("Attack")
plt.ylabel("Defense")
plt.legend()
plt.show()
2. 다차원 군집 분석 (Kmeans)
1) 군집 분석
x = preprocessed_df[['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']]
k_list = []
cost_list = []
for k in range(1, 15):
kmeans = KMeans(n_clusters=k).fit(x)
inertia = kmeans.inertia_
print("k:", k, "| cost:", inertia)
k_list.append(k)
cost_list.append(inertia)
plt.plot(k_list, cost_list)
kmeans = KMeans(n_clusters=5).fit(x)
cluster_num = kmeans.predict(x)
cluster = pd.Series(cluster_num)
preprocessed_df['cluster_num'] = cluster.values
preprocessed_df.head()
2) 군집별 특성 시각화
fig = plt.figure(figsize=(12, 12))
ax = fig.gca()
sns.boxplot(x="cluster_num", y="HP", data=preprocessed_df, ax=ax)
plt.show()
728x90