251216_BootCamp Day 42_클러스터링(Clustering)

2025. 12. 16. 20:06TIL

1. 클러스터링 (Clustering)

https://www.linkedin.com/pulse/comparison-kmeans-agglomerative-clustering-algorithms-jagarlapoodi/

클러스터링은 정답 없이 머신러닝 모델이 스스로 데이터에서 패턴이나 구조를 찾는 비지도 학습(Unsupervised Learning)의 한 종류로, 비슷한 특성을 가진 데이터들을 클러스터(cluster)로 묶어서 전체 데이터를 분류하는 머신러닝 기법이다.

정답값 없이 데이터의 자연스러운 분포를 확인할 수 있고, 고객 segmentation (마케팅), 기계 작동 패턴 분류(제조업) 등 다양한 분야에 활용될 수 있다. 데이터 분석가는 클러스터링을 통해 데이터를 적절한 속성을 통해 적절한 클러스터 수로 분류하고, 각 클러스터 별로 인사이트를 도출하는 작업을 수행한다.

 

2. 클러스터링 방법

1) 데이터 기간 선정 (Data Selection)

클러스터링을 위한 데이터의 기간을 설정하는데, 의미 있는 최신의 결과를 도출하기 위해 최소 3개월 이상의 데이터셋이 권장된다. 이는 클러스터링 모집단 데이터를 선정하는 과정이며, 비지도학습의 경우는 시간의 흐름에 따라 주기적으로 모델(알고리즘)을 갱신해야 하기 때문에, 가급적 최신의 데이터를 사용하는 것이 좋다.

2) 이상치 기준 선정 및 제외 (Outlier)

클러스터링은 '분류'를 수행하는 작업이기 때문에, 이상치에 매우 예민하다. (물론 DBSCAN과 같이 이상치나 노이즈에 덜 민감한 클러스터링 방식도 있다.) 그렇기 때문에 데이터의 이상치를 전처리해야 하는데, Z-Score, IQR, Isolation Forest, DBSCAN 등 다양한 방식이 존재한다. Z-Score와 IQR은 전통적인 통계 방식을 통해 이상치를 찾아내고, Isolation Forest와 DBSCAN은 각각 트리 기반, 거리 기반 머신러닝 알고리즘을 활용해 데이터의 이상치를 찾아낸다.

물론 중요한 것은, 이러한 기법을 통해 찾은 이상치를 곧이곧대로 적용하는 것이 아니라, 데이터 분석가가 한 번 더 생각하고 판단해서 이상치임을 확정하는 것이다. 잘못된 이상치 판단은 법적 소송으로도 이어질 수 있는 큰 문제다.

3) 표준화 또는 정규화 (Standardization or Normalization)

컬럼 간 데이터 범위의 차이가 많이 나는 경우, 또는 거리 기반 알고리즘을 사용하는 경우는 필수적으로 표준화 또는 정규화와 같은 feature scaling을 시행해야 한다. 특히 클러스터링은 거의 모두 거리 기반이기 때문에, 반드시 진행해줘야 하며, 보통은 이상치의 영향을 많이 받지 않는 표준화를 많이 수행한다.

4) 차원 축소 (Dimensionality Reduction)

데이터의 feature 수(쉽게 말하면 컬럼 수)를 차원이라고 하는데, 고차원 데이터는 이러한 차원이 많은 데이터를 말한다. 고차원 데이터를 그대로 머신러닝에 적용하면 연산 복잡도가 급증하고, 노이즈로 인해 제대로 된 분류 결과가 나오지 않고, 시각화하기가 어려워 패턴 파악이 힘들다는 단점이 있다. 따라서 조금 더 데이터를 잘 나타낼 수 있는 주속성을 추출해 차원을 축소하는 것을 차원 축소의 과정이 필요하다. 쉽게 말하면 여러 컬럼들을 합쳐서 하나의 새로운 분류 기준을 만드는 것이다.

https://velog.io/@maswann/PCA-%EA%B0%9C%EB%85%90

