python累计占比_Python|用户价值分析,构建RFM模型

一、RFM

1、 RFM模型是众多客户关系管理(CRM)分析方法中的一种,能够方便快速有效的量化用户价值和创利能力。

2、RFM模型有三个要素,分别是:Recency(最近一次交易距今时间)、Frequency(交易频率)、Monetary(交易金额)。

R值(最近一次交易距今时间)

用户最近一次交易距今的时间。间隔时间越短,则值越大,这类客户也是最有可能对活动产生反应的群体。

F值(交易频率)

用户在限定的时间内所购买的次数。最常购买的顾客,也是满意度、忠诚度最高的顾客。

M值(交易金额)

用户的交易金额,可以分为累计交易金额和平均每次交易金额,根据不同的目的取不同的数据源进行建模分析。

3、根据R、F、M的三个值的指标,进行分类,客户分为以下标准的8类RFM划分的8类客户标准

知识点详解:RFM模型数据源准备只需四个字段:客户名称、交易日期、交易次数/频率、交易金额。

二、Python建立RFM模型知识点详解:Python建立RFM模型流程?

1、加载数据

2、数据清洗

1)列名重命名

2)删除重复值

3)缺失值处理

4)一致化处理

5)异常值处理

6)选择子集/关键字段提取

3、构建模型

1)关键字段构造

2)维度打分

3)分值计算

4)客户分层

4、RFM模型结果分析

1)查看各类用户占比情况

2)不同类型用户总消费金额贡献占比情况

1、加载数据

①加载处理数据所需要的库

#1加载数据处理所需要的的库

import pandas as pd

import numpy as np

import os

②读取数据文件知识点详解:Python|os.chdir()

os.chdir() 将当前工作目录切换到指定的路径。

详细请看:Python|os.chdir()​zhuanlan.zhihu.com知识点详解:如何利用python查看Excel文件?

df=pd.read_excel('excel文件名.xlsx')

df

#将当前的工作目录切换到指定目录(C:\Users\14861\Desktop\项目经验\RFM模型\RFM\数据源)

os.chdir('C:\\Users\\14861\\Desktop\\项目经验\\RFM模型\\RFM\\数据源')

#利用python查看Excel文件(文件名:PYTHON-RFM实战数据)数据字段信息

df=pd.read_excel('PYTHON-RFM实战数据.xlsx')

df

2、数据清洗

1)列名重命名

数据字段名本身已经便于理解,因此,不需要重命名。

2)删除重复值

本数据没有重复值,因此不需要进行删除重复值操作。

3)缺失值处理

缺失值定位

#接着再观察数据的类型和缺失情况:

df.info()

订单一共28833行,没有任何缺失值。

因此不需要进行缺失值处理。

4)一致化处理

根据以上操作了解到数据源数据类型:付款日期:时间格式;实付金额、邮费和购买数量:数值型;其他均为字符串类型。

因此不需要进行一致化处理

5)异常值处理

①查看订单状态

#查看订单状态有哪些?

df['订单状态'].unique()

订单只有这两种状态,其中退款订单对于我们模型价值不大,需要在后续清洗中剔除。

②删除订单状态中:付款以后用户退款成功,交易自动关闭的数据。

#删除退款

df=df.loc[df['订单状态']=='交易成功',:]

df.head()

print('删除退款后还剩:%d行'%len(df))

6)选择子集/关键字段提取

构建RFM模型只需四个字段:客户名称、交易日期、交易次数/频率、交易金额。

在数据中对应的只需要买家昵称、付款日期、购买数量、实付金额等字段;

df=df[['买家昵称','付款日期','实付金额']]

df.head()

3、构建模型

1)关键字段构造

①R值

即每个用户最后一次购买时间距今多少天。

如果用户只下单过一次,用现在的日期减去付款日期即可;若是用户多次下单,需先筛选出这个用户最后一次付款的时间,再用今天减去它。

#筛选用户最后一次付款时间

r=df.groupby('买家昵称')['付款日期'].max().reset_index()

r.head()

#计算最后一次付款时间距今(2019-7-1:订单数据是2019-7-1生成的,即把这是时间当做是今天)多少天了?

r['R']=(pd.to_datetime('2019-7-1')-r['付款日期']).dt.days

r=r[['买家昵称','R']]

r.head()

②F值

每个用户累计购买频次。

把单个用户一天内多次下单行为看作整体一次。

