[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.07.29
📕 학습 목록
- 쇼핑몰 고객 RFM 분석 및 시각화 프로젝트
📗 프로젝트 작업 내역
1) 프로젝트 제목
쇼핑몰 고객 RFM 분석 및 시각화
2) 프로젝트 목표
- 고객의 구매 데이터를 바탕으로 RFM(Recency, Frequency, Monetary) 분석을 통해 고객의 상태를 충성 고객, 이탈 가능 고객, 신규 고객 등으로 세분화하여 맞춤형 마케팅 전략을 수립
3) 사용한 데이터 셋
- 고객 구매 데이터 (고객ID, 구매 날짜, 구매 빈도, 구매 금액 등의 정보 포함)
4) 워크플로우
① 데이터 수집 및 전처리
import pandas as pd
import datetime as dt
# 데이터 파일 불러오기
def read_data(path):
df = pd.read_csv(path)
df["주문일자"] = pd.to_datetime(df["주문일자"]) # 주문일자를 datetime 형식으로 변환
return df
# 파일 경로 지정 및 데이터 로드
file_path = "shopping.csv"
df = read_data(file_path)
# 데이터 기본 정보 확인
df.info()
print(df.head())
② RFM 지표 계산
# 기준 날짜 설정
NOW = dt.datetime(2022, 12, 1)
# Recency 계산 함수
def calculate_recency(df):
df['Recency'] = df['주문일자'].apply(lambda x: (NOW - x).days)
return df
# Frequency 및 Monetary 계산
rfm = df.groupby('구매자').agg({
'Recency': 'min',
'주문일자': 'count',
'판매금액': 'sum'
}).rename(columns={'주문일자': 'Frequency', '판매금액': 'Monetary'})
print(rfm.head())
③ 고객 등급 분류
# RFM 점수 계산
def rfm_scoring(row):
r_score = 5 if row['Recency'] < 30 else 4 if row['Recency'] < 90 else 3 if row['Recency'] < 180 else 2
f_score = 5 if row['Frequency'] > 100 else 4 if row['Frequency'] > 50 else 3 if row['Frequency'] > 20 else 2
m_score = 5 if row['Monetary'] > 1000000 else 4 if row['Monetary'] > 500000 else 3 if row['Monetary'] > 100000 else 2
return r_score, f_score, m_score
rfm[['R_score', 'F_score', 'M_score']] = rfm.apply(rfm_scoring, axis=1, result_type="expand")
# 등급 부여
def assign_grade(row):
if row['R_score'] >= 4 and row['F_score'] >= 4 and row['M_score'] >= 4:
return 'VIP'
elif row['R_score'] >= 3 and row['F_score'] >= 3 and row['M_score'] >= 3:
return 'GOLD'
elif row['R_score'] >= 2 and row['F_score'] >= 2 and row['M_score'] >= 2:
return 'SILVER'
else:
return 'BRONZE'
rfm['Grade'] = rfm.apply(assign_grade, axis=1)
print(rfm[['R_score', 'F_score', 'M_score', 'Grade']].head())
④ 시각화
import matplotlib.pyplot as plt
import seaborn as sns
# 연도별 매출 시각화
df['연도'] = df['주문일자'].dt.year
sns.lineplot(data=df, x="연도", y="판매금액", marker="o")
plt.title("연도별 매출")
plt.show()
# 월별 매출 시각화
df['월'] = df['주문일자'].dt.month
sns.lineplot(data=df, x="월", y="판매금액", hue="연도", marker="o")
plt.title("연도별 월 매출")
plt.show()
# TOP 3 판매 상품의 구매자 분포
top_products = df.groupby("상품명")["판매금액"].sum().nlargest(3).index
top_data = df[df["상품명"].isin(top_products)]
sns.countplot(data=top_data, x="상품명", order=top_products)
plt.title("TOP 3 판매 상품 구매자 분포")
plt.show()
5) 프로젝트 결과
- 구현 기능
- 고객을 등급별로 분류하여 충성도가 높은 고객군을 파악
- 시각화를 통해 매출 트렌드와 주요 구매 상품의 분포를 확인
6) 트러블 슈팅
- 날짜 형식 이슈: 다양한 날짜 형식을 통일하는 데 어려움이 있었으나, pd.to_datetime 함수를 활용해 해결
- 시각화 오류: 특정 플롯에서 데이터 겹침 문제가 발생했으나, 마커 설정과 그래프 크기 조절을 통해 해결
7) 프로젝트를 통해 얻은 역량
- 데이터 전처리: 날짜 데이터 처리 및 결측값 처리
- 분석 및 시각화 : 다양한 데이터 시각화 기법 적용
📙 내일 일정
- Python 실습
'TIL _Today I Learned > 2024.07' 카테고리의 다른 글
[DAY 15] Python 실습 (0) | 2024.07.31 |
---|---|
[DAY 14] IT 프로젝트, Python 실습 (0) | 2024.07.30 |
[DAY 12][특강] 학습 데이터의 유형 및 서비스 적용 사례 (1) | 2024.07.26 |
[DAY 11] Plotly, Folium (0) | 2024.07.25 |
[DAY 10] Data Visualization (0) | 2024.07.24 |