• mksong8

[데이터 분석] 파이썬으로 구현 가능한 클러스터링 알고리즘 2가지

4월 27 업데이트됨



​ ​ 데이터 예측 또는 분류 방법은 크게 '지도 학습(supervised learning)'과 '비지도 학습(unsupervised learning)'으로 나눌 수 있습니다. ​ 예를 들어, 피자 배송 시간을 예측하기 위해 거리, 요일, 시간, 직원, 대기한 시간과 실제 배송 시간 데이터 셋으로 모델링을 하여 배송 시간을 예측해 냈다면 이는 지도 학습입니다. ​ 이번에는 고객을 대상으로 4가지 종류의 쿠폰을 발행을 하기 위해 대가족, 소가족, 독신, 대학생 그룹으로 분류하려고 합니다. 위의 예와 같은 데이터가 제공되고 고객들을 4개의 그룹으로 분류하는 모델링을 한다면 이는 비지도 학습입니다. 이 모델은 예측값이 필요하지 않고 분류만 하면 됩니다. ​



​ 이 글에서는 가장 일반적인 분류 방법인 K 평균(K-means)과 계층적(hierarchical) 클러스터링 방법에 대해 알아보겠습니다. ​ ​ | K- 평균 클러스터링 알고리즘 ​ K- 평균 클러스터링 알고리즘을 파이썬에서 구현하려면 Python sci-kit learn 라이브러리의 make_blobs 함수를 이용하면 됩니다. 이 프로젝트에서는 make_blobs 함수를 이용하여 4개의 그룹으로 클러스터링을 해 보겠습니다. ​

# import statements from sklearn.datasets import make_blobs import numpy as np import matplotlib.pyplot as plt ​ # create blobs data = make_blobs(n_samples=200, n_features=2, centers=4, cluster_std=1.6, random_state=50) ​ # create np array for data points points = data[0] ​ # create scatter plot plt.scatter(data[0][:,0], data[0][:,1], c=data[1], cmap='viridis') plt.xlim(-15,15) plt.ylim(-15,15)



다음과 같은 결과를 얻을 수 있습니다. ​



​ 위의 그림에서 볼 수 있듯이 4개의 그룹으로 나누었지만 위의 두 개 그룹과 아래 두 개의 그룹은 약간씩 겹치는 모습을 보여줍니다. K- 평균 클러스터링 모델링을 하려면 제일 먼저 중심점을 정해야 합니다. 이 경우 4개의 그룹으로 나누기로 했기 때문에 임의의 점 4개 중심점을 정해야 합니다. 다음의 그림은 처음 4개의 중심점을 정한 그림입니다.




​ 그런 다음, 각 점에서 가까운 점들로 각각 그룹을 나눕니다. 거리를 계산하는 방법은 파이썬의 np.linalg.norm으로 유클리디안 계산법을 이용하였습니다. ​



​ 4개의 그룹으로 나눠지면 그룹의 새로운 중심 점을 정합니다. ​



​ 또다시 각 점에서 가장 가까운 중심점을 중심으로 그룹을 새롭게 나누고 다시 새로운 중심점을 정하는 프로세스를 반복합니다. 이 프로세스가 끝나면 다음과 같은 결과가 나타나게 됩니다.​



​ ​결과 그룹은 처음 그룹과 다른 모양을 하고 있습니다. K- 평균 클러스터링 알고리즘의 초기화 오류를 방지하려면 K- 평균 ++ 클러스터링 알고리즘을 사용하면 됩니다. 파이썬은 자동으로 K- 평균 클러스터링 알고리즘에서 이 방법을 지원합니다. ​ ​ ​ | 파이썬에서 K- 평균 클러스터링 구현하기 ​ 파이썬에서 K- 평균 클러스터링을 실행하려면 sci-kit learn의 KMeans를 이용해야 합니다. K- 평균 ++ 클러스터링 알고리즘이 기본값으로 되어 있습니다. 이제 파이썬에서 K- 평균 클러스터링 알고리즘을 실행해 보겠습니다. ​

# import KMeans from sklearn.cluster import KMeans ​ # create kmeans object kmeans = KMeans(n_clusters=4) ​ # fit kmeans object to data kmeans.fit(points) ​ # print location of clusters learned by kmeans object print(kmeans.cluster_centers_) ​ # save new clusters for chart y_km = kmeans.fit_predict(points)

