RFM用户画像-python

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()
#查看数据的描述性统计信息,数据极值,离散程度...

df1.info() 数据信息概览df1.describe()统计描述性情况价格=0

数据清洗

  1. **筛选数据:**需要的字段有:user_id;event_time;order_id
df=df1[['user_id','event_time','order_id','price']]
  1. **删除异常值:**price字段中值为0的35条数据需要删除
df=df[df.price!=0]
df.info()

建模分析

R:用户订单时间段内,最近一次消费距今(2020-12-01)的时间间隔天数
F:用户订单时间段内的消费频率
M:用户订单时间段内的消费总金额

R,F,M值计算,并打分

  1. 找出每个用户最近一次的消费记录
  2. 对订单时间进行排序,对用户id去重,获得最近一条消费记录
import copy
#将原数据进行深拷贝备份
dfr=copy.deepcopy(df)
#排序去重
dfr=dfr.sort_values("event_time").drop_duplicates("user_id",keep="last")

在这里插入图片描述

  1. 计算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

dfr.info()

  1. 计算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

f

  1. 计算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])

打分

用户分类

分类标准如下:分类标准

  1. 赋值判断
    分别计算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)

在这里插入图片描述

  1. 分类
#合并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分类")
  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值