文章目录
基于RFM 模型的 Python 实战分析
脱敏后数据链接:https://pan.baidu.com/s/1vSbBeNLaH5M4Ph8DGkgqRQ 密码:tr4q
一、RFM 模型介绍
RFM模型是根据客户活跃程度和交易金额的贡献,进行客户价值细分的一种用户分类方法。
- R(Recency)——最近一次交易时间间隔。基于最近一次交易日期计算的得分,距离当前日期越近,得分越高。如5分制反映客户交易活跃度较高。
- F(Frequency)——客户在最近一段时间内交易次数。基于交易频率计算的得分,交易频率越高,得分越高。如5分制反映客户交易频次较高。
- M(Monetray)——客户最近一段时间内交易金额。基于交易金额计算的得分,交易金额越高,得分越高。如5分制反映客户交易金额较高。
以上三个指标对客户进行 每个维度的1-5 分打分,会将每个维度细分出5类,这样就能够细分出共5x5x5=125类用户。
但一般来说125类用户已超出普通人脑的计算范畴了,更别说针对125类用户量体定制营销策略。
在本次实战中,我们只把每个维度做一次两分,即在每个维度上取平均值,高于平均值取 1,低于平均值取 0。
这样在3个维度上我们得到了2* 2*2=8类用户。
用户分类 | R 分类 | F 分类 | M 分类 | 解读 |
---|---|---|---|---|
重要价值客户 | 1 | 1 | 1 | 最近消费、高频、高消费 |
消费潜力客户 | 1 | 1 | 0 | 最近消费、高频、低消费 |
频次深耕客户 | 1 | 0 | 1 | 最近消费、低频、高消费 |
新客户 | 1 | 0 | 0 | 最近消费、低频、低消费 |
重要价值流失预警客户 | 0 | 1 | 1 | 最近未消费、高频、高消费 |
一般客户 | 0 | 1 | 0 | 最近未消费、高频、低消费 |
高消费换回客户 | 0 | 0 | 1 | 最近未消费、低频、高消费 |
流失客户 | 0 | 0 | 0 | 最近未消费、低频、低消费 |
基于这 8 类用户,我们再进行用户营销策略制定,显而易见会容易许多。
二、数据导入与清洗
1.相关包导入
先对相关包进行导入,将数据导入 Python:
import pandas as pd
import numpy as np
df=pd.read_csv('RMF_Model_Data.csv')
2.查看字段定义
查看数据表中相关字段及其含义:
df.columns
由于本次数据只需提取已完成的订单,故对【订单状态】查看其状态:
a=df.groupby('订单状态')['订单编号'].count().reset_index()
3.提取有用字段
由上可知:数据表中订单存在3种类型状态,订单未支付、订单支付未评价、订单已支付已评价。
上述 3 种订单均为已完成的订单,故无需对订单状态字段进行处理。
RFM模型中仅需 乘客编号,订单时间,订单金额,故将数据字段进行精简,仅保留以上 3 个字段。
df=df[['乘客编号','订单金额','叫车时间']]
df.head()
4.数据清洗
运行后发现叫车时间存在转义符,需对其进行处理:
(此处即对叫车时间进行切片,丢弃其最后两个字符)
df['叫车时间']=df['叫车时间'].apply(lambda x: x[:-2])
df.head()
查看数据类型,看是否有丢失或残缺:
df.info()
各字段数据完整,均为 31809条,无丢失情况。
但同时也发现,乘客编号为浮点型、订单金额为整型,叫车时间却为object类型。
下面利用 pandas将其转换为时间格式:
(此处是为了后续作时序分析,若只进行 RFM 模型,可以不进行转换)
df['叫车时间']=pd.to_datetime(df['叫车时间'],format='%Y/%m/%d %H:%M:%S')
df.info()
6.补充知识(日期格式化表达式)
插播一个小知识:Python 中日期格式化的表达方式如下:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
最后我们的清洗基本上是完成了,来看一下清洗完的数据长什么样:
三、RFM 模型建立:
基础清洗告一段落,这一步关键在于构建模型所需的三个字段:
R(最近一次购买距今多少天);
F(购买了多少次);
M(平均或者累计购买金额);
下面开始构造上述三个相关的衡量指标,即最近一次购买距今的天数差R、消费频率F、消费金额M及创建新表RFM。
1、 R 字段的构造:
先求出每位乘客的最近一次叫车时间:
r=df.groupby('乘客编号')['叫车时间'].max().reset_index()
#获得每一位乘客的最近一次叫车时间
r.loc[:10]
再以获取数据的时间(2020/3/1)减去叫车时间,即为R:
r['R']=(pd.to_datetime('2020-3-1')-r['叫车时间']).dt.days
r=r[['乘客编号','R']]
r.loc[:10]
2、F 字段的构造
由于叫车时间为年月日时分秒的格式,故我们要先获得一个日期标签:
df['日期标签']=df['叫车时间'].astype(str).str[:10]
df.head()
一般建立 RFM 模型时,我们会将客户一天内的多笔订单视为一笔
即将以乘客编号&日期标签作聚合,获得各个乘客在 每一天的打车频次:
df_1=df.groupby(['乘客编号','日期标签'])['叫车时间'].count().reset_index()</