[내배캠] 데이터분석 6기/프로젝트 기록

[본캠프 24일차] 부록: [chap 2] 기초 프로젝트 준비①

물맨두 2025. 3. 21. 18:01

 

 

어제부터 주제를 정해서 기초 프로젝트 과제를 해나가고 있다.

 

어제도 하긴 했는데, 낡고 지친 관계로 어제 TIL에 해당 내용을 적지 못했다. 비주얼 코드 스튜디오와 씨름하기만도 지치고 바빠서.. 그래도 오늘은 뭐라도 끼적이면서 남겨놔야 할 것 같아서 기록한다.


 

선정 주제: [커머스] H&M 고객/매출 데이터 분석

선정한 데이터셋: 

 

H&M Personalized Fashion Data

 

www.kaggle.com

 

해당 주제는 H&M 데이터에 대한 EDA를 통해 1️⃣자사의 서비스 현황2️⃣향후 서비스의 행보에 대한 제언을 해야 한다.

 

추가적으로 캐글의 데이터셋에 대한 소개 페이지를 보면 다음과 같은 내용들도 알 수 있다.

  • H&M의 온라인 스토어는 폭넓은 제품군을 취급하고 있으나, 너무 많은 선택지는 오히려 구매 결정의 어려움을 초래함
  • 이런 상황에서 제품 추천이 고객의 구매 경험을 향상시키는 데 있어 핵심
  • 또한 고객이 제품을 적절히 선택하는 것을 유도하는 것은 반품이 줄어듦으로써 운송으로 인해 배출되는 배기가스 역시 줄어든다는 점에서 지속가능성에도 기여함
  • 이에 H&M은 데이터에 기반한 제품 추천 시스템을 개발하고자 함
  • 자사의 이전 거래 내역 데이터, 고객 정보 데이터, 제품 정보 데이터를 제공함

해당 주제는 3년 전에 H&M에서 이전 구매 내역에 기반한 제품 추천 시스템을 설계하는 대회를 열었었고 그때 제공된 데이터셋이 이번 과제로 주어진 듯했다.


 

테이블 살펴보기

1. 주제 상세 설명을 읽으며 

주어진 데이터는 3가지 테이블이 있다.

  • 💽 customers_hm : 고객 정보
  • 💽 transactions_hm : 거래 내역
  • 💽 articles_hm : 품목 정보

애초에 추천화 시스템 구축을 위해 제공된 데이터들이라 그런지 데이터 컬럼들만 살펴봐도 눈에 걸리는 지점들이 있었다.

  • 💽 customer 테이블
    • 기본적인 고객 정보가 적음 (사실 age밖에 없음)
      (아니 성별 정보도 없다니근데 그럴 수밖에 없었을 것 같기도 하고) (근데 뭘 쓰라는지 오히려 명확하니 좋은 건가 싶기도 함, 그냥 이거 쓰라는 거잖아)
    • 대신 고객과 소통할 수 있는 채널에 대한 정보들이 많음
      : 패션 뉴스 구독 여부(FN), 커뮤니케이션 가능 여부(Active), 패션 뉴스 알람 주기(fashion_news_frequency)
      • 그런데 패션 뉴스(뉴스레터, 즉 이메일 수신 여부?)가 뭔지, 커뮤니케이션이 어떤 방식으로 가능하다는 건지(광고 문자 수신이 가능한 상태라는 건지 뭔지) 정확히는 모르겠음
  • 💽 transactions 테이블
    • 고객 행동에 관한 데이터 없음 (상품을 봤다든가, 장바구니에 담았다든가 하는)
    • 수량 정보 없음 (각 행마다 모두 해당 품목 하나)
    • 금액과 판매 채널(온라인/오프라인)에 대한 정보만 있음
  • 💽 articles 테이블
    • 상품에 대한 분류 내용이 엄청남
      : 상품 종류 코드(product_type_no), 제품군(product_group_name), 소분류 코드(department_no), 중분류 코드(index_code), 대분류 코드(garment_group_no), 타겟 그룹 코드(index_group_no), 섹션 코드(section_no)
      (세세하게 제품 추천하는 데 용이하도록 이렇게 제공한 것 같음)
    • 색상에 대한 내용도 존재 (명도라든가 생각군이라든가) (원래 대회에선 이미지 파일도 제공했어서 그런 듯)

 

