用Python实现RFM模型——互联网产品用户分层必备技巧

用Python实现RFM模型——互联网产品用户分层必备技巧1.前语

RFM模型即”R”——Recency(最近一次消费时刻)、”F”——Frequency(一段时刻内消费频次)、”M”——(一段时刻内消费总额)。这三个目标可以将咱们的用户划分红不同的等级和层次,意图是为了衡量他们的用户价值,然后可以更准确地将本钱和精力花在更准确的用户层次身上。一个典型的比方便是针对一个显着无志愿的丢失用户,对其持续push自己的中心产品,费时吃力也费钱。

2.怎么用Python树立RFM模型

RFM模型,尽管字眼中带着“模型”二字,但实践它底子不需求任何的算法支撑,和数据建模中的逻辑回归,聚类剖析等是彻底不同的概念。因而完成RFM的东西和办法有许多:SQL, Excel, R等等都可以做到,当然Python也不破例,RFM模型的中心便是将三个目标进行标签化,然后依据实践场景事务需求进行分层即可。下面的文章我就经过一个简略的比方来经过代码完成RFM模型的树立。

2.1数据导入

链接:https://pan.baidu.com/s/1YbZrdsg2dOoe_5lylTwhQw 提取码:nf2f 数据是某电商的一款SKU于2018年的出售表单,字段自身只要4个,可是满足树立RFM模型了。

import os import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline plt.rcParams['font.serif'] = ['SimHei'] plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus']=False sns.set_style('ticks', {'font.sans-serif':['simhei','Droid Sans Fallback']}) 

2.2 数据清洗

df = pd.read_csv('sale.csv') df.drop_duplicates(subset=['ORDERID'],keep='first',inplace=True) df.dtypes 

dtypes.png

可以看到咱们各个字段的数据类型,注意到其间的ORDERDATE是字符串类型,而不是时刻Datetime类型,这个需求在后面进行转化。其它字段都正常。

df[df.isna().values == True] df = df.dropna(how='any', axis=0) 

检查空值.png

可以看到上面有些数据出现了空值,由于空值无法核算出RFM,所以直接删去。

plt.figure(figsize=(10,5)) sns.distplot(df.AMOUNTINFO) 

数据全体散布.png

经过直方图咱们可以很明晰地看到数据的全体散布状况,出现偏态散布,不过没有负值,因而不需求处理异常值,>0的值都是合理的。

df['ORDERDATE'] = pd.to_datetime(df['ORDERDATE']) df['Datediff'] = (pd.to_datetime('today') - df['ORDERDATE']).dt.days df 

增加一列R.png

数据的终究处理,便是将ORDERDATE转化成Datetime时刻类型,并增加一列时刻差,作为”R”的核算目标。

2.3数据剖析

R_Agg = df.groupby(by=['USERID'])['Datediff'] R_Agg = R_Agg.agg([('最近一次消费','min')])  F_Agg = df.groupby(by=['USERID'])['ORDERID'] F_Agg = F_Agg.agg([('2018年消费频次','count')])  M_Agg = df.groupby(by=['USERID'])['AMOUNTINFO'] M_Agg = M_Agg.agg([('2018年消费金额',sum)])  rfm = R_Agg.join(F_Agg).join(M_Agg) rfm 

上面的过程是别离核算了RFM模型中的三个目标: R,F,M,将其合并成一张新表,如下图:

RFM表1.png

然后便是最要害的一步了,经过pd.cut办法,将用户分层并打上标签,这儿我用的分层办法是python中的quantile函数,由于咱们之前的直方图看到是偏态散布,所以取均值来分层的差错会很大,这时候挑选分位数来分层会更好。

def rfm_convert(x):     rfm_dict = {0:'R',                 2:'M'}     try:         for i in range(0,3,2):             bins = x.iloc[:,i].quantile(q=np.linspace(0,1,num=6),interpolation='nearest')              if i == 0:                 labels = np.arange(5,0,-1)             else:                 labels = np.arange(1,6)              x[rfm_dict[i]] = pd.cut(x.iloc[:,i],bins=bins,labels=labels,include_lowest=True)     except Exception as e:         print(e)  rfm_convert(rfm) 

上面这个函数的意图是将R和M依照1-5的等级打上标签,给用户分层,但由于F的数值大多会集在1,即消费频次只要1次,所以无法运用分位数办法来均分出5个等级,因而我下面额定再运用其它办法将其打上标签:

bins = [1,3,5,12] labels = np.arange(1,4) rfm['F'] = pd.cut(rfm['2018年消费频次'], bins=bins, labels=labels, include_lowest=True) rfm.insert(4,'F',rfm.pop('F')) rfm 

F的分层是由我手动区别的,由于RFM模型自身便是依据不同场景和事务需求来树立的,因而这儿的F我就依据数据的实践散布状况来手动分层了。

RFM表2.png

好,那么至此RFM模型已经有了个雏形,终究要做的,便是打上标签:

