K-means

  • yellowbrick
  • 선행 작업 문자형 수치형으로
  • 선행 작업  scaling
#[문제 1] 필요 라이브러리 로딩
# numpy, pandas, matplotlib, seaborn, os 를 임포트 하기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os

# 시각화 표에서 에러나는 부분 글꼴 셋팅

plt.rc("font", family = "Malgun Gothic")
sns.set(font="Malgun Gothic", 
rc={"axes.unicode_minus":False}, style='white')

# 지수표현(소수점 2자리까지 나타내기)

pd.options.display.float_format = '{:.2f}'.format


# [문제 2] 스케일링 한 데이터 불러오기
# 1. data 변수에 'scaler_data.csv' 파일을 불러와서 할당, 인코딩은 utf-8
# 2. data 변수 호출해서 상위 5개 확인해보기

data = pd.read_csv('scaler_data.csv', encoding = 'UTF -8 ')


import yellowbrick

from sklearn.cluster import KMeans
from yellowbrick.cluster import KElbowVisualizer

 

# Elbow Method 활용해서 k 값 구하기

  • yellowbrick의 k-Elbow Mehod를 활용해서 최적의 k 값을 구하기(k값 결정하기 쉽게 도와주는 함수)
#Elbow Method를 통해 최적의 군집 수 도출을 해보자.

from yellowbrick.cluster import KElbowVisualizer
from sklearn.cluster import KMeans

# 1. 모델 선언하기 (random_state=2023, n_init=10 으로 설정)
model_E = KMeans(random_state=2023, n_init=10)

# 2. KElbowVisualizer 에 k-means 모델과 k값 넣어서 만들기(Elbow_M 에 할당)
# k값은 k=(3,11)사이의 값중에서 찾는 것으로 넣으면 된다.

Elbow_M = KElbowVisualizer(model_E, k=(3, 11))

# 3. Elbow 모델 학습하기(fit)

Elbow_M.fit(data)

# 4. Elbow 모델 확인하기(show()활용)

Elbow_M.show()

 

yellow brick 이용 적절 k 찾기

 

선행 작업 문자형 수치형으로

# 상품타입'범주를 인코딩 해보기
# loc를 활용해서 '기본,중급'을 0으로 변환/ '고급'을 1로 변환

data_choice.loc[(data_choice['상품타입']=='기본') | (data_choice['상품타입']=='중급'),'상품타입'] = 0
#---------------------------------------------------------------
data_choice.loc[data_choice['상품타입']=='고급','상품타입'] = 1


# 데이터 안의 정보는 수치형이지만 dtype은 아직 object 이다. 범주형을 수치형으로 변경해 주자!
# astype-> float64 활용해서 변경 후 확인
data_choice_n = data_choice_n.astype('float64')

 

선행 작업 scaling

# min-max-scaler & standard-scaler import!(sklearn의 processing 활용)
from sklearn.preprocessing import MinMaxScaler, StandardScaler

#. scaler라는 변수에 MinMaxScaler 넣어주기
scaler = MinMaxScaler()

#. 'data_choice_n'을 'scaler_data' 변수에 fit-transform으로 fit 하기!
# 각 열을 스케일링
scaler_data = scaler.fit_transform(data_choice_n)
print("scaler_data",scaler_data)

# 컬럼은 이전 dataframe('data_choice_n') 에서 그대로 가져와서 'scaler_data.columns'에 할당하기
# 컬럼 가져오기
scaler_columns = data_choice_n.columns

pd.DataFrame(scaler_data, columns = data_choice_n.columns)



# 스케일링이 잘 되었는지 'scaler_data' 데이터를 확인해보자
scaler_data = pd.DataFrame(scaler_data, columns = data_choice_n.columns)
scaler_data

내용

  • PCA
  • PCA 코드
  • 주성분 누적 분산 그래프 elbow method
PCA 사용하기
* 선언

- 생성할 주성분의 개수 지정
- 원래 feature의 수만큼 지정할 수 있음
( 일반적으로 feature 수 만큼 지정 )
- 생성 후 조정할 수 있음
* 적용
- x_train으로 fit & transform
- 다른 데이터는 적용
- 결과는 numpy array
* 코드
# 라이브러리
from sklearn.decomposition import PCA

# 주성분 분석 선언
pca = PCA(n_components=n)

# 만들고, 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

 

코드
1. 데이터 준비

(1) 라이브러리 로딩

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

from sklean.model_selection import train_test_split


(2) 스케일링
scaler = MinMaxScaler()
x = scaler.fit_transform(x)

(3) 데이터 분할
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size = .3, random = 20)


2. 차원 축소 : 주성분 PCA

(1) 주성분 만들기
from sklearn.decomposition import PCA

(2) 주성분 분석 수행
# 주성분을 몇 개로 할지 결정( 최대값 : 전체 feature 수)
n = x_train.shape[1]

# 주성분 분석 선언
pca = PCA(n_components = n)

# 만들고 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

(3) 결과는 numpy array로 주어지므로 데이터 프레임으로 변환

# 컬럼 이름 생성
column_names = ['PC' + str(i+1) for i in range(n) ]

# 데이터프레임으로 변환
x_train_pc = pd.DataFrame(x_train_pc, columns = column_names )
x_val_pc = pd.DataFrame(x_val_pc, columns = column_names
연습

# 주성분 1개짜리
pca1 = PCA(n_components = 1)
x_pc1 = pca1.fit_transform(x_train)

# 주성분 2개짜리
pca2 = PCA(n_components = 2)
x_pc2 = pca2.fit_transform(x_train)

# 주성분 3개짜리
pca3 = PCA(n_components = 3)
x_pc3 = pca3.fit_transform(x_train)
주성분 누적 분산 그래프

- 그래프를 보고 적절한 주성분의 개수를 지정(elbow method)
- x축 : PC 수
- y축 : 전체 분산크기 - 누적분산크기

# 코드
plt.plot( range(1, n+1), pca.explained_variance_ratio_, marker = '.')
plt.xlabel('No. of PC')

군집분석

1. 라이브러리 로딩
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 클러스터링을 위한 함수
from sklearn.cluster import KMeans

# 데이터 만들기
from sklearn.datasets import make_blobs
x, y = make_blobs(n_samples = 300, center=4, cluster_std=0.60, random_state = 0)
x = pd.DataFrame(x, columns = ['x1', 'x2'])
y = pd.Series(y, name = 'shape')

2. k-means
(1) k means 모델 만들기

1) 군집모델 생성
# k means 학습
model = KMeans(n_cluster=2, n_init='auto' )
model.fit(x)

# 예측
pred = model.predict(x)

# feature + pred + y 붙여서 비교
pred = pd.DataFrame(pred, columns = ['predicted'])
result = pd.concat( [ x, pred, y ], axis = 1)

시각화

# 코드
plt.scatter(result['x1'], result['x2'], c=result['predicted'], alpha =0.5)
plt.scatter(centers['x1'], centers['x2'], s = 50, marker ='D', c='r'

 

적정한 k 값 찾기

# k means 모델을 생성하게 되면 inertia 값을 확인 가능

model.inertia_
from sklearn.cluster import KMeans

kvalues = range(1, 10)
inertia = []

for k in kvalues:
    model = KMeans(n_clusters = k, n_init = 'auto')
    model.fit(x)
    inertias.append(model.inertia_)

# 그래프 그리기
plt.plot(kvalues, inertias, '-o')
plt.xlabel('numbers of clusters, k')
plt.ylabel('inertia')

# 적정한 k 값을 찾은 경우

 

분석 방법

 

 

+ Recent posts