캐글에 올라가 있는 데이터셋 제목도 "H&M Personalized Fashion Data"이고, 테이블도 저렇게 생겨서 진짜 제품 추천을 어떻게든 해야 할 것만 같은 생각만 든다. 근데 그걸 어떻게 하죠?

 


2. pandas로 데이터를 굴려보며

(나 아직 SQL도 어려운데, 어쨌든 시작!)

#사용할 라이브러리 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#사용할 csv파일 데이터프레임으로 가져오기
cus = pd.read_csv("/Users/(…)/h&m dataset/customer_hm.csv")
tra = pd.read_csv("/Users/(…)/h&m dataset/transactions_hm.csv")
art = pd.read_csv("/Users/(…)/h&m dataset/articles_hm.csv")

 

customers 테이블

cus.info()
# customer_id : 고객 id ( <- cus의 PK )
# FN : 패션 뉴스 구독 여부
# Active : 커뮤니케이션 가능 여부
# Club_member_status : 회원 상태 (신규, 활성, 탈퇴)
# fashion_news_frequency : 패션 뉴스 알람 주기
# age: 연령

# 데이터를 살펴보면 NULL값이 거의 없음

고객 정보 테이블에 대한 기본적인 정보 (컬럼명, 컬럼별 NULL값이 아닌 데이터의 개수, 컬럼별 데이터 타입)

#테이블 cus의 처음 10행 조회하기
cus.head(10)

# FN, Active : 불리언 값으로 여부를 나타냄 (0 == False, 1 == True)

고객 정보 테이블의 처음 10행 (테이블에 어떤 식으로 값이 담겨있는지 확인하기 위함)

간단하게 테이블을 살펴봤으니 이제 각 컬럼별로 하나씩 살펴봤다.

 

☑️ ['customer_id'] : 과연 값들이 고유한가 (사실 PK인데 해당 부분도 확인해야 하나 싶었지만 했음)

#컬럼: customer_id
#customer_id가 과연 전부 고유한지 확인하기 #근데 이런 것도 살펴야 하나 싶긴 했는데, 아무튼 함
cus_id_cnt = cus['customer_id'].nunique()
cus_len = len(cus)
cus_id_cnt == cus_len

customer_id 값은 모두 고유했음

☑️ ['FN'], ['Active'], ['club_member_status'], ['fashion_news_frequency']
: 어떤 값이 몇 개씩 있는가, 컬럼 내 값들의 비율은 어떠한가

# 컬럼 : FN
# 어떤 값이 있고, 그 값이 몇 개가 있는지
cus['FN'].value_counts()
# 그 값이 컬럼 내 차지하는 비율은 어떤지
cus['FN'].value_counts(normalize=True)

패션 뉴스를 구독 여부는 불리언 형태로 값이 들어가 있다. (0은 False(=구독 안 함), 1은 True(=구독함))

 

(좌) 개수 / (우) 비율 (커뮤니케이션 가능 여부 관련)

커뮤니케이션 가능 여부 역시 불리언 형태로 값이 들어가 있다. (0은 False(=불가), 1은 True(=가능))

 

(좌) 개수 / (우) 비율 (멤버십 고객 상태 관련)

멤버십 고객들의 상태는 ACTIVE(활동 중), PRE-CREATE(가입만 함), LEFT CLUB(탈퇴) 3가지로 값이 들어가 있다.

 

(좌) 개수 / (우) 비율 (패션 뉴스를 받아보는 빈도 관련)

패션 뉴스를 받아보는 빈도는 NONE(받아보지 않음), Regularly(자주), Monthly(매월) 3가지 값이 들어가 있다.


 

패션 뉴스를 구독하지 않는 회원의 수와 패션 뉴스의 구독을 받아보지 않는 회원의 수가 서로 일치하지 않음

그런데 한 가지 걸리는 점이 fashion_news_frequency 컬럼의 NONE 값이 패션 뉴스를 받아보지 않음이라면

앞서서 살펴본 FN 컬럼의 0(=패션 뉴스 구독하지 않음)의 값의 수와 일치해야 한다고 생각하는데 그렇지 않았다.

패션 뉴스를 받아보지 않는다고 응답한 회원(FN==0)이 패션 뉴스를 받아보는 빈도에 없음(…freq == NONE)으로 응답한 사람보다 1067명 더 많은 것으로 조회되는데, 그렇다면 이러한 차이를 어떤 식으로 해석해야 하는지 의문이 생겼다.

