판매율 기반 군집

2024. 10. 11. 18:00데이터분석

프로젝트 개요

과거 3개월치 판매 데이터를 기반으로 제품군을 클러스터링 하고,
소비 패턴 파악하는 것이 목표

기술 스택

  • 프로그래밍 언어: Python
  • 라이브러리: Pandas, NumPy, Scikit-Learn, Matplotlib
  • 모델링 기법: K-means 클러스터링, 실루엣 스코어 분석

프로젝트 상세 설명

데이터 로드 및 전처리

  • DIV별 판매량 : Excel에서 각 제품군 별 판매량을 저장한 새로운 시트를 작성하여 파이썬 분석의 입력 데이터로 활용
  • 월간 변화율 계산: 3개월간 판매량 변화율을 계산하여 클러스터링 분석의 주요 변수로 사용했습니다.
  • 이상치 제거: 이상치로 인한 클러스터의 왜곡을 방지하기 위해 데이터에서 이상치를 제거하였습니다.
더보기

DIV별 판매량 (Excel SumIF 활용)

 

월간 변화율 계산

1~2월 변화: ((2월 - 1월 ) / 1월) *100

 

이상치 제거

# IQR 기반 이상치 탐지 및 제거 함수
def filter_outliers(df, columns):
    no_outliers_df = df
    outliers_df = pd.DataFrame()

    for column in columns:
        Q1 = df[column].quantile(0.25)
        Q3 = df[column].quantile(0.75)
        IQR = Q3 - Q1
        lower_bound = Q1 - 1.5 * IQR
        upper_bound = Q3 + 1.5 * IQR

        # 이상치와 이상치가 아닌 데이터를 구분하여 각각 저장
        outliers_df = pd.concat([outliers_df, no_outliers_df[(no_outliers_df[column] < lower_bound) | (no_outliers_df[column] > upper_bound)]])  # 제거된 이상치
        no_outliers_df = no_outliers_df[(no_outliers_df[column] >= lower_bound) & (no_outliers_df[column] <= upper_bound)]  # 이상치가 아님

    return no_outliers_df, outliers_df.drop_duplicates().reset_index(drop=True)

# '1_2'와 '2_3' 열에 대해 이상치 제거 및 탐지 수행
New_DF_no_outliers, removed_outliers = filter_outliers(New_DF, ['1_2', '2_3'])

# 결과 확인
print(f"이상치 제거 전 데이터 개수: {len(New_DF)}")
print(f"이상치 제거 후 데이터 개수: {len(New_DF_no_outliers)}")
print(removed_outliers)

이상치 데이터를 봤을때, 

1월달 값을 제외한 2월 3월 판매량은 비슷하므로 새로 출시된 제품군이 있을 가능성이 있음.

 

군집 분석

  • K-means 클러스터링: 3개월간의 변화율을 기반으로 3개의 주요 클러스터로 분류 
  • 클러스터 특성 해석:
    • 클러스터 0: 1월에서 2월 사이에 감소한 후, 2월에서 3월 사이에 큰 증가를 보임. (Youth Pants, Wet Tissue)
    • 클러스터 1: 1월에서 2월 사이 약간 증가하고 2월에서 3월 사이 소폭 감소함. (Baby & Child Care, Family Care)
    • 클러스터 2: 1월에서 2월 사이 큰 증가가 발생하고 2월에서 3월 사이에는 감소세로 전환됨.
      (Health Care, Skin Care)
더보기

K값 찾기

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를 높여 더 정확한 군집화를 하려합니다.

 

SALES_Cluster.ipynb
0.11MB
SALES_DATA.xlsx
0.31MB

'데이터분석' 카테고리의 다른 글

판매 건수를 통한 서버 최적화  (0) 2024.10.12
다음달 판매 예측  (0) 2024.10.02
Boston 범죄데이터 분석  (0) 2024.09.30
제품 판매 데이터 분석  (0) 2024.07.22