머신러닝

[머신러닝] Hierarchical Clustering

eyoo 2022. 5. 10. 10:01

하이어라키컬 클러스터링은 각 데이터간의 거리가 가장 가까운것부터 묶어 순차적으로 클러스터링한다. 

 

 

 

또한 이를 관계도인 덴드로그램을 통해 나타낼수 있다.

 

 

 

완성된 덴드로그램을 분석하여 사용자가 데이터를 몇개의 그룹으로 나눌지 결정한다.

 

# 주로 거리가 긴 (관계가 먼) 곳을 기준으로 나눠준다.

 

 

df=

 

먼저 X값을 정한다.

 

X = df.iloc[:,3:]

 

 

그 후, sch.dendrogram함수와 sch.linkage함수를 사용하여 덴드로그램을 그린다.

 

in:

sch.dendrogram(sch.linkage(X,method='ward'))
plt.title('Dendrogram')
plt.xlabel('Customers')
plt.ylabel('Eculidean Distance')
plt.show()

out:

# 덴드로그램을 보니, 그룹개수는 5개가 적당한것 같다.

 

 

덴드로그램을 사용하여 결정한 그룹의 수로 하이어라키컬 클러스터링 해보자

 

from sklearn.cluster import AgglomerativeClustering
hc = AgglomerativeClustering(n_clusters=5)

 

 

결과를 데이터프레임의 그룹 컬럼으로 추가한다.

 

in:

y_pred = hc.fit_predict(X)
df['Group'] = y_pred
df

out:

 

그루핑 정보를 차트로 확인하자.

 

in:

plt.scatter(X.values[y_pred == 0, 0], X.values[y_pred == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(X.values[y_pred == 1, 0], X.values[y_pred == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(X.values[y_pred == 2, 0], X.values[y_pred == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
plt.scatter(X.values[y_pred == 3, 0], X.values[y_pred == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
plt.scatter(X.values[y_pred == 4, 0], X.values[y_pred == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()

out: