[Python] 군집화를 통한 데이터 특성 파악

K-평균 군집화

scikit-learn

  • Python에서의 기계학습을 위해 사용되는 대표적인 라이브러리
import sklearn

 

인공지능 / 기계학습 / 딥러닝의 구분

인공지능


: 문제 해결을 위하여 인간의 지능을 모사하는 경우

기계학습 (머신러닝)


: 학습과 경험을 거듭할수록 기계가 발전하는 경우

딥러닝


: 신경망을 기초로 하여 학습이 이루어지는 경우


 

K-평균 군집화

  • 사전에 군집의 개수 K를 결정
  • 각 군집에는 중심이 존재하게 될 것인데, 중심과 군집 내 데이터 거리 차의 제곱 합을 최소로 하는 최적의 군집을 찾는 방식

K-means 알고리즘으로 주어진 데이터를 군집화하려면?

알고리즘 수행을 위해 필요한 라이브러리

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans

plt.figure(figsize = (10,5))

K-means Clustering 수행하기

df = pd.read_csv('menu.csv', engine = 'python')

df_data = df[['가격', '판매량']]  # 가격과 판매량을 중심으로 군집화
km = KMeans(n_clusters = 4, random_state = 0)  # 군집의 수와 초기 중심 설정
km.fit(df_data)  # K-means Clustering 수행
result = km.predict(df_data)  # 각 음료를 네 개 군집에 할당 
  • n_clusters : 군집의 수
  • randoms_state : 초기 중심

군집화 결과 출력

km.cluster_centers_
df['CLUSTER'] = result
plt.scatter(df['가격'], df['판매량'], df['CLUSTER'])

plt.show()

 

밀도 기반 군집화

여러 가지 군집화 방법론

K-means

  • 군집의 수를 정해 놓고, 각 군집의 중심에 데이터가 최대한 몰리게끔 군집화
  • 원형으로 몰려 있는 데이터가 아닌 경우 부적절하다는 단점

밀도 기반 군집화 (DBSCAN)

  • 같은 군집에 속한 데이터들은 끼리끼리 밀도 있게 모여 있을 것이라 가정
  • Density-Based Spatial Clustering of Applications with Noise

계층적 군집화

  • 유사도가 높은 개체끼리 묶고, 그 군집을 다시 다른 개체와 묶는 과정을 반복
  • Dendrogram을 통해 군집화 결과를 시각화할 수 있음

DBSCAN

  • 원의 반지름과 원 안에 포함될 최소 점 개수를 사전에 지정
  • 최소 점 개수보다 더 많은 점이 포함되면, 원으로 점을 묶음
  • 만들어진 원들을 하나로 이어 최종 군집을 결정
  • → 어느 군집에도 포함되지 않는 점이 존재할 수 있다 (noise point)

재개발 사업을 위해 주택들을 몇 개의 구획으로 나누고자 하는 00시. 위치가 가까운 주택끼리 밀도 있게 뭉치도록 구획을 결정하려면?

DBSCAN을 이용한 군집화 시작 전 작업

import pandas as pd
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
df = pd.read_csv('housing.csv')
house_position = df[['x', 'y']]  # 주택명은 군집화에 불필요하므로 제외

주택 위치 데이터를 바탕으로 DBSCAN 군집화 수행

db = DBSCAN(eps = 10, min_samples = 3)  # 원의 반지름과 최소 데이터 수를 제시
cluster_pred = db.fit_predict(house_position)  # DBSCAN을 적용하고 군집 번호를 저장
  • eps : 원의 반지름 결정
  • min_samples : 최소 데이터 수 결정
df = ['CLUSTER'] = cluster_pred

군집화 결과 최종 시각화

x = house_position['x']
y = house_position['y']
plt.scatter(x,y,c = cluster_pred)
  • DBSCAN의 결과는 실험을 반복해도 바뀌지 않음

 

계층적 군집화

계층적 군집화

  • 데이터로 주어진 모든 개체끼리의 유사도를 계산 (이상치 배제 X)
  • 유사도가 가장 높은 두 개체를 하나의 군집으로 묶음
  • 같은 과정을 반복하여, Tree 형태로 최종 군집화 수행

유사도 계산 방법

: Linkage 방법에 따라 군집화 결과가 달라질 수 있다

Single Linkage

: 서로 다른 그룹의 점 사이 거리의 최솟값을 유사도로 간주

Complete Linkage

: 서로 다른 그룹의 점 사이 거리의 최댓값을 유사도로 간주

Average Linkage

: 서로 다른 그룹의 점 사이 거리의 평균값을 유사도로 간주

앞선 주택 문제를 계층적 군집화로 풀어보면?

import pandas as pd
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram
df = pd.read_csv('housing.csv')
house_position = df[['x', 'y']]

주택 데이터를 불러오고 위치 열만을 추출

linked = linkage(house_position, 'single')
dendrogram(linked, orientation = 'top')

계층적 군집화를 수행하고 결과를 즉시 시각화