有很多种分析电商用户价值的方式,今天来谈谈传统企业和电商用得较多的RFM模型。在众多的客户细分模型中,RFM模型是被广泛提到和使用的。
根据用户对公司的贡献,把客户分为重点用户、潜力用户和流失用户三大类,挖掘出各用户群的需求点;
R、F、M分别代表三个单词:
站在公司的角度,用户的等级也是符合”二八定律“,20%的客户带来80%的利润,而剩余80%的用户只带来20%的利润;
我们可以再往下细分,基于R、F、M值这三个维度,将每个维度分为高低两种情况,构建出了一个三维的坐标系,每个小正方形代表一类用户,也就是2^3=8类:
剩下的事情就是根据三维得分,将用户分类。
如果只是按高低来分类,很容易把x-y面、x-z面和y-z面这三个面附近的用户归错类。为了达到更精准的分类,我们先把RFM三值量化成5个区间,再把5^3=25个用户群体压缩到8个,规则如下:
1.相关第三方数据分析库,其中datetime库是用于转换时间类型:
import pandas as pd
import numpy as np
import csv
import time
from datetime import datetime
#全部行都能输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
sale_data = pd.read_csv("D:/data/RFM_E_commerce/rfm_data.csv", encoding = 'gbk')
sale_data.head()
2. 查看字段类型、长度和有无缺失值,如有缺失值需要做缺失值填充;
sale_data.dtypes
len(sale_data)
sale_data.isnull().any()
3. 考虑到用户黏贴度,其黏贴度越高越有价值,这里为了凸显他们的价值,于是做去重处理,当某个客户一天之内有下多个订单的情况我们只记录这个客户当天有下单(非必须项,请根据实际情况考虑是否需要这项处理)
sale_data.drop_duplicates(subset = ['buy_time', 'city_code', 'customer_code'], keep = 'first', inplace = True)
len(sale_data)
4.把buy_time字段转化为时间类型,并计算最后一次消费距离现在的时间间隔date_diff
def time_diff(x):
x=x[0]
day_diff=(pd.to_datetime('today')-x).days
return day_diff
sale_data['buy_time']=pd.to_datetime(sale_data['buy_time'])
sale_data['date_diff']=sale_data.apply(time_diff,axis=1)
sale_data.head()
5.计算’最后一次消费间隔’,‘消费次数’,'消费总额’三个字段实际大小
R_data = sale_data.groupby(['city_code', 'customer_code'])['date_diff']
F_data = sale_data.groupby(['city_code', 'customer_code'])['bill_code']
M_data = sale_data.groupby(['city_code', 'customer_code'])['sale_amt']
R_agg = R_data.agg([('最后一次消费间隔', 'min')])
F_agg = F_data.agg([('消费次数', 'count')])
M_agg = M_data.agg([('消费总额', 'sum')])
rfm = R_agg.join(F_agg).join(M_agg)
rfm
6.把’最后一次消费间隔’,‘消费次数’,'消费总额’三个字段按照五分位数,划分为5层,并给与对应得分;
rfm = rfm.reset_index(drop = False)
bins = rfm['最后一次消费间隔'].quantile(q=np.linspace(0,1,6), interpolation= 'nearest')
bins[0] = 0
labels = [5, 4, 3, 2, 1]
R1 = pd.cut(rfm['最后一次消费间隔'], bins, labels=labels)
bins = rfm['消费次数'].quantile(q=np.linspace(0,1,6), interpolation= 'nearest')
bins[0] = 0
labels = [1, 2, 3, 4, 5]
F1 = pd.cut(rfm['消费次数'], bins, labels=labels)
bins = rfm['消费总额'].quantile(q=np.linspace(0,1,6), interpolation= 'nearest')
bins[0] = 0
labels = [1, 2, 3, 4, 5]
M1 = pd.cut(rfm['消费总额'], bins, labels=labels)
rfm['R1']=R1
rfm['F1']=F1
rfm['M1']=M1
rfm.head()
7.按照RFM得分公式,算出总分,划分对应用户等级,并统计出各等级的用户数量,了解总体分布情况。
rfm['RFM'] = 0.2*R1.astype(int) + 0.3*F1.astype(int) + 0.5*M1.astype(int)
bins = rfm['RFM'].quantile(q=np.linspace(0,1,9), interpolation= 'nearest')
bins[0] = 0
labels = ['流失用户', '一般维持客户', '一般发展用户', '潜力用户', '重要挽留用户', '重要保持用户', '重要发展客户', '重要价值用户']
rfm['用户分层'] = pd.cut(rfm['RFM'], bins, labels=labels)
rfm=rfm.rename(columns={'最后一次消费间隔':'last_sale_day','消费次数':'sale_frq','消费总额':'sale_amt','用户分层':'customer_classification',})
rfm_table = rfm.pivot_table(values = 'customer_code', index = 'customer_classification', aggfunc='count')
rfm_result = rfm_table.rename(columns={'customer_code':'customer_num'}).reset_index()
print(rfm_result)