군집화(clustering)는 데이터를 군집(cluster)으로 구성하는 작업입니다.
데이터를 비슷한 집단으로 묶는 방법이라는 점에서 분류분석과 공통적이지만
분류는 레이블과 소속 집단에 대한 정보가 있는 지도학습인 반면에
군집화는 레이블과 소속 집단에 대한 정보가 없는 비지도학습입니다.
군집화의 대표적인 알고리즘은 K-평균 군집화와 계층적 군집이 있습니다.
그 중 K-평균 군집화의 기본 과정을 소개하겠습니다.
먼저 K개의 중심점을 임의로 선정합니다.
이후 각 데이터와 중심 사이의 거리를 계산하고,
데이터를 가장 거리가 적은 중심으로 배정합니다.
1차 군집화가 끝나면 중심점의 위치를 군집 내의 데이터의 중간 위치로 재설정합니다.
이 과정을 반복하다가 중심점의 위치 변동이 없으면 학습을 종료합니다.
군집의 개수(K)는 사용자가 설정하는 하이퍼파라미터이고,
이 개수를 정하는 두 가지방법에 대해 소개하겠습니다.
먼저 엘보방법입니다.
왜곡(distortion)은 ∑{(클러스터의 중심점 위치)-(클러스터 내의 데이터 위치)}^2 값입니다.
k 수에 따른 왜곡의 변화를 그래프로 나타냈을 때,
그래프가 꺾이고 완만한 경사도를 보이기 시작하는 지점의 k값이 최적의 k값이 됩니다.
이 그래프의 경우 k의 개수가 3 혹은 4일 때가 최적의 k값이라고 판단할 수 있습니다.다음으로는 실루엣분석입니다.
실루엣 분석은 클러스터 내에 있는 데이터가 얼마나 조밀하게 모여있는 지 측정하는 도구입니다.
a(i)가 데이터 i가 해당 클러스터 내의 데이터와 얼마나 가까운가를 나타내는 클러스터 응집력이고, b(i)가 데이터 i와 가장 가까운 다른 클러스터 내의 데이터와 얼마나 떨어져있는가를 나타내는 클러스터 분리도일 때
실루엣계수 s(i)는 다음과 같이 나타낼 수 있습니다.
s(i)= (b(i)-a(i))/(max(a(i),b(i)))
이 실루엣 계수는 -1부터 1까지의 값을 가질 수 있고, 1에 가까울수록 좋은 군집화입니다.
이 경우에는 Silhouette Score가 k=4일 때 1에 가장 가까우므로 최적의 클러스터 개수는 4개라고 판단할 수 있습니다.UCI Machine Learning Respositary에서 온라인판매데이터를 가지고 고객을 군집화해보겠습니다.
(이 실습은 '데이터 과학 기반의 파이썬 빅데이터 분석'을 참고하였습니다.)
먼저 데이터셋을 불러오고 정보를 확인합니다.
이 데이터셋에서 활용할 주요 속성은 다음과 같습니다.
CustomerID: 주문 고객 번호
UnitPrice: 주문 단가
Quantity: 주문 수량
InvoiceDate: 주문 날짜와 시간
데이터전처리
데이터의 차원을 출력해보았을 때 기존 54만 여 개에서 39만 여 개로 축소된 것을 확인할 수 있습니다.
'Unit Price'(구매 단가)와 'Quantity'(수량)을 곱하여 'SaleAmount'(구매금액)이라는 열을 생성하였습니다.
그리고 열 속성에 대한 직관적 이해를 위해 열의 이름을 재설정하였습니다.
고객ID('CustomerID') 와 구매횟수('Freq'), 총구매량('SaleAmount'), 마지막 구매 후 지난 날 수('ElapsedDays')의 값을 가진 새로운 데이터셋을 완성했습니다.
박스플랏을 통해 고객ID를 제외한 세 열의 값의 분포를 확인해보았을 때, 박스 바깥쪽으로 데이터가 퍼져있음을 알 수 있습니다.
추가적으로 각 속성값이 정규분포를 따르도록 스케일링해줍니다.
이제 전처리가 끝났으니 세 속성에 대해 k평균 군집화 진행하면 됩니다.
클러스터 개수 선정
앞서 소개한 방법 중 엘보방법을 통해 최적의 군집 개수를 알아봅니다.