B.D.A
[BDA 데이터 분석 모델링반 (ML 1) 7회차] RFM 분석
SeonHo Yoo
2024. 6. 5. 14:20
Online Retail 데이터를 활용하여 RFM 분석을 실습해본다.
RFM 분석
고객 분석을 위한 피처인 R, F, M 피처를 가지고 고객을 이해하고, 분석하는 방법론이다.
R(Recency) : 고객 중 가장 최근 구매한 상품 구입일과 현재까지의 기간
F(Frequency) : 상품 구매 횟수, 주문 횟수
M(Monetary) : 고객의 총 주문 금액
분류 기준, 도메인에 따라 분석 결과가 변할 수 있다.
RFM 피처 외에 쿠폰에 대한 사용, 고객의 불만율, 고객의 다양한 제품 구매, 고객의 지속기간, 손익 등을 피철로 추가하여 분석하는 것도 가능하다.
retail_df=pd.read_excel(io='online_retail_II.xlsx')
retail_sp=retail_df[0:10000]
RFM 피처를 만드는 방법
데이터셋의 크기가 크기에 분석하려는 집단을 선정하여 데이터 전처리를 진행한다.
주문 수량이 음수인 사람(주문 취소 반품 고객) 제외, 구매 국가가 영국인 회원 고객만을 집단으로 선정했다. (다른 집단으로 선정해도 괜찮다.)
# 취소반품 고객 제외
retail_sp=retail_sp[retail_sp['Price']>0]
retail_sp=retail_sp[retail_sp['Quantity']>0]
# 회원인 고객만 분석 가정
retail_sp=retail_sp[retail_sp['Customer ID'].notnull()]
# 구매 국가도 영국으로만 지정
retail_sp=retail_sp[retail_sp['Country']=='United Kingdom']
Quantity와 Price의 곱을 통해 M 피처를 만든다.
retail_sp['sales_amount']= retail_sp['Quantity']*retail_sp['Price']
retail_sp['Customer ID'] = retail_sp['Customer ID'].astype(int) #error 방지를 위해 int로 변경
고객마다 하나의 지표로 수립해야 하므로, Customer ID 별로 groupby를 진행한다.
#RFM 지표 만들기
agg_rfm = {
'InvoiceDate' :'max', #주문일자, 가장 최근이니 max
'Invoice' : 'count', #카운트 -> 주문 제품 수량
'sales_amount' : 'sum' # 전체 주문 금액 sum
}
cust_df =retail_sp.groupby('Customer ID').agg(agg_rfm)
R 피처를 만들기 위해 timestamp를 활용한다.
max(retail_sp.InvoiceDate)
# Timestamp('2009-12-04 09:31:00')
import datetime as dt
cust_df['Recency']= cust_df['InvoiceDate'] - dt.datetime(2009,12,31)
# timedelta 계산된 값을 x.days+1로 나눠서 수치형으로 변환
cust_df['Recency']=cust_df['Recency'].apply(lambda x: x.days+1)
cust_rfm=cust_df[['Invoice','sales_amount','Recency']]
cust_rfm
활용 데이터셋 : https://www.kaggle.com/datasets/vijayuv/onlineretail
Online Retail Data Set
www.kaggle.com