본문 바로가기
데이터과학

데이터과학: 계층적 클러스터링 알고리즘 완벽 가이드

by write453 2024. 11. 8.

데이터 과학 분야에서 데이터를 이해하고 분석하는 다양한 방법들 중에서, 계층적 클러스터링은 데이터의 내재된 계층 구조를 밝혀내는 데 탁월한 능력을 발휘하는 알고리즘입니다.  데이터 포인트 간의 유사성을 기반으로 계층적인 구조를 형성하며, 데이터 탐색, 시각화, 그리고 이상치 탐지 등에 널리 활용되고 있어요. 이 포스팅에서는 계층적 클러스터링 알고리즘의 원리, 종류, 그리고 파이썬을 활용한 구현 예시까지 살펴보면서, 이 알고리즘의 매력적인 세계를 함께 탐험해보도록 하겠습니다.

 


계층적 클러스터링이란 무엇일까요?

계층적 클러스터링, 혹시 들어보셨나요? 이름에서 느껴지듯이, 데이터를 계층적으로, 즉 트리 구조처럼 묶어나가는 군집화 알고리즘을 말해요. 마치 가족 구성원처럼, 가장 가까운 사람들끼리 묶고, 그 묶음이 다시 다른 묶음과 연결되는 식으로 데이터를 그룹화하는 거죠.

 

이 알고리즘은 데이터 포인트 간의 거리 또는 유사도를 기반으로 작동하며, 데이터의 구조를 시각적으로 파악하고 싶을 때 매우 유용해요. 특히, 데이터셋의 크기가 크지 않고, 데이터 간의 관계를 명확히 살펴보고 싶을 때 빛을 발하는 멋진 알고리즘이랍니다. 예를 들어, 고객 세그먼트 분석이나 생물학적 데이터 분석 등 다양한 분야에서 활용되고 있어요.

 

계층적 클러스터링의 가장 큰 매력은 사전에 클러스터의 개수를 정해줄 필요가 없다는 점이에요. 알고리즘이 데이터의 구조를 스스로 파악하여, 적절한 클러스터를 형성해주거든요. 마치 데이터가 스스로 이야기하듯, 알고리즘이 데이터의 속삭임을 듣고 클러스터를 만들어내는 거라고 생각하면 될 것 같아요.

 

하지만, 모든 게 완벽할 순 없죠? 계층적 클러스터링도 단점이 존재해요. 데이터셋의 크기가 커지면 계산 시간이 급격히 증가하는 경향이 있고, 데이터 포인트의 추가나 삭제에 민감해서 결과가 크게 달라질 수도 있답니다. 그래서 데이터셋의 크기가 크거나 데이터가 자주 변하는 경우에는 다른 클러스터링 알고리즘을 고려하는 게 좋을 수 있어요.

 


계층적 클러스터링의 두 가지 접근 방식

계층적 클러스터링은 크게 두 가지 방식으로 나뉘는데요, 바로 응집형(Agglomerative)과 분할형(Divisive)입니다.

 

응집형 계층적 클러스터링은 마치 레고 블록을 조립하는 것처럼, 각 데이터 포인트를 하나의 클러스터로 시작하여 가장 가까운 클러스터들을 차례대로 합쳐나가는 방식이에요. 점점 더 큰 클러스터를 만들어나가는 거죠. 마치 작은 조약돌들이 모여 큰 바위를 이루는 것처럼 말이에요.

 

반면, 분할형 계층적 클러스터링은 큰 덩어리를 쪼개는 방식으로, 전체 데이터를 하나의 클러스터로 시작하여 점차적으로 작은 클러스터들로 나누어 갑니다. 마치 커다란 흙덩이를 쪼개 작은 흙 덩어리들을 만드는 것과 같은 방식이라고 할 수 있죠.

 


계층적 클러스터링의 핵심: 연결 기준

계층적 클러스터링 알고리즘은 데이터 포인트 간의 거리를 계산하여 클러스터를 형성하는데, 이때 클러스터 간의 거리를 어떻게 계산할지 정의하는 기준을 연결 기준(Linkage)이라고 부른답니다. 마치 친구들끼리 친목 도모를 할 때, 어떤 기준으로 친구를 맺을지 정하는 것과 비슷하다고 생각하면 쉬울 거예요.

 

