320x100
320x100
실제 파이썬 코드를 통해 예시를 공부해봤습니다.
# 원본 데이터셋 복사
rfm_online_sales = online_sales.copy()
# 날짜 형식 변환
rfm_online_sales['거래날짜'] = pd.to_datetime(rfm_online_sales['거래날짜'])
# 데이터 내 마지막 날짜 계산
last_date = rfm_online_sales['거래날짜'].max()
# Recency 계산
recency_data = rfm_online_sales.groupby('고객ID')['거래날짜'].max().reset_index()
recency_data['Recency'] = (last_date - recency_data['거래날짜']).dt.days
# Frequency 계산
frequency_data = rfm_online_sales.groupby('고객ID')['거래ID'].count().reset_index()
frequency_data.rename(columns={'거래ID': 'Frequency'}, inplace=True)
# Monetary 계산
rfm_online_sales['SalesValue'] = rfm_online_sales['수량'] * rfm_online_sales['평균금액']
monetary_data = rfm_online_sales.groupby('고객ID')['SalesValue'].sum().reset_index()
monetary_data.rename(columns={'SalesValue': 'Monetary'}, inplace=True)
# RFM 데이터 결합
rfm_data = recency_data.merge(frequency_data, on='고객ID').merge(monetary_data, on='고객ID')
# Recency, Frequency, Monetary에 점수 부여
rfm_data['R_Score'] = pd.qcut(rfm_data['Recency'], 4, labels=[4, 3, 2, 1])
rfm_data['F_Score'] = pd.qcut(rfm_data['Frequency'], 4, labels=[1, 2, 3, 4])
rfm_data['M_Score'] = pd.qcut(rfm_data['Monetary'], 4, labels=[1, 2, 3, 4])
# RFM 스코어 계산
rfm_data['RFM_Score'] = rfm_data['R_Score'].astype(str) + rfm_data['F_Score'].astype(str) + rfm_data['M_Score'].astype(str)
고객 세그먼트 분류 함수를 통해 RFM 값에 따른 고객 세그먼트를 분류하였습니다.
# 고객 세그먼트 분류 함수
def classify_customer_segment(row):
R, F, M = row['R_Score'], row['F_Score'], row['M_Score']
if R == 4 and F == 4 and M == 4:
return 'VIP고객'
elif R >= 2 and F >= 3 and M == 4:
return '충성고객'
elif R >= 3 and F <= 3 and M <= 3:
return '잠재충성고객'
elif R == 2 and F < 2 and M < 2:
return '신규고객'
elif R >= 3 and F < 2 and M < 2:
return '정체고객'
elif R >= 3 and F >= 3 and M >= 3:
return '관심필요고객'
elif 2 <= R <= 3 and F < 3 and M < 3:
return '잠드려는고객'
elif R < 3 and 2 <= F <= 4 and 2 <= M <= 4:
return '이탈우려고객'
elif R < 2 and F == 4 and M == 4:
return '놓치면안될고객'
elif 2 <= R <= 3 and 2 <= F <= 3 and 2 <= M <= 3:
return '겨울잠고객'
elif R < 2 and F < 2 and M < 2:
return '이탈고객'
else:
return '기타'
# rfm_data에 'Customer_Segment' 컬럼 추가
rfm_data['Customer_Segment'] = rfm_data.apply(classify_customer_segment, axis=1)
모든 세그먼트에 대해 정의를 완료하고, 시각화 하는 과정 코딩입니다.
# 가능한 모든 세그먼트 정의
all_segments = ['VIP고객', '충성고객', '잠재충성고객', '신규고객', '정체고객', '관심필요고객',
'잠드려는고객', '이탈우려고객', '놓치면안될고객', '겨울잠고객', '이탈고객', '기타']
# 각 세그먼트별 고객 수 계산
segment_counts = rfm_data['Customer_Segment'].value_counts()
# 모든 세그먼트에 대한 고객 수를 0으로 초기화하고, 계산된 값으로 업데이트
segment_counts_all = {segment: 0 for segment in all_segments}
segment_counts_all.update(segment_counts)
# 데이터프레임으로 변환
segment_counts_df = pd.DataFrame(list(segment_counts_all.items()), columns=['Segment', 'Count'])
# 세그먼트별 고객 수를 내림차순으로 정렬
segment_counts_sorted_df = segment_counts_df.sort_values(by='Count', ascending=False)
# 바 그래프 시각화
plt.figure(figsize=(15, 8))
plt.bar(segment_counts_sorted_df['Segment'], segment_counts_sorted_df['Count'], color='skyblue')
plt.title('고객 세그먼트별 분포')
plt.xlabel('고객 세그먼트')
plt.ylabel('고객 수')
plt.xticks(rotation=45)
plt.show()
320x100
320x100
'빅데이터 관련 자료 > Python' 카테고리의 다른 글
상관관계와 회귀분석: 데이터의 관계를 탐구하는 여정 (0) | 2024.12.30 |
---|---|
Python: 혁신적인 프로그래밍 언어 (2) | 2024.07.24 |
파이썬에서 데이터 읽는 방법 (0) | 2024.03.06 |
Python 파이썬, 왜 다들 파이썬 파이썬 그러는가? (0) | 2023.10.31 |
Python 함수 group by, unstack() , transpose() (0) | 2023.02.02 |