rubus0304 님의 블로그

[머신러닝 군집] 본문

Data Analyst/라이브세션

[머신러닝 군집]

rubus0304 2024. 11. 28. 17:24

[Python] 머신러닝 특강 - 군집 분석

 

 

pip install yellowbrick   이거 해야함!!

 

 

Z-score 평균으로부터 얼마나 떨어져

Z-Score : 0 해당 데이터는 평균과 같음을 의미합니다. (=평균에서 떨어진 거리가 0)

 

IQR 4분위로 나눈

데이터의 25% 지점()과 75% 지점() 사이의 범위()를 사용합니다. 이를 벗어나는 값들은 모두 이상치로 간주

 

------ 이 아래로 cluster 해보기 ------

Isolation Forest   -- 프로젝트에서 사용해보기 

DBScan 밀도기반

 

표준화: 

실험하고 더 잘 나오는 거로....

 

minmax scale  자주 안 사용

모든 데이터 0과 1사이 배치  (표준화보다 정규화에 더 가까움) 

- 데이터의 분포를 가져갈 수 없기 때문

 

standrd scale  현실에서 그냥 씀

평균을 0, 표준편차를 1로 변환

데이터의 한계가 없음.

 

* 표준화는 필수가 아니다.

데이터셋이 압도적으로 크면 표준화해주는게 좋음

그러나 왠만하면 하는 걸 추천.

둘다 해보고 비교해보고 하는것.

 

 

  

차원축소(PCA)

많은 컬럼으로 구성된 다차원 데이터 세트의 차원을 축소해 새로운 차원의 데이터 세트를 생성하는 것.

(컬럼이 너무 많이 때문에 학습이 어렵고, 더 좋은 특징만 가지고 사용하겠다.)

 

각각의 테이블들에서 뽑아내서 합쳐서  보는 것.

 

 

클러스터링할 때,

1. 고유갓은 드랍해야함  숫자형만 넣어야함.

2. 연속형

0번인 친구와 1번 친구 특징 뭔지. 

 

평균 0 분산 1로 만드는 친구   StandardScaler ( )

 

한번 넣으면 알아서 컬럼끼리 수행함.

 

 

pca = PCA (n_components = )  (1~3까지만 넣을 수 있음) 1차원, 2차원, 3차원  (4부터는 안 나옴)

 

 

[실습]

 

# 기본 라이브러리 import 
import pandas as pd
import numpy as np
# 시각화 라이브러리 import 
import seaborn as sns
import matplotlib.pyplot as plt

# 표준화 라이브러리 import 
from sklearn.preprocessing import StandardScaler
# k 값 참고: scree plot을 통한 k 값 확인을 위한 라이브러리 import 
from yellowbrick.cluster import KElbowVisualizer
# k 값 참고: distance map 라이브러리 import 
from yellowbrick.cluster import intercluster_distance
from sklearn.cluster import MiniBatchKMeans
# k 값 참고: 실루엣 계수 확인을 위한 라이브러리 import 
from sklearn.metrics import silhouette_score
# 데이터셋 주성분 분석중 하나인 pca 를 수행하기 위한 라이브러리 import 
from sklearn.decomposition import PCA
# k-means 알고리즘 활용을 위한 라이브러리 import 
from sklearn.cluster import KMeans
import warnings 
warnings.filterwarnings('ignore')

# 데이터셋 로드
base_df = pd.read_csv('merge_df.csv')


# 결측치 확인
base_df.isnull().sum()

# 클러스터링 할 컬럼 지정
feature_names=['customer_zip_code_prefix','price','shipping_charges','payment_sequential','payment_value']

# 지정된 컬럼으로 새로운 dataframe 생성 
base_df = pd.DataFrame(base_df, columns=feature_names)

# 표준화
# 표준화 방식: standard scaler (평균0, 분산1)
scale_df = StandardScaler().fit_transform(base_df)

# 주성분 개수를 판단하기 위한 pca임의 시행 
pca = PCA(n_components=3)
pca.fit(scale_df)
# 설정한 주성분의 갯수로 전체 데이터 분산을 얼만큼 설명 가능한지 
pca.explained_variance_ratio_.sum()

# pca 시행
pca_df = pca.fit_transform(scale_df)
pca_df = pd.DataFrame(data = pca_df, columns = ['PC1','PC2','PC3'])  

# Show the first 5 firms
pca_df.head()

# 초기 k 값 참고를 위한 scree plot 을 그리고, 군집이 나뉘는 시간까지 고려한 k 값 확인 
model = KMeans()

# k 값의 범위를 조정해 줄 수 있습니다. 
visualizer = KElbowVisualizer(model, k=(3,12))

# 데이터 적용 
visualizer.fit(pca_df) 
visualizer.show()   

# 초기 k 값 참고를 위한 distance map 시각화
# 그룹의 갯수를 지정해 줄 수 있습니다. 저는 5로 적어두었습니다. 
intercluster_distance(MiniBatchKMeans(5, random_state=42), pca_df)

#  KMEANS
# 군집개수(n_cluster)는 5,초기 중심 설정방식 랜덤,  
kmeans = KMeans(n_clusters=5, random_state=42,init='random')

# pca df 를 이용한 kmeans 알고리즘 적용
kmeans.fit(pca_df)

# 클러스터 번호 가져오기 
labels = kmeans.labels_

# 클러스터 번호가 할당된 데이터셋 생성
kmeans_df = pd.concat([pca_df, pd.DataFrame({'Cluster':labels})],axis = 1)

# 클러스터 번호가 할당된 데이터셋 생성
kmeans_df

# 3차원으로 시각화 
x =kmeans_df["PC1"]
y =kmeans_df["PC2"]
z =kmeans_df["PC3"]

fig = plt.figure(figsize=(12,10))
ax = plt.subplot(111, projection='3d')
ax.scatter(x, y, z, s=40, c=kmeans_df["Cluster"], marker='o', alpha = 0.5, cmap = 'Spectral')
ax.set_title("The Plot Of The Clusters(3D)")

plt.show()


# 2차원으로 시각화

plt.figure(figsize=(8,6))

sns.scatterplot(data = kmeans_df, x = 'PC1', y='PC2', hue='Cluster')
plt.title('The Plot Of The Clusters(2D)')
plt.show()