본문 바로가기

DATA SCIENCE/MACHINE LEARNING

[Python] kmeans clustering

인턴하는 중 새로운 아이디어를 제안해주셔서 급하게 하게 된 군집분석. 까먹기 전에 기록해두기 위해 적어둔다.

우선 필요한 패키지를 불러온다.

# 항상 불러와주는 기본 패키지들
import pandas as pd
import numpy as np

# plotting 용 패키지들
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

# KMeans 알고리즘
from sklearn.cluster import KMeans

데이터를 정리하고 (보안상 생략) 모델링에 들어간다.

inertia = []
for i in range(1,11):
    kmeans = KMeans(n_clusters=i)
    kmeans.fit(Xs)
    inertia.append(kmeans.inertia_)
    
plt.plot(range(1,11), inertia)
plt.title('The Elbow Method')
plt.xlabel('no of clusters')
plt.ylabel('inertia')
plt.show()

cluster = 3 으로 결정

위의 elbow method를 쓰면 3이 가장 적합한 cluster 개수임을 알 수 있다.
모델링 하는 방법은 다음과 같이 간단하다.

kmeans = KMeans(n_clusters=3)
y_kmeans = kmeans.fit_predict(Xs)

이제 시각화를 통해 데이터 분포를 확인해보자.

# kmeans 결과를 두 변수에 대해 scatter plot 그려서 보기
def scatterKmeans(xCol, yCol, n_cluster):
    for i in range(n_cluster):
        plt.scatter(data_Xs[y_kmeans == i][xCol], data_Xs[y_kmeans == i][yCol], s =30, label = 'Cluster'+str(i))
    x_idx = list(data_Xs.columns).index(xCol)
    y_idx = list(data_Xs.columns).index(yCol)
    plt.scatter(kmeans.cluster_centers_[:, x_idx], kmeans.cluster_centers_[:, y_idx], s = 80, c = 'yellow', label = 'Centroids')
    plt.title('Clusters of customers')
    plt.xlabel(xCol)
    plt.ylabel(yCol)
    plt.legend()
    plt.show()
    
scatterKmeans('Age','Weight',3)

그리고 종속변수와의 관계를 알아보기 위해 pairplot을 그려본다.

i=0 # cluster 번호
sns.pairplot(data_conti[y_kmeans==i],diag_kind='hist')
plt.show()

 

참고 : https://www.kaggle.com/vjchoudhary7/kmeans-clustering-in-customer-segmentation

반응형