차원 축소의 대표적인 방법은 PCA(Principal Component Analysis, 주성분 분석)이다.

PCA는 선형 차원 축소 방식으로, 데이터에서 가장 높은 분산을 가지는 (=데이터를 가장 잘 분류할 수 있는) 방향 (=주성분)을 찾아 그 방향으로 데이터를 선형 투영해 차원을 축소하는 방식이다.

가장 큰 분산을 갖는 방향을 제1주성분(PC1)으로, 그 다음으로 큰 분산을 갖는 서로 직교하는 방향을 제2주성분(PC2)으로 하는 식으로 주성분을 설정한다. 만들고자 하는 주성분의 개수는 사용자가 직접 설정할 수 있다.

(다만, 주성분이 컬럼보다 많을 수는 없고, 클러스터링 성능을 고려해 적절한 수를 설정해야 한다.)

PCA는 계산이 비교적 간단하고, 결과 해석이 용이하며, 노이즈를 제거하는 효과가 있지만 데이터가 비선형적으로 복잡한 경우 데이터 손실이 발생할 수 있고, 구조를 명확히 반영하지 못할 수 있다. 이러한 경우에는 t-SNE(t-Distributed Stochastic Neighbor Embedding)나 UMAP(Uniform Manifold Approximation and Projection)과 같은 비선형 차원 축소 기법을 사용해야 한다.

5) K값, 초기 feature 선정

KMeans 기반 클러스터링을 위해서는 내가 분류하고자 하는 클러스터 개수(K)를 먼저 선정해야 한다. 그러나 우리가 데이터만 보고 적절한 K값을 판단하기 어렵기 때문에, K값을 선정할 때 참고할 수 있는 기법이 몇가지 있다.

I) Silhouette Coefficient

https://farshadabdulazeez.medium.com/understanding-silhouette-score-in-clustering-8aedc06ce9c4

각 클러스터 간의 거리가 얼마나 효율적으로 분리되어 있는지 나타내는 지표.

효율적인 분리 = 각 클러스터 별 응집도(같은 군집 내 데이터와의 평균거리)가 낮고, 분리도(가장 가까운 다른 군집과의 평균 거리)가 높은 상태. Silhouette coefficient는 -1 ~ 1 사이의 값을 가지며, 절대값이 1에 가까울수록 근처의 클러스터와 멀리 떨어져 있다는 것을 의미한다.

II) Elbow-point

Elbow-point 시행 결과

파이썬의 yellowbrick 라이브러리에 있는 elbow-point 함수는 군집별 왜곡점수(distortion score)와 분류 시간(fit time)을 고려해 가장 적절한 k값을 도출한다. 그림에 있는 검은 점선이 해당 데이터에서 알고리즘이 계산한 가장 적절한 K값을 나타낸다.

K값의 범위를 설정할 수 있는데, 같은 데이터를 사용해도 설정하는 범위에 따라 다른 결과가 나올 수 있다.

III) Distance Map
클러스터 간의 거리를 시각화하는 기법으로, 클러스터 간에 교집합(겹쳐진 부분)이 얼마나 생기는지 확인할 수 있다. 같은 코드로 실행해도 실행마다 다른 결과가 나오긴 하지만, 위치가 바뀐 것일 뿐 근본적인 결과는 변함이 없다.

Distance Map 시행 결과

어쨌든 모든 기법이 나름대로 계산한 적절한 K값을 제시해주긴 하지만, 모두가 정답은 아니다. (각 기법마다 다른 K값을 낸다. 지금 내가 직접 시행했을 때도, Elbow-point는 K=5였지만 Distance Map은 K=3이었다.) 따라서 적절한 K값을 설정하는 것은 데이터 분석가의 주관과 판단이 매우 중요하다!

이 과정이 끝나면 데이터를 클러스터링하기 위한 주속성 수(Feature), 목표한 클러스터 수(K)를 지정하고, 클러스터링을 위한 준비가 끝난 것이다.

