이번 프로젝트는 kaggle에서 제공하는 데이터셋인 eCommerce 웹 로그 데이터 분석 프로젝트이다.
1. 데이터 전처리
2. 데이터 분석 & 시각화
3. 데이터 모델링
해당 파일은 데이터 분석 & 시각화 과정이다.
이 과정에서는 RFM 분석을 진행할 예정이다.
데이터 load & import
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
import squarify
import datetime as dt
%matplotlib inline
ecommerce_df = pd.read_csv("refined_2019_Oct.csv", index_col = 0, usecols=['kst_time','event_type','price','user_id','user_session'])
ecommerce_df = ecommerce_df.reset_index()
RFM
https://www.datarian.io/blog/what-is-rfm
RFM 분석이란 무엇일까요
안녕하세요! 데이터 분석가 이보민입니다.
www.datarian.io
RFM의 개념은 비교적 간단한데, 아래 세 가지 단어의 약자를 따서 RFM이라고 부른다.
Recency : 얼마나 최근에 구매했는가
Frequency : 얼마나 자주 구매했는가
Monetary : 얼마나 많은 금액을 지출했는가
즉, 사용자별로 얼마나 최근에, 얼마나 자주, 얼마나 많은 금액을 지출했는지에 따라 사용자들의 분포를 확인하거나 사용자 그룹(또는 등급)을 나누어 분류하는 분석 기법이다.
RFM 분석은 기본적으로 evnet_type이 purchase 유저 기준으로 진행하기 때문에, 필터링한다.
같은 유저라도 세션이 다를 수 있으니, 세션별로 그룹핑을 진행한다.
ecommerce_df = ecommerce_df[ecommerce_df['event_type'] == 'purchase']
ecommerce_df = ecommerce_df.groupby(by="user_session").agg(Date_order=("kst_time", lambda x: x.max()), /
user_id=("user_id", lambda x: x.unique()), session_count=("user_session", "count"), /
money_spent=("price", "sum")).reset_index(drop=True)
ecommerce_df
RFM
RFM 분석의 3가지 속성인 Recency, Frequency, Monetary를 구할 것이다.
데이터 마지막 날짜에서 현재 구입 날짜를 빼면 마지막 구매 날짜가 나오는데, 일자 데이터 타입으로 변경해서 넣는다.
last_day = dt.datetime(2019,11,2)
ecommerce_df['last_purchase'] = last_day - ecommerce_df['Date_order']
ecommerce_df['last_purchase'].astype('timedelta64[D]')
ecommerce_df['last_purchase']=ecommerce_df['last_purchase'] / np.timedelta64(1, 'D')
ecommerce_df.head()
User_id로 그룹핑해서 Recency, Frequency, Monetary 구한다.
Recency - last_purchase 중 최소 일자(min())
Frequency - user_id의 개수를 세면 해당 일자로부터의 빈도(count)
Monetary - 그룹핑된 데이터에서 money_spend의 합(sum))
RFM = ecommerce_df.groupby('user_id').agg(Recency=('last_purchase', lambda x: x.min()), Frequency=('user_id', lambda x: x.count()), Monetary=('money_spent', lambda x : x.sum()))
RFM.head()
Recency
얼마나 최근에 구입했는가 - 최소 6시간부터 마지막 날(11/1)에 구입한 유저까지 존재한다.
Frequency
얼마나 자주 구입했는가 - 최소 1번 구입부터 152번이나 구입한 유저까지 존재한다.
Monetary
얼마나 많은 금액을 지출했는가 - 최소 0.88달러에서 최대 265569달러 제품까지 구입한 유저가 존재한다.
위의 과정에서 RFM은 구했으나 RFM 분석에서 더 중요한 건 RFM 세분화(Segmentation)이다
RFM Segmentation
RFM 세분화는 데이터에 따라 사용자의 그룹을 식별하는 방법이다.
이를 통해, 특정 고객 그룹을 타켓팅할 수 있어서 응답률이 향상되고 서비스 충성도가 높아진다.
RFM 모델에서 고객 세분화를 하는 가장 간단한 방법으로 사분위수를 사용할 것이다.
우리는 1에서 4까지 점수를 RFM에 할당할 것이고, RFM Score는 각 점수를 합하여 계산한다.
고객 세분화를 위한 사분위수 기준 정하기 위해 quantile 함수 사용한다.
RFM 세분화 함수
recency가 작으면 작을수록 충성도가 높은 고객
monetary, frequency가 클수록 충성도가 높은 고객
RFM score = recency.quartiles + monetary.quartiles + frequency는.quartiles
score가 작을수록 충성도가 높은 고객으로 설정한다.
def for_recency(x, parm, data):
if x <= data[parm][0.25]:
return 1
elif x <= data[parm][0.50]:
return 2
elif x <= data[parm][0.75]:
return 3
else:
return 4
def for_monfre(x, parm, data):
if x <= data[parm][0.25]:
return 4
elif x <= data[parm][0.50]:
return 3
elif x <= data[parm][0.75]:
return 2
else:
return 1
RFM['R_quartile'] = RFM['Recency'].apply(for_recency, args=('Recency', quartiles))
RFM['F_quartile'] = RFM['Frequency'].apply(for_monfre, args=('Frequency', quartiles))
RFM['M_quartile'] = RFM['Monetary'].apply(for_monfre, args=('Monetary', quartiles))
RFM['RFM_Score'] = RFM.R_quartile.map(int) + RFM.F_quartile.map(int) + RFM.M_quartile.map(int)
RFM.head()
RFM Score에 따른 고객 분류를 정의한다.
3 - Leading Customer
4, 5, 6 - Loyal Customers
7, 8, 9 - Promising Customers
10, 11 - Hibernating Customers
12 - Loss Customers
def RFM_Define(data):
if data['RFM_Score'] >= 12:
return 'Loss Customers'
elif ((data['RFM_Score'] >= 10) and (data['RFM_Score'] < 12)):
return 'Hibernating Customers'
elif ((data['RFM_Score'] >= 7) and (data['RFM_Score'] < 10)):
return 'Promising Customers'
elif ((data['RFM_Score'] >= 4) and (data['RFM_Score'] < 7)):
return 'Loyal Customers'
else:
return 'Leading Customer'
RFM['RFM_Label'] = RFM.apply(RFM_Define, axis = 1)
RFM.head()
각 RFM_Label 별로 분포
RFM_desc = RFM.groupby('RFM_Label').agg({
'Recency' : 'mean',
'Frequency' : 'mean',
'Monetary' : ['mean', 'count'],
}).round(1)
RFM_desc
RFM_desc.columns = RFM_desc.columns
RFM_desc.columns = ['RecencyMean','FrequencyMean','MonetaryMean', 'Count']
fig = plt.gcf()
ax = fig.add_subplot()
fig.set_size_inches(16, 9)
squarify.plot(sizes=RFM_desc['Count'],
label=['Hibernating Customers',
'Leading Customer',
'Loss Customers',
'Loyal Customers',
'Promising Customers'], alpha=.6 )
plt.title("RFM Segments",fontsize=18,fontweight="bold")
plt.axis('off')
plt.show()
RFM Segment에 따른 고객 마케팅 전략을 생각해보자
Leading Customer - 해당 고객군에게 보상을 한다. 그러면 신제품의 얼리 어답터가 될 수도 있고, 해당 서비스를 홍보할 것이다.
Loyal Customers - 더 높은 가치의 제품을 상향 판매하고, 리뷰 요청을 진행한다.
Promising Customers - 멤버십/서비스 충성 프로그램을 제공하고, 맞춤 추천을 제공한다.
Hibernating Customers - 이메일 개인화와 특정 제품에 대한 특정 할인으로 관심을 되살린다.
Loss Customers - 목표 캠페인을 진행하여 관심을 유도하되 많은 리소스를 쏟지 않는다.
마무리
이번 포스팅에서 eCommerce 웹 로그 데이터를 RFM 분석에 대해 알아봤습니다.
다음 포스팅은 eCommerce 웹 로그 데이터에서 특정 주제를 정하고 모델링을 진행하겠습니다.
해당 프로젝트는 아래 github에 상세히 정리가 되어 있어서 많은 관심 부탁드립니다. 개인으로 진행한 프로젝트라 정확하지 않을 수 있는 점 양해 부탁드립니다.
https://github.com/JunSeokCheon/eCommerce_weblog_analysis
GitHub - JunSeokCheon/eCommerce_weblog_analysis
Contribute to JunSeokCheon/eCommerce_weblog_analysis development by creating an account on GitHub.
github.com
'Data Projects > ecommerce 로그 데이터 분석 프로젝트' 카테고리의 다른 글
[ecommerce 웹 로그 분석] 4. XGBoost 사용한 고객 행동 예측 모델 (0) | 2022.06.28 |
---|---|
[ecommerce 웹 로그 분석] 2. 데이터 분석 & 시각화 (1) (0) | 2022.06.23 |
[ecommerce 웹 로그 분석] 1. 데이터 전처리 (0) | 2022.06.22 |
댓글