FN 컬럼에선 패션 뉴스를 안 받아본다고 했으면서 패션 뉴스를 받아보는 빈도에는 Regularly나 Monthly로 체크된 사용자를 어떻게 이해해야 할까.

# 패션 뉴스를 구독하지 않으면서 패션 뉴스를 받아보는 빈도에 Regularly나 Monthly로 체크돼 있는 사람 필터링
cus_fn = cus[(cus['FN'] == 0) & (cus['fashion_news_frequency'] != 'NONE')]
# cus_fn의 패션 뉴스 구독 빈도 컬럼의 값 개수 확인하기
cus_fn['fashion_news_frequency'].value_counts()

찾아보니 패션 뉴스를 구독하지 않지만 구독 주기가 NONE이 아닌 사람들(Regulary는 1,684명, Monthly는 8명)이 있어서 '이들은 어차피 패션 뉴스를 받아보지 않는 사람들이니 이들의 구독 주기는 의미가 없는 정보니 전부 NONE으로 처리해도 되나?' 하는 의문이 들었고, 이 부분에 대해서 담당 튜터님께 이런 상황에서 이렇게 처리하는 것을 어떻게 생각하는지 질문했다.

"그 사람들의 구독 주기를 NONE으로 처리해도 괜찮지만, 사실 전체(1,048,574) 중 1,067건이면 그렇게 큰 부분은 아니라서 전체 데이터가 지닌 경향성을 왜곡할 정도는 아니기에 굳이 그 값을 변경할 필요 없이 데이터를 분석해도 괜찮다. 그 부분이 현재는 패션 뉴스를 구독하고 있지 않아도 과거 패션 뉴스를 구독했기에 구독 빈도는 Regularly나 Monthly로 체크했는데 지금은 받아보질 않아 그렇게 남아있는 것일 수도 있어서 단순 오류라고만 생각할 수도 없다."

나는 해당 부분을 의미상의 불일치로 인식해서 데이터 전처리로 수정해줘야 하는 부분이라 생각했는데, 사실 데이터에서 이런 부분이 전체 경향성을 해칠 정도가 아니라면 구태여 수정할 필요가 없다는 것을 알게 됐다. 그래서 이 부분의 구독 빈도를 굳이 값을 수정하지 않기로 했다.

 


 

☑️ ['age']
: 회원 나이에 대한 기초 통계값(평균, 최솟값, 최댓값, 중앙값 등), 나이대에 대한 정보를 나타내는 컬럼 생성하기

#전체 숫자가 안 나와서 아래의 코드 추가함
pd.set_option('float_format', '{:.2f}'.format)

#연령에 대한 기초 통계값 보기
#16세~99세까지 존재 #99???
cus['age'].describe()

컬럼 'age'의 요약 통계값 확인하기 (값의 개수, 평균, 표준 편차, 최솟값, 1사분위수, 중앙값, 3사분위수, 최댓값)

#고객 연령에 대한 데이터 파악을 위해 box plot 그리기
plt.figure(figsize=(7, 4))
plt.boxplot(cus['age'], vert=False)
plt.title('Box Plot of Age')
plt.xlabel('age')

#고객 연령에 대한 분포 파악을 위해 히스토그램 그리기
plt.hist(cus['age'], bins=30, density=True, color='royalblue', alpha=0.8, edgecolor='grey')
plt.title('Age Disribution', fontsize=18)
plt.xlabel('age')

컬럼 'age'의 데이터를 상자그림과 히스토그램으로 살펴보기

#연령별로 고객 세그먼트하기 (10대, 20대, 30대, 40대, 50대, 60대, 70대 이상)
cus['age_range'] = pd.cut(cus['age'], bins=[0, 19, 29, 39, 49, 59, 69, np.inf], labels=['10대', '20대', '30대', '40대', '50대', '60대', '70대 이상'])

#age_range컬럼으로 연령별 고객 수 집계하기
cus.groupby('age_range')['customer_id'].count()
cus['age_range'].value_counts(normalize=True)

연령별로 사용자 비율을 봤을 땐,

  • 20대가 약 39% 가량으로 가장 많은 비중을 차지
  • 그 다음으론 30대와 50대가 17%, 40대가 15%를 차지했다.
  • 그리고 10대와 60대가 비슷한 비중(5%)을 보이고 있지만 사실 age컬럼의 최소값이 16세인 점을 감안해야 하지 않나 싶음
