주어진 데이터를 k개의 군집으로 묶는 알고리즘으로


클러스터의 개수에 따른 SSE(Sum of Squared Error) 값을 시각화하여 적절한 K의 값을 찾는 방법
def elbow(data, length):
sse = [] # sum of squre error 오차제곱합
for i in range(1, length):
kmeans = KMeans(n_clusters=i)
kmeans.fit(data)
# SSE 값 저장
sse.append(kmeans.inertia_)
plt.plot(range(1, length), sse, 'bo-')
plt.title("elbow method")
plt.xlabel("number of clusters")
plt.ylabel("SSE")
plt.show()
elbow(points, 10)

군집화가 잘 되어있다는 것은 다른 군집과는 멀리 떨어져있고, 동일한 군집끼리는 가까이 있다는 의미.
실루엣 계수: 군집간의 거리가 얼마나 효율적으로 분리되어 있는지 측정한 값.
가 클수록, 가 작을수록 군집화가 잘 된 것이므로
실루엣 계수가 1로 갈수록 군집화가 잘 되어있고, -1에 가까울수록 잘못 군집화 되어있음을 의미

sklearn.cluster.KMeans
- 함수 입력 값
n_cluster: 군집화 갯수max_iter: 최대 반복 횟수- 메소드
labels_: 각 데이터 포인트가 속한 군집 중심점 레이블cluster_centers: 각 군집 중심점의 좌표
sklearn.metrics.sihouette_score: 전제 데이터의 실루엣 계수 평균 값 반환
- 함수 입력 값
X: 데이터 세트labels: 레이블metrics: 측정 기준 기본은euclidean
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
iris_df = sns.load_dataset('iris')
sns.scatterplot(data = iris_df, x = 'sepal_length', y = 'sepal_width', hue = 'species')

iris_df2 = iris_df[['sepal_length','sepal_width','petal_length','petal_width']]
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3, init = 'k-means++', max_iter = 300, random_state= 42)
kmeans.fit(iris_df2)
kmeans.labels_
# 예측 결과:
''' array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0,
0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0,
0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2], dtype=int32)'''
iris_df2['target'] = iris_df['species'] # 정답
iris_df2['cluster'] = kmeans.labels_ # 예측
iris_df2

plt.figure(figsize = (12,6))
plt.subplot(1,2,1)
sns.scatterplot(data = iris_df2, x = 'sepal_length', y = 'sepal_width', hue = 'target')
plt.title('Original')
plt.subplot(1,2,2)
sns.scatterplot(data = iris_df2, x = 'sepal_length', y = 'sepal_width', hue = 'cluster', palette= 'viridis')
plt.title('Clustering')
plt.show()
