본문 바로가기
AI/머신러닝

14. 계층적 군집화(HC) | 고객층 분석

by 사라리24 2024. 10. 7.



1. 계층적 군집화(Hierarchical Clustering)란? 

HC는 계층적 군집화(Hierarchical Clustering)를 의미하며,
데이터를 군집화하는 과정과 그 원리를 감각적으로 이해하는 것을 목표로 합니다.

 

1. 직관적 이해

  • 자연스러운 계층 구조: 자연스러운 그룹 간의 계층 구조를 찾으려는 방법입니다.
    예를 들어, 생물학적 분류에서 종을 분류하는 방법처럼, 작은 그룹들이 더 큰 그룹들로 합쳐지고, 이 과정이 계속 반복되면 전체 데이터를 하나의 큰 그룹으로 묶을 수 있습니다. 이러한 과정이 덴드로그램으로 시각화됩니다.

  • 근접성 기반의 군집화: 데이터를 서로 가까운 것들끼리 묶는 방식으로 동작합니다
    데이터 포인트들이 서로 가까우면 같은 그룹으로 묶이고, 이 그룹들은 다시 가까운 그룹과 묶입니다. 이 과정이 계속되면 작은 군집들이 점차 병합되면서 큰 군집을 형성합니다. 데이터의 유사성이나 거리는 유클리드 거리나 맨해튼 거리 같은 기준을 사용할 수 있습니다.

  • 덴드로그램을 통한 분석: 군집화가 끝나면 덴드로그램으로 결과를 분석할 수 있습니다.
    덴드로그램은 트리 형태로 군집화 과정을 나타내며, 어느 단계에서 군집들이 병합되었는지 시각적으로 이해할 수 있습니다. 이를 통해 최종적으로 군집을 자르거나 특정 개수로 나누는 결정을 내릴 수 있습니다.

  • 동적 군집화: HC의 중요한 특징은 사전에 군집의 개수를 정할 필요가 없다는 점입니다.
    이 방법은 데이터를 클러스터의 개수 없이 분석하고자 할 때 유용하며, 트리의 구조에서 군집을 자유롭게 선택할 수 있어 유연성이 높습니다.

2. 특징

  • 덴드로그램(Dendrogram): 계층적 군집화의 결과는 덴드로그램으로 시각화할 수 있습니다. 덴드로그램은 트리 구조로, 데이터를 병합하거나 분할한 과정을 보여주며, 각 노드는 클러스터를 나타냅니다. 덴드로그램을 자르거나 특정 높이에서 클러스터를 선택하여 최종 클러스터 수를 결정할 수 있습니다.

  • 거리 측정 방법: 계층적 군집화에서는 클러스터 간의 유사성을 계산하는 방법으로 다양한 거리 측정법(유클리드 거리, 맨해튼 거리 등)을 사용할 수 있으며, 클러스터 간 거리 계산 방식으로는 아래의 대표적인 방법들이 있습니다:
    • 최단 연결법(Single Linkage): 두 클러스터의 가장 가까운 데이터 포인트 간의 거리를 기준으로 클러스터를 병합
    • 최장 연결법(Complete Linkage): 두 클러스터의 가장 먼 데이터 포인트 간의 거리를 기준으로 클러스터를 병합
    • 평균 연결법(Average Linkage): 두 클러스터의 모든 데이터 포인트 간 평균 거리를 기준으로 클러스터를 병합

3. 장단점

  • 장점
    • 군집의 수를 사전에 정할 필요가 없으며, 덴드로그램을 통해 군집의 계층적 구조를 쉽게 이해할 수 있습니다.
    • 군집의 모양과 구조에 대한 가정을 두지 않으므로 복잡한 데이터에도 적용 가능.
  • 단점
    • 대규모 데이터에 적용할 경우 계산 비용이 매우 높을 수 있습니다.
    • 각 단계에서의 결정을 되돌릴 수 없으므로 초기 병합 또는 분할이 잘못되면 결과에 큰 영향을 미칠 수 있습니다.

4. HC 적용 전후




5. Agglomerative(병합형) vs Divisive(분할형)

1. Agglomerative (병합형 군집화)

병합적 계층적 군집화하향식(바텀업, Bottom-up) 접근 방식입니다.
즉, 개별 데이터 포인트를 작은 군집에서 시작해 점점 더 큰 군집으로 합쳐 나가는 방식입니다.

과정:

  • 처음에 각 데이터 포인트가 자신만의 군집을 형성하며, 군집의 개수는 데이터 포인트의 수와 동일합니다.
  • 가장 가까운 두 군집을 합칩니다.
  • 군집을 합치는 과정을 반복하며, 점점 더 큰 군집을 형성합니다.
  • 원하는 군집의 개수가 남을 때까지, 혹은 모든 데이터가 하나의 군집이 될 때까지 병합 과정을 계속합니다.

