본문 바로가기
데이터 분석/Machine Learning

클러스터링 분석 - (1) 범주형 변수

by 친절한 휘저씨 2021. 12. 18.

클러스터링(군집) 분석을 하면서 고민했던 부분들을 조금씩 정리해 보려고 합니다. 분석 기법에 대한 이야기보다는 실무에서 클러스터링 분석을 진행하면서 고려할 부분이나 미리 염두에 두면 좋을 부분들에 대한 이야기가 주가 될 것 같습니다. 오늘은 그 첫 번째 시간으로 범주형 변수(categorical variables)에 대한 이야기를 해볼께요.

 

 

범주형 변수 이야기를 하기에 앞서

 

클러스터링 분석을 위한 방법론은 다양하지만, 잘 알려지고, 또 흔히 많이 사용되는 방식은 ‘거리’를 이용한 방식(Distance-Based Methods)입니다. 클러스터링은 쉽게 말하자면 유사한 것끼리 묶어주는 작업을 의미합니다. 여기서 이 유사한 정도를 계산하기 위한 단위로 ‘거리’를 사용한다는 의미죠. 이 ‘거리’라는 것은 짝지어 보고자 하는 개체(ex. 고객, 혹은 상품 등)가 갖는 개별 특성들이 얼마나 유사한지, 또 다른지를 의미합니다. 아래와 같은 정보를 가지고 있다고 가정하겠습니다.

종원 : 밥을 좋아함. 면을 싫어함.
여운 : 밥을 좋아함. 면을 싫어함.
상인 : 밥을 싫어함. 면을 좋아함.
지윤 : 밥을 싫어함. 면을 좋아함.

 

위의 예시에서 밥과 면 선호도를 기준으로 종원과 여운을 비슷한 유형으로 묶을 수 있고, 상인과 지윤을 또 비슷한 유형으로 묶을 수 있습니다. 아래는 또 다른 예시입니다. 최근 일주일간 점심으로 무엇을 먹었는지 다시 볼까요?

종원 : 밥 6번, 면 1번
여운 : 밥 7번, 면 0번
상인 : 밥 1번, 면 6번
지윤 : 밥 0번, 면 7번

 

앞선 예시와 성격이 조금 다른 정보이긴 하지만 여전히 종원&여운, 상인&지윤을 비슷한 유형으로 묶을 수 있을 것 같습니다. 우리는 이번 예시에서 종원과 여운, 그리고 상인과 지윤을 어떻게 유사하다고 판단한 것일까요? ‘밥’과 ‘면’ 식사 횟수라는 2가지 특성이 갖는 값을 통해 특성별로 값의 차이를 계산할 수 있었고, 이 차이가 작을수록 유사하다고 판단할 수 있었습니다.

‘거리’를 이용하여 개체 간의 유사성을 판단한다는 것은 바로 위의 사례처럼 특성(혹은 변수)이 연속적인(continuous) 값을 가질 때 각 개체간의 특성 차이를 계산하고, 이 차이의 크고 작은 정도를 비교하여 서로 유사한 개체와 그렇지 않은 개체를 구분하는 것을 의미합니다. 여기서 중요한 것은 Distance-Based Methods를 활용한 클러스터링 방식에서는 연속형 변수가 필요하다는 사실입니다.

 

 

범주형 변수는 왜 문제가 될까?

 

이번에도 네 사람을 불러볼게요. 이번에는 어떤 종류의 밥을 선호하는지 물었습니다.

종원 : 콩밥 선호
여운 : 녹두밥 선호
상인 : 보리밥 선호
지윤 : 찹쌀밥 선호

 

이번에는 누가누가 비슷한가요? 콩이랑 녹두 크기가 비슷하니까 종원&여운을 비슷한 유형이라고 볼 수 있을까요? 쉽게 판단하기 어렵네요. 아래는 다른 예시입니다. 이번에는 좋아하는 악기에 대해 물었습니다.

종원 : 기타
여운 : 피아노
상인 : 하모니카
지윤 : 드럼

이번에도 역시 구분하는 게 쉽지 않습니다.

위의 2가지 사례에서 제시한 특성(선호하는 밥의 종류, 좋아하는 악기)과 같은 것들을 범주형 변수(categorical variables)라고 합니다. 이것은 서로 다른 성질이나 범위에 따라 고유값을 부여한 데이터 형태를 의미합니다. 범주형 변수는 개체가 가진 고유 특성의 차이 계산이 안 되기 때문에 거리 측정 방식을 사용하는 클러스터링 작업을 위해서는 범주형 변수를 제외하든지, 아니면 연속형 변수와 같은 형태로 바꿔줘야만 합니다.

 

 

