R을 사용한 K-means 군집분석 (K-means clustering in R)



소셜 커머스 싸이트 C사에서 물건을 구매하는 고객 A와 B가 있다고 가정해 봅시다. A는 물티슈, 기저귀, 레깅스 등을 오후에 방문하여 구매하는 전업주부이며 B는 기능성 화장품, 트렌드 패션의류 등을 주로 점심시간에 방문하여 구매하는 커리어 우먼입니다.

C사는 두 고객을 구분해서 스마트 폰의 앱 알림 시간과 보여주는 품목을 다르게 접근한다면 매출 발생 기회를 높일 수 있을 것입니다.

이렇게 구매 물품, 패턴 등 대상이 가지고 있는 정보의 유사성에 따라 대상을 분류하는 기법을 군집 분석(Cluster analysis)이라고 합니다.

by Andy Wilson
by Andy Wilson

군집분석이란?

군집 분석은 비지도학습(Unsupervised learning) 분석 기법 중 하나입니다. 쉽게 말해서, 사전 정보 없이 자료를 컴퓨터에게 주고, “유사한 대상끼리 묶어보아라!” 라고 명령을 내리는 분석 방법입니다.

따라서 군집분석에서는 어떤 변수를 컴퓨터에게 입력하느냐가 중요하다고 볼 수 있습니다. 예를 들어, PC방 플레이어의 유형을 분석하고 싶은 데 스킨 구매 데이터만 넣고 분석 하면 좋은 분석 결과를 얻기 힘들겠죠.

K-means 군집분석 이란?

군집 분석은 유사한 대상끼리 그루핑 하는 분석이라고 말씀드렸죠? 대상간의 유사도, 거리를 측정하는 방법에는 여러가지가 있습니다.  K-means 군집 분석은 비계층적 군집 분석 방법을 사용하는데요, 계산량이 적기 때문에 대용량 데이터도 빠르게 처리할 수 있는 장점이 있습니다.

K-means 군집 분석의 알고리즘은 아래와 같습니다.

  • 분석자가 설정한 K개의 군집 중심점을 랜덤하게 선정
  • 관측치를 가장 가까운 군집 중심에 할당한 후 군집 중심을 새로 계산
  • 기존의 중심과 새로 계산한 군집 중심이 같아질 때까지 반복

 

R을 사용한 K-means 군집 분석

R에 내장되어 있는 기본 데이터 셋 Iris를 사용하여 군집을 만들고, 군집 모델의 정확도를 평가해 봅시다.

데이터 준비

우선 caret 패키지의 createDataPartition 함수를 사용해서 iris 데이터를 training / testing 데이터 셋으로 구분해 봅시다. training 데이터로 모델을 만들고, testing 데이터로 모델을 평가 하기 위한 사전 작업입니다.

표준화

K-means 군집 분석은 관측치 간의 거리를 이용하기 때문에 변수의 단위가 결과에 큰 영향을 미칩니다.  그래서 변수를 표준화 하는 작업이 필요한데요, scale 함수를 사용해서 iris 데이터를 표준화 해 보겠습니다.

모델 작성

training 데이터셋으로 iris 데이터를 3개의 군집으로 나누어 봅시다.

군집 확인

군집 분석 결과를 training 데이터셋에 할당하고, 결과를 확인해 보죠.

K-means 군집 분석 with iris

 

결과를 보니 setosa는 잘 분류해 내었지만 versicolor나 virginica 종은 잘 구분해 내지 못한 것 같네요.

 

[잠깐!] K-means 군집분석에서 군집 중심의 갯수를 결정하는 방법

K-means 군집분석에서는 입력하는 변수와 함께 중심의 갯수를 지정하는 것이 중요한데요, 몇개의 군집 중심이 적당한지 결정하는 방법에는 여러가지가 있습니다. 그중 자주 사용하는 NbClust 패키지를 사용하는 방법과 군집 내 sum of squares를 사용하는 방법이 있습니다.

우선 NbClust 함수를 써보겠습니다.

 

NcClust

NbClust 함수는 3개의 군집이 적당하다고 하네요. 이번에는 Some of square means를 보겠습니다.

아래 그래프를 보면 군집이 3개를 넘어가면서 그룹 내 some of squares가 별로 낮아지지 않네요. 군집 간 격차가 줄어든다는 이야기입니다.

결론적으로 iris 데이터는 3개의 군집으로 구분하는 것이  좋겠네요.

some of square

 

새로운 데이터에 군집 할당

training 데이터 셋을 사용해서 예측 모델을 만들고, testing 데이터 셋으로 모델의 정확성을 다시 한번 확인해 보겠습니다.

역시 setosa는 정확히 분류해 내지만 versicolor나 virginica에 대해서는 변별력이 약한 모습이네요.

 

 

참고 자료

1) Coursera, Practical machine learning
2) Princeton, Clustering algorithms
3) R-statistics, K-means Clustering (from “R in Action”)