데이터분석/분석-비지도학습

파이썬 k-means 클러스터링 군집분석

씩씩한 IT블로그 2022. 9. 11. 21:48
반응형

K-means 클러스터링

sklearn의 kmeans클러스터링을 이용하여 군집분석을 수행한다.

데이터는 iris데이터를 사용한다.

 

코드

- 필요한 패키지 설치

# 필요한 패키지 설치
import pandas as pd
import numpy as np
from sklearn import datasets

import seaborn as sns
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d import proj3d

 

- 본 데이터 업로드 및 산점도 그리기

# skearn.datasets에 포함된 iris(붓꽃) 데이터 가져오기
iris = datasets.load_iris() 
data= pd.DataFrame(iris.data).iloc[:,:3]
data.columns = iris.feature_names[:3]

X = data.copy()
X["target"] = iris.target
display(X)

# 3d scatterplot 그리기
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')

scatter = ax.scatter(X.iloc[:,0],
                     X.iloc[:,1],
                     X.iloc[:,2],
                     s=10, #사이즈
                     c=X.target,
                     cmap="rainbow",
                     alpha=1, #투명도
                     )
# 축표시
ax.set_xlabel(X.columns[0])
ax.set_ylabel(X.columns[1])
ax.set_zlabel(X.columns[2])

# 범례표시
legend1 = ax.legend(*scatter.legend_elements(), title="Classes")
ax.add_artist(legend1)

plt.show()

 

- k-means로 군집분석 한 후 산점도 그리기

원래 데이터를 이용하여 지도학습 시킨것이 아닌,

붓꽃 데이터를 이용하여 군집분석한 후 원래 분류와 차이를 보는 것이므로 class는 다를 수 있다.

(즉 원래 붓꽃 데이터를 분류하는 모델이 아닌, 군집분석을 하기위해 붓꽃데이터를 써봤을 뿐)

from sklearn.cluster import KMeans

# [inertia를 통해서 최적 분류 개수 찾기]
X = data.copy()
inertias = []
num=10
for k in range(1,num):
    model = KMeans(n_clusters=k)
    model.fit(X)
    inertias.append(model.inertia_)

plt.figure(figsize=(4, 4))
plt.plot([i for i in range(1,num)], inertias, '-o')
plt.xlabel('number of clusters, k')
plt.ylabel('inertia')
plt.xticks([i for i in range(1,num)])
plt.show()

# [모델생성 및 학습]
clust_model = KMeans(n_clusters = 3 # 클러스터 갯수
#                      , n_init=10 # initial centroid를 몇번 샘플링한건지, 데이터가 많으면 많이 돌릴수록안정화된 결과가 나옴
#                      , max_iter=500 # KMeans를 몇번 반복 수행할건지, K가 큰 경우 1000정도로 높여준다
#                      , random_state = 42
#                      , algorithm='auto'
                    )
clust_model.fit(X) 

# [예측값과 군집중심값]
centers = clust_model.cluster_centers_ # 각 군집의 중심점
pred = clust_model.predict(X) # 각 예측군집

# [3d scatterplot 그리기]
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')
X["pred"] = pred
display(X)

ax.scatter(centers[:,0],centers[:,1],centers[:,2] ,c='black', s=200, marker='*')
scatter = ax.scatter(X.iloc[:,0],
                     X.iloc[:,1],
                     X.iloc[:,2],
                     s=10, #사이즈
                     c=X.pred,
                     cmap="rainbow",
                     alpha=1, #투명도
                     )

# 축표시
ax.set_xlabel(X.columns[0])
ax.set_ylabel(X.columns[1])
ax.set_zlabel(X.columns[2])

# 범례표시
legend1 = ax.legend(*scatter.legend_elements(), title="Classes")
ax.add_artist(legend1)

plt.show()

반응형