​ 이제 matplotlib에서 다음을 실행해 보도록 하겠습니다.


plt.scatter(points[y_km ==0,0], points[y_km == 0,1], s=100, c='red') plt.scatter(points[y_km ==1,0], points[y_km == 1,1], s=100, c='black') plt.scatter(points[y_km ==2,0], points[y_km == 2,1], s=100, c='blue') plt.scatter(points[y_km ==3,0], points[y_km == 3,1], s=100, c='cyan')

4개의 그룹이 표현되었습니다. K- 평균 ++ 클러스터링 알고리즘으로 초기 중심점을 잘 잡았기 때문에 K- 평균 클러스터링 알고리즘 실행 결과보다 나은 결과를 보여줍니다.



​ K- 평균 클러스터링 알고리즘은 계산이 빠르고 단순하여 가장 자주 사용되고 있습니다. 그다음으로 많이 이용되는 알고리즘으로는 계층적 클러스터링 알고리즘이 있습니다. ​ ​ ​ | 파이썬에서 계층적 클러스터링 구현하기 계층적 클러스터링 알고리즘은 K- 평균 클러스터링 알고리즘과 근본적으로 다른 방식입니다. K- 평균 클러스터링 알고리즘은 임의의 k 개의 중심점에서 시작하지만 계층적 클러스터링 알고리즘은 데이터 셋의 모든 데이터를 클러스터로 시작합니다. 가장 가까운 데이터를 찾아 클러스터로 결합합니다. 이런 계산 과정을 덴드로그램을 만들면서 반복합니다. 아래의 그림처럼 덴드로그램을 보면 어떻게 클러스터가 진행되었는지 확인해 볼 수 있습니다. ​



덴드로그램은 각 클러스터와의 거리를 표현합니다. 덴드로그램에서 원하는 그룹 수를 정할 수 있습니다. 위의 덴드로그램을 보면 녹색, 빨간색, 파란색 클러스터의 시작점을 쉽게 확인할 수 있습니다. ​ 파이썬에서 계층적 클러스터링 알고리즘이 어떻게 구현되는 지 알아보겠습니다. 먼저, scipy.cluster.hierarchy와 sklearn.clustering에서 필요한 라이브러리를 가져오겠습니다.


# import hierarchical clustering libraries import scipy.cluster.hierarchy as sch from sklearn.cluster import AgglomerativeClustering


원하는 그룹 수를 정하고 각 데이터들을 표현해 덴드로그램을 그려 보겠습니다.


# create dendrogram dendrogram = sch.dendrogram(sch.linkage(points, method='ward')) ​ # create clusters hc = AgglomerativeClustering(n_clusters=4, affinity = 'euclidean', linkage = 'ward') ​ # save clusters for chart y_hc = hc.fit_predict(points)


K- 평균 클러스터링 알고리즘에서 했던 것처럼 matplotlib을 사용하여 데이터를 시각화해보겠습니다.


plt.scatter(points[y_hc ==0,0], points[y_hc == 0,1], s=100, c='red') plt.scatter(points[y_hc==1,0], points[y_hc == 1,1], s=100, c='black') plt.scatter(points[y_hc ==2,0], points[y_hc == 2,1], s=100, c='blue') plt.scatter(points[y_hc ==3,0], points[y_hc == 3,1], s=100, c='cyan')




이 프로젝트에서는 K- 평균 클러스터링 알고리즘과 계층적 클러스터링 알고리즘의 결과가 매우 유사하게 나타났습니다. 일반적으로 계층적 클러스터링 알고리즘이 더 정확하다고 알려져 있습니다. 그러나 계층적 클러스터링 알고리즘은 구현하기가 쉽지 않고 계산하는데 시간과 자원이 더 필요하다는 것이 단점일 수 있습니다.

조회 168회

​고객센터

Tel: 02-596-8900  Fax : 02-6930-5709

10시 - 오후 7시(토, 일요일 및 공휴일은 휴무)

개인정보관리책임자 : 황재준   상호 : 유펜솔루션   대표자 : 김재훈   사업자등록번호 : 426-86-00939
주소 : (본사)대전광역시 유성구 엑스포로446번길 38, 3층 302호 / (지사 및 연구소)서울시 성동구 연무장 15길 11, B동 2층
​ⓒ 2019 UpennSolution Co., Ltd. All rights reserved.