본문 바로가기

대외활동/ABC 지역주도형 청년 취업역량강화 ESG 지원산업

[ABC 220927] 비지도 학습 - 군집

반응형

군집 (clustering)

  • 군집(clustering)은 데이터셋을 클러스터(cluster)라는 그룹으로 나누는 작업
    • 군집 분석은 데이터셋 관측값이 갖고 있는 여러 속성을 분석하여 서로 비슷한 특징을 갖는 관측값끼리 같은 클러스터(집단)으로 묶는 알고리즘
      • 다른 클러스터 간에는 서로 완전하게 구분되는 특징을 갖기 때문에 어느 클러스터에도 속하지 못하는 관측값이 존재할 수 있음
      • 관측값을 몇 개의 집단으로 나눈다는 점에서 분류 알고리즘과 비슷 BUT 정답이 없는 상태에서 데이터 자체의 유사성만을 기준으로 판단하는 점이 다름
      • 신용카드 부정 사용 탐지, 구매 패턴 분석 등 소비자 행동 특성 그룹화
      • 어떤 소비자와 유사한 특성을 갖는 집단 구분 → 갖은 집단 내의 다른 소비자를 통해 새로운 소비자의 구매 패턴이나 행동 예측에 활용
      • k-Means 알고리즘, DBSCAN 알고리즘

군집(clustering) 알고리즘

  • 군집(clustering)은 데이터셋을 클러스터(cluster)라는 그룹으로 나누는 작업
  • k-평균 군집
    • 가장 간단하고 널리 사용하는 군집 알고리즘
    • 데이터의 어떤 영역을 대표하는 클러스터 중심 찾기
  • 병합 군집
    • 군집 알고리즘의 모음
    • 종료 조건 만족까지 비슷한 클러스터 합치기
  • DBSCAN
    • 데이터가 위치하고 있는 공간 밀집도 기준으로 클러스터 구분

k-평균 군집 (k-Means)

  • 데이터 간의 유사성을 측정하는 기준으로 각 클러스터의 중심까지의 거리를 이용
  • 벡터 공간에 위치한 어떤 데이터에 대해서 k개의 클러스터가 주어졌을 때 클러스터의 중심까지 거리가 가장 가까운 클러스터로 해당 데이터를 할당
  • 다른 클러스터 간에는 서로 완전하게 구분하기 위해 일정한 거리 이상 떨어져야함
  • 몇 개의 클러스터로 데이터를 구분할 것인지 생성하는 k 값에 따라 모형의 성능이 달라짐
  • 일반적으로 k가 클수록 모형의 정확도가 개선
  • k 값이 너무 커지면 선택지가 너무 많아지므로 분석의 효과가 사라짐

k-평균 군집(k-Means) 예제

  • Kmeans 도매업 고객 군집 분석
    • UCL ML Repository의 도매업 고객(wholesale customers) 데이터 셋 사용
    • https://archive.ics.uci.edu/ml/datasets/wholesale+customers
    • 데이터 전처리 (StandardScaler() 데이터 정규화 ; 특정 범위 값으로 데이터 범위 축소)
    • 데이터 셋 분리(훈련셋, 테스트셋) → Kmeans 메소드 n_clusters 5를 적용하여 모델 생성 → 클러스터 데이터 시각화

K-Means 도매업 고객 군집 분석

문제 정의 : 도매업(clients of a wholesale distributor) 데이터 셋을 활용한 군집 분석

기본 라이브러리 임포트

import pandas as pd
import matplotlib.pyplot as plt

데이터 준비하기

# Wholesale customers 데이터셋 가져오기 (출처 : UCI ML Repository)
# uci_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/
# clients of a wholesale distributor 각 품목에 대한 연간 지출
uci_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/\
00292/Wholesale%20customers%20data.csv'
df = pd.read_csv(uci_path, header=0)
df.head()

데이터 확인하기

df.info()

df.Channel.unique()
# Horeca (Hotel/Restaurant/Cafe) or Retail channel (Nominal)

df.Region.unique()
# Lisnon, Oporto ot Other (Nominal)

데이터 전처리

X = df.iloc[: , :]
X.shape

X.head()

# 데이터 정규화 -> 스케일링
from sklearn import preprocessing
X = preprocessing.StandardScaler().fit(X).transform(X)
X

type(X)

K-Means 군집 모델 설정

from sklearn import cluster

kmeans = cluster.KMeans(n_clusters=5)

모델 학습하기

kmeans.fit(X)

cluster_label = kmeans.labels_ # 0~4까지 군집 생성
cluster_label

클러스터 데이터 시각화

df['Cluster'] = cluster_label
df.head()

df['Cluster'].unique()

# Channel(채널)과 Region(지역)의 연관 관계
# 2 Cluster Channel 2, Region 1, 2, 3
# 1 Cluster Channel 1, Region 3
# 0 Cluster Channel 1, Region 1, 2
df.plot(kind='scatter', x='Channel', y='Region', c='Cluster', cmap='Set1', figsize=(10,10))

# 품목들간의 연관 관계 Milk, Fresh

df.plot(kind='scatter', x='Milk', y='Fresh', c='Cluster', cmap='Set1', figsize=(10,10))

# 품목들간의 연관 관계 Frozen, Detergents_Paper

df.plot(kind='scatter', x='Frozen', y='Detergents_Paper', c='Cluster', cmap='Set1', figsize=(10,10))

# 주황색 2, 갈색 3번 클러스터 만 더 자세하게 보고 싶다.
mask = (df['Cluster'] == 2) | (df['Cluster'] == 0)
ndf = df[mask]
ndf.Cluster.unique()

ndf.plot(kind='scatter', x='Frozen', y='Detergents_Paper', c='Cluster', cmap='Set1', figsize=(10,10))

# 주황색 2, 갈색 1번 클러스터를 제외한 0, 3, 4번만 더 자세하게 보고 싶다.
mask = (df['Cluster'] == 2) | (df['Cluster'] == 0)
ndf = df[~mask]
ndf.plot(kind='scatter', x='Frozen', y='Detergents_Paper', c='Cluster', cmap='Set1', figsize=(10,10))

# 데이터프레임을 사용해 df['Cluster'] 따라서 색으로 구분된 산점도 행렬
pd.plotting.scatter_matrix(df, c=df['Cluster'], figsize=(20,20), marker='o', hist_kwds={'bins' : 20}, s=60, alpha=0.8)
plt.tight_layout()

import numpy as np

plt.imshow([np.unique(df['Cluster'])])
plt.show()

len(df[df['Cluster'] == 1])

len(df[df['Cluster'] == 3])

len(df[df['Cluster'] == 0])

LIST