brunch

You can make anything
by writing

C.S.Lewis

by Raphael Lee Apr 27. 2017

K-means 클러스터링 (clustering)

삼남매 아빠 = 애국자

분석이란 걸 위한 통계 완전 기초

Chapter 1. 통계 기본 함수

Chapter 2. 표준화/정규화

Chapter 3. 데이터 전처리 - Part II (part I 참조)

Break #1. 통계 실습을 위한 환경 구축 - Part I

Break #2. 통계 실습을 위한 환경 구축 - Part II

Chapter 4. 클러스터링, 장바구니 - Part I (장바구니 분석)

Chapter 4. 클러스터링, 장바구니 - Part II (클러스터링)

Chapter 5. 의사결정 나무 (Decision Tree), 회귀분석 (Regression), 신경망 분석 (Neural Network)

Chapter 6. 모형 평가, WoE


# 클러스터링에는 몇 가지 종류가 있지만, 이 글에서는 가장 기본적인 K-means clustering을 살펴 보겠습니다. 계층형 클러스터(hierarchical clustering)는 다루지 않습니다.
# 샘플 데이터 및 코드는 다음 주소에 공개되어 있습니다.

https://github.com/RapaelLee/brunch


0. 들어가며

- 클러스터링은 데이터 군집화라고도 말하며 이름에서 알 수 있듯이 유사한 데이터를 묶어내는 것입니다.

- 클러스터링은 데이터의 속성을 잘 모르는 상태에서 데이터를 효과적으로 묶어내는 것이라고 이야기하는 경우도 있는데, 그 말이 맞을 수도 있지만 필자가 경험한 바로는 '세상에 대충은 없다.'이며, 클러스터링도 마찬가지로 잘 모르니까 변수를 다 넣어서 클러스터링을 수행했다가는 클러스터링 결과가 만족스럽지 않아서, 몇 번이고 반복하게 됩니다. 클러스터링 수행을 위해서는 전처리 과정을 통해 데이터를 잘 흩어 놓는 것이 중요합니다.

- 클러스터링을 하는 과정에서 변수 값은 클러스터를 구성하기 위한 입력 변수(input variable)와 구성된 클러스터의 특성을 살펴보기 위한 설명 변수(explanatory variable)로 나누어 집니다. 설명 변수와 입력 변수는 사실 구분하기가 약간 애매하기 때문에 종종 변수를 모두 넣어서 클러스터링을 수행하곤 합니다. 하지만, 이름에서 알수 있듯이 입력 변수는 클러스터링 수행의 앞에서 설명 변수는 클러스터링 수행 후 클러스터(ex. 고객군) 활용을 위한 전략 수립에 참조로 사용됩니다.

- 이미지 처리(Image processing)에서는 픽셀의 정보를 이용해 경계선을 검출하는 등 활용 분야는 다양하며, 본격 처리에 앞서 필터링 역할을 하기도 합니다.

- 예제로 준비한 내용은 종목의 종가에 대한 월평균을 구한 후 월 증감율에 대해 클러스터링을 수행 하는 것입니다. 이 예제는 전처리 과정이 만족스럽지 않아 분포가 예쁘게 나오지는 않으니 결과에 민감하지 않으셨으면 좋겠습니다.


1. 이론적 설명 (텐서플로우 사이트 참조)

- K-means는 간단한 방법으로 주어진 데이터를 지정된 클러스터 갯수(k)로 그룹핑합니다.

알고리즘의 결과는 센트로이드(centroid)라 불리는 K개의 포인트로서 서로 다른 그룹의 중심을 나타내며 데이터들은 K 클러스터 중 하나에만 속할 수 있습니다. 한 클러스터 내의 모든 데이터들은 다른 센트로이드 보다 자신의 센트로이드와의 거리가 더 가깝습니다.

대체적으로 이 테크닉은 세개의 단계를 가집니다.

  - 단계 1: K 센트로이드의 초기 값을 결정한다.

  - 단계 2: 가까운 클러스터에 데이터를 할당한다.

  - 단계 3: 각 클러스터에 대해 새로운 센트로이드를 계산한다.


2. Python

 # 텐서플로우(tensorflow)를 사용한 클러스터링

 # 소스 파일 : kmeans_clustering_sample.py

2.1. Tensor 란?? (참조 사이트)

 - 좌표 독립 특성을 가지는 벡터와 행렬의 확장으로 볼 수 있다. (뭔 소린지.....=______=;;;;;;;;)

 - 참조 사이트에 자세하게 설명되어 있는데, 필자가 이해한 바로는 좌표 독립 특성을 가지지 않는 경우와 같이 특별한 경우가 아니라면 데이터 마이닝에서의 입력 데이터셋(input dataset)이라 봐도 무방하다 입니다.

2.2. 코드 설명

 - load_data: sqlite3에서 데이터를 추출합니다.

    1. 일별 종가로 저장된 값을 월별 평균으로 가공합니다.

    2. 당월에서 전월 값을 차감한 후 그에 대한 절대값을 씌워서 평균 가격 변동 금액을 만듭니다.

    3. 종목별로 변동금액에 대해 변동금액의 총합으로 나눔으로써, 특정 기간 내의 변동율을 구합니다.

 - __main__

    1. 클러스터 개수를 지정합니다.

    2. load_data() 함수를 호출하여 sqlite3에서 데이터를 추출합니다.

    3. 추출한 데이터를 텐서로 변환합니다.

    4. 텐서에 차원을 추가합니다.

    5. 임의의 중심점을 선언하고, 중심점을 텐서에 차원으로 추가합니다.

    6. 유클리디안 제곱거리(Squared Euclidean Distance)를 할당합니다.

    7. 중심점을 업데이트 합니다.

    8. 데이터 그래프를 실행합니다.

    9. 결과를 확인하기 위한 산점도 그래프를 생성합니다.

2.3. 실행 결과

중심점 값
레코드가 속한 클러스터 번호
클러스터링 결과 산점도 그래프


3. R

 # cluster 패키지를 사용한 kmeans 클러스터링

 # 소스 파일 : kmeans_clustering_sample.R

3.1. 코드 설명

  - cluster_sample = dbGetQuery( conn," ... : sqlite3에서 데이터를 추출합니다.

  - cluster_sample.stand <- cluster_sample[-1] : 데이터셋에서 첫 번째 컬럼을 제거합니다.

  - k.means.fit <- kmeans(cluster_sample.stand, 3) : kmeans 클러스터링을 수행합니다.

  - wssplot <- function(data, nc=15, seed=1234){ ... : 클러스터링 결과에 대한 산점도를 표시합니다.

  - H.fit <- hclust(d, method="ward") : 연관 그룹을 표시합니다.

3.2. 실행 결과

wssplot 함수 실행 결과
clusplot 함수 실행 결과
hclust 함수 실행 결과

4. 마치며

  - 이상으로 클러스터링에 대한 이야기를 마치며, 다음 차례로는 분석 기법에 대한 비교를 해보겠습니다.


매거진의 이전글 장바구니 분석 (Association Rule)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari