K means 군집분석 - k means gunjibbunseog

최대 효율성을 위해 표본 케이스를 선택한 후 반복 및 분류하기 방법을 선택하여 군집중심을 결정합니다. 최종값 저장을 선택합니다. 그런 다음 전체 데이터 파일을 복구하고 분류만 하기 방법을 선택한 후 초기값 읽기를 선택하여 표본에서 추정한 중심을 사용하여 전체 파일을 분류합니다. 파일이나 데이터 세트에서 읽고 쓸 수 있습니다. 데이터 세트는 같은 세션에서 다시 사용할 수 있으나 세션을 마치기 전에 명시적으로 저장하지 않는 한 파일로 저장되지 않습니다. 데이터 세트 이름은 변수 명명 규칙을 따라야 합니다. 자세한 정보는 변수 이름 주제를 참조하십시오.

이 프로시저를 사용하면 여러 개의 케이스를 다루는 알고리즘을 통해 선택한 특성을 기준하여 상대적으로 동질적인 케이스 그룹을 구별할 수 있습니다. 그러나 이러한 알고리즘을 사용하려면 군집의 수를 지정해야 합니다. 이러한 정보를 알 경우에는 군집중심초기값을 지정할 수 있습니다. 케이스를 분류하려면 반복적으로 군집중심을 업데이트하거나 분류만 하는 두 가지 방법 중 하나를 선택할 수 있습니다. 소속군집, 거리 정보, 마지막 군집중심 등을 저장할 수 있습니다. 선택적으로 케이스별 결과를 설명하는 데 사용되는 값을 갖는 변수를 지정할 수 있습니다. 분산 분석 F 통계가 필요할 수도 있습니다. 이러한 통계는 필요에 따라 사용할 수 있으며(이 프로시저는 서로 다른 그룹을 구성하려고 함) 통계의 상대적 크기로 그룹 분리에 각 변수가 미치는 영향을 알 수 있습니다.

예제. 각 그룹에서 비슷한 시청자 유형을 갖는 텔레비전 쇼를 구별하는 그룹은 무엇입니까? K-평균 군집 분석을 사용하면 텔레비전 쇼(케이스)를 시청자의 특성에 따라 K 동일성 그룹으로 모을 수 있습니다. 이 방법은 마케팅을 위한 대상 선정에도 사용됩니다. 다양한 마케팅 전략을 검정하는데 비교 도시들을 선택할 수 있도록 도시(케이스)를 동일 그룹으로 모을 수 있습니다.

통계. 완료 해법에 대해 군집중심초기값, 분산 분석표를 선택할 수 있습니다. 각 케이스에 대해 군집 정보, 군집중심으로부터의 거리를 선택할 수 있습니다.

K-Means 군집 분석 데이터 고려 사항

데이터. 변수는 구간 수준이나 비율 수준에서 양적변수이어야 합니다. 사용 변수가 이분형이나 개수일 경우 계층적 군집 분석 프로시저를 사용합니다.

케이스 및 군집중심 초기값 순서. 군집중심 초기값을 선택하는 기본값 알고리즘은 케이스 순서에 따라 달라질 수 있습니다. 반복 대화 상자의 유동계산 평균 사용 옵션을 사용하면 군집중심 초기값의 선택 방법과 상관없이 케이스 순서에 따라 결과 해법이 달라질 수 있습니다. 이러한 방법 중 하나를 사용하는 경우 주어진 해법의 안정성을 확인하기 위해 케이스를 각기 다른 무작위 순서로 정렬하여 서로 다른 여러 가지 해법을 구할 수도 있습니다. 군집중심 초기값을 지정하고 유동계산 평균 사용 옵션을 사용하지 않으면 케이스 순서와 관련된 문제를 방지할 수 있습니다. 그러나 케이스에서 군집중심까지의 거리가 동률인 경우 군집중심 초기값의 순서가 해법에 영향을 줄 수 있습니다. 주어진 해법의 안정성을 평가하기 위해 중심 초기값의 순열을 각기 달리하여 실행한 분석 결과를 비교할 수 있습니다.