#age_range별로 컬럼별 값의 개수를 집계하는 피벗테이블 생성
#연령별 패션 뉴스 구독 여부
pivot_fn = pd.pivot_table(cus, index='age_range', columns='FN', values='customer_id',aggfunc='count')
#연령별 커뮤니케이션 가능 여부
pivot_active = pd.pivot_table(cus, index='age_range', columns='Active', values='customer_id',aggfunc='count')
#연령별 멤버십 회원 상태 
pivot_status = pd.pivot_table(cus, index='age_range', columns='club_member_status', values='customer_id',aggfunc='count')
# 연령별 패션 뉴스 받아보는 주기
pivot_fn_freq = pd.pivot_table(cus, index='age_range', columns='fashion_news_frequency', values='customer_id',aggfunc='count')

#만들어놓고서 왜 만들었지 싶긴 한데, 이왕 만든 거 age_range 컬럼 기준으로 싹 다 합쳐봤음
df_fnac = pd.merge(pivot_fn, pivot_active, left_index=True, right_index=True)
df_fnac.rename(columns={'0_x':'FN_0'}, inplace=True)
df_fnac.rename(columns={'1_x':'FN_1'}, inplace=True)
df_fnac.rename(columns={'0_y':'Active_0'}, inplace=True)
df_fnac.rename(columns={'1_y':'Active_1'}, inplace=True)
df_fnacst = pd.merge(df_fnac, pivot_status, left_index=True, right_index=True)
pivot_cus_all = pd.merge(df_fnacst, pivot_fn_freq, left_index=True, right_index=True)

만들고보니 컬럼 순서도 맘에 안 들고, 제목행 부분을 멀티인덱스로 두 줄로 만들어서 좀 더 보기 편하게 하고 싶다.

그런데 딱히 만든 목적도 없으니 나중에 필요하면 이런 부분은 손보기로.

 


transactions 테이블


우선 price 컬럼이 암호화돼 있기 때문에 해당 부분을 튜터님이 알려주신 대로 원화로 풀어주었다.

#price 컬럼 해석하기

# 암호화를 풀어서 USD로 환산하기
tra['price2_USD'] = tra['price']*590
# USD를 KRW로 환산하기
tra['price3_KRW'] = tra['price2_USD']*1466

tra.info()
# t_dat : 구매일 (데이터 타입이 datetime이 아님!!)
# customer_id : 고객 id ( <- FK (cus의 PK) )
# article_id : 품목 id ( <- FK (art의 PK) )
# price : 금액
# sales_channel_id : 판매 채널 (1: 오프라인 / 2: 온라인)

#테이블 cus의 처음 5행 조회하기
tra.head()

# sales_channel_id : 판매 채널 (1: 오프라인 / 2: 온라인)

이제 컬럼별로 살펴본다.

 

☑️ ['t_dat']: 날짜 범위 확인하기, 월별 구매 건수 및 총 판매액 집계하기

우선 데이터 타입을 날짜형으로 변환시켜서 언제부터 언제까지의 거래 내역들이 들어와있는지 확인했다.

# t_dat 컬럼 데이터 타입 날짜 형식으로 변환하기
tra['t_dat'] = pd.to_datetime(tra['t_dat'])
tra.info()

tra['t_dat'].describe()

  • 최솟값: 2019-01-01
  • 최댓값: 2019-12-31

transactions 테이블에는 2019년에 일어난 거래 내역들만 있음을 확인할 수 있다.

 

# 월별로 거래가 발생한 횟수, 총 판매액 집계하기

# 월만 추출한 컬럼 t_dat_month 만들기
tra['t_dat_month'] = tra['t_dat'].dt.month
#피벗테이블로 월별 구매 건수, 총 구매액 집계하기
month_pivot = pd.pivot_table(tra, index='t_dat_month', values=['customer_id', 'price3_KRW'],aggfunc={'customer_id':'count', 'price3_KRW':'sum'})
month_pivot.rename(columns={'customer_id':'buy_cnt'}, inplace=True)
month_pivot.rename(columns={'price3_KRW':'amount'}, inplace=True)

월별 구매 건수와 월별 총 판매액 집계 (월 기준 오름차순 정렬)

얼핏 보기에 6월이 구매 건수도, 총 판매액도 가장 많고 가장 높다는 걸 알 수 있지만 각각의 순서를 알고 싶어서 정렬 기준을 달리 해보기도 했다.

