준비하는 대학생

[기계학습] 군집분석 - 계층적 클러스터링 본문

Programming/Machine learning

[기계학습] 군집분석 - 계층적 클러스터링

Bangii 2023. 3. 17. 10:00

1. 군집분석이란?

군집분석은 데이터를 비슷한 특징을 가진 그룹으로 나누는 기법으로, 데이터 분석 및 기계학습 분야에서 많이 활용됩니다. 군집분석을 통해 비슷한 특성을 가진 데이터끼리 그룹으로 묶어서 특성을 파악하고, 그룹 간의 차이점을 분석하여 새로운 인사이트를 얻을 수 있습니다.

2. 계층적 클러스터링이란?

계층적 클러스터링은 군집분석의 한 방법으로, 데이터를 계층적으로 묶어가며 클러스터를 형성하는 방법입니다. 데이터 포인트들을 가장 가까운 클러스터로 묶어나가며, 클러스터 간의 거리를 계산하여 계층적으로 클러스터를 형성합니다. 이렇게 계층적으로 클러스터를 형성하면, 데이터의 유사도를 시각화하기 쉽고, 데이터를 보다 잘 이해할 수 있게 됩니다.

계층적 클러스터링은 두 가지 방법으로 나눌 수 있습니다.

2 - 1. 병합적 방법 (Agglomerative method)

병합적 방법은 가장 가까운 두 클러스터를 묶어나가는 방법입니다. 즉, 데이터 포인트를 가장 가까운 클러스터로 묶어나가며 클러스터를 하나씩 합쳐가는 방식입니다. 이러한 병합적 방법을 사용하면, 최종적으로 하나의 클러스터가 남을 때까지 클러스터를 묶어나갑니다.

병합적 방법의 예시를 보겠습니다. 우선, 먼저 필요한 라이브러리들을 import합니다.

import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

다음으로, 랜덤한 데이터를 생성합니다.

np.random.seed(4711)
n = 100
X = np.random.randn(n, 2)

생성한 데이터를 시각화해보겠습니다.

plt.scatter(X[:,0], X[:,1])
plt.show()

이제, linkage 함수를 사용하여 데이터 간의 거리를 계산합니다.  linkage 함수는 데이터 간의 거리를 계산하는 함수입니다. 데이터 간의 거리를 측정하는 방법은 여러 가지가 있으며, linkage 함수는 다양한 방법을 지원합니다.

Z = linkage(X, 'ward')

여기서 ward는 거리 계산 방법 중 하나로, 두 클러스터를 합쳤을 때 변화량의 제곱을 계산하여 거리를 구하는 방식입니다.

이제, dendrogram 함수를 사용하여 계층적 클러스터링 결과를 시각화합니다.

plt.figure(figsize=(25, 10))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('sample index')
plt.ylabel('distance')
dendrogram(
    Z,
    leaf_rotation=90.,
    leaf_font_size=8.,
)
plt.show()

위 그래프에서 x축은 데이터 포인트의 인덱스를, y축은 클러스터 간의 거리를 나타냅니다. 클러스터를 형성하는 데 사용된 거리를 기준으로 가장 높은 곳에서 가로로 지나가는 줄을 그으면, 클러스터를 몇 개로 나누어야 하는지 결정할 수 있습니다. 위 예시에서는 4개의 클러스터를 사용하는 것이 적절해 보입니다.

2 - 2. 분할적 방법 (Divisive method)

분할적 방법은 가장 먼 두 클러스터를 나누어나가는 방법입니다. 즉, 모든 데이터를 하나의 클러스터로 보고, 클러스터를 나누어가는 방식입니다. 이러한 분할적 방법을 사용하면, 최종적으로 각 데이터 포인트가 하나의 클러스터를 가지게 됩니다.

분할적 방법의 예시를 보겠습니다. 먼저, 랜덤한 데이터를 생성합니다.

np.random.seed(1234)
n = 100
X = np.random.randn(n, 2)

생성한 데이터를 시각화해보겠습니다.

plt.scatter(X[:,0], X[:,1])
plt.show()

이제, linkage 함수를 사용하여 데이터 간의 거리를 계산합니다.

Z = linkage(X, 'complete')

여기서 complete는 거리 계산 방법 중 하나로, 두 클러스터 중 가장 먼 데이터 포인트 사이의 거리를 사용합니다.

이제, fcluster 함수를 사용하여 클러스터를 나눕니다.

from scipy.cluster.hierarchy import fcluster

k = 4
clusters = fcluster(Z, k, criterion='maxclust')

k는 나눌 클러스터의 개수를 나타내며, criterion은 클러스터링 기준을 나타냅니다. 여기서는 maxclust를 사용하여 클러스터 개수를 지정합니다.

클러스터링 결과를 시각화해보겠습니다.

plt.scatter(X[:,0], X[:,1], c=clusters, cmap='viridis')
plt.show()

위 그래프에서 색상이 다른 점들은 서로 다른 클러스터에 속한 데이터 포인트들입니다.

3. 군집분석 계층적 클러스터링의 활용

군집분석 계층적 클러스터링은 다양한 분야에서 활용됩니다. 예를 들어, 마케팅 분야에서는 고객들을 그룹으로 나누어 마케팅 전략을 세우거나, 고객 특성을 파악하여 새로운 상품을 개발하는 데 활용됩니다. 또한 의료 분야에서는 유전자 데이터를 군집분석하여 특정 질병에 대한 유전적인 원인을 파악하거나, 환자들을 그룹으로 나누어 개별적인 치료 방법을 제시하는 데 활용됩니다.

또한, 군집분석 계층적 클러스터링은 데이터 시각화에도 매우 유용합니다. 데이터를 그룹으로 나누어 시각적으로 보여주기 때문에, 데이터의 특성을 파악하는 데 도움이 됩니다. 또한, 데이터를 쉽게 이해하고 비교할 수 있도록 도와주며, 분석 결과를 시각화하여 다른 사람들과 공유하기 쉽습니다.

4. 결론

군집분석 계층적 클러스터링은 데이터를 비슷한 특성을 가진 그룹으로 나누는 기법 중 하나로, 데이터 분석 및 기계학습 분야에서 매우 중요한 역할을 합니다. 병합적 방법과 분할적 방법으로 나눌 수 있으며, 다양한 분야에서 활용됩니다. 데이터를 시각화하고 이해하는 데 매우 유용하므로, 데이터 분석 및 기계학습 분야에서는 필수적인 기법 중 하나입니다.

Comments