from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
# 최적의 K 값 찾기 (엘보우와 실루엣 점수)
inertia = [] # 엘보우 방법을 위한 리스트
silhouette_scores = [] # 실루엣 점수를 위한 리스트
k_values = range(2, min(10, len(growth_rate_scaled))) # K 값 범위 설정
for k in k_values:
kmeans = KMeans(n_clusters=k, random_state=0)
kmeans.fit(growth_rate_scaled)
inertia.append(kmeans.inertia_)
silhouette_scores.append(silhouette_score(growth_rate_scaled, kmeans.labels_))
# 엘보우 방법과 실루엣 점수 그래프
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(k_values, inertia, 'bo-')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia (SSE)')
plt.title('Elbow Method for Optimal K')
plt.subplot(1, 2, 2)
plt.plot(k_values, silhouette_scores, 'go-')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Score for Optimal K')
plt.tight_layout()
plt.show()
클러스터링 코드
# KMeans 클러스터링
kmeans_final = KMeans(n_clusters=3, random_state=42)
final_clusters = kmeans_final.fit_predict(growth_rate_scaled)
# 군집 결과를 원본 데이터에 추가
New_DF_no_outliers['Cluster'] = final_clusters # 클러스터 결과를 바로 추가
# 결과 출력
print(New_DF_no_outliers)
모델 성능 평가
실루엣 스코어 분석: 각 클러스터에 대해 실루엣 스코어를 측정하여 클러스터링의 품질을 평가하였으며, 주요 클러스터의 실루엣 스코어는 평균적으로 0.5를 기록.
from sklearn.metrics import silhouette_samples, silhouette_score
# 평균 실루엣 점수 계산
average_silhouette_score = silhouette_score(growth_rate_scaled, final_clusters)
print(f"Average Silhouette Score: {average_silhouette_score:.3f}")
# 개별 데이터 포인트에 대한 실루엣 점수 계산
sample_silhouette_values = silhouette_samples(growth_rate_scaled, final_clusters)
# 결과 출력
New_DF_no_outliers['Silhouette Score'] = sample_silhouette_values
print(New_DF_no_outliers[['DIV', '1_2', '2_3', 'Cluster', 'Silhouette Score']])
결과
결과 시각화
산점도 시각화: 각 클러스터를 산점도로 나타내어, 각 제품군의 변화율과 클러스터의 관계를 시각적으로 확인
결과 및 고찰
소비 패턴에 대한 인사이트 제공: 제품군별로 유사한 판매 패턴을 갖는 제품들을 클러스터링함으로써, 소비 패턴을 이해하는 데 도움을 줄 수있음.
마케팅 전략에 활용: 각 클러스터의 구매 경향에 맞는 마케팅 전략과 프로모션을 제안할 수 있는 기반을 제공 할 수 있음.
이번 프로젝트에서는 카테고리별로 유사한 변화 패턴을 가진 그룹을 군집화하여 분석했습니다. 이상치를 제거하여 데이터의 신뢰도를 높였고, 이를 바탕으로 변화율에 따른 군집화를 진행했습니다.
데이터가 특정 월이나 계절적 요인, 그리고 시장 트렌드에 따라 변화할 가능성이 있지만, 이번 분석에서는 이러한 요인들을 구체적으로 확인하지 못한 점이 아쉬움으로 남습니다.
군집화의 품질을 평가하기 위해 Silhouette Score를 사용했으며, 일부 제품에서는 0.3 정도로 낮은 값을 보였습니다.
낮은 Silhouette Score는 군집의 경계가 명확하지 않거나, 데이터가 적절히 분리되지 않았을 수도 있습니다.
이후에는 데이터 기간을 확장하거나, 군집화에 사용할 변수를 추가하는 방법 등을 통해 Silhouette Score를 높여 더 정확한 군집화를 하려합니다.