빅데이터분석기사/개념

[빅데이터분석기사] 군집분석(Clustering Analysis)

EveningPrimrose 2022. 6. 8. 00:03
반응형

군집분석

 

  분류 기준이 없는 상태에서 데이터 속성을 고려해 스스로 전체 데이터를 N개의 소그룹으로 묶어내는(Clustering) 분석법이다. 유사성이 높은 대상 데이터를 묶고, 서로 다른 그룹에 속한 데이터 개체 간의 이질성을 계산하는 과정을 거친다.

 

군집분석 예시

 

 

계층적 군집화(Hierarchical Clustering)

 

  가장 유사한 개체를 묶어 나가는 과정을 반복하여 원하는 개수의 군집을 형성하는 방법이다. 계층적 군집을 형성하는 방법에는 작은 군집으로부터 출발하여 군집을 변합해 나가는 병합적 방법과 큰 군집으로부터 출발하여 군집을 분리해 나가는 분할적 방법이 있다.

 

 

  왼쪽 그림은 병합적 방법으로 군집을 형성해 나가는 과정을 보여주고 있다.

  계층적 군집의 결과는 오른쪽 그림과 같이 덴드로그램(dendrogram)의 형태로 표현된다.

  이 그림을 통해 군집들 간의 구조적 관계를 파악할 수 있다. 항목 간의 거리, 군집 간의 거리를 알 수 있고, 군집 내의 항목 간 유사 정도를 파악함으로써 군집의 견고성을 해석할 수 있다.

 

 

계층적 군집 종류

 

1) 최단 연결법(single linkage, nearest neighbor) :

  한 군집의 점과 다른 군집의 점 사이에 가장 짧은 거리로 군집 형성

2) 최장 연결법(complete linkage, farthest neighbor) :

  한 군집의 점과 다른 군집의 점 사이에 가장 긴 거리로 군집 형성

3) 중심 연결법(centroid linkage) :

  두 군집의 중심 간의 거리로 군집 형성

4) 평균 연결법(average linkage) :

  한 군집의 점과 다른 군집의 점 사이의 거리에 대한 평균을 사용하여 군집 형성

5) 와드 연결법(ward linkage) :

  군집 간 거리에 기반하는 다른 연결법과는 달리, 군집 내 오차제곱합(ESS, error sum of square)을 고려하여 군집 형성(군집 간 정보의 손실을 최소화하기 위해 군집화)

 

 

비계층적 군집(Non-Hierarchical Clustering Method)

 

  구하고자 하는 군집의 수를 정한 상태에서 설정된 군집의 중심에 가장 가까운 개체를 하나씩 포함해 가는 군집 형성 방식이다.

 

 

비계층적 군집 종류

 

1) K-평균 군집(K-means clustering) :

  사전에 결정된 군집 수 K에 기초하여 전체 데이터를 상대적으로 유사한 K개의 군집으로 구분하는 방법이다. 가장 대표적인 방법이며, 순차적 군집 분석법(Sequential Threshold Method)이라고도 한다.

2) 동시 군집 분석법(Paralleled Threshold Method) :

  사전에 지정된 값 안에 관측 대상이나 속성이 속하는 경우나 몇 개의 군집이 동시에 결정되는 경우

3) 최적 할당 군집 분석법(Optimizing Partitioning Method) :

  사전에 주어진 군집의 수를 위한 군집 내 평균거리를 계산하는 최적화 기준에 의거하여 최초의 군집에서 다른 군집으로 다시 할당하는 방법

 

 

K-평균 군집(K-means clustering) 과정

 

1) 클러스터 개수 K값 결정

2) 데이터 공간에 클러스터 중심 K개 할당

3) 각 클러스터 중심을 해당 클러스터 데이터의 평균으로 조정

4) 클러스터 중심이 변하지 않을 때까지 반복

 

 

DBSCAN 클러스터링

 

  DBSCAN의 경우 '밀도 기반'으로 군집을 할당한다. 여기서 밀도 기반이란, 어떤 데이터 포인트에서의 반지름 x내에 n개 이상의 포인트를 갖는 것을 하나의 군집으로 구분하는 것이다. 즉, K-Means와는 달리 군집의 개수 k를 미리 정의해놓을 필요는 없지만 반지름과 한 군집 내에 최소 n개의 포인트가 있어야하므로 이 두 개를 사전에 정의해야 한다.

 

 

  위 그림에서 반지름이 2이고, 최소 6개의 포인트를 가질 때 1개의 군집으로 할당하고자 한다. 이때 빨간 점은 해당 조건을 만족하여 코어 포인트가 된다. 보더 포인트란 코어 포인트의 반지름 내에 걸쳐서 '이웃'하고 있으나 최소 포인트 개수를 충족시키지 못하는 경우(초록색)를 말한다. 노이즈 포인트는 코어 포인트도 아니고 보더 포인트도 아닌 포인트를 말한다. 모든 데이터 포인트에서 해당 점이 코어 포인트가 되는지 확인하면서 군집을 할당하는 것이 DBSCAN 알고리즘의 핵심이다. K-Means와 달리 어느 군집에도 속하지 않는 노이즈 포인트는 제외하며 남아있는 포인트를 버리기 때문에 노이즈에 취약하지 않으며, 군집의 모양과 사이즈가 다양하게 나올 수 있다.

 

 

