250609

AnalytiCode·2025년 6월 9일

플랫폼의 프로모션 마케팅

프로모션 성과 분석

프로모션별 평균 할인율, 매출, 주요 고객 , 주요 구매된 카테고리, 결제 유형 등

프로모 코드별 평균 할인율

  • 코드
# promo_code가 있는 행만 필터링
  promo_df = transactions_df[transactions_df['promo_code'] != 'None']
                   promo_df['promo_code'].value_counts()
                    
# 할인율 컬럼 추가
promo_df['discount_rate'] = promo_df['promo_amount'] / promo_df['total_amount']
                    
# 프로모션 코드별 평균 할인율 계산avg_discount_by_code = promo_df.groupby('promo_code')['discount_rate'].mean().sort_values(ascending=False)
print(avg_discount_by_code)

transaction에서 promo_mount와 total_amount의 비율 확인해서 할인율 추정 가능

프로모션 코드사용 건수평균 할인율 (%)
AZ202289,2271.93%
BUYMORE66,8351.93%
WEEKENDSERU61,9411.92%
XX202244,7441.92%
LIBURDONG20,9651.91%
WEEKENDMANTAP20,4481.92%
SC202211,2713.95%
STARTUP11,1053.98%
            - 할인율이 높을수록 사용건수가 적음(많이 뿌릴 땐 낮은 단가로, 적게 뿌릴 땐 높은 단가로)
            - 할인율이 높을땐 특정고객에게만.(적은 인원수)
            
  • 프로모코드를 사용한 결제 유형 확인
  • 코드
# 프로모션 코드별 + 결제수단별 건수 집계
promo_payment_counts = promo_df.groupby(['promo_code', 'payment_method']).size().unstack(fill_value=0)
                    
# 정렬
promo_payment_counts = promo_payment_counts.sort_index()
print(promo_payment_counts)
                    
# 비율로 변환 (행 기준 → 각 프로모션별 합계로 나눔)
percentages = promo_payment_counts.div(promo_payment_counts.sum(axis=1), axis=0) * 100
                    
# 소수점 두 자리로 포맷
percentages = percentages.round(2)
print(percentages)
  • count
프로모션 코드Credit CardDebit CardGopayLinkAjaOVO
AZ202231,33914,27917,9347,86817,807
BUYMORE23,52110,71413,3745,91513,311
LIBURDONG7,2643,3824,3451,8224,152
SC20223,9551,8542,2849902,188
STARTUP3,8611,8022,2811,0102,151
WEEKENDMANTAP7,2633,3164,0381,7464,085
WEEKENDSERU21,6199,88412,5245,53212,382
XX202215,6827,2018,9163,9558,990

비율로 나타내면

프로모션 코드Credit CardDebit CardGopayLinkAjaOVO
AZ202235.12%16.00%20.10%8.82%19.96%
BUYMORE35.19%16.03%20.01%8.85%19.92%
WEEKENDSERU34.90%15.96%20.22%8.93%19.99%
XX202235.05%16.09%19.93%8.84%20.09%
LIBURDONG34.65%16.13%20.73%8.69%19.80%
WEEKENDMANTAP35.52%16.22%19.75%8.54%19.98%
SC202235.09%16.45%20.26%8.78%19.41%
STARTUP34.77%16.23%20.54%9.10%19.37%

프로모션 코드별 결제 수단 비율이 거의 같음
→ 프로모션 코드와 결제수단 사이에 유의미한 상관관계가 없다
(독립성 검정 해볼까? ⇒ 프로모션 코드와 결제수단은 독립적이다)

  • 프로모 코드 추정
    → 구매까지 유도하는 코드로 유용한 코드인지
  • STARTUP은 회원가입시 사용할 수 있는 코드이다.
    - 회원가입 쿠폰이라면 join date와 created at 날짜(시간)차이가 적을 것이다.
프로모션 코드건수평균표준편차최소25%중앙값75%최대
AZ202289,227658.77502.230.0234.0563.01,005.02,209.0
BUYMORE66,834659.53504.850.0232.0562.01,009.02,217.0
WEEKENDSERU61,941625.45513.630.0186.0519.0980.02,212.0
XX202244,744660.72503.570.0234.0569.01,008.02,187.0
LIBURDONG20,965620.48505.580.0189.0519.0967.02,201.0
WEEKENDMANTAP20,448626.83512.240.0193.0525.0972.02,198.0
SC202211,271660.32504.040.0235.0562.01,010.02,161.0
STARTUP11,105666.60507.300.0234.0576.01,014.02,185.0
  • STARTUP이 평균 오히려 제일 큼(가장 늦게 사용)

  • 코드

# aptc = Add to Promo + Transaction + Customer
                            aptc = pd.merge(apt, customer_df, how='left', on='customer_id')
                            
# first_join_date 컬럼을 datetime 형식으로 변환
aptc['first_join_date'] = pd.to_datetime(aptc['first_join_date'])
                            