(좌) 구매 건수가 많은 순서로 정렬한 모습 / (우) 총 판매액이 높은 순으로 정렬한 모습

 

  • 월별 구매 건수와 월별 총 판매액이 가장 높은 달은 6월
  • 2019년 기준 총 판매 건수의 약 40%가 4, 5, 6, 7월의 4개월 동안 발생함 (6월: 11.64%, 7월: 11.02%, 5월: 9.51%, 4월: 8.97%)
  • 2019년 기준 총 판매액의 약 38.4%가 6, 5, 4, 9월의 4개월 동안 발생함(6월: 10.68%, 5월: 9.5%, 4월: 9.36%, 9월: 8.86%)

월별 판매 건수와 월별 판매액을 시각화

(시각화를 시도해보긴 했는데, 총 판매액에 해당하는 y축 억 단위로 설정했으면 좋겠고, 범례는 왜 판매액만 나타나고 판매 건수를 날아간 것인지...)

 

☑️ ['customer_id']: 구매 고객에 대한 특성 파악하기

#구매 고객 수 세기
구매_회원_수 = tra['customer_id'].nunique()
전체_회원_수 = cus['customer_id'].nunique()
print(f'전체 회원 수: {전체_회원_수}, 구매 회원 수: {구매_회원_수} 구매 회원이 차지하는 비율은 {(구매_회원_수/전체_회원_수)*100}%')

우선 transactions 테이블에 기록된 고객의 수를 집계하기 위해 nunique()를 사용해 집계했다. 그리고 이를 customers 테이블에 저장된 고객들의 수와 비교했다. 2019년에 구매한 고객은 총 458,235명으로 전체 회원 중 43.7%에 해당하는 고객들이었다.

 

#고객당 구매 건수
purchase_cnt = pd.DataFrame(tra.groupby('customer_id')['t_dat'].count())

print(purchase_cnt['t_dat'].min(), purchase_cnt['t_dat'].max(), purchase_cnt['t_dat'].mean())

  • 고객당 최소 구매 건수: 1건
  • 고객당 최대 구매 건수: 60건
  • 고객당 평균 구매 건수: 2.29건

고객당 구매 건수를 그린 히스토그램 (bins=60)

 

#기존의 transactions 테이블에 해당 고객의 구매 건수('buy_cnt') 컬럼 추가하기
df = pd.DataFrame(purchase_cnt)
df.rename(columns={'t_dat':'buy_cnt'}, inplace=True)
#tra2: 구매 건수(buy_cnt) 컬럼 추가된 거래 내역 
tra2 = pd.merge(tra, df, how='left', left_on='customer_id', right_on='customer_id')

#해당 고객의 구매 총액('total_price_KRW') 컬럼 추가하기
df2 = pd.DataFrame(tra2.groupby('customer_id')['price3_KRW'].sum())
df2.rename(columns={'price3_KRW':'total_price_KRW'}, inplace=True)
tra3 = pd.merge(tra2, df2, how='left', left_on='customer_id', right_on='customer_id')

#구매 건수당 고객 분석하기 (총 판매액, 평균 소비 금액, 고객 수)
pivot = pd.pivot_table(tra3, index='buy_cnt', values='total_price_KRW', aggfunc=['sum', 'mean'])
pivot.columns = ['_'.join([col for col in multi_col if len(col)>0]) for multi_col in pivot.columns]
pivot2 = pd.pivot_table(tra3, index='buy_cnt', values='customer_id', aggfunc='nunique')
pivot3 = pd.merge(pivot, pivot2, how='left', left_on='buy_cnt', right_on='buy_cnt')
pivot3.rename(columns={'sum_total_price_KRW':'total_amount'}, inplace=True)
pivot3.rename(columns={'mean_total_price_KRW':'average_amount'}, inplace=True)
pivot3.rename(columns={'customer_id':'customer_cnt'}, inplace=True)

위의 피벗테이블을 다음과 같이 각 행을 해석할 수 있다.

  • 구매 건수가 1건인 고객은
    • 총 228,515명이고,
    • 이들의 총 판매액은 5,428,610,246.18원이고,
    • 이들의 한회 평균 소비 금액은 23,756.03원이다.
