前言
个人认为该模型可以运用到很多场合不单单是进行普通的用户挖掘。而且可以举一反三形成另一维度特征用来标记用户。也是一个经常用于用户购买行为预测的重要特征之一。通过该篇文章能够知晓如何根据这一个模型反建更多相对模型。
提示:以下是本篇文章正文内容,下面案例可供参考
一、RFM概念
RFM模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该机械模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱3项指标来描述该客户的价值状况。
根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有三个神奇的要素,这三个要素构成了数据分析最好的指标:
最近一次消费(Recency)
消费频率(Frequency)
消费金额(Monetary)
根据模型原理可知该模型主要由三个特征R、F、M所组成,当然要构建这个模型可以不用仅仅局限于这三个特征进行构建,我们可以根据不同数据特征筛选出最为需要的三个因素进行构建。
二、根据实例构建模型步骤
1.数据预览
此次数据选为2021年的全国大学生数据统计与分析竞赛B题数据。
(如有数据需要可联系笔者)
2.模型的构建
在该模型中,我们选择用户的三个指标,即“login_diff_time”(登录间隔)、“login_time” (登录时长)、“login_day”(登录天数)依次承担这三个维度。设置这些特征表达了 一定的用户依赖度,提取该特征我们可以了解该用户对课程的粘粘度,判断是否为使用 该软件的核心用户。从而推测符合行为程度的用户对购买课程是否拥有强烈的意愿,加 大推送课程购买概率。
3.维度打分
对每个用户进行 R/F/M 三个维度的打分。R 维度打分的标准是:登录越频繁,则分 值越高。F 维度打分的标准是:登录的时长越多,则分值越高。M 维度打分的标准是: 登录的天数越多,则分值越高。
我们首先需要根据数据情况进行合理的划分区间:
首先看login_diff_time:
R打分 | R值 | 含义 |
1 | [30,135] | 一个月以上四个月半之内未登陆 |
2 | [10,30] | 10天以上一个月之内未登陆 |
3 | [3,10] | 3天以上10天以下未登陆 |
4 | [1,3] | 1天以上3天以下未登陆 |
5 | [0,1] | 1天之内登陆过 |
'login_time'
F打分 | F值 | 含义 |
1 | [0,1] | 登陆时长不足一天 |
2 | [1,10] | 登陆时长超过一天不足十天 |
3 | [10,30] | 登陆时长超过十天不足一个月 |
4 | [30,365] | 登陆时长超过一个月不足一年 |
5 | [365.--] | 登陆时长超过一年 |
M值设为
‘login_day':
M打分 | M值 | 含义 |
1 | [0,1] | 登陆天数不超过一天 |
2 | [1,3] | 登陆天数超过一天不足三天 |
3 | [3,5] | 登陆天数超过三天不足五天 |
4 | [5,10] | 登陆天数超过五天不足十天 |
5 | [10,120] | 登陆天数超过十天在三个月之内 |
由此我们可对各个用户进行 R/F/M 的打分。因为每个用户和平均值对比后的 R/F/M 只有 0 和 1 两个值。0 表示小于平均值,1 表示大于平均值。整体组合一共有 8 个分组。 所以我们设定 RFM 的分类标准,将用户分为了 2 × 2 × 2 = 8 种。
4.模型建立
根据建立的 RFM 模型对每个用户进行分类。其输出结果预览如下图。
该模型能够快速地帮助企业对用户进行分类,进而对不同层次的用户制定不同的营 销策略。由下图可以直观地看出该企业存在的流失用户是比例最大的,而重要价值用户 占中等比例,一般用户占的比例最小。通过 RFM 方法,对用户的属性数据分析,对用 户进行了归类。在推送和营销时,可以更加精准化,不至于出现用户反感的情形。更重 要的是,对产品转化等商业价值也有很大的帮助 。
三、具体代码以及思路
#我们可构建代表用户是否为常驻用户的RFM判别模型 #首先我们可知道 # R,Rencency,即每个客户有多少天没回购了,可以理解为最近一次购买到现在隔了多少天。 # F,Frequency,是每个客户购买了多少次。 # M,Monetary,代表每个客户平均购买金额,这里也可以是累计购买金额。 #那我们设置 R为用户登入间隔 F为登陆时长 M即为开课数 df2=df1[['user_id','login_diff_time','login_time','login_day']] df2
df2.columns=['用户','R','F','M'] df2
df2['R-SCORE']=pd.cut(df2['R'],bins=[-1,1,3,10,30,135],labels=[5,4,3,2,1],right=False).astype(float) df2['F-SCORE']=pd.cut(df2['F'],bins=[-1,1,10,30,365,1481],labels=[1,2,3,4,5],right=False).astype(float) df2['M-SCORE']=pd.cut(df2['M'],bins=[-1,1,3,5,10,120],labels=[1,2,3,4,5],right=False).astype(float) df2.head()
df2['R是否大于均值']=(df2['R-SCORE']>df2['R-SCORE'].mean())*1 df2['F是否大于均值']=(df2['F-SCORE']>df2['F-SCORE'].mean())*1 df2['M是否大于均值']=(df2['M-SCORE']>df2['M-SCORE'].mean())*1 df2['人群数值']=(df2['R是否大于均值']*100)+(df2['F是否大于均值']*10)+(df2['M是否大于均值']*1) df2.head()
#判断R/F/M是否大于均值 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
count=df2['人群类型'].value_counts().reset_index() count.columns = ['客户类型','人数'] count['人数占比'] = count['人数']/count['人数'].sum()