유사성이 높은 대상의 집단을 분류하는 분석 방법
계층적 군집분석과 비계층적 군집분석 으로 구분함
전통적인 계층적 군집분석은 군집의 개수를 나중에 선정함
비계층적 군집분석인 K-means는 군집의 수를 가장 먼저 선정함
K-mean 군집분석은 초기 중심 값은 임의로 선정하며, 중심 값이 이동함
대표적인 방법 K-means
K-평균군집(centroid): 임의의 지점 K개를 선택해 해당 중심에서 가까운 데이터를 군집화
n_clusters(하이퍼파라미터) 반드시 설정
# KMeans 라이브러리
from sklearn.cluster import KMeans
# 데이터 불러오기
from sklearn.datasets import load_wine
dataset = load_wine()
data = pd.DataFrame(dataset.data, columns=dataset.feature_names)
df = data.copy()
# KMeans 선언 및 학습
kmeans = KMeans(n_clusters=3)
kmeans.fit(df)
# KMeans 예측
pred = kmeans.predict(df)
pred
# 실제값과 예측값 비교
df['target'] = dataset.target
df['pred'] = pred
df
# PCA
df = data.copy()
pca = PCA(n_components=2)
df = pca.fit_transform(df)
df = pd.DataFrame(df) # 넘파이 형태로 반환되므로 DF형태로 변환
df.head()
# Kmeans
kmeans = KMeans(n_clusters=3)
kmeans.fit(df)
pred = kmeans.predict(df)
df['kmeans'] = pred
df
# 각 군집의 중심점
centers = kmeans.cluster_centers_
# 시각화
import seaborn as sns
plt.figure(figsize=(12, 6))
sns.scatterplot(x=df.iloc[:,0], y=df.iloc[:,1], hue=df['kmeans'])
plt.scatter(centers[:,0], centers[:,1])
클러스터 개수를 대체 몇 개로 잡아야 할 지
시각화를 시켜본 후, 대충 몇 개를 잡을지 파악하기 위함
그래프에서 급격히 떨어지다가 완만해지는 부분을 (e.g. 2,3,4) 클러스터 개수로 설정하면 됨
# 군집 수 찾기
inertia = [] # inertia 변수에 리스트 만들기
for i in range(1,10):
kmeans = KMeans(n_clusters=i, random_state=2022)
kmeans.fit(df)
inertia.append(kmeans.inertia_) # inertia 리스트에 꼭 추가해주어야 함
plt.plot(range(1,10),inertia)
대표적인 방법 : 덴드로그램
k-means와 달리 군집 개수를 사전에 설정하지 않음
*용어 : 덴드로그램? 개체간의 결합되는 순서를 나타낸 트리 형태의 다이어그램이다.
# 덴드로그램, 와드 함께 불러오기
from scipy.cluster.hierarchy import dendrogram, ward
# PCA를 통해 데이터 축소시키기
df = data.copy()
pca = PCA(n_components=2) # 2차원으로 축소
df = pca.fit_transform(df) # df를 transform 하여 df 변수에 다시 담음
df = pd.DataFrame(df)
# (데이터) 샘플링
kdata = df[:3].copy() # 앞에서 부터 3개 (0,1,2) 를 copy함
kdata = kdata.append(df[70:73])
kdata = kdata.append(df[160:163])
kdata
# 덴드로그램
linkage = ward(kdata) # linkage 라는 거리정보를 ward 함수를 통해 받음
dendrogram(linkage)
K-means(비계층군집) 와 달리 덴드로그램(계층군집)은
시간/비용절감