가정. 거리는 단순 유클리드 거리를 사용하여 계산합니다. 다른 거리나 유사성 측도를 사용하려면 계층적 군집 분석 프로시저를 사용합니다. 변수 척도화는 특히 중요한 고려 사항입니다. 한 변수는 달러로 표시되고 다른 변수는 연도로 표시되는 경우와 같이 변수가 서로 다른 척도로 측정되면 결과가 잘못될 수 있습니다. 이러한 경우에는 변수를 표준화한 후 K-평균 군집 분석을 수행하도록 합니다. 이 작업은 기술통계 프로시저에서 수행할 수 있습니다. 이 프로시저에서는 적합한 군집의 수를 선택했으며 관련 변수가 모두 포함되었다고 가정합니다. 선택한 군집의 수가 적합하지 않거나 중요 변수가 빠졌을 때는 결과가 잘못될 수 있습니다.

728x90

- 정답이 없는 문제를 해결하기 위한 알고리즘 → 비지도학습 '군집분석'

 

 

- 군집분석(Clustering Analysis)

  • ex) 쇼핑몰에서 페이지 체류 시간, 구매 금액대 등을 토대로 소비자 유형 그룹을 나누고(군집 설정), 새로운 소비자가 쇼핑몰에 들어왔을 때 행동을 바탕으로 앞서 설정해놓은 그룹으로 할당, 비슷한 소비자가 구매한 상품 노출하여 제품 구매율을 높힘
  • 군집은 정답을 모르는 데이터 안에서 숨겨진 구조를 찾는 것
  • 클래스 레이블이 없는 데이터를 특정 군집으로 묶고자 할 때 활용
  • 계층 군집, 밀집도 기반 군집(클러스터 모양이 원형이 아닐 때 사용)

 

 

- K-평균(K-means)

  • 매우 쉬운 구현성, 높은 계산 효율성 → 학계와 산업현장을 가리지 않고 활약
  • 프로토타입 기반 군집 : 각 클러스터가 하나의 프로토타입으로 표현됨
    • 프로토타입(Prototype)
      • 연속적인 특성에서는 비슷한 데이터 포인트의 센트로이드(centroid - 평균)
      • 범주형 특성에서는 메도이드(medoid - 가장 자주 등장하는 포인트)
  • 원형 클러스터 구분에 뛰어남
  • 사전에 몇 개의 클러스터를 만들 것인지 직접 지정해줘야함 → 주관적인 사람의 판단 개입
  • 적절한 K값을 선택했다면 높은 성능, 부적합한 K값은 모델의 성능을 보장할 수 없음

 

 

- 파이썬 활용하여 K-평균 군집분석 진행하기

# 무작위 데이터셋 생성

from sklearn.datasets import make_blobs

X, y = make_blobs(n_samples = 150,      # 150개
                  n_features = 2,       # 2차원
                  centers = 3,          # 3개의 클러스터 혹은 중심
                  cluster_std = 0.5,    # 클러스터의 표준편차 값
                  shuffle = True,      # 무작위로 섞을 지 여부
                  random_state = 0)     # 시드 값


#시각화 : 2차원 산점도 그리기

import matplotlib.pyplot as plt

plt.scatter(X[:, 0], X[:, 1], c = 'white', marker = 'o', edgecolor = 'black', s= 50)
plt.grid()
plt.tight_layout()
plt.show()
K means 군집분석 - k means gunjibbunseog
  • 목표 : 특성의 유사도에 기초하여 데이터들을 그룹으로 모으는 것
  • K-평균 4단계 알고리즘
    1. 데이터 포인트에서 랜덤하게 K개의 센트로이드를 초기 클러스터 중심으로 선택
    2. 각 데이터를 가장 가까운 센트로이드에 할당
    3. 할당된 샘플들을 중심으로 센트로이드를 이동
    4. 클러스터 할당이 변하지 않거나, 사용자가 지정한 허용오차나 최대 반복횟수에 도달할 때 까지 2/3 과정 반복
  • 유사도 측정 방법
    • 임의의 차원 공간에 있는 두 데이터 포인트 x와 y사이의 유클리디안 거리 혹은 유클리디안 거리 제곱 지표 기반 → 최적화 문제
    • 클러스터 내의 제곱 오차합(SSE)을 반복적으로 최소화
    • 각 데이터를 센트로이드에 할당할 때마다, 센트로이드는 이동 → 센트로이드가 변화할 때마다 오차 제곱합을 반복적으로 계산하면서 변화량에 대한 허용 오차값이 일정 수준내로 들어온다면 더 이상 클러스터가 변화하지 않는다는 것이고, 최적화가 완료되었다는 것