장점:

  • 군집화 과정이 명확하고 직관적입니다.
  • 데이터 간의 유사도를 기반으로 군집을 형성하므로, 군집의 계층 구조를 시각적으로 표현할 수 있습니다.

단점:

  • 큰 데이터셋에 대해 비효율적일 수 있으며, 시간이 오래 걸릴 수 있습니다.
  • 초기 결정을 번복할 수 없으므로, 잘못된 병합이 이루어지면 이후의 결과에 영향을 미칠 수 있습니다.


2. Divisive (분할형 군집화)

분할적 계층적 군집화상향식(탑다운, Top-down) 접근 방식입니다.
즉, 데이터를 하나의 큰 군집에서 시작해 점점 더 작은 군집으로 나누는 방식입니다.

과정:

  • 처음에 모든 데이터 포인트가 하나의 큰 군집에 속합니다.
  • 큰 군집을 나누어 두 개의 더 작은 군집으로 분할합니다.
  • 각 군집을 계속해서 더 작은 군집으로 나누는 과정을 반복합니다.
  • 원하는 군집의 개수가 나올 때까지, 또는 더 이상 나눌 수 없을 때까지 계속 나누어 나갑니다.

장점:

  • 최상위 레벨에서 전체 구조를 먼저 파악하고 나누기 때문에, 큰 그림에서부터 세부적인 군집으로 분리해 나갈 수 있습니다.

단점:

  • 군집을 나누는 초기 선택이 최종 결과에 큰 영향을 미칠 수 있습니다.
  • 계산적으로 복잡할 수 있으며, 작은 군집을 형성할 때 세밀한 조정이 어려울 수 있습니다.

비교

  • Agglomerative작은 군집부터 시작해서 점점 큰 군집을 만들고, Divisive큰 군집부터 시작해 점점 작은 군집으로 나눕니다.
  • Agglomerative는 계산 과정에서 합치기를 반복하고, Divisive는 나누기를 반복합니다.

예시:

  • Agglomerative: 10개의 데이터 포인트가 있으면, 처음에는 각각이 독립된 군집(1개씩)이고, 가장 가까운 것부터 병합하여 최종적으로 1개의 군집을 형성합니다.
  • Divisive: 10개의 데이터 포인트가 있으면, 처음에는 하나의 큰 군집으로 시작하고, 이를 점점 작은 군집으로 분할하여 10개의 독립된 군집을 형성합니다.

6. 덴도그램(Dendrogram) 예시

Bottom-up 방식에서 어떤 순서로 cluster가 묶였는지 보여주는 트리 구조이다.
원하는 level에서 dendrogram을 자름으로써 원하는 기준의 clustering 결과를 얻을 수 있다.

 

2. 적용해보기

고객데이터 | 고객식별번호, 성별, 나이, 연소득, 소비점수
'연소득과 소비점수'
를 가지고 병합군집클래스를 이용해서 계층적 군집모델로 학습해 고객층을 나누기

 

고객 데이터 | Mall_Customers.csv

 

 

import 


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

 
 

 

 

 

데이터 가져오기


       
      dataset = pd.read_csv('데이터 위치')
      X = dataset.iloc[:, [3, 4]].values



 

 

 

덴드로그램을 사용하여 최적의 군집 수를 찾기ㄱ


      
        import scipy.cluster.hierarchy as sch
        dendrogram = sch.dendrogram(sch.linkage(X, method = 'ward'))
        plt.title('Dendrogram')
        plt.xlabel('Customers')
        plt.ylabel('Euclidean distances')
        plt.show()


 

계층적 군집화(HC) 모델을 데이터셋에 적용하여 학습


       
        from sklearn.cluster import AgglomerativeClustering
        hc = AgglomerativeClustering(n_clusters = 5, linkage = 'ward')
        y_hc = hc.fit_predict(X)


계층적 군집화는 지도 학습 방식이 아닌 비지도 학습 알고리즘이므로,
여기서의 "학습"은 데이터의 패턴을 찾아 군집을 형성하는 과정을 의미합니다.

 

 

예측값보기


      
        print(y_hc)

 
[4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4
 3 4 3 4 3 4 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 2 0 2 0 2 1 2 0 2 0 2 0 2 0 2 1 2 0 2 1 2
 0 2 0 2 0 2 0 2 0 2 0 2 1 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0
 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2]

 

 

고객층 군집을 시각화하기


       
          plt.scatter(X[y_hc == 0, 0], X[y_hc == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
          plt.scatter(X[y_hc == 1, 0], X[y_hc == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
          plt.scatter(X[y_hc == 2, 0], X[y_hc == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
          plt.scatter(X[y_hc == 3, 0], X[y_hc == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
          plt.scatter(X[y_hc == 4, 0], X[y_hc == 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()

 



5개의 고객층으로 나눠지는 것을 볼 수 있음