본문 바로가기
Data/[스파르타 내일배움캠프]

[TIL]본캠프 44일차(심화 프로젝트 3일차)

by MIN_JOON 2024. 6. 19.
  • 주성분 분석(PCA)
    • 기존 데이터들 중 주성분이 될 수 있는 컬럼들을 변환하여 주성분을 추출해내는 것(데이터 바뀜)
    • 위와 같은 이유로 원래의 컬럼의 데이터 원본이 중요하다면 PCA 진행시 제외할 것
    • 주성분: 전체 데이터의 분산을 가장 잘 설명해주는 것
    • 하나의 변수는 하나의 차원을 의미하기 때문에 주성분 분석을 통해 차원 축소를 진행할 수 있음
  • 프로젝트 내의 PCA 진행 및 클러스터링
# 엘보우 방식 통해 클러스터 개수 계산
sse = []
scaler = StandardScaler()
rfm_scaled = np.log(rfm[['recency','frequency','monetary']])
rfm_scaled = scaler.fit_transform(rfm_scaled)
for k in range(1, 11):
    kmeans = KMeans(n_clusters = k, random_state=42)
    kmeans.fit(rfm_scaled)
    sse.append(kmeans.inertia_)

plt.figure(figsize=(10, 6))
plt.plot(range(1, 11), sse, marker='o')
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()

# 스케일링된 데이터로 PCA (Principle Component Analysis) 주성분 분석 
pca = PCA(n_components = 2)  
pca_data = pca.fit_transform(rfm_scaled)

print('Explained variance ratio:', pca.explained_variance_ratio_)

#클러스터링
k = 4
kmeans = KMeans(n_clusters = k, random_state = 42, init = 'k-means++')
clusters = kmeans.fit_predict(rfm_scaled)
cluster_labels = kmeans.labels_

# kmeans 시각화
plt.figure(figsize=(15, 10))
sns.scatterplot(x=pca_data[:, 0], y=pca_data[:, 1], hue=clusters, palette='viridis')
plt.title('KMeans Clustering Results')
plt.xlabel('PCA 1')
plt.ylabel('PCA 2')
plt.show()

#각 군집별 RFM 시각화
rfm_df = rfm.groupby('cluster').agg({'recency': 'mean', 'frequency': 'mean', 'monetary': 'mean'}).round(2).reset_index()
fig, ax=plt.subplots(1,3,figsize=(15,5))
sns.barplot(data = rfm_df , x = 'cluster', y = 'recency', ax=ax[0], color = 'lightblue');
sns.barplot(data = rfm_df , x = 'cluster', y = 'frequency', ax=ax[1], color = 'lightgreen');
sns.barplot(data = rfm_df , x = 'cluster', y = 'monetary', ax=ax[2], color = 'red');

프로젝트 시각화