이번 글은 코드잇 강의를 수강하면서 배운 내용을 주로 하여 정리되어 있습니다. (코드잇 스프린트 데이터 애널리스트 트랙 1기 훈련생)
다양한 클러스터링 모델
다양한 클러스터링의 종류
- 계층 기반 클러스터링 (Hierarchical Clustering)
- 기본 아이디어: 유사한 데이터를 묶은 클러스터들을 층으로 쌓아가며 클러스터링을 합니다.(계층 구조 바탕)
- 장점: 데이터 간의 관계를 시각화된 결과물을 통해 쉽게 파악할 수 있으며, 원하는 수의 클러스터로 간단하게 구분 가능합니다.
- 밀도 기반 클러스터링 (Density-Based Clustering)
- 기본 아이디어: 밀도가 높은 부분을 같은 클러스터로 묶어 나감. 클러스터 내의 데이터들은 밀집되어 있습니다.
- 장점: 기하학적인 형태의 데이터를 클러스터링할 때 효과적입니다.
- 분포 기반 클러스터링 (Distribution-Based Clustering)
- 기본 아이디어: 각 클러스터에 포함된 데이터들이 정규분포를 따른다고 가정하고, 특정 데이터가 포함될 확률이 가장 높은 분포의 클러스터를 찾아 나눕니다..
정리
- 계층 기반 클러스터링: 유사한 데이터를 묶어 층으로 쌓아가며 클러스터링. 데이터 간 관계를 쉽게 파악 가능.
- 밀도 기반 클러스터링: 밀도가 높은 부분을 클러스터로 묶음. 기하학적인 형태의 데이터에 효과적.
- 분포 기반 클러스터링: 각 클러스터가 정규분포를 따른다고 가정하고, 특정 데이터가 속할 확률이 높은 클러스터를 찾아 나눔.
계층적 클러스터링
계층적 클러스터링(Hierachical Clustering)은 순차적으로 유사한 데이터끼리 같은 클러스터로 묶어 나가는 모델(데이터를 거리에 따라 계층적으로 그룹화하는 클러스터링 방법)입니다. 데이터를 아래에서부터 묶어 나간다고 해서 Bottom-up 클러스터링이라고도 합니다.
클러스터의 수를 미리 지정할 필요가 없으며, 클러스터의 계층적 구조를 트리 형태로 표현합니다.
과정
- 거리 계산: 각 데이터 사이의 거리를 모두 계산하여 가장 가까운 데이터 쌍을 묶음.
- 클러스터 묶기: 묶인 데이터 쌍끼리의 거리를 다시 계산하여, 가까운 쌍을 하나로 묶음.
- 반복: 모든 데이터가 하나의 클러스터로 묶일 때까지 이 과정을 반복.
덴드로그램 (Dendrogram)
모든 클러스터의 계층을 시각적으로 표현한 그래프.(모든 클러스터의 계층이 구분되어 연결된 그래프)
- 클러스터 개수 결정: 덴드로그램을 이용해 원하는 개수로 클러스터를 나눌 수 있음.
거리 계산 방법: Ward 거리
- Ward 거리: 각 클러스터의 중심과 속한 데이터들 사이 거리의 제곱합의 증가분.(계층을 묶을 때 특정 데이터가 서로 유사하다는 것을 정의하는 개념)
- 목적: Ward 거리를 최소화하는 방향으로 클러스터를 묶음.
계층적 클러스터링 과정 예시
# 라이브러리 불러오기
from scipy.cluster.hierarchy import dendrogram, linkage, cut_tree
import matplotlib.pyplot as plt
# Ward 거리를 사용하여 모델 학습
model = linkage(df, 'ward')
# 덴드로그램 시각화
plt.figure(figsize=(16,9))
plt.style.use("default")
dendrogram(model, labels=df.index)
plt.show()
# 클러스터 개수 설정 및 고객별 클러스터 라벨 구하기
cluster_num = 5
df['label'] = cut_tree(model, cluster_num)
pd.DataFrame(df['label'].value_counts())
# 클러스터링 시각화
sns.scatterplot(x=df['total_time'], y=df['total_view_cnt'], hue=df['label'], s=200, palette='bright')
계층적 클러스터링의 장,단점
장점
- 클러스터 개수 미리 가정 불필요: 사전에 클러스터 개수를 정할 필요 없음.
- 유연성: 덴드로그램을 통해 다양한 클러스터 개수를 실험할 수 있음.
단점
- 연산 비용: 모든 데이터 쌍의 거리를 반복해서 계산해야 하므로 연산량이 많음.
- 학습 속도: 많은 데이터를 처리할 때 학습 속도가 느림.
- 대용량 데이터 적용 어려움: 대용량 데이터에서는 적용이 어려울 수 있음.
DBSCAN (Density-Based Spatial Clustering of Applications with Noise)
DBSCAN은 밀도 기반 클러스터링 방법으로, 밀도를 기준으로 데이터 포인트를 클러스터로 묶는 클러스터링 알고리즘입니다.
(밀집된 지역을 클러스터로 정의하고, 밀도가 낮은 지역에 있는 포인트를 노이즈로 간주합니다.)
- DBSCAN의 전제: 특정 클러스터에 속한 데이터는 클러스터 내의 다른 데이터와 가까운 위치에 있어야 합니다.
- 반경 (Radius, eps): 클러스터의 범위를 정의하는 거리.
- 최소 데이터 개수 (Minimum Points, min_samples): 반경 내에 있어야 하는 최소 데이터 개수.
- 밀도 : 반경(eps) 내 포인트 수(MinPts)
- border point : core point는 아니지만 근처에 있음.
- noise point : core point, border point 모두 만족하지 않는 경우의 데이터 포인트
DBSCAN의 클러스터링 진행 과정
- 반경 내 데이터 탐색: 특정 데이터 포인트에서 지정한 반경 내에 몇 개의 데이터 포인트가 포함되는지 탐색합니다.
- 클러스터 형성: 반경 내에 최소 데이터 개수가 포함되면 해당 포인트를 클러스터로 묶습니다.
- 클러스터 병합(확장) : 두클러스터 경계에 있는 데이터 포인트의 반경이 겹칠 경우, 두 클러스터를 하나로 합칩니다.
- 이상치 처리: 클러스터에 포함되지 않은 데이터 포인트는 이상치(Outlier)로 간주합니다.
DBSCAN 과정 예시
- 데이터 준비
from sklearn.datasets import make_moons
import numpy as np
n_samples = 1000
np.random.seed(3)
X, y = make_moons(n_samples=n_samples, noise=.05)
df = pd.DataFrame(X)
- k-means 클러스터링
# 시각화
plt.figure(figsize=(16, 9))
sns.scatterplot(x=df[0], y=df[1], marker='o', s=200)
# k-means 클러스터링 (k는 2로 설정)
from sklearn.cluster import KMeans
# k-means 모델 학습
model = KMeans(n_clusters=2, random_state=123)
model.fit(df)
# 클러스터 라벨링
df['kmeans_label'] = model.predict(df)
# 각 군집의 중심점
centers = model.cluster_centers_
# 클러스터링 결과 시각화
plt.figure(figsize=(16, 9))
sns.scatterplot(x=df[0], y=df[1], hue=df['kmeans_label'], s=200)
sns.scatterplot(x=centers[:,0], y=centers[:,1], color='black', s=200)
- DBSCAN 클러스터링
from sklearn.cluster import DBSCAN
eps = 0.1
min_samples = 5
# DBSCAN 모델 학습
model = DBSCAN(eps=eps, min_samples=min_samples)
model.fit(df)
df['dbscan_label'] = model.labels_
# 시각화
plt.figure(figsize=(16, 9))
sns.scatterplot(x=df[0], y=df[1], hue=df['dbscan_label'], s=200)
DBSCAN의 장,단점
장점
- 이상치에 강건: DBSCAN은 클러스터에 포함되지 않은 데이터를 제외하기 때문에 이상치(Outlier)에 민감하지 않습니다.
- 비구형 클러스터 처리: 데이터의 밀도에 따라 클러스터를 형성하기 때문에 복잡하거나 기하학적인 형태의 클러스터도 잘 찾아낼 수 있습니다.
- 클러스터 수 사전 지정 불필요: DBSCAN은 클러스터 수를 미리 지정할 필요가 없습니다. 클러스터는 데이터의 밀도에 따라 자동으로 결정됩니다.
단점
- 파라미터 선택의 어려움: 반경(ε)과 최소 데이터 개수(MinPts)를 적절히 선택하는 것이 어렵습니다. 이 값들은 클러스터링 결과에 큰 영향을 미칩니다.
- 고차원 데이터에서의 성능 저하: 고차원 데이터에서는 밀도 계산이 어려워지고 연산량이 많아져 학습 속도가 느려질 수 있습니다.
- 변동 밀도에 민감: 밀도가 크게 변하는 데이터 세트에서는 최적의 파라미터를 찾기 어려울 수 있습니다.
GMM
GMM(Gaussian Mixture Model)은 데이터가 서로 다른 k 개의 정규분포에서 생성되었다고 가정하고 다변량 가우시안 분포의 평균과 공분산을 찾아가는 과정의 모델입니다. (정규분포 : 평균을 중심으로 대칭이며 표준편차에 따라 흩어진 정도가 정해지는 분포)
데이터가 여러 개의 가우시안 분포로 구성된 혼합 모델로부터 생성되었다고 가정하고 EM 알고리즘을 이용하여 클러스터 포홤 확률을 추정합니다.
데이터가 정규 분포를 따를 때 가장 큰 이점은 값이 특정 구간에 속할 확률을 계산할 수 있다는 점이며, GMM은 이 확률을 통해 클러스터를 구분합니다.
과정
- 가정: 데이터가 여러 정규 분포에서 생성되었다고 가정.
- 확률 계산: 각 데이터가 각 정규 분포에 속할 확률을 계산.
- 클러스터 할당: 가장 높은 확률을 가진 정규 분포로 데이터를 할당.
GMM 과정 예시
- 데이터 준비
from sklearn.datasets import make_blobs
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
n_samples = 500
centers = 4
cluster_std = 0.75
random_state = 13
data, clusters = make_blobs(n_samples=n_samples, centers=centers, cluster_std=cluster_std, random_state=random_state)
# 타원형 데이터 생성
tf = [[0.6, -0.6], [-0.4, 0.2]]
data_tf = data @ tf
df = pd.DataFrame(data_tf)
# 시각화
sns.scatterplot(x=df[0], y=df[1], alpha=0.7, edgecolor="k", s=100)
- k-means 클러스터링
from sklearn.cluster import KMeans
# k-means 학습
model = KMeans(n_clusters=4, random_state=123)
model.fit(df)
df['kmeans_label'] = model.predict(df)
centers = model.cluster_centers_
# 시각화
sns.scatterplot(x=df[0], y=df[1], hue=df['kmeans_label'], palette='rainbow', alpha=0.7, s=200)
sns.scatterplot(x=centers[:,0], y=centers[:,1], color='black', alpha=0.8, s=100)
- GMM 클러스터링
df = df.drop(columns=['kmeans_label'], axis=1)
from sklearn.mixture import GaussianMixture
n_components = 4
random_state = 10
model = GaussianMixture(n_components=n_components, random_state=random_state)
# GMM 모델 학습
model.fit(df)
df['gmm_label'] = model.predict(df)
# 시각화
sns.scatterplot(x=df[0], y=df[1], hue=df['gmm_label'], palette='rainbow', alpha=0.7, s=100)
GMM의 장,단점
장점
- 중심과 분산: 클러스터별로 중심(평균)과 분산을 모두 고려.
- 복잡한 분포에서도 성능 유지 : 기하학적 모양의 군집을 갖는 경우, Kmeans보다 성능이 좋음.
단점
- k값 설정 필요: 클러스터 개수를 사전에 설정해야 함.(예상되는 가우시안 분포 개수)
- 데이터 수 요구: 충분한 데이터가 있어야 모수 추정이 정확.
- 범주형 데이터 불가: 정규 분포를 가정하므로 범주형 데이터에는 적용 불가.
- 초기 중심점 위치에 매우 의존함.
클러스터링과 머신러닝
클러스터링과 비지도 학습
- 비지도 학습: 데이터의 특성만 가지고 스스로 규칙을 찾아내는 머신러닝 기법.
- 클러스터링: 비지도 학습의 한 방법으로, 데이터의 특성만으로 데이터를 여러 그룹(클러스터)으로 나눔.
- 특징: 정답(레이블)이 주어지지 않은 상태에서 데이터를 구분.
클러스터링과 분류(Classification)
- 분류: 데이터의 특성과 정답(레이블) 사이의 관계를 학습하여 새로운 데이터를 특정 범주로 구분.
- 지도 학습: 분류는 데이터에 정답 레이블이 있는 상태에서 학습하는 방식으로, 지도 학습에 해당.
주요 차이점
- 데이터 레이블:
- 클러스터링: 정답이 없는 상태에서 데이터의 특성만으로 구분.
- 분류: 정답 레이블이 있는 상태에서 데이터의 특성과 정답 사이의 관계를 학습하여 구분.
- 결과 해석:
- 분류: 결과가 특정한 범주(예: 합격 또는 불합격)로 할당.
- 클러스터링: 데이터가 특정 클러스터에 할당될 뿐, 그 클러스터의 의미는 별도로 해석해야 함.
적절한 방법론 선택
- 데이터의 특성에 따라 클러스터링 또는 분류를 선택해야 함.
- 클러스터링은 데이터의 특성만으로 그룹을 나눌 때 유용.
- 분류는 정답 레이블이 있는 데이터에서 새로운 데이터를 특정 범주로 구분할 때 유용.
요약
- 클러스터링: 비지도 학습에 속하며, 정답이 없는 데이터에서 특성만으로 그룹을 나눔.
- 분류: 지도 학습에 속하며, 데이터의 정답 레이블을 바탕으로 새로운 데이터를 특정 범주로 구분.
- 차이점: 클러스터링은 결과의 해석이 필요하고, 분류는 결과가 명확한 범주로 할당됨.
- 적용: 데이터의 특성과 분석 목적에 따라 클러스터링과 분류를 적절히 선택하여 사용.
이번 글에서는 다양한 클러스터링 모델 / 계층적 클러스터링 / DBSCAN / GMM / 클러스터링과 머신러닝이 포함된 내용을 정리했으며, 파이썬에서 데이터 분석을 하거나 프로그래밍을 하는 사람들에게 알아두면 유용한 개념들로 이번 기회를 통해 다른 분들도 정리하면 좋을 것 같습니다.
글 읽어주셔서 감사합니다.
출처 및 참고자료 : 코드잇 사이트 강의 '클러스터 분석' https://www.codeit.kr/topics/cluster-analysis
'프로그래밍 > 데이터 분석' 카테고리의 다른 글
[데이터 분석 심화 개념] 장바구니 분석 개념 정리 1️⃣ (장바구니 분석의 개념, 연관 규칙 마이닝의 개념과 규칙 평가 지표) (0) | 2024.08.12 |
---|---|
[데이터 분석 심화 개념] 차원 축소 개념 정리 (0) | 2024.08.04 |
[데이터 분석 심화 개념] 클러스터링 개념 정리 2️⃣ (K-Means) (0) | 2024.08.04 |
[데이터 분석 심화 개념] 클러스터링 개념 정리 1️⃣ (지도학습 및 비지도학습, 클러스터링) (0) | 2024.08.04 |
[Tableau 개념 정리] Tableau 기초 개념 정리 2️⃣ (3) | 2024.07.15 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!