본문 바로가기
TIL _Today I Learned/2024.07

[DAY 13] Python 실습

by gamdong2 2024. 7. 29.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 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 실습