놀고 싶어요

[R Programming] 머신러닝: 군집분석 - K Means 본문

R

[R Programming] 머신러닝: 군집분석 - K Means

챌린지 2021. 5. 25. 15:27

 

머신러닝: 군집분석

 

 

 

비지도 학습 (Unsupervised learning)


답이 데이터 안에 있는 경우를 지도학습(supervised learning)이라고 한다. 

비지도학습(unsupervised learning)은 답이 존재하지 않는 데이터를 우리의 비즈니스 목적에 맞게 활용할 수 있는 방법이다.

우리는 그 중 K-Means 클러스터링에 대해 알아보도록 하겠다.

Ex) 고객 세분화, 상권 세분화 등처럼 답이 정해진 과거 데이터가 있는 것이 아니라서 종속변수가 정해질 수 없는 경우, 유사한 것 끼리 그룹을 짓는 기법이다. 

그러기 위해서는 ‘유사하다’를 정의할 방법이 있어야 하고 어떤 값을 기준으로 비슷한지 Feature 값을 정하는 것이 중요하다. 그리고 마지막으로 몇 개의 그룹으로 나뉘어야 하는지 값을 정해주는 것이 필요하다.

 

유사성의 기준으로 많이 사용하는 것이 ‘거리’이다. 

Ex) 서울에서 부산까지의 거리

추상적인 개념의 거리도 존재한다. 사람 A와 사람 B를 물리적 거리로 측정하면 이해할 수 있는 개념이지만

추상적안 거리는 도대체 무슨 소리인지 가늠이 안갈 수 있다. 

사람 A가 사람 B와 유사한 사람인지? 또는 사람 A는 사람 B와 사람 C 가운데 어떤 사람과 더 비슷한지? 같은 질문에 답하는 것이 추상적인 거리를 측정하는 문제와 같다.

 

그렇지만 거리 계산 개념자체는 물리적 거리를 측정하는 것과 유사하며, 수치형 데이터여야 한다.

수치적으로 측정하고 표현이 가능한 값을 사용해야 거리도 계산할 수 있다.

 

그러므로 어떤 항목을 기준으로 거리를 계산하는 게 문제가 된다.

> 결국 Feature를 어떻게 적절하게 찾아내서 적용하는가의 문제다.

 

 

 

 

 

 

표준화(Normalization)


수치형 데이터로 표현할 수 있는 항목들로 거리를 계산하는데 특정 항목 하나가 편차가 너무 크고 단위 차이가 큰 항목이 있다면 그 하나의 항목 때문에 다른 항목들이 거리에 기여하는 바가 미미해서 그 큰 항목 하나로 모든 것이 설명되는 경우가 흔히 있을 수 있다. 

예를 들어, 대기업 1군데와 중소기업 99 군데 와 섞여 있다면 대기업 매출이 압도적으로 큰 값이라서 다른 특징들로 비교해보려는 시도는 거의 의미 없이 매출이 가장 중요한 기준으로 계산이 된다. 그래서 거리를 이용하여 유사성 기반으로 결과를 만드는 기법을 사용할 때에는 Normalization 단계를 사용한다. 이것을 처리하는 함수는 scale() 이다.

 

 

각 데이터의 정수 부분만 보았을 때 humidity는 세 자리에 가까운 값이 나타난다. wind는 한자리 수로 나타나고 있다. 

 

어떤 두 수치 데이터가 있는데 이 두 값이 모두 분석에 중요한 독립변수라고 가정한다.

그러면 대부분의 분석기법에서는 큰 값을 가진 것이 더 큰 영향력을 가지고 있다고 판단될 가능성이 상당히 높다.

 

예를 들어 동물의 키 차이는 뇌 무게의 차이보다 더 크게 차이가 나며 동물을 비교할 때 훨씬 더 눈에 띄는 차이로 보여질 것이다. 그렇지만 뇌의 무게 차이가 훨씬 더 큰 차이의 원인이 될 수도 있다. 

 

이런 차이가 공평하게 비교 분석된다면 숨어 있는 의미나 패턴 등을 찾을 수 있다.

표준화는 이런 의미에서 데이터 분석의 많은 단계에 전처리 과정으로 적용하게 된다.

 

 

 

weather$scaled_humidity <- scale(weather$humidity)
str(weather)
hist(weather$scaled_humidity, breaks = 100)
summary(weather$scaled_humidity)

