RFM用户画像
项目背景-需求
- **要求:**对京东平台某电子产品批发店铺20年1-11月的订单数据,做RFM用户分类
- **产出:**一张明细表,字段包含用户id、R、F、M、用户分类几个字段
导入数据
import pandas as pd
df1=pd.read_excel("data.xlsx")
数据探索
df1.head()
df1.tail()
df1.info()
# 查看数据信息概览,包括数据类型,内存情况,空缺值情况...
df1.describe()
#查看数据的描述性统计信息,数据极值,离散程度...
数据清洗
- **筛选数据:**需要的字段有:user_id;event_time;order_id
df=df1[['user_id','event_time','order_id','price']]
- **删除异常值:**price字段中值为0的35条数据需要删除
df=df[df.price!=0]
df.info()
建模分析
R:用户订单时间段内,最近一次消费距今(2020-12-01)的时间间隔天数
F:用户订单时间段内的消费频率
M:用户订单时间段内的消费总金额
R,F,M值计算,并打分
- 找出每个用户最近一次的消费记录
- 对订单时间进行排序,对用户id去重,获得最近一条消费记录
import copy
#将原数据进行深拷贝备份
dfr=copy.deepcopy(df)
#排序去重
dfr=dfr.sort_values("event_time").drop_duplicates("user_id",keep="last")
- 计算R值
#将下单时间字段改为时间数据类型,只保留日期部分
dfr.event_time=pd.to_datetime(dfr.event_time).dt.date
#再次更改数据类型
dfr.event_time=pd.to_datetime(dfr.event_time)
#增加结束时间字段,注意数据类型
dfr["end_time"]=pd.to_datetime("2020-12-01")
#计算R值,时间字段相减,取days属性
dfr["R"]=(dfr.end_time-dfr.event_time).dt.days
- 计算F
- 每人每天的下单算一次
# 深拷贝,备份数据
dff=copy.deepcopy(df)
# 每人每天的下单,只计算一次,对任意非空字段进行计数
dff=dff.drop_duplicates(["user_id","event_time"]).groupby("user_id")["event_time"].count().reset_index()
dff.columns=['user_id', 'f']
dff
- 计算M
dfm=copy.deepcopy(df)
dfm=dfm.groupby("user_id")["price"].sum().reset_index()
dfm.columns=['user_id', 'm']
dfm
6.合并RFM,并打分
- 合并数据
#合并数据
df_RFM=dfr[["user_id","R"]].merge(dff,on="user_id").merge(dfm,on="user_id")
# 重设index
df_RFM.set_index("user_id",inplace=True)
df_RFM.head()
- 分别给RFM打分
#注意bins区间,确保全部都分段打分
df_RFM["r分"]=pd.cut(df_RFM.R,[0,30,60,90,120,10000],labels=[5,4,3,2,1])
df_RFM["f分"]=pd.cut(df_RFM.f,[0,3,5,10,50,10000],labels=[1,2,3,4,5])
df_RFM["m分"]=pd.cut(df_RFM.m,[0,100,500,1000,2000,10000000000],labels=[1,2,3,4,5])
用户分类
分类标准如下:
- 赋值判断
分别计算r分,f分,m分的均值
#修改数据类型,方便后续进行比较
df_RFM["r分"]=df_RFM.r分.astype("int8")
df_RFM["f分"]=df_RFM.f分.astype("int8")
df_RFM["m分"]=df_RFM.m分.astype("int8")
#赋值
df_RFM["r_分类"]=df_RFM.r分.apply(lambda x:1 if x>df_RFM.r分.mean() else 0)
df_RFM["f_分类"]=df_RFM.f分.apply(lambda x:1 if x>df_RFM.r分.mean() else 0)
df_RFM["m_分类"]=df_RFM.m分.apply(lambda x:1 if x>df_RFM.r分.mean() else 0)
- 分类
#合并rfm的高低打分数值
df_RFM["RFM"]=df_RFM.r_分类*100+df_RFM.f_分类*10+df_RFM.m_分类
df_RFM.info()
#将分类标准判断逻辑,封装为函数
def fenlei(x):
if x==111:
return "重要价值客户"
elif x==110:
return "重要潜力客户"
elif x==101:
return"重要深耕客户"
elif x==100:
return "新客户"
elif x==11:
return "重要唤回客户"
elif x==10:
return "一般用户"
elif x==1:
return "重要挽回客户"
else:
return "流失客户"
#应用函数
df_RFM["用户分类"]=df_RFM.RFM.apply(fenlei)
#查看分类后的数据信息概览,看是否将所有用户进行分类
df_RFM.info()
输出结果,并分析
df_result=df_RFM[["r分","f分","m分","用户分类"]]
df_result.用户分类.value_counts()
- 画图分析
from matplotlib import pyplot as plt
#更改字体显示
font = {
"family": "Microsoft Yahei"
}
plt.rc("font",**font)
#用户分类数据
a=pd.DataFrame(df_result.用户分类.value_counts())
a.plot.bar()
将分类结果写入本地
df_result.to_excel("RFM_result.xlsx",sheet_name="2020年1-11月订单用户RFM分类")