본문 바로가기
Data Projects/ecommerce 로그 데이터 분석 프로젝트

[ecommerce 웹 로그 분석] 3. 데이터 분석 & 시각화 (2)

by 천뿌니 2022. 6. 24.
728x90

이번 프로젝트는 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)에 구입한 유저까지 존재한다.

Recency

 

Frequency

얼마나 자주 구입했는가 - 최소 1번 구입부터 152번이나 구입한 유저까지 존재한다.

Frequency

Monetary

얼마나 많은 금액을 지출했는가 - 최소 0.88달러에서 최대 265569달러 제품까지 구입한 유저가 존재한다.

Monetary

위의 과정에서 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

RFM Score range

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

댓글