因此,引入一个精确到天的日期标签,依照“买家昵称”和“日期标签”进行分组,把每个用户一天内的多次下单行为合并,再统计购买次数:

#引入日期标签辅助列

df['日期标签']=df['付款日期'].astype(str).str[:10]

#把单个用户一天内的订单合并

dup_f=df.groupby(['买家昵称','日期标签'])['付款日期'].count().reset_index()

#对合并后的用户统计频次

f=df_1.groupby('买家昵称')['付款日期'].count().reset_index()

f.columns=['买家昵称','F']

f.head()

③M值

用户的交易金额,可以分为累计交易金额和平均每次交易金额,根据不同的目的取不同的数据源进行建模分析。

这里选取用户平均支付金额。

用户平均支付金额=用户累计支付金额/购买频次

#计算累计支付金额

sum_m=df.groupby('买家昵称')['实付金额'].sum().reset_index()

sum_m.columns=['买家昵称','总支付金额']

com_m=pd.merge(sum_m,f,left_on='买家昵称',right_on='买家昵称',how='inner')

#计算平均支付金额

com_m['M']=com_m['总支付金额']/com_m['F']

com_m.head()

④合并三个指标

rfm=pd.merge(r,com_m,left_on='买家昵称',right_on='买家昵称',how='inner')

rfm=rfm[['买家昵称','R','F','M']]

rfm.head()

2)维度打分

R值根据行业经验,设置为30天一个跨度,区间左闭右开:

F值和购买频次挂钩,每多一次购买,分值就多加一分:

M值做个简单的区间统计,然后分组,这里我们按照50元的一个区间来进行划分:

3)分值计算(pandas)

①计算R的分值

rfm['R-SCORE']=pd.cut(rfm['R'],bins=[0,30,60,90,120,1000000],labels=[5,4,3,2,1],right=False).astype(float)

rfm.head()

②计算F的分值

rfm['F-SCORE']=pd.cut(rfm['F'],bins=[1,2,3,4,5,1000000],labels=[1,2,3,4,5],right=False).astype(float)

rfm.head()

③计算M的分值

rfm['M-SCORE']=pd.cut(rfm['M'],bins=[0,50,100,150,200,1000000],labels=[1,2,3,4,5],right=False).astype(float)

rfm.head()

④判断R、F、M的每个分值是否大于平均值?

rfm['R是否大于均值']=(rfm['R-SCORE']>rfm['R-SCORE'].mean())*1

rfm['F是否大于均值']=(rfm['F-SCORE']>rfm['F-SCORE'].mean())*1

rfm['M是否大于均值']=(rfm['M-SCORE']>rfm['M-SCORE'].mean())*1

rfm.head()

#Python中判断后返回的结果是True和False,对应着数值1和0,只要把这个布尔结果乘上1,

# True就变成了1,False变成了0。

4)客户分层

①人群数值

#先引入一个人群数值的辅助列,把之前判断的R\F\M是否大于均值的三个值给串联起来:

rfm['人群数值']=(rfm['R是否大于均值']*100)+(rfm['F是否大于均值']*10)+(rfm['M是否大于均值']*1)

rfm.head()

人群数值的理解:0代表流失客户;1代表高消费唤回客户;101代表频次深耕客户。

②人群标签

#为了得到最终人群标签,再定义一个判断函数,通过判断人群数值的值,来返回对应的分类标签:

def transform_label(x):

if x==111:

label='重要价值客户'

elif x==110:

label='消费潜力客户'

elif x==101:

label='频次深耕客户'

elif x==100:

label='新客户'

elif x==11:

label='重要价值流失预警客户'

elif x==10:

label='一般客户'

elif x==1:

label='高消费唤回客户'

elif x==0:

label='流失客户'

return label

#最后把标签分类函数应用到人群数值列:

rfm['人群类型']=rfm['人群数值'].apply(transform_label)

rfm.head()

4、RFM模型结果分析

1)查看各类用户占比情况

#查看各类用户占比情况:

count=rfm['人群类型'].value_counts().reset_index()

count.columns=['人群类型','人数']

count['人数占比']=count['人数']/count['人数'].sum()

count

2)不同类型用户总消费金额贡献占比情况

#不同类型用户总消费金额贡献占比情况

rfm['购买总金额']=rfm['F']*rfm['M']

money=rfm.groupby('人群类型')['购买总金额'].sum().reset_index

money.columns=['人群类型','消费金额']

money['金额占比']=money['消费金额']/money['消费金额'].sum()

money

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值