본문 바로가기

카테고리 없음

[python] k-means clustering 데이터 분석 공부 정리

728x90
반응형
k- means 군집 분석의 특징
연속형 변수에 활용 가능 
초기 중심값은 임의로 선택가능
장점 : 알고리즘 단순, 빠름, 계층보다 많은 데이터 가능
단점 : 군집 수 , 가중치 ,거리 정의 어렵, 결과 해석 어렵, 이상값 영향 큼 

 

from sklearn.datasets import make_blobs # 가상의 데이터셋을 만들어주는 함수 

# 필요 데이터 로딩 

import pandas as pd 
import numpy as np
import math 
import scipy as sp
import seaborn as sns 
import matplotlib.pyplot as plt 

sns.set_palette("Set2")


# make_blobx  : 보통 클러스링 용 가상데이터를 생성하는데 사용하는 함수 
## n_samples : sample  수 , 
## n_features : 독립변수의 수 default : 20 
## centers : 생성할 클러스터의 수 혹은 중심 

## x : [n_samples,n_features] 크기의 배열 ( 독립변수 )
## y : [n_samples]  크기의 배열  ( 종속변수 )


x,y = make_blobs (n_samples = 100, centers = 4 , n_features = 2 , random_state = 6)

points = pd.DataFrame(x,y).reset_index(drop = True) ## 왚의 열을 가져온다. 
points.columns = ["x","y"]

x

#### step 1 . k 값 설정하기 


# 만든 데이터 셋을 scatter plot으로 그려봄 
# 데이터 결과를 보면 대충 4개의 군집이 적당할 것 같음 
sns.scatterplot(x = "x", y = "y", data = points, palette= "Set2")

 

#### step 2 . 중심점 (Centroid) 구하기 

# 클러스터의 중심점은 각 cluster의 x 좌표의 평균과  y좌표의 평균이 된다.
# 클러스팅 시작 전에는 클러스터가 생성되지 않아 중심점을 구할 수 없기 때문에 전체 데이터 중에서 k = 4 로 임시로 데이터를 sample 추출하여 중심점으로 활용한다. 
centroids = points.sample(4, random_state=1)
centroids

#### step 3 . 각 중심점으로부터의 거리를 구해 가까운 중심점의 cluster로 할당하기 


# 각 데이터에 대하여 각 중심점과의 유클리드 거리 계산 
# 100 * 4  --> 4개의 중심점과 거리 
distance = sp.spatial.distance.cdist(points, centroids, "euclidean")


# 가장 거리가 짧은 중심점의 cluster로 할당 
cluster_num = np.argmin(distance, axis = 1 ) # 최솟값 색인의 위치를 반환한다. 

cluster_num

# 결과 확인 
results = points.copy ()
results["cluster"] = np.array (cluster_num) 
results.head()

 

 

#### step 4 . 그래프로 군집확인 

sns.scatterplot(x="x", y="y", hue="cluster", data=results, palette="Set2");
# 잘분류된 cluster도 있고 아닌 것도 있다.

### step 45 변경된 cluster에 대해서 중심점 구하기 


# x좌표의 평균과 y 좌표의 평균으로 다시 중심점 계산 

centroids_2 = results.groupby ("cluster").mean()
centroids_2

distance2  = sp.spatial.distance.cdist(points, centroids_2, "euclidean")
cluster_num_2 = np.argmin(distance2, axis = 1 ) # 최솟값 색인의 위치를 반환한다. 

cluster_num_2  

results_2 = points.copy ()
results_2["cluster"] = np.array (cluster_num_2) 
results_2.head()
sns.scatterplot(x="x", y="y", hue="cluster", data=results_2, palette="Set2"); 
# 2번째 결과 

results_2.tail()

### step 6. 반복해서 시도 

# x좌표의 평균과 y 좌표의 평균으로 다시 중심점 계산 

centroids_4 = results_3.groupby ("cluster").mean()
centroids_4

distance4  = sp.spatial.distance.cdist(points, centroids_4, "euclidean")
cluster_num_4 = np.argmin(distance4, axis = 1 ) # 최솟값 색인의 위치를 반환한다. 


results_4 = points.copy ()
results_4["cluster"] = np.array (cluster_num_4) 
sns.scatterplot(x="x", y="y", hue="cluster", data=results_4, palette="Set2");

4번째, 5번째 수행 차이 별로 없어서 실행 종료 

 

### 수동으로 하지 말고 Scikit - Learn 을 이용해보자 
 Scikit - Learn 에서 k-means clustering 관련 함수를 제공한다. 
from sklearn.cluster import KMeans 
# k-means clustering 실행
kmeans = KMeans(n_clusters=4)
kmeans.fit(points)

# 결과 확인
result_by_sklearn = points.copy()
result_by_sklearn["cluster"] = kmeans.labels_
result_by_sklearn.head()

sns.scatterplot(x="x", y="y", hue="cluster", data=result_by_sklearn, palette="Set2");

https://velog.io/@gayeon/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-k-means-clustering-with-sklearn

 

출처 : 

 

데이터 분석 초보자를 위한 k-means clustering (with Scikit-Learn)

1. 컴퓨터도 학습을 한답니다. 2. k-means clustering 3. 이 세상에 완벽한 방법은 없다

velog.io

 

반응형