#어떤 구매 건수에 해당하는 고객들이 전체 판매액에서 가장 높은 판매액을 차지하는지 내림차순으로 정렬해 파악하기
pivot3.sort_values(by=['total_amount'], ascending=False)

#어떤 구매 건수에 해당하는 고객들이 한회 소비 금액이 가장 높은지 내림차순으로 정렬해 파악하기
pivot3.sort_values(by=['average_amount'], ascending=False)

(좌) 총 판매액이 높은 순으로 정렬 / (우) 일인 평균 소비 금액이 높은 순으로 정렬

  • 총 판매액이 높은 고객 층 : 구매 건수가 3~4건인 고객
    • 구매 건수가 3개인 고객들의 총 판매액은 10,951,443,949.02원으로 2019년 전체 판매액에서 가장 높은 비중(9.73%)을 차지함
      • 이들은 한회 평균 70,457.65원을 소비하고, 이에 총 51,811명의 고객이 해당함
    • 또한 구매 건수가 4개인 고객들도 총 판매액이 10,808,959,422.70원으로 2019년 전체 판매액의 9.6%를 차지함
      • 이들은 한회 평균 95,192.86원을 소비하고, 이에 총 28,387명의 고객이 해당함
  • 일인 소비 금액이 높은 고객 층 : 구매 건수가 30개 이상인 고객
    • 구매 건수가 60개인 고객의 총 판매액은 104,452,499.82원으로,
      • 구매 건수 1개인 고객이 1인 평균 소비 금액(23756.03원)에 비해 약 4397배에 높은 구매력을 지님
    • 구매 건수가 30개 이상인 고객(68명)들의 총 판매액은 2,408,302,238.18원으로 이는 2019년 전체 판매액의 2.14%를 차지함

 

구매 건수를 기준으로 transactions 데이터를 살피면서, 재구매율을 높이겠다는 목적으로 구매 건수를 살피고 있지만 여기서 어떻게 더 나아가야 할지 갈피를 못 잡고 있을 때 CRM 마케팅 관련해서 이런 글을 보았다.

"한 명의 고객이 브랜드에 신뢰 관계가 쌓이는 시점은 보통 하나의 사이트에서 3번 이상 구매했을 때라고 합니다.
또한 대부분의 커머스에서는 구매 횟수가 2회 이하인 고객이 80~90%이므로 이들의 평균 수익을 기준으로 고객을 분류했습니다."

빅인, "CRM 마케팅을 위한 필수 지침서 (2)심화편", 2023.02.14

객단가(AOV) 컬럼을 추가한 구매 건수 테이블

  • [구매 건수가 1~2건] 총 판매액: 14,843,350,131원(약 13.18%) / 고객 수: 329,861명(약 71.99%)
    • [구매 건수가 1건] 총 판매액: 5,428,610,246.18원 / 고객 수: 228515명 / 객단가: 23,756.03원
    • [구매 건수가 2건] 총 판매액: 9,414,739,885.20원 / 고객 수: 101,346명 / 객단가: 92,897.01원
  • [구매 건수가 3~6건] 총 판매액: 41,080,577,841.95원(약 36.49%)/ 고객 수: 107,215명(약 23.40%)
    • [구매 건수가 3건] 총 판매액: 10,951,443,949.02원(약 9.73%) / 고객 수: 51,811명(약 11.31%) / 객단가: 211,372.95원
    • [구매 건수가 4건] 총 판매액: 10,808,959,422.70원(약 9.60%) / 고객 수: 28,387명(약 6.19%) / 객단가: 380,771.46원
    • [구매 건수가 5건] 총 판매액: 10,109,265,141.45원(약 8.98%) / 고객 수: 16,642명(약 3.63%) / 객단가: 607,454.94원
    • [구매 건수가 6건] 총 판매액: 9,210,909,328.78원(약 8.18%) / 고객 수: 10,375명(약 2.26%) / 객단가: 887,798.49원

그래서

  • 구매 건수가 1~2건인 회원들을 대상으로는 가볍게 1~2번의 재구매를 유도하는 프로모션을, 신뢰 관계 쌓기 유도
  • 구매 건수가 3~4건이면서 회원들을 대상으로는 더 많은 소비를 유도해 충성 고객이 되도록 유도하는 프로모션을, 객단가 끌어올리기

각각 진행하면 어떨까 싶었다.

 

구매 건수가 1~2건인 회원들의 특성을 살펴보았다.

 

 

 


 

(to be continued...)