본문 바로가기
AI SCHOOL/TIL

[DAY 49] 머신러닝, K-means clustering algorithm

2023. 3. 7.

머신러닝과 scikit-learn에 대해 학습하는 것으로 강의가 시작되었다.

어제 retail data를 기반으로 만든 RFM 데이터와 군집화 알고리즘 K-means를 이용하여 실습하였다.

머신러닝, scikit-learn

파이썬의 머신러닝 라이브러리 scikit-learn의 대표적 기능
1. Classification(분류)
2. Regression(회귀)
3. Clustering(군집화)
4. Dimensionality Reduction(차원 축소)
5. Model selection and evaluation(모델 선택 및 평가)
6. Preprocessing(전처리)

머신러닝, 딥러닝에서 추상화된 도구(scikit-learn, TensorFlow, pyTorch, FastAI 등)를 사용했을 때 장단점
장점
- 개발 시간 단축
- 정확성 향상(오류 감소)
- 재사용성
단점
- 일반성 부족
- 실제 동작의 이해 부족
- 구성의 어려움
- 메모리 사용량 증가

머신러닝 용어
지도학습 : 정답(label)이 있는 데이터를 학습
- 분류 : 범주형 데이터를 각 class별로 나누는 것(범주형 변수)
- 회귀 : 하나의 가설에 미치는 수치형 변수들과의 인과성 분석(수치형 변수)
비지도학습 : 정답(label)이 없는 데이터를 학습
- 군집화 : 유사도가 높은 범주끼리 모아주는 것. 분류와는 다르게 정답이 없다(범주형 변수)
- 차원 축소 : 고차원 데이터를 차원을 축소하여 분석할 특성을 줄이고 한눈에 볼 수 있게 해준다(수치형 변수)

어떤 최적화 알고리즘이든 모든 문제에서 효과적일 수 없다.
다시 말해, 최적화 문제의 성격에 따라 알고리즘의 성능이 다르게 나타난다.
따라서 최적화 알고리즘을 선택할 때는 문제의 특성과 목적에 적합한 알고리즘을 선택해야 한다.
시대에 따라서 유행이 존재하기도 한다.

K-means 알고리즘을 통한 군집화 실습

고객 4338명의 Recency, Frequency, Monetary를 계산한 데이터를 사용하였다.

rfm
사용할 데이터

 

describ

Recency, Frequency, Monetary의 스케일의 차이가 있고 편차가 큰 것을 확인할 수 있다.

rfmhist2

히스토그램으로 확인하면 편향이 직관적으로 보인다.

각각의 변수에 로그함수를 적용하여 편차를 작게 줄였다.

rfmhist

히스토그램으로 확인하면 편향성이 사라진 것을 확인할 수 있다. 정규분포 형태도 보인다.

이후 StandardScaler를 통해 평균이 0, 표준편차가 1이 되도록 변환하여 스케일을 조정한다.

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
ss.fit(rfm_cluster_log)
X = ss.transform(rfm_cluster_log)

그리고 군집 수를 2~19개로 설정한 K-means algorithm을 적용한다.

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

inertia = []
silhouettes = []
range_n_clusters = range(2, 20)

for n_cluster in range_n_clusters:
    kmeans = KMeans(n_clusters=n_cluster, random_state=42)
    kmeans.fit(X)
    inertia.append(kmeans.inertia_)
    silhouettes.append(silhouette_score(X, labels=kmeans.labels_))
    print(n_cluster, end=",")

inertia는 각 군집별 오차 제곱의 합으로, 군집 내의 분산을 의미한다.
군집 수가 증가하면 inertia가 줄어들며, inertia가 빠르게 변하는 지점이 최적의 군집 수 k이다.

Elbow Method

elbow

팔꿈치처럼 급격히 꺾이는 부분이 확연히 보이진 않는다. 실제 활용에서 이런 경우가 많다고 한다.

군집 수를 3으로 지정하여 결과 확인

n_clusters = 3
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
kmeans.fit(X)
pd.Series(kmeans.labels_).value_counts()

# 실행 결과
2    1832
0    1536
1     970
dtype: int64

데이터가 군집 3개로 분류되었다.

시각화해서 확인해보면

cluster

군집화된 데이터(clustered data)를 확인할 수 있다.

silver, gold, platinum으로 분류한 RFM_class와 머신러닝으로 군집화한 각 cluster를 비교해 보자.

rfmcluster

완전히 같진 않지만 어느정도 유사하게 분류된 것을 알 수 있다.

바이올린 플롯을 그려 확인하면 아래와 같다.

violin

기존의 RFM_class를 구한 것처럼 qcut 방식으로 고객을 군집화 할 수 있지만 변수가 많다면 머신러닝 군집화를 사용하면 비교적 간단해질 수 있다.

K-means 군집화 알고리즘을 사용하여 머신러닝으로 고객을 군집화해 보는 시간이었다.

반응형

댓글