데이터 분석/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