기간 설정 : 데이터 기간 설정, 의미있는 패턴을 도출하기 위해 최소 3개월 이상의 데이터셋 권장
이상치 기준 선정 및 제외 : IQR, Z-SCORE 등 다양한 이상치 기법 사용 및 기록
Silhouette Coefficient : 각 군집간의 거리가 얼마나 효율적으로 분리되어 있는지
scree plot 의 elbow-point : 알고리즘이 군집이 나뉘는 시간까지 고려한 k값 도출
Distance Map : 군집 간 거리를 시각화 해주는 기법
군집 분포 확인 : 데이터셋을 기반으로 데이터가 얼마나 밀도있게 나뉘었는지 확인하는 과정
-> 왼쪽은 군집이 잘 나눠지지 않았고, 오른쪽은 군집별 특성이 명확함
2~7번 과정을 반복하며 최적의 결과 도출 : 다양한 기준 고려
모델링 : 클러스터링 결과를 가지고 모델에 학습
데이터 적재 및 자동화 설정 : python을 통해 클러스터별로 나뉜 고객들을 별도 테이블에 저장, 스케줄 기능을 통해 주기별로 라이브한 데이터를 자동 테이블에 적재
인사이트 도출 : 적제된 테이블을 통해 클러스터별 인사이트 도출
# 기본 라이브러리 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()