6) KMeans

https://ml-explained.com/blog/kmeans-explained

클러스터링을 수행하는 많은 알고리즘 중 대표적인 것이 KMeans이다. 데이터를 거리를 기반으로 한 K개의 클러스터로 묶는 알고리즘으로, 각 클러스터의 평균(means)을 활용해 K개의 클러스터를 만든다. 

위 GIF 이미지가 KMeans의 원리를 잘 보여주고 있는데, 초기 중심점 K개를 설정한 후, 중심점을 기준으로 각 포인트들의 거리를 비교해 가장 가까운 중심점을 가진 클러스터에 데이터를 할당한다.

데이터가 할당되면 각 클러스터 별 중심점이 변화하게 되는데, 이 과정을 반복하면서 중심점이 더 이상 변하지 않을 때까지 수행한다. KMeans는 최종적으로 고정된 중심점에 대한 클러스터링 결과를 반환한다.

7) 시각화 (Visualization)

Scaling한 데이터셋을 기반으로, 데이터가 얼마나 밀도 있게 잘 나뉘었는지 시각화를 통해 확인한다.

이때 2D와 3D scatter plot을 통해 시각화할 수 있는데, 3D는 클러스터가 제대로 나뉘었는지 확인하기 어려워, 보통 실무에서는 2D scatter plot을 많이 사용한다고 한다.

2D plot은 축을 2개만 설정할 수 있는데, 이때 사용하는 축은 주성분이다. (우리는 주성분으로 클러스터링을 한 거지, 원본 데이터에 있는 컬럼을 사용한 것이 아니다)

2D scatter plot
3D scatter plot

8) 반복 (Iteration), 최적화(Optimization)

머신러닝 모델에 데이터를 대입하는 과정을 실험(experiment)이라고 하는데, 이제 다양한 parameter들을 조절하면서 반복 실험을 통해 데이터를 설명할 수 있는 최적의 모델을 찾아야 한다. 비지도학습은 지도학습과는 달리 정해진 정답이 없기 때문에, 데이터 분석가가 정하고 생각해야 할 것들이 더 많다. 한 번에 최적화된 모델을 찾는다면 좋겠지만, 그럴 가능성은 적기 때문에 많은 반복과 수정을 통해 최적화된 모델을 찾아야 한다.

하나의 인스턴스에 하나의 클러스터만 mapping 되었는지, 데이터 자체의 전처리가 잘 되었는지, 차원 축소가 잘 되었는지, 컬럼이 가지는 의미가 무엇인지, 클러스터링 결과가 지나치게 편향되어 있지는 않은지 계속 확인하면서, 목적에 맞는 가장 최적화된 모델을 만드는 과정이 비지도학습의 핵심이다. 그리고 새로운 데이터가 들어왔을 때, 기존의 모델이 잘 설명하지 못할 수도 있기 때문에, 그때는 다시 모델을 최적화해야 한다.

9) 인사이트 도출 (Insight)

https://medium.com/@sygong/k-means-clustering-for-customer-segmentations-a-practical-real-world-example-196a10323b9f

분류된 클러스터별로 어떤 의미를 가지고 있는지를 판단해, 각 클러스터별로 적절한 인사이트 (행동 전략)를 도출하는 것이 클러스터링의 최종 목적이다.

아무리 머신러닝 모델을 잘 만들고, 완벽에 가까운 분류 결과를 만들었다고 해도, 클러스터 별 의미를 파악하지 못하고, 인사이트를 도출하지 못한다면 아무런 의미가 없다. 결국 통계든, 머신러닝이든 인사이트를 만드는 과정이기 때문이다.

따라서 우리는 화려한 머신러닝 기법을 사용하는 것보다 우리가 정의한 문제를 잘 설명할 수 있는 적절한 모델을 찾아 좋은 모델을 만들고, 그 결과를 잘 해석하고 의미 있는 행동 전략을 만드는 것을 목표로 해야 할 것이다.