# 시간대 없애기
aptc['created_at'] = aptc['created_at'].dt.tz_localize(None)
                            
# 결제일 - 가입일 계산
aptc['date_diff'] = (aptc['created_at'] - aptc['first_join_date']).dt.days
                            
# 프로모션별 평균 day 차이
aptc.groupby('promo_code')['date_diff'].mean().reset_index().sort_values('date_diff', ascending=False)
                            
# 프로모션별 day차이 describe
aptc.groupby('promo_code')['date_diff'].describe()
                            
  • 회원가입 쿠폰은 1회성이다
    customer_id별로 하나씩밖에 사용을 못하는데 그렇지않음.
    STARTUP promo 전체 사용자 수 = 7468명
    두번 이상 사용한 사용자 수 = 2166명

5번 사용한 99915 확인해보면

  • 코드
# 고객별로 promocode 몇 번 썼는지 count
promo_usage = aptc.groupby(['customer_id', 'promo_code']).size().reset_index(name='use_count')
                            
# startup promo 몇 번 썼는지 count promo_usage[promo_usage['promo_code'] == 'STARTUP']
                            
# startup promo를 2번 이상 썼는지 확인
promo_usage[(promo_usage['promo_code'] == 'STARTUP') & (promo_usage['use_count'] >= 2)]
                            
# 5번 사용한 경우(customer_id = 99915) 확인
aptc[(aptc['customer_id'] == 99915) & (aptc['promo_code'] == 'STARTUP')][
                                ['event_name', 'session_id', 'event_time', 
                                 'created_at', 'promo_code', 'date_diff']].T
  • WEEKENDMANTAP, WEEKENDSERU, LIBURDONG는 주말 한정(공휴일) 할인쿠폰일 것이다
  • 맞음
# WEEKENDMANTAP
weekend_df = aptc[aptc['promo_code'] == 'WEEKENDMANTAP'].copy()
                        
# 사용 날짜 요일 이름으로 나타내기
weekend_df['day_of_week'] = weekend_df['created_at'].dt.day_name()
                        weekend_df['day_of_week'].value_counts()
                        
# WEEKENDSERU
weekend_df = aptc[aptc['promo_code'] == 'WEEKENDSERU'].copy()
weekend_df['day_of_week'] = weekend_df['created_at'].dt.day_name()
                        weekend_df['day_of_week'].value_counts()
                        
# LIBURDONG
libur_df = aptc[aptc['promo_code'] == 'LIBURDONG'].copy()
libur_df['day_of_week'] = libur_df['created_at'].dt.day_name()
libur_df['day_of_week'].value_counts()
  • WEEKENDMANTAP
    MANTAP : 짱이다, 굿, 강력하다
    Sunday 10827
    Saturday 9621
  • WEEKENDSERU
    ERU : 재밌다, 흥미롭다, 신난다

Sunday 32910
Saturday 29031

  • LIBURDONG
    Libur = 휴일, dong은 감탄사

Sunday 11139
Saturday 9826

  • SC2022, AZ2022, XX2022 는 특정 시기(캠페인-2022-)코드일 것이다

2022가 있어서 2022년 특정 프로모션일 것이라 예상했는데 그것과 관계없이 꾸준히 이루어 짐을 확인할 수 있다.

  • 코드
# 비교할 프로모션 코드 목록을 정의
codes = ['SC2022', 'AZ2022', 'XX2022']
                        
# 전체 그래프 크기 설정
plt.figure(figsize=(12, 5))
                        
# 각 프로모션 코드에 대해 반복
for code in codes:

# 해당 코드에 해당하는 행만 필터링 (복사본 생성)
df = aptc[aptc['promo_code'] == code].copy()
                            
                            
# created_at 날짜에서 '연-월'만 추출하여 새로운 'month' 컬럼 생성
df['month'] = df['created_at'].dt.to_period('M')

# 월별 사용 건수를 계산, 월 순서대로 정렬
monthly_counts = df['month'].value_counts().sort_index()
                            
# 인덱스를 Timestamp 형식으로 바꿈
monthly_counts.index = monthly_counts.index.to_timestamp()

# 라인 그래프로 월별 사용량 시각화 monthly_counts.plot(label=code)

# 그래프 제목, 축 레이블, 범례, 그리드 설정

plt.title("월별 프로모션 사용량: SC2022 / AZ2022 / XX2022")
plt.xlabel("월")
plt.ylabel("사용 건수")
plt.legend()
plt.grid(True)
plt.tight_layout()

# 그래프 출력
plt.show()
  • 프로모 코드를 자주 사용하는 고객의 특성
    (성별, 연령대, 지역)
    customer이랑 transaction확인
  • 프로모코드를 사용한 session의 카테고리를 확인
    카테고리..어케확인할지..
    이거는 근데 진짜로 ast해야겠다

0개의 댓글