- 전날에서 RFM 빼고 갈아엎기
- 사용 변수
→범주형: product_category_name, payment_type, customer_city, customer_state, customer_region
→연속형: price, shpping_charges, product_volume - 범주형 변수는 label encoding 시행, 연속형 변수는 왜도 보완을 위해 로그 변환 시행
- 변수들의 정규화 후 PCA 시행(n_components = 2)
- Elbow method를 이용해 클러스터 갯수 설정
- 클러스터 갯수 5개로 군집화 시행 후 실루엣 계수 확인
- 추후 클러스터링 된 데이터를 통해 군집 분석 진행
#PCA(주성분 분석) n = 2
pca_main = main_data.copy()
le = LabelEncoder()
pca_main['product_category_name'] = le.fit_transform(pca_main['product_category_name'])
pca_main['payment_type'] = le.fit_transform(pca_main['payment_type'])
pca_main['customer_city'] = le.fit_transform(pca_main['customer_city'])
pca_main['customer_state'] = le.fit_transform(pca_main['customer_state'])
pca_main['customer_region'] = le.fit_transform(pca_main['customer_region'])
#컬럼 선택
feature_names = ['product_category_name', 'price', 'product_volume','shipping_charges', 'payment_type', 'customer_city', 'customer_state', 'customer_region']
pca_sample = pca_main[feature_names]
#log_scale 변환
pca_sample['price'] = np.log1p(pca_sample['price'])
pca_sample['product_volume'] = np.log1p(pca_sample['product_volume'])
pca_sample['shipping_charges'] = np.log1p(pca_sample['shipping_charges'])
#정규화
scaler = StandardScaler()
pca_sample_scaled = scaler.fit_transform(pca_sample)
#PCA 실행
pca = PCA(n_components=2)
printcipalComponents = pca.fit_transform(pca_sample_scaled)
principal_df = pd.DataFrame(data=printcipalComponents, columns = ['principal component1', 'principal component2'])
principal_df.head(5)
#설명력 체크
print(pca.explained_variance_ratio_)
print(sum(pca.explained_variance_ratio_))
model = KMeans()
# k 값의 범위를 조정해 줄 수 있습니다.
visualizer = KElbowVisualizer(model, k=(3,10))
# 데이터 적용
visualizer.fit(principal_df)
visualizer.show()
#군집화
optimal_k = 5
kmeans = KMeans(n_clusters=optimal_k, random_state=42, init = 'k-means++')
clusters = kmeans.fit_predict(principal_df)
principal_df['cluster'] = kmeans.labels_
# kmeans 시각화
plt.figure(figsize=(15, 10))
sns.scatterplot(data=principal_df, x='principal component1', y='principal component2', hue='cluster', palette='viridis')
plt.title('KMeans Clustering Results')
plt.xlabel('PCA 1')
plt.ylabel('PCA 2')
plt.show()
#해당 군집화 실루엣 계수
score_samples = silhouette_score(principal_df, kmeans.labels_)
principal_df['silhouette_coeff'] = score_samples
print(np.mean(score_samples))
우당탕탕 클러스터링 마무리😢
'Data > [스파르타 내일배움캠프]' 카테고리의 다른 글
[WIL]본캠프 10주차 (2) | 2024.06.21 |
---|---|
[TIL]본캠프 46일차(심화 프로젝트 5일차) (0) | 2024.06.21 |
[TIL]본캠프 44일차(심화 프로젝트 3일차) (2) | 2024.06.19 |
[TIL]본캠프 43일차(심화 프로젝트 2일차) (2) | 2024.06.18 |
[TIL]본캠프 42일차(심화 프로젝트 1일차) (2) | 2024.06.17 |