개발학습일지

[AI] 머신러닝 Unsupervised. K-Means Clustering와 반복문, 그룹 정보얻기 본문

AI/Machine Learning

[AI] 머신러닝 Unsupervised. K-Means Clustering와 반복문, 그룹 정보얻기

처카푸 2024. 4. 16. 09:48

기본 임폴트 라이브러리

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

오늘 포스팅에서 사용할 df

df = pd.read_csv('Mall_Customers.csv')
df.head()

 

 

데이터를 비슷한 정보끼리 묶으려고 한다

1. nan 있는지 확인한다

df.isna().sum()
>>>
    CustomerID                0
    Genre                     0
    Age                       0
    Annual Income (k$)        0
    Spending Score (1-100)    0
    dtype: int64

 

2. 필요한 데이터 X로 묶어준다

X = df.loc[ : , 'Genre':'Spending Score (1-100)']

 

3. X 에 Genre 의 문자열을 숫자로 바꿔준다

- Genre 에 몇가지의 문자열이 있는지 확인하고 라벨링 인코딩을 할지 원핫인코딩을 할지 결정해준다

X['Genre'].nunique()
# 2  # 2개 여서 라벨링인코딩을 해준다
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
X['Genre'] = encoder.fit_transform(X['Genre'])
sorted(X['Genre'].unique())
# [0, 1]
# 숫자로 변경 완료!

 

4. KMeans를 사용해서 그룹끼리 분류한다

- 클러스터 라이브러리 임폴트

from sklearn.cluster import KMeans

- KMeans(n_clusters= K, random_state= *) 사용  _K 값에 숫자를 넣어 잘 분류되는 값을 찾아야한다

- n_clusters= K 는 사람이 결정 해야하는 파라미터인 하이퍼 파라미터(hyper parameters)이다

kmeans = KMeans(n_clusters= 3, random_state= 10)
y_pred = kmeans.fit_predict(X)
y_pred
>>>
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1,
           2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
           2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
           2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
           2, 1])
df['Group'] = y_pred
df.head()

그룹 정보를 추가한 df

 

5. WCSS 를 반복문을 사용해  K 값을 1-10의 수로 구해서 차트로 만들어 보자 

- WCSS(Within Cluster Sum of Squares)란?

   각 클러스터 내의 관측치 간의 분산의 합을 의미한다

   각 관측치와 중심점(centroid) 간의 거리를 측정하고 두 값 사이의 제곱 차이를 계산하여 이름이 붙여졌다

   따라서, WCSS는 클러스터 내의 총 변동성을 설명하는 데 일반적으로 사용되고,

   WCSS 값과 클러스터의 수, K를 결정하는 데 사용된다.

- 클러스터 라이브러리 임폴트

from sklearn.cluster import KMeans

- 반목문을 사용해서 K 값 넣기

wcss = []
for k in range(1, 10+1):
    kmeans = KMeans(n_clusters= k, random_state= 10)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)

- wcss 값을 확인한 후 차트로 만들자

wcss
>>>
    [308862.06,
     212889.442455243,
     143391.59236035674,
     104414.67534220166,
     75399.61541401484,
     58348.64136331505,
     51167.19736842105,
     45324.85021951262,
     40811.455768566826,
     37141.48254409704]
plt.plot(wcss)
plt.show()

X축 K 값인 차트

6. 더 정확한 그룹 정보를 구할 수 있다

- 차트를 보고 K 값을 사람이 선택해서 그룹 정보를 정확하게 구해 df에 넣어야 한다

kmeans = KMeans(n_clusters=5, random_state= 1)
y_pred = kmeans.fit_predict(X)
y_pred
>>>
    array([3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1,
           3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1,
           3, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
           4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
           4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
           4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 0, 2, 4, 2, 0, 2, 0, 2,
           0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 4, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
           0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
           0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
           0, 2])
df['Group'] = y_pred
df.head()