DBSCAN에서 최적의 반지름과 최소 군집 개수 찾는 법

 

  이제 최적의 반지름과 최소 군집 개수를 찾아보자. 이상적인 케이스를 생각하면, 하나의 군집 안에 있는 데이터 포인트의 거리는 가깝고, 노이즈 포인트와의 거리는 꽤 멀게 떨어져 있을 것이다. 어떤 군집 안에 있는 데이터 포인트들과 'k번째 인접한 이웃 데이터 포인트까지의 거리'를 계싼해보며 반지름을 찾아나간다. 즉, 그 거리가 급격하게 늘어날 때까지의 점을 찾는다. 여기서 k는 최소 군집 개수이며, k번째 인접한 이웃 데이터 포인트까지의 거리는 반지름이 된다.

 

 

문제정의

 

  계층적 군집 방법에 대해 알아보자.

 

 

DATASET

 

  붓꽃 꽃받침 길이(Sepal Length), 꽃받침 폭(Sepal Width), 꽃잎 길이(Petal Length), 꽃잎 목(Petal Width)

 

 

참고 소스코드

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

# 계층적 군집화
iris = load_iris()
#print(iris)
iris_df = pd.DataFrame(iris.data, columns = iris.feature_names)
print(iris_df.head(5))
from scipy.spatial.distance import pdist, squareform
distmatrix = pdist(iris_df.loc[0:4, ["sepal length (cm)", "sepal width (cm"]], metric = "euclidean")
#print("distmartix: ", distmatrix)
# squareform을 이용해 거리 값을 matrix 형태로 표현
row_dist = pd.DataFrame(squareform(distmatrix))
print("row_dist: ", row_dist)

# 단일(최단) 연결법
from scipy.cluster.hierarchy import linkage, dendrogram
r_cluster = linkage(distmatrix, method = "single")
print("r_cluster: ", r_cluster)
df = pd.DataFrame(r_cluster, columns = ["id_1", "id_2", "거리", "멤버 수"])
#print(df)
row_dend = dendrogram(r_cluster)
plt.tight_layout()
plt.show()

# 완전(최장) 연결법
from scipy.cluster.hierarchy import linkage, dendrogram
r_cluster = linkage(distmatrix, method = "completer")
print("r_cluster: ", r_cluster)
df = pd.DataFrame(r_cluster, columns = ["id_1", "id_2", "거리", "멤버 수"])
#print(df)
row_dend = dendrogram(r_cluster)
plt.tight_layout()
plt.show()

 

문제정의

 

  비계층적 군집 가운데 K-평균 군집(K-means Clustring)에 대해 알아보자.

 

 

참고 소스코드

 

# 초기 Data 시각화
from sklearn.datasets import make_bolbs
print(make_bolbs)
x, y = make_bolbs(n_samples = 150, n_features = 2, centers = 3, cluster_std = 0.5, shuffle = True, random_state = 0)
print("x.shape: ", x.shape, ", y.shape: ", y.shape)

plt.scatter(X[:, 0], x[:, 1], marker = "o", s = 50)
plt.grid()
plt.show()