K means 군집분석 - k means gunjibbunseog
첫 번째 줄은 μ, 두 번째 줄은 w에 관한 설명
  • 각 점들간의 거리를 측정할 때, 점들간의 단위와 변동폭이 크다면 왜곡 발생 → 거리 산출 시 불필요한 항목간의 특성을 제거하고 단위를 일치시키는 '표준화'과정으로 왜곡을 줄일 수 있음
from sklearn.cluster import KMeans

km = KMeans(n_clusters = 3,      # 클러스터 개수 3개
           init = 'random',     # K평균 알고리즘 설정, 초기 중심 좌표를 무작위로 선정하여 random
           n_init = 10,         # 각기 다른 랜덤한 센트로이드에서 독립적으로 몇 번 실행하여 가장 낮은 제곱오차합을 만들 것인지 설정
           max_iter = 300,      # 최대 몇 번을 반복할 것인지
           tol = 1e-04,         # 허용 오차값
           random_state = 0)


# 군집분석 알고리즘에 의한 예측 클래스 레이블

y_km = km.fit_predict(X)


# 시각화

import matplotlib.pyplot as plt

plt.scatter(X[y_km == 0, 0], X[y_km == 0, 1],
           s = 50, c = 'lightgreen', marker = 's', edgecolor = 'black', label = 'cluster 1')

plt.scatter(X[y_km == 1, 0], X[y_km == 1, 1],
           s = 50, c = 'orange', marker = 'o', edgecolor = 'black', label = 'cluster 2')

plt.scatter(X[y_km == 2, 0], X[y_km == 2, 1],
           s = 50, c = 'lightblue', marker = 'v', edgecolor = 'black', label = 'cluster 3')

plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:,1],
            s = 250, marker = '*', c = 'red', edgecolor = 'black', label = 'centroids')

plt.legend(scatterpoints = 1)
plt.grid()
plt.tight_layout()
plt.show()
K means 군집분석 - k means gunjibbunseog
  • 초기 센트로이드를 설정할 때, 랜덤으로 위치를 선정하기 때문에 애초에 잘못 선정된 곳에서 시작한 경우 (여기에 더불어 데이터가 적은 악조건이 붙게 된다면) 클러스터의 성능이 매우 불안정해짐
  • 따라서 초기 클러스터 센트로이드를 좀 더 똑똑하게 할당할 수 있는 기법 등장 → K-means++
  • K-means 알고리즘에서 클러스터는 중첩되지 않고 계층적이지 않음, 클러스터 당 하나 이상의 데이터가 존재 → 데이터가 꼭 하나의 클러스터로만 구분되지 않을 경우 문제 발생 → K-means++

 

 

- K-means++

km = KMeans(n_clusters = 3,     # 클러스터 개수 3개
           init = 'k-means++',  # K평균++ 알고리즘 설정
           n_init = 10,         # 각기 다른 랜덤한 센트로이드에서 독립적으로 몇 번 실행하여 가장 낮은 제곱오차합을 만들 것인지 설정
           max_iter = 300,      # 최대 몇 번을 반복할 것인지
           tol = 1e-04,         # 허용 오차값
           random_state = 0)
           
y_km = km.fit_predict(X)
  • K-평균의 무작위성을 보완하기 위한 기법
  • 초기 센트로이드가 서로 멀리 떨어지도록 위치 시킴
  • 기본 K-평균보다 일관되고 좋은 결과 보여줌

 

 

- 사이킷런 사용하여 군집의 품질 평가하기

  • 비지도학습은 올바른 정답이 없기 때문에 군집의 품질을 평가해야 하는 경우 알고리즘 자체의 지표를 사용해야함 ex) k-평균 군집의 성능 비교를 위한 오차 제곱합
  • KMeans 모델 학습을 진행한 객체 안에 관성이라는 뜻을 가진 'inertia' 속성안에 이미 계산이 완료 되어 있음
print('왜곡 : %.2f' % km.inertia_)
K means 군집분석 - k means gunjibbunseog
  • 왜곡 값이 적절한 값인지는 k를 다양한 값으로 할당한 후에 왜곡값을 비교해봐야함 → 엘보우 방법

 

 

- 엘보우 방법(elbow method)

  • 최적인 클러스터 개수 k를 추정
  • k값의 증가 → 센트로이드의 증가 →데이터들이 센트로이드에 더 가까워지는 것 → 왜곡값(SSE)의 감소
# k를 1부터 10까지 구축, 각각의 SSE를 시각화