rfm_model = rfm.filter(items=['R','F','M']) def rfm(x):     return x.iloc[0]*3+x.iloc[1]+x.iloc[2]*3 rfm_model['RFM'] = rfm_model.apply(rfm,axis=1) bins = rfm_model.RFM.quantile(q=np.linspace(0,1,num=9),interpolation='nearest') labels = ['丢失客户','一般保持客户','新客户','潜力客户','重要款留客户','重要深耕客户','重要唤回客户','重要价值客户'] rfm_model['Label of Customer'] = pd.cut(rfm_model.RFM, bins=bins, labels=labels, include_lowest=True) rfm_model 

RFM表3.png

这儿的RFM分数依据详细场景和事务来分配权重,这儿我给的权重比是3:1:3,,那么其实也可以不要这个加权分数,彻底依据独自的R,F,M来标签,比方R>=4、F>1、M>=4的,算中心用户。

4.数据可视化

以上便是RFM模型了,那么有了模型之后,咱们就能直观地看到各个层级下的用户散布以及用户价值了:

from pyecharts.charts import Grid, Pie, Bar from pyecharts import options as opts tmp = rfm_model.groupby('Label of Customer').size() t = [list(z) for z in zip(tmp.index.values, tmp.values)] # 制作饼图 pie = (     Pie()     .add('',t,      radius=['30%','75%'],      rosetype='radius',      label_opts=opts.LabelOpts(is_show=True))     .set_global_opts(title_opts=opts.TitleOpts(title='顾客分层结构',pos_left='center'),                      toolbox_opts=opts.ToolboxOpts(is_show=True),                      legend_opts=opts.LegendOpts(orient='vertical',pos_right='2%',pos_top='30%'))     .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{d}%'))) pie.render_notebook() 

顾客分层结构.png

可以看到无价值的丢失客户占有了很大一部分,可是一起咱们也要关注到,新客户的占比量是相当大的,不过,单纯看占比是没有意义的,由于咱们终究的意图是盈余,因而下面咱们再结合消费金额散布状况,来看下咱们实践应该针对哪些层级的用户进行精准投进:

consumer_r = df.groupby('USERID').AMOUNTINFO.agg([('消费总额',sum)]) new_rfm = rfm_model.join(consumer_r) filter_list = ['丢失客户','新客户','重要款留客户','重要价值客户'] new_rfm = new_rfm[new_rfm['Label of Customer'].astype('<U').isin(filter_list)] new_rfm['Label of Customer'] = new_rfm['Label of Customer'].astype('<U') tmp = new_rfm.groupby('Label of Customer').消费总额.sum() tmp = tmp.sort_values() from pyecharts.charts import Bar yindex = [] for i in list(tmp.values):     yindex.append(int(i)) # 制作柱状图 bar = (Bar(init_opts=opts.InitOpts(theme='white',bg_color='papayawhip'))        .add_xaxis(list(tmp.index.values))        .add_yaxis('顾客分层',yindex,color='lightcoral', category_gap='70%')        .set_global_opts(title_opts=opts.TitleOpts(title='不同分层顾客2018年消费总额',pos_left='center',title_textstyle_opts=opts.TextStyleOpts(color='lightcoral')),                         legend_opts=opts.LegendOpts(pos_top='bottom'),                         toolbox_opts=opts.ToolboxOpts(is_show=True),                         yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter='{value}'))) ) bar.render_notebook() 

不同分层顾客2018年消费总额.png

结合上面的饼图,咱们可以终究得出结论,尽管新客户的人群占比是最大的,可是他们实践奉献的金额并不高,所以咱们没有必要在拉新这一块花费太多心思和精力,而应该侧重将运营的重心放在“留存”和“变现”上,怎么留住中心收入来历的“重要价值用户”以及经过用户触达的各种办法,召回“重要款留客户”,是现阶段的使命。

5.总结

经过上面的RFM模型树立和可视化,咱们其实可以发现,经过对用户的精准分层,咱们可以对用户价值有个更直观的感触,然后对互联网产品的运营,起到点对点服务的效果。

原文作者:NXLLno

上一年今天运营文章2022:《我在阿里做运营》读书笔记&思想导图(0)2022:8月营销日历参阅:4号七夕,88大促(0)2021:一文读透《考虑,快与慢》(0)2021:阿里第一代政委亲述文明落地:100次的重复便是着重,100次的着重才干成功(0)2021:抖音直播复盘总结,抖音复盘究竟都在做些什么(0)

特别申明:本站的主旨在于收集互联网运营相关的干货知识,给运营小伙伴提供便利。网站所收集到的公开内容均来自于互联网或用户投稿,并不代表本站认同其观点,也不对网站内容的真实性负责,如有侵权,请联系站长删除,转载请注明出处:https://www.lnwcn.com/158050.html。
(0)
运营学社的头像运营学社官方
上一篇 2023年7月3日 下午3:01
下一篇 2023年7月3日 下午3:59

猜你喜欢

QQ:1124602020
微信:vl54120
备注:周一至周五全天在线,周末可能不在线,另外联系时,请告知来意。

公众号
交流群
运营学社会员,开通可享海量资源与多项权益,点击了解详情