# Kmeans Clustering
from sklearn.cluster import Kmeans
# 초기 클러스터 중심은 임의로 할당
init_centroid = "random"
# init_centroid = "k-means++" # 기본값
kmodel = KMeans(n_clusters = 3, init = init_centroid, random_state = 0)
# print(kmodel)
pred = kmodel.fit_predict(x)
# print("pred: ", pred)
plt.scatter(x[pred == 0, 0], x[pred == 0, 1], marker = "o", s = 50, c = "red", label = "cluster1")
plt.scatter(x[pred == 1, 0], x[pred == 1, 1], marker = "s", s = 50, c = "green", label = "cluster2")
plt.scatter(x[pred == 2, 0], x[pred == 2, 1], marker = "v", s = 50, c = "blue", label = cluster3")
plt.scatter(kmodel.cluster_centers_[:, 0], kmodel.cluster_centers_[:, 1], marker = "+", s = 80, c = "black", label = "center")
plt.legend()
plt.grid()
plt.show()

# n-clusters를 알기위한 방법
#1 엘보우 기법: 클러스터 내 오차제곱합이 최소가 되도록 클러스터의 중심을 결정해 나가는 방법
def elbow(x):
 sse = []
 for i in range(1, 11):
  km = KMeans(n_cluster = i, init = "k-means++", random_state = 0)
  km.fit(x)
   sse.append(km.inertia_)
  print(sse[3])
  plt.plot(range(1, 11), sse, marker = "o")
  plt.axvline(x=3, color='r')
  plt.axgline(y=sse[3], color='r')
  plt.xlabel("Number of Cluster")
  plt.ylabel("sse")
  plt.show()
elbow(x)
# 클러스터의 개수가 3일 때 팔꿈치 부분이므로, 최적의 클러스터 개수는 3으로 결정됨

 

문제정의

 

  계층적 군집 방법에 대해 알아보자.

  밀도 기반 군집화의 명확한 이해를 위해, 예제 데이터로 Moon 데이터 세트를 활용하였다. Moon 데이터는 make_moons 함수로 생성할 수 있으며, 샘플 수(n_samples)와 분산 정도(noise)를 조절해서 생성할 수 있다.

 

 

참고 소스코드

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
x, y = make_moons(n_samples=300, noise=0.05, random_state=42)
df = pd.DataFrame(x)
# df.head()
# 산점도
plt.figure(figsize=(7, 5)
plt.title("Before", fontsize=15)
plt.plot(df[0], df[1], "o")
plt.grid()
plt.show()

# DBSCAN 함수로 클러스터링을 수행해보자
# eps : 반경 설정(속성값의 단위)
# min_samples : 최소 개체 수
from sklearn.cluster import DBSCAN
db_scan = DBSCAN(eps=0.3, min_samples=5).fit(df.values)
df['cluster_db'] = db_scan.labels_
plt.figure(figsize=(7,5))
plt.title("After - DBSCAN", fontsize=15)
plt.scatter(df[0], df[1], c=df['cluster_db'])
plt.grid()
plt.show()

# K-means와 DBSCAN 비교
# 위와 동일한 Moon 데이터 세트로 KMeans를 활용해 작업을 수행해본 결과이다.
form sklearn.cluster import KMeans
kmeans_ = KMeans(n_cluster=2, random_state=42).fit(df.values)
df['cluster_km'] = kmeans_.labels_
plt.figure(figsize=(7, 5))
plt.title("After - KMeans", fontsize=15)
plt.scatter(df[0], df[1], c=df['cluster_km'])
plt.grid()
plt.show()

 

 

함께 보면 좋은 글

 

[빅데이터분석기사] 인공신경망(Artificial Neural Network)

 

[빅데이터분석기사] 인공신경망(Artificial Neural Network)

핵심요약 인공신경망(ANN)은 기계학습과 인지과학 분야에서 고안한 학습 알고리즘이다. 신경세포의 신호 전달체계를 모방한 인공뉴런(노드)이 학습을 통해 결합 세기를 변화시켜 문제를 해결하

it-utopia.tistory.com

 

[빅데이터분석기사] 심층신경망(Deep Neural Network)

 

[빅데이터분석기사] 심층신경망(Deep Neural Network)

핵심요약 심층신경망(Deep Neural Network)은 인공신경망(Aritificial Neural Network)과 동일한 구조와 동작 방식을 갖고 있다. 심층신경망은 단지 인공신경망에서 은닉층(Hidden Layer)의 깊이가 깊어진 형태를

it-utopia.tistory.com

 

[빅데이터분석기사] 합성곱신경망(Convolutional Neural Network)

 

[빅데이터분석기사] 합성곱신경망(Convolutional Neural Network)

핵심요약 합성곱신경망(CNN)은 인공신경망 모델의 하나로 패턴을 찾아 이미지를 분석하는데 특화된 알고리즘이다. 주요 구성은 크게 합성곱(Convolution) 연산과 풀링(Pooling) 연산으로 나눌 수 있다.

it-utopia.tistory.com

 

[빅데이터분석기사] 순환신경망(Recurrent Neural Network)

 

[빅데이터분석기사] 순환신경망(Recurrent Neural Network)

핵심요약 순환신경망(Recurrent Neural Network)은 시간 순서가 있는 데이터를 잘 예측하도록 설계된 인공신경망 모델들 중 하나이다. 과거의 신호를 기억할 수 있는 장치(Hidden State)를 두어 입력신호를

it-utopia.tistory.com

 

[빅데이터분석기사] 연관규칙분석(Association Rule Analysis)

 

[빅데이터분석기사] 연관규칙분석(Association Rule Analysis)

연관분석 연관분석이란, 대량의 트랜잭션 정보로부터 개별 데이터(변수) 사이에서 연관규칙(x면 y가 발생)을 찾는 것을 말한다. 가령 슈퍼마켓의 구매내역에서 특정 물건의 판매 발생 빈도를 기

it-utopia.tistory.com

 

반응형