distortions = []

for i in range(1, 11) :
    km = KMeans(n_clusters = i,
               init = 'k-means++',
               n_init = 10,
               max_iter = 300,
               random_state = 0)
    km.fit(X)
    distortions.append(km.inertia_)
    
plt.plot(range(1,11), distortions, marker = 'o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.tight_layout()
plt.show()
K means 군집분석 - k means gunjibbunseog
사람의 팔꿈치 형상

 

 

- 실루엣 분석(silhouette analysis)

  • 군집 품질을 평가하는 또 다른 방법
  • 클러스터 내 데이터들이 얼마나 조밀하게 모여있는지를 측정하는 그래프 도구
K means 군집분석 - k means gunjibbunseog
  • 계수 구하는 방법
    1. 하나의 임의의 데이터(x(i))와 동일한 클러스터 내의 모든 다른 데이터 포인트 사이의 거리를 평균하여 클러스터의 응집력(a(i))을 계산
    2. 앞서 선정한 데이터와 가장 가까운 클러스터의 모든 샘플간 평균 거리로 최근접 클러스터의 클러스터 분리도(b(i))를 계산
    3. 클러스터 응집력과 분리도 사이의 차이를 둘 중 큰 값으로 나눠 실루엣 계수(s(i))를 계산
  • 분리도 = 응집력 : 실루엣 계수는 0이 됨, 클러스터가 중첩되어 있다는 의미
  • 분리도 > 응집력 : 이상적인 실루엣 계수인 1에 가깝게 됨
  • 분리도 : 데이터가 다른 클러스터와 얼마나 다른지를 나타냄
  • 응집력 : 클러스터 내 다른 샘플과 얼마나 비슷한지를 나타냄, 작을수록 클러스터 내 다른 데이터들과 비슷함
import numpy as np
from matplotlib import cm
from sklearn.metrics import silhouette_samples
# sklearn의 metrics 모델 안에 silhouette_samples함수로 계산


# k-means++ 알고리즘

km = KMeans(n_clusters = 3,    
           init = 'k-means++', 
           n_init = 10,       
           max_iter = 300,     
           tol = 1e-04,        
           random_state = 0)

y_km = km.fit_predict(X)

cluster_labels = np.unique(y_km)
n_clusters = cluster_labels.shape[0]


# 실루엣 분석

silhouette_vals = silhouette_samples(X, y_km, metric = 'euclidean')


# 시각화

y_ax_lower, y_ax_upper = 0, 0
yticks = []
for i, c in enumerate(cluster_labels) :
    c_silhouette_vals = silhouette_vals[y_km == c]
    c_silhouette_vals.sort()
    y_ax_upper += len(c_silhouette_vals)
    color = cm.jet(float(i) / n_clusters)
    plt.barh(range(y_ax_lower, y_ax_upper), c_silhouette_vals, height = 1.0,
             edgecolor = 'none', color = color)
    
    yticks.append((y_ax_lower + y_ax_upper) / 2)
    y_ax_lower += len(c_silhouette_vals)
    
silhouette_avg = np.mean(silhouette_vals)

plt.yticks(yticks, cluster_labels + 1)
plt.ylabel('Cluster')
plt.xlabel('Silhouette coefficient')

plt.tight_layout()
plt.show()
K means 군집분석 - k means gunjibbunseog
이상치를 가진 클러스터 구별할 수 있게 됨 / 위의 그래프 경우에는 실루엣 계수가 대부분 최대값 1에 가깝게 형성되어 있으므로 군집이 잘 형성된 경우라 볼 수 있음
K means 군집분석 - k means gunjibbunseog
군집의 개수가 2개일 경우 → 군집이 비교적 잘 형성되어 있지 않다고 평가됨

728x90

공유하기

게시글 관리

구독하기데이터분석_공부기록

저작자표시

  • 카카오스토리
  • 트위터
  • 페이스북

'AI > Machine Learning' 카테고리의 다른 글

[ML] 강화학습  (0)2021.05.13[ML] 군집분석(계층 군집, 밀집도 기반 군집)  (0)2021.05.12[ML] 머신러닝 모델(결정 트리 학습, K-근접 이웃)  (0)2021.05.11[ML] 머신러닝 모델(퍼셉트론, 로지스틱 회귀, 서포트 벡터 머신)  (0)2021.05.11[ML] 경사하강법 - 편미분  (0)2021.05.10