hist(weather$scaled_humidity, breaks=100)

hist(weather$scaled_humidity, breaks = 100)

weather 파일의 humidity 컬럼을 읽어들여 Z 스코어로 변환했을 때의 값을 표현한 것이다.

-> 각 값에서 평균을 빼고 표준편차로 나눈 값으로 변환을 한 것이다.

 

이렇게 변환을 하고 나면 summary를 통해 알 수 있듯이 평균은 0, 표준편차는 1인 구조를 기반으로 데이터를 변환한다. 

 

 

 

 

 

 

 

K-Means 클러스터링


예시: 구별로 시간대별 대여건수를 집계한 다음에 시간대 패턴이 같은 구 끼리 그룹화한다.

 

첫 번째 단계는 구별, 시간대 별로 대여 횟수를 집계 한다. (Gu, Time_out 기준)

구별, 시간대 별 대여 횟수를 요약한 결과

Distance는 대여 횟수 집계를 위해 사용한다.

 

집계함수로 length를 사용했는데 수치 데이터 자체를 계산에 활용한 것이 아니라 동일 조건, 즉 구별, 시간대별로 Distance 값을 모아두고 보니 길이가 얼마이던가를 찾아서 요약한 형식이다.

 length는 리스트에서 데이터의 개수가 몇 개인지 알려주는 기능을 갖고 있다.

 

 

요약한 데이터를 spread 함수를 사용해서 와이드 폼으로 변경하는데, 기준은 (Gu)이고 기준은 시간대(Time_out, 0~23) 되었다.

 

 

centers = 2 로 클러스터링을 하고 결과를 보면 각각 2개 구와 3개 구로 나눠진 클러스터가 생성되었음을 알 수 있다.

그 외에도 클러스터의 중심 위치, 전체 거리 합에 대한 클러스터 거리 합의 비율을 알려준다.

 

숫자들이 뜻하는 바는 클러스터 수를 변경하면서 돌려보고 알아보도록 하자.

 

 

km3 <- kmeans(n_bike2[,2:25], centers = 3)
km4 <- kmeans(n_bike2[,2:25], centers = 4)

 

 

결과를 하나로 합해서 구가 어떻게 군집을 형성되었는지 보도록 하겠다.

클러스터를 두 개로 나누었을 때, 마포구와 영등포구가 클러스터1에 동대문구, 서초구, 은평구가 클러스터 2에 포함되었다.

3개로 나누었을 경우, 마포구, 영등포구 / 동대문구, 은평구 / 서초구 로 나뉜 것을 볼 수 있다.

 

클러스터링 기준이 24시간동안의 공공자전거 대여 횟수의 패턴을 근간으로 유사성을 보인다고 판단할 수 있는 구를 같은 클러스터로 묶어주는 방법이다. 

(구별로 24시간 시간대별 대여 횟수가 비슷한 패턴을 보이는 경우에 같은 군집으로 군집화)

 

 

 

 

 

sum of square


tot_withinss: 같은 클러스터 안에 있는 데이터 간의 거리 합

betweenss: 다른 클러스터 사이에 계산되는 거리의 합

 

totss: tot_withinss+betweensss

= 데이터 전체에서 계산되는 거리의 합과 동일하다. 

 

각 클러스터 수에 따라 그룹 간 거리 합과 그룹 내 거리의 합의 비율이다.

이 비율이 값이 클수록 클러스터링 결과가 좋다고 할 수 있다.

동일 클러스터끼리는 거리가 가깝고 다른 클러스터끼리는 거리가 뚝뚝 떨어져 있다는 의미다.

 

 

 

 

 

K-Means 클러스터링 특징


K-Means 클러스터링 특징은 K값을 주면 무조건 K개의 클러스터를 만들어 준다.

생각보다 속도도 빠르다.

K의 클러스터가 항상 만족스러운 클러스터링 결과를 만들어 내는 것은 아니다.

원래 3개가 적절한 클러스터인데 2개나 4개로 나누라고 할 경우 뜻하지 않은 것끼리 섞여서 이해할 수 없는 클러스터가 형성될 수 있다. 

그래도 원래 값이 없던 것에 비하면 분명이 유용할 것이고 특히나 군집화할 대상이 많은 경우 상대적으로 아주 유용하다.