One-Hot Encoding (One-Out-of-N Encoding)

 

One-Hot Encoding은 위와 같은 문제를 해결하기 위해 고안된 방법 중 하나입니다. 꼭 클러스터링 작업이 아니더라도 통계 모델링(ex. 회귀분석 등) 작업이나 다른 종류의 기계학습(Machine Mearning) 작업에서도 범주형 변수 처리를 위해 자주 활용되는 방법 중 한 가지입니다. 아주 단순한 기본 개념에서 출발하는데요, 아래 예시를 보시면 바로 이해할 수 있을 거예요.

[ 변경 전 ]

이름 선호하는 악기
종원 기타
여운 피아노
상인 하모니카
지윤 드럼

[ 변경 후 ]

이름 기타 피아노 하모니카 드럼
종원 1 0 0 0
여운 0 1 0 0
상인 0 0 1 0
지윤 0 0 0 1
1. 범주형 변수의 값(value)의 종류수만큼 변수를 만들기 (가변수 생성) 
2. 각 변수마다 개체가 특성에 해당되면 1을 부여하고, 그렇지 않으면 0을 부여하기


위와 같은 방식으로 범주형 변수를 여러 개의 연속형 변수로 변환함으로써 특성 간의 차이를 계산할 수 있고, 클러스터링 작업에도 활용할 수 있게 됩니다. 이러한 작업을 보다 간편하게 할 수 있도록 pandas, scikit-learn과 같은 프로그래밍 언어 라이브러리에서는 유용한 모듈과 함수들을 제공하고 있습니다. One-Hot Encoding에 대한 자세한 정보는 검색을 통해 쉽게 찾으실 수 있어요! (참고pandas.get_dummiessklearn.preprocessing.OneHotEncoder)

 

 

범주형 변수 값의 종류가 너무 많다면?

 

우리가 일상 속에서, 또 업무 상황에서 접하게 되는 수많은 데이터가 범주형 데이터의 성격을 갖고 있고, 불행히도 대부분은 분석 업무에 바로 활용하기에는 깔끔하지 않은 형태로 존재합니다. 게다가 다루고자 하는 범주형 변수의 수가 많고, 그 값의 종류 또한 굉장히 다양한 경우에는 어떻게 해야 할까요?

분석가의 판단과 역량이 이때 굉장히 중요하게 작용합니다. 범주형 변수의 모든 값을 가변수로 변환하는 것도 물론 한 가지 방법이지만, 분석가가 의미 있는 단위로 값들을 다시 묶어보고이러한 묶음 단위로 값을 새로 부여하는 방법을 통해 가변수를 필요 이상으로 많이 만들어야 하는 부담을 줄일 수 있습니다. 실제로 이런 방법은 실무에서 매우 자주 사용되고 있고, 데이터 전처리(preprocessing)의 중요한 과정으로도 인식되고 있습니다. 시장과 고객에 대한 이해가 깊은 분석가일수록 이런 작업에서 시간을 절약할 수 있고, 결과적으로 좀 더 의미 있는 분석 결과를 만들어 낼 수 있습니다

 


조금 더 알아보기

 

범주형 변수를 연속형 변수로 변환하는 경우도 있지만 또 그 반대의 경우도 있습니다. ‘고객 연령’을 한 번 예로 들어 볼까요? ‘연령’은 대부분의 산업군에서 여전히 고객을 이해하는 중요한 데이터로 활용되고 있지만, 산업군별로 활용하는 방식에서는 다소 차이를 보입니다.


예를 들어, 금융소비자에게 서비스를 제공하는 보험사나 자산운용사와 같은 곳에서는 고객의 Life Time Event(ex. 첫취업, 결혼, 자녀 출산, 내 집 마련 등)에 따라 저축과 소비 성향이 크게 달라지기 때문에 ‘연령’ 변수를 그대로 활용하기보다는 이러한 이벤트에 맞게 연령대를 범주화하여 활용하고 있습니다. 또한, 고객 본인의 나이뿐만 아니라 막내 자녀의 나이(ex. 초등입학전후, 대입전후) 역시 가구의 지출 규모/형태에 크게 영향을 주는 요소이기 때문에 이러한 자료를 최대한 수집하고, 마찬가지로 범주화하여 분석 업무와 마케팅 활동 등에 많이 활용하고 있습니다.

 

 

다음 주제는..

 

다음에 다뤄볼 내용 역시 클러스터링 분석의 ‘거리’와 관련된 부분인데요, 이 이야기도 최대한 시간을 내어 빠르게 정리할 수 있도록 하겠습니다. 😃

 

 

 

반응형

댓글