python价值算法_案例:用python实现RFM用户价值度分层(python_022)

本文框架:用户价值分析与RFM模型

案例数据概况

python实现过程

结果可视化

在真实的业务场景中,数据化运营包括会员(用户)数据化运营、商品数据化运营、流量数据化运营、内容数据化运营等四个主要方面。会员(用户)价值分析是其中最重要的数据分析应用之一。

对用户价值分析的切入点是进行用户价值细分。在销售型公司,对订单交易尤为关注,因此基于订单交易的价值度模型将更适合运营需求。

对于用户价值度分析模型而言,用户的状态是不断变化的,因此模型也需要定期更新,结合业务方的需求,一般至少每周更新一次。本文主要介绍用python实现如何将销售数据进行数据变化计算出RFM得分的过程,并进行简要可视化分析。

ps : 本文的案例数据为某企业2016年的部分销售数据。案例数据均来自宋天龙老师的《python数据分析与数据化运营》。

一、用户价值分析与RFM模型会员价值度模型,即评估用户的价值情况,是区分会员价值的重要模型和参考依据,也是衡量不同营销效果的关键指标之一。价值度模型一般基于交易行为产生,衡量的是有实体转化价值的行为。常用的价值度模型是RFM。

RFM模型:根据会员最近一次购买时间R,购买频率F,购买金额M,计算出RFM得分,通过这三个维度来评估客户的订单活跃价值,常用来做客户分群或价值区分。

RFM模型的基本实现过程:设置要计算时的截止时间点(如2019-01-05),用来做该时间的数据选取和计算。

在会员数据库中,以今天为时间界限向前推固定周期(如1年),得到包含每个会员的会员ID、订单时间、订单金额的原始数据集,一个会员可能会产生多条订单记录。

数据预计算。从订单时间中找到各个会员距离截止时间点最近的订单时间作为最近购买时间;以会员ID为维度统计每个用户的订单数量作为购买频率;将用户多个订单的订单金额求和得到总订单金额。由此得到R、F、M三个原始数据量。

R、F、M分区。对于F、M变量来讲,值越大代表购买购买频率越高、订单金额越高;但对R来讲,值越小代表离截止时间点越近,因此值越好。对R、F、M分别使用五分位(或三分位)法做数据区分,需要注意的是,对于R要倒过来划分,离截止时间越近的值划分越大。这样就得到每个用户的R、F、M三个变量的分位数值。

将三个值组合或相加得到总的RFM得分。对于RFM总得分的计算有两种方法,一种是直接将三个值直接拼接到一起,例如RFM得分为312、333、132;另一种直接将三个值相加求得一个新的汇总值,例如RFM得分为6、9、6。

基于三个维度值做用户群体划分和解读,对用户的价值度做分析。例如得分为212的会员往往购买频率较低,针对购买频率低的客户定期发送促销活动邮件;针对得分为321的会员虽然购买频率高但是订单金额低等,这些客户往往具有较高的购买粘性,可以考虑通过关联或搭配销售的方式提升订单金额。

基于RFM汇总得分评估所有会员的价值度价值,并可以做价值度排名;同时,该得分可以作为输入维度跟其他维度一起作为其他数据分析和挖掘模型的输入变量,为分析建模提供基础。

二、案例数据概况特征变量数:4个。用户ID、订单日期、订单ID、订单金额

数据记录数:86135

是否有NA值:有

是否有异常值:有USERID: 用户ID,每个用户的ID唯一,由纯数字组成

ORDERDATE: 订单日期,格式为YYYY/MM/DD

ORDERID: 订单ID,每个订单的ID唯一,由纯数字组成

AMOUNTINFO: 订单金额,浮点型数据

三、python实现过程

步骤一:导入数据

import time

import pandas as pd

import numpy as np

dtypes = {'ORDERDATE': object, 'ORDERID': object, 'AMOUNTINFO': np.float32} # 设置每列数据类型

raw_data = pd.read_csv('sales.csv', dtype=dtypes, index_col='USERID') # 读取数据文件

使用pandas.read_csv读取数据文件,参数dtypes自定义数据框的数据类型,并指定USERID为索引列。

步骤二:数据审查和校验

主要包括数据概览、缺失值审查等。

#数据概览

print('Data Overview:')

print(raw_data.head(4))

print("-" * 30)

print('Data DESC')

print(raw_data.describe())

print('-' * 30)

从数据表述中可以看出:极值较大,标准差也较大,说明数据波动非常明显。

最大值为30999,最小值为0.5,数值差距较大,非常怪异。与业务确认后得知:最大值属正常;小于1的数据属于促销优惠生成的订单,可以去掉。

缺失值审查:

na_cols = raw_data.isnull().any(axis=0) # 查看每一列是否有缺失值

print('NA Cols:')

print(na_cols)

print('-'*30)

na_lines = raw_data.isnull().any(axis=1) # 查看每一行是否有缺失值

print('NA Lines')

print('Total number of NA lines is: {0}'.format(na_lines.sum())) # 缺失行总记录数

