도찐개찐

[머신러닝-비지도] 03. dendrogram 본문

PYTHON/데이터분석

[머신러닝-비지도] 03. dendrogram

도개진 2023. 1. 4. 10:15

덴드로그램

  • 클러스터링의 결과를 시각화하기 위한 대표적인 그래프 중 하나.
  • 계층적 군집분석(hierachical clustering) 방식에 대해 시각화 하는 그래프로 많이 활용 되고 있음.
  • 가까운 두점 혹은 점과 그룹을 묶어 나가면서 그룹을 이루어 나가는 과정을 기각화 한 그래프

Hierarchical clustering

(한글 : 계층적 군집 분석) 은 비슷한 군집끼리 묶어 가면서 최종 적으로는 하나의 케이스가 될때까지 군집을 묶는 클러스터링 알고리즘이다.

ex)

“진돗개,세퍼드,요크셔테리어,푸들, 물소, 젖소" 를 계층적 군집 분석을 하게 되면

첫번째는 중형견, 소형견, 소와 같은 군집으로 3개의 군집으로 묶일 수 있다.

이를 한번 더 군집화 하게 되면 [진돗개,셰퍼드] 와 [요크셔테리어,푸들] 군집은 하나의 군집(개)로 묶일 수 있다.

마지막으로 한번 더 군집화를 하게 되면 전체가 한군집(동물)으로 묶이게 된다.

이렇게 단계별로 계층을 따라가면서 군집을 하는 것을 계층적 군집 분석이라고 한다.

계층적 군집 분석은 Dendrogram이라는 그래프를 이용하면 손쉽게 시각화 할 수 있다.

(출처 : https://bcho.tistory.com/1204)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from scipy.cluster.hierarchy import dendrogram
from scipy.cluster.hierarchy import linkage, fcluster
from sklearn.cluster import AgglomerativeClustering
from yellowbrick.cluster import SilhouetteVisualizer
from yellowbrick.cluster import KElbowVisualizer

과일, 채소 군집분석

fresh = pd.read_csv('../data/fresh.csv', encoding='euc-kr')
fresh.columns = ['name', 'sweet', 'crunchy', 'class']
fresh.head()
  name sweet crunchy class
0 포도 8 5 과일
1 생선 2 2 단백질
2 당근 6 10 채소
3 오렌지 7 3 과일
4 샐러리 3 8 채소
data = fresh.iloc[:, 1:3]
linked = linkage(data, method='ward')
plt.figure(figsize=(25,10))
dendrogram(linked, orientation='top', leaf_font_size=10, leaf_rotation=90)
plt.ylabel('distance')  # 군집간 거리
plt.xlabel('instance')  # 개체
plt.show()
findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial, Liberation Sans, Bitstream Vera Sans, sans-serif
findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial, Liberation Sans, Bitstream Vera Sans, sans-serif

png

ac = AgglomerativeClustering(affinity='euclidean', linkage='ward')
visualizer = KElbowVisualizer(ac, k=(2,7), metric='silhouette', timings=False)
visualizer.fit(data)
visualizer.show()
findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial, Liberation Sans, Bitstream Vera Sans, sans-serif

<AxesSubplot:title={'center':'Silhouette Score Elbow for AgglomerativeClustering Clustering'}, xlabel='k', ylabel='silhouette score'>
visualizer = KElbowVisualizer(ac, k=(2,7), timings=False)
visualizer.fit(data)
visualizer.show()

<AxesSubplot:title={'center':'Distortion Score Elbow for AgglomerativeClustering Clustering'}, xlabel='k', ylabel='distortion score'>
ac = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
ac.fit(data)
AgglomerativeClustering(n_clusters=4)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
plt.scatter(data.iloc[:, 0], data.iloc[:, 1], c=ac.labels_, cmap='Paired')
plt.show()

농구선수 게임데이터를 이용해서 포지션 군집 분석

bbp = pd.read_csv('../data/bbplayer.csv')
data = bbp.iloc[:, 2:8]

linked = linkage(data, method='ward')
bbp.head()
  Player Pos 3P 2P TRB AST STL BLK
0 Alex Abrines SG 1.4 0.6 1.3 0.6 0.5 0.1
1 Steven Adams C 0.0 4.7 7.7 1.1 1.1 1.0
2 Alexis Ajinca C 0.0 2.3 4.5 0.3 0.5 0.6
3 Chris Andersen C 0.0 0.8 2.6 0.4 0.4 0.6
4 Will Barton SG 1.5 3.5 4.3 3.4 0.8 0.5
plt.figure(figsize=(25,10))
dendrogram(linked, orientation='top', leaf_font_size=10, leaf_rotation=90)
plt.ylabel('distance')  # 군집간 거리
plt.xlabel('instance')  # 개체
plt.show()

ac = AgglomerativeClustering(affinity='euclidean', linkage='ward')
visualizer = KElbowVisualizer(ac, k=(2,7), metric='silhouette', timings=False)
visualizer.fit(data)
visualizer.show()

<AxesSubplot:title={'center':'Silhouette Score Elbow for AgglomerativeClustering Clustering'}, xlabel='k', ylabel='silhouette score'>
visualizer = KElbowVisualizer(ac, k=(2,7), metric='calinski_harabasz', timings=False)
visualizer.fit(data)
visualizer.show()

<AxesSubplot:title={'center':'Calinski Harabasz Score Elbow for AgglomerativeClustering Clustering'}, xlabel='k', ylabel='calinski harabasz score'>
ac = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
ac.fit(data)
AgglomerativeClustering()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
plt.scatter(data.iloc[:, 1], data.iloc[:, 2], c=ac.labels_, cmap='tab10')
plt.show()

728x90
Comments