다양한 연결 기준들이 존재하지만, 대표적인 몇 가지를 소개해드릴게요.

 


단일 연결(Single Linkage)

단일 연결은 두 클러스터 간의 가장 가까운 거리를 기준으로 클러스터를 결합하는 방식이에요. 마치 두 클러스터 중 가장 친한 친구 둘이 만나면, 두 클러스터가 친구가 되는 것과 비슷하죠. 이 기준은 데이터 간의 연결성을 파악하는 데 유용하며, 긴 끈처럼 연결된 데이터 구조를 찾아낼 때 적합해요.

 


완전 연결(Complete Linkage)

완전 연결은 두 클러스터 간의 가장 먼 거리를 기준으로 클러스터를 결합하는 방식입니다. 즉, 두 클러스터 중 가장 사이가 안 좋은 두 사람의 관계를 기준으로 클러스터를 결합하는 거죠. 이 기준은 클러스터 내부의 응집도를 높이는 데 효과적이며, 클러스터 간의 경계를 명확하게 구분하고 싶을 때 유용해요.

 


평균 연결(Average Linkage)

평균 연결은 각 클러스터 내 모든 데이터 포인트 간의 평균 거리를 기준으로 클러스터를 결합하는 방식이에요. 마치 두 클러스터의 모든 구성원들의 평균적인 친밀도를 기준으로 클러스터를 결합하는 것과 비슷하죠. 이 기준은 단일 연결과 완전 연결의 중간적인 성격을 가지고 있으며, 다양한 데이터셋에 적용하기 용이해요.

 


계층적 클러스터링의 장점과 단점

계층적 클러스터링은 데이터의 계층 구조를 탐구하는 데 유용한 알고리즘이지만, 다른 알고리즘과 마찬가지로 장단점을 가지고 있어요.

 


계층적 클러스터링의 장점

  • 사전에 클러스터 개수를 지정할 필요가 없어요. 데이터의 구조를 분석하여 알고리즘이 스스로 최적의 클러스터 개수를 찾아내기 때문에, 사용하기 편리하죠.
  • 덴드로그램을 통해 계층 구조를 시각화할 수 있어요. 덴드로그램은 계층적 클러스터링 결과를 트리 형태로 나타내는 시각화 도구인데, 클러스터 간의 관계를 한눈에 파악하기 용이하답니다.
  • 이상치 탐지에 유용해요. 다른 클러스터와 떨어져 있는 데이터 포인트는 이상치일 가능성이 높기 때문에, 이상치 탐지에 활용할 수 있죠.
  • 작은 데이터셋에 적합해요. 계산 복잡도가 높지 않기 때문에, 데이터셋의 크기가 작을 때 효율적으로 사용할 수 있답니다.

계층적 클러스터링의 단점


  • 대규모 데이터셋에는 적용하기 어려워요. 데이터셋의 크기가 커지면 계산 복잡도가 기하급수적으로 증가하기 때문에, 처리 시간이 오래 걸릴 수 있어요.
  • 데이터 포인트의 추가나 삭제에 민감해요. 데이터셋의 변화에 따라 클러스터링 결과가 크게 달라질 수 있기 때문에, 주의가 필요하죠.
  • 클러스터링 결과가 최적이라는 보장이 없어요. 지역적 최적화(Local optima)에 빠질 위험이 있기 때문에, 최적의 결과를 얻기 위해서는 여러 번 시도해보는 게 좋답니다.

Python으로 계층적 클러스터링 구현하기

이제 Python을 사용하여 계층적 클러스터링을 직접 구현해보고, 그 결과를 시각화해보는 시간을 가져볼게요.  Python의 scikit-learn 라이브러리는 계층적 클러스터링을 포함하여 다양한 머신러닝 알고리즘을 제공해주는 아주 유용한 도구랍니다.

 


예제: 와인 데이터셋 클러스터링