print(raw_data[na_lines]) # 只查看具有缺失值的行信息

print('-'*30)

一共有10条na记录,这些数据在整体样本中占比非常小,可以直接删除。

步骤三:数据预处理

包括数据异常、格式转换和处理。

# 异常值处理

sales_data = raw_data.dropna() # 丢失带有缺失值的行记录

sales_data = sales_data[sales_data['AMOUNTINFO'] > 1] # 丢弃订单金额<=1的记录

# 日期格式转换

sales_data['ORDERDATE'] = pd.to_datetime(sales_data['ORDERDATE'], format='%Y-%m-%d') # 将字符串转换为日期格式

# 数据转换

recency_value = sales_data['ORDERDATE'].groupby(sales_data.index).max() #计算原始最近一次订单时间

frequency_value = sales_data['ORDERDATE'].groupby(sales_data.index).count() #计算原始订单频率

monetary_value = sales_data['AMOUNTINFO'].groupby(sales_data.index).sum() #计算原始订单总金额

日期转换的目的是实现基于时间间隔的计算,这样才能算出R距离指定日期的天数。转换后的数据通过groupby( )方法实现R、F、M原始数值的计算。

步骤四:计算RFM得分

# 分别计算R,F,M得分

deadline_date = pd.datetime(2017, 1,1) #指定一个时间节点,用来计算其他时间和改时间的距离

r_interval = (deadline_date - recency_value).dt.days #计算r间隔

r_score = pd.cut(r_interval, 5, labels=[5,4,3,2,1]) # 计算r得分

f_score = pd.cut(frequency_value, 5, labels=[1,2,3,4,5]) # 计算f得分

m_score = pd.cut(monetary_value, 5, labels=[1,2,3,4,5]) # 计算m得分

# R,F,M数据合并

rfm_list = [r_score, f_score, m_score] # 将R,F,M三个维度组成列表

rfm_cols = ['r_score', 'f_score', 'm_score'] # 设置R,F,M三个维度的列名

rfm_pd = pd.DataFrame(np.array(rfm_list).transpose(), dtype=np.int32,

columns=rfm_cols, index=frequency_value.index) #建立R,F,M数据框

计算RFM得分

#方法一:加权得分

rfm_pd['rfm_wscore'] = rfm_pd['r_score']*0.6 + rfm_pd['f_score']*0.3 + rfm_pd['m_score']*0.1

#方法二:RFM组合

rfm_pd_tmp = rfm_pd.copy()

rfm_pd_tmp['r_score'] = rfm_pd_tmp['r_score'].astype('str')

rfm_pd_tmp['f_score'] = rfm_pd_tmp['f_score'].astype('str')

rfm_pd_tmp['m_score'] = rfm_pd_tmp['m_score'].astype('str')

rfm_pd['rfm_comb'] = rfm_pd_tmp['r_score'].str.cat(rfm_pd_tmp['f_score']).str.cat(rfm_pd_tmp['m_score'])

步骤五:打印输出并保存结果

# 打印结果

print('Final RFM Score Overview:')

print(rfm_pd.head(4))

print('-'*60)

print('Final RFM Score DESC:')

print(rfm_pd.describe())

# 保存RFM得分到本地

rfm_pd.to_csv('sales_rfm_score.csv')

四、结果可视化

通过上面的步骤,已将RFM得分的结果数据保存至本地:

在RFM划分时,将区间划分为5份,因此可以将这5个区间分别定义为高、中、一般、差和非常差5个级别,分别对应R,F,M中的5/4/3/2/1。

RFM用户价值度分层可视化(一)

rfmm = rfmm[rfmm.M < 20000]

plt.style.use('ggplot')

rfmm.plot.scatter('R','F', c=rfmm.rfm_wscore,s=100*rfmm.rfm_wscore,cmap='viridis',alpha=0.3,figsize=(10,4),fontsize=12)图:RFM用户价值度分层

图片上的色块代表了对用户价值度的分层。分数越高,代表用户的价值度越高,黄色用户价值度最高(消费时间最新鲜,消费频次高);紫色用户价值度最低(最近一次消费时间最长,消费频次少)。

RFM用户价值度分层可视化(二)

rfmm_grouped = rfmm.groupby('rfm_comb').M.count()

rfmm_grouped.plot.bar(figsize=(10,4),fontsize=12)

plt.xticks(rotation=0)

plt.xlabel("RFM label",fontsize=14)

plt.title("the Frequency of RFM labels")

受到极大值的影响,消费频次F和消费金额M的分层作用受到了限制,主要发挥作用的是最近一次消费时间R。可以看到,图中主要的分层是按照R进行区分的,分别是:111,211,311,411,511

基于RFM得分业务方得到的分析结论如下:公司的会员中99%以上的客户状态都不容乐观,主要体现在消费频率低R、消费总金额低M。

公司中有一些典型客户的贡献特征明显,重点是RFM得分为555的用户(ID为74270),该用户消费金额非常高,导致做5分位时受到最大值的影响,区间向大值区域偏移。同时购买频率也非常高,应引起会员管理部门的重点关注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值