다음은 와인 데이터셋을 사용하여 계층적 클러스터링을 수행하고, 그 결과를 시각화하는 예제 코드입니다.

 

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.preprocessing import StandardScaler

# 와인 데이터셋 로드
wine_df = pd.read_csv("wine.csv")

# 특징 선택 (예: 알코올, 마그네슘)
features = ['alcohol', 'magnesium']
X = wine_df[features]

# 데이터 표준화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 계층적 클러스터링 모델 생성 및 학습
model = AgglomerativeClustering(n_clusters=3, linkage='ward')
model.fit(X_scaled)

# 클러스터 결과 시각화
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=model.labels_)
plt.xlabel("알코올")
plt.ylabel("마그네슘")
plt.title("와인 데이터셋 클러스터링 결과")
plt.show()

 코드는 와인 데이터셋에서 알코올과 마그네슘 두 가지 특징을 사용하여 계층적 클러스터링을 수행합니다. AgglomerativeClustering 클래스를 사용하며, n_clusters 매개변수를 통해 클러스터의 개수를 3개로 지정하고, linkage 매개변수를 통해 'ward' 연결 기준을 사용합니다. 그리고, 결과를 산점도로 시각화하여 클러스터링 결과를 확인할 수 있어요.

 

표 1. 와인 데이터셋의 특징

 

알코올 와인의 알코올 함량
마그네슘 와인의 마그네슘 함량

특징 설명

 

계층적 클러스터링은 다양한 분야에서 사용되는 강력한 알고리즘이지만, 데이터셋의 특성과 알고리즘의 매개변수에 따라 결과가 달라질 수 있다는 점을 기억해야 해요. 따라서, 데이터셋에 맞는 적절한 연결 기준을 선택하고, 클러스터링 결과를 신중하게 해석하는 것이 중요하답니다.

 

자주 묻는 질문 (FAQ)

Q1. 계층적 클러스터링은 어떤 경우에 사용하면 좋을까요?

 

A1. 계층적 클러스터링은 데이터셋의 크기가 작고, 데이터 간의 관계를 시각적으로 파악하고 싶을 때 유용해요. 또한, 데이터의 계층 구조를 분석하거나 이상치를 탐지하고 싶을 때 적합합니다.

 

Q2. 덴드로그램은 무엇이고, 왜 중요한가요?

 

A2. 덴드로그램은 계층적 클러스터링 결과를 트리 형태로 시각화한 그림이에요. 클러스터 간의 관계를 한눈에 파악할 수 있게 해주기 때문에, 클러스터링 결과를 이해하고 해석하는 데 매우 중요하죠.

 

Q3. 계층적 클러스터링에서 연결 기준은 어떻게 선택해야 하나요?

 

A3. 연결 기준은 데이터셋의 특성에 따라 적절하게 선택해야 해요. 데이터 간의 연결성을 파악하고 싶다면 단일 연결을, 클러스터 내부의 응집도를 높이고 싶다면 완전 연결을 사용하는 것이 좋습니다. 데이터셋의 특성에 따라 가장 적합한 연결 기준을 선택하여 클러스터링을 수행하는 것이 중요합니다.

 

마무리

 

계층적 클러스터링은 데이터의 계층 구조를 파악하고, 데이터를 효과적으로 탐색하고 분석하는 데 유용한 도구입니다. 특히, 데이터셋의 크기가 작고 데이터 간의 관계를 시각적으로 확인하고 싶을 때 빛을 발하는 알고리즘이에요. 이 포스팅을 통해 계층적 클러스터링에 대한 이해를 높이고, 데이터 분석에 활용할 수 있기를 바랍니다.

 

키워드

계층적클러스터링, 데이터과학, 머신러닝, 군집화, 덴드로그램, 알고리즘, 데이터분석, 응집형, 분할형, 연결기준, 단일연결, 완전연결, 평균연결, scikitlearn, 파이썬, 데이터마이닝, 데이터시각화, 이상치탐지, KMeans, K평균, 데이터구조, 트리, 비지도학습, 데이터과학자, 머신러닝엔지니어, AI, 인공지능