rfm模型及python实现的简单介绍

发布时间:2022-11-17

本文目录一览:

  1. 数据蛙-Python进阶
  2. 用户价值分层——基于RFM模型的研究分析
  3. 基于RFM的客户价值分析报告
  4. Python数据分析项目:用户消费行为分析
  5. K-means与RFM模型结合进行用户群体划分

数据蛙-Python进阶

这是漫长的一周,本周完成了Python的进阶模块,主要是pandas、numpy、matplotlib、seaborn、pyecharts这些模块的学习以及一个实际的案例:商品销售情况分析,之前一直觉得课程难度不够,但到这一周难度就大大提高了。尤其是案例练习中的RFM模型和用户生命周期建立,看懂不难但是自己写一直出错,在不断出错不断尝试中知识得到了积累,另外可视化部分没有什么练习题,希望后面可以加上一些这方面的练习,接下来分模块来总结一下学习的内容。

  • 重新设置索引:df.set_index()
  • Series格式转换为DataFrame:df.to_frame()
  • 文件读取:pd.read_csv(filepath, header = 0, skiprows=[1,2])
  • 使用位置做索引:df.loc[0];使用列表做索引:df.loc[[0,1,2]]
  • 使用切片做索引:df.loc[0:4];使用bool类型索引:df[df['年龄']>30]
  • loc 是基于索引值的,切片是左闭右闭的
  • iloc 是基于位置的,切片是左闭右开的
  • 修改列索引:df.rename(columns={'姓名':'name', '年龄':'age'}, inplace=True)
  • 替换一个值:df.replace({'name':{'小明':'xiaoming'}}, inplace=True)
  • 对数据进行排序:df.sort_values('age')
  • 累加求和:df.cumsum(0)
  • 删除列:del df['player'];删除行:df.drop(labels=0)(labels 是行列的名字)
  • 数据拼接:pd.concat([left, right], axis=1)
  • 指定列进行关联,默认是 inner join:result = pd.merge(left, right, on='key')
  • 多个关联条件:result = pd.merge(left, right, on=['key1', 'key2'])
  • 左连接:result = pd.merge(left, right, how='left', on=['key1', 'key2'])
  • 列名不一样的关联:pd.merge(left, right, left_on=['key1','key2'], right_on=['key3','key4'])
  • 单个分组:groups = df.groupby('district')
  • 作用多个聚合函数:groups.agg([np.mean, np.sum, np.std])
  • 针对具体列聚合:groups.age.agg([np.mean, np.sum, np.std])
  • 不同列不同聚合函数:groups.agg({"age":np.mean, "novip_buy_times":np.sum})
  • 分组后该列值求和显示:groups['vip_buy_times'].transform('sum')
  • 通常用于求占比:transform(lambda x: x / sum(x))
  • 填充指定值:np.full([3,4], 1)
  • 起始为10,5为步长,30为结尾取不到:np.arange(10, 30, 5)
  • 随机矩阵:np.random.random((2,3))
  • 平均划分:np.linspace(0, 2*pi, 100)
  • 类型及转换:vector.astype('float')
  • 多维变一维:matrix.ravel()
  • 矩阵的扩展:a = np.arange(0, 40, 10); b = np.tile(a, (3, 5))(行变成3倍,列变成5倍)
  • 水平拼接:np.hstack((a, b));竖直拼接:np.vstack((a, b))
  • 竖直分割:np.hsplit(a, 3);水平分割:np.vsplit(a, 3)
  • Select the data in rows [3, 4, 8] and in columns ['animal', 'age']:
    • df.loc[df.index[[3,4,8]], ['animal','age']]
  • The 'priority' column contains the values 'yes' and 'no'. Replace this column with a column of boolean values: 'yes' should be True and 'no' should be False:
    • df['priority'].replace(['yes','no'],[True,False], inplace=True)
    • df['priority'] = df['priority'].map({'yes': True, 'no': False})
  • 最大最小值的索引:df.idxmaxdf.idxmin
  • 找出最大最小的前N个数:nlargest()nsmallest()
  • 将原表分组并设置分段区间:pd.cut(df['A'], np.arange(0, 101, 10))
  • resample函数 日期重采样:s.resample('M').mean()
  • TimeGrouper 重组:s.groupby(pd.TimeGrouper('4M')).idxmax()
  • split 分割函数:temp = df['From_To'].str.split('_', expand=True)(True为DataFrame)
  • 两个DataFrame拼接用join:df = df.join(temp)
  • 导入绘图模块:import matplotlib.pyplot as plt
  • 设置中文显示:plt.rcParams['font.sans-serif']=['SimHei']
  • 设置负号显示:plt.rcParams['axes.unicode_minus']=False
  • 直接显示图表:%matplotlib inline
  • 折线图:plt.plot(x, y, color='r')
  • 柱状图:plt.bar(x, y);水平柱状图:plt.barh(x, y);堆积图:bottom设置不同
  • 散点图:plt.scatter(x, y, c=colors, alpha=0.5, s=area)
  • 直方图:plt.hist(a, bins=20)(bin代表分隔的最小单位)
  • 显示图例:plt.legend()
  • 添加数据标签:
    for a, b in zip(X+W[i], data[i]):
        plt.text(a, b, "%.0f"% b, ha="center", va="bottom")
    
  • 添加注释文本:
    plt.annotate('注释文本', xy=(1, np.sin(1)), xytext=(2, 0.5), fontsize=16, arrowprops=dict(arrowstyle="-"))
    
  • x轴标题:plt.xlabel("Group")
  • y轴标题:plt.ylabel("Num")
  • 绘制多个图形:
    fig, axes = plt.subplots(nrows=2, ncols=2, facecolor='darkslategray')
    axes[0,0], axes[0,1], axes[1,0], axes[1,1]
    
  • 调整图片大小:pylab.rcParams['figure.figsize'] = (10, 6)
  • 动态展示图表
  • 导入pyecharts模块:
    from pyecharts.charts import Bar
    from pyecharts import options as opts
    
  • pyecharts 绘图的五个步骤:
    1. 创建图形对象:bar = Bar()
    2. 添加绘图数据:
      bar.add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
      bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
      bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
      
    3. 配置系列参数:对标签、线型等的一些设置
    4. 配置全局参数:bar.set_global_opts(title_opts=opts.TitleOpts(title="销售情况"))
    5. 渲染图片:生成本地 HTML 文件 bar.render("mycharts.html")bar.render()
    6. notebook 渲染:bar.render_notebook()
  • 示例代码:
    bar = (
        Bar()
        .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
        .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
        .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
        .set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况"))
    )
    bar.render_notebook()
    
  • 柱状图:Bar()
  • 条形图:bar.reversal_axis()(翻转XY轴,将柱状图转换为条形图)
  • 折线图:from pyecharts.charts import Line; line = Line()
  • 饼图:from pyecharts.charts import Page, Pie; Pie()
  • 转换日期类型:df['order_dt'] = pd.to_datetime(df.order_dt, format="%Y%m%d")
  • 将日期转换为月为单位:df['month'] = df.order_dt.values.astype('datetime64[M]')(所有日期显示为当月第一天)
  • 去除日期单元值:order_diff / np.timedelta64(1, 'D')
  • 过滤部分极值:grouped_user.sum().query('order_products100').order_amount
  • 数据透视表:rfm = df.pivot_table(index='user_id', values=['order_products','order_amount'], aggfunc={'order_amount':'sum','order_products':'sum'})
  • map() 方法是pandas.series.map()方法,对DF中的元素级别的操作,可以对df的某列或某多列
  • applymap(func) 也是DF的属性,对整个DF所有元素应用func操作
  • 示例:purchase_r = pivoted_counts.applymap(lambda x: 1 if x > 1 else np.NaN if x == 0 else 0)
  • apply(func) 是DF的属性,对DF中的行数据或列数据应用func操作,也可用于Series
  • 示例:apply(lambda x: x.cumsum()/x.sum())(累计占比)
  • 示例:apply(lambda x: x/x.sum(), axis=0)(每一列中每行数据占比)
  • 下周开始进入数据分析思维的课程,很期待后面的课程以及项目,加油!

用户价值分层——基于RFM模型的研究分析

  • R(Recency):消费间隔,最近一次距离上次消费的时间间隔
  • F(Frequency):消费频次,一段时间(1个月/1年...)内的消费总次数
  • M(Monetary):消费金额,一段时间(1个月/1年...)内的消费总金额 RFM模型是用户价值研究中的经典模型,基于近度(Recency)、频度(Frequency)和额度(Monetory)这3个指标对用户进行聚类,找出具有潜在价值的用户,从而辅助商业决策,提高营销效率。RFM作为一种数据驱动的客户细分技术,可帮助营销人员做出更明智的战略性决策,使营销人员能够快速识别用户并将其细分为同类群体,并针对性制定个性化的营销策略,提高用户的参与度和留存率。 RFM建模所需要的数据源是相对简单的,只用到了购买记录中的时间和金额这两个字段。我们基于交易数据中用户的最后一次的购买时间,购买的次数以和频率,以及平均/总消费额对每个用户计算了三个维度的标准分。然后我们对于三个维度赋予了不同的权重,再基于加权后的分值应用K-Means进行聚类,根据每种人群三个维度与平均值之间的高低关系,确定哪些是需要保持用户,哪些是需要挽留的用户,哪些是需要发展的用户等。在将这些客户圈出之后,便可以对不同客户群使用不同针对性地营销策略(引导,唤醒等),提高复购率与转化率。值得注意的是,三个维度的权重制定并没有统一的标准,比较通用的方法是用层次分析法(AHP),实际场景结合行业以及具体公司的特点进行因地制宜、因人而异的优化。

RFM因素:

  • R值越高,顾客的有效期越近,对商家活动的响应越积极
  • F值越高,顾客的消费频次越高,对商家的忠诚度就越高
  • M值越高,顾客的消费能力越高,对商家贡献度就越高
  • 想要提高复购率和留存率,需要时刻警惕R值

RFM分析:

  • 谁是您最有价值的客户?
  • 导致客户流失率增多的是哪些客户?
  • 谁有潜力成为有价值的客户?
  • 你的哪些客户可以保留?
  • 您哪些客户最有可能对参与度活动做出响应?
  • 谁是你不需要关注的无价值客户?
  • 针对哪些客户制定哪种发展、保留、挽回策略? 通过RFM模型,可以帮助营销人员实现客户细分;衡量客户价值和客户利润创收能力;识别优质客户;指定个性化的沟通和营销服务;为更多的营销决策提供有力支持。

数据导入:

  • 使用python的pandas.read_csv导入样本数据。

缺失值校验:

  • 因数据为生产真实的交易数据,质量相对较高,缺失值较低。

极值校验:

  • 第一份样本数据获取的用户订单实付金额,其中会存在优惠或补差支付,同时因就餐人数不一致,产生的的订单消费也会存在较大的差异,造成极致波动、标准差值较大,因此需对金额进行处理,以人均消费额替代订单支付金额,可去掉10元以下、万元以上的交易订单。

获取RFM值:

  • 使用 groupby 获取RFM值

获取RFM评分值:

  • 数据离散,pandas.cut

实验数据RFM分值占比:

  • 说明:F、M分布不均匀,极值差异大,经数据探查知晓该商户开通了企业团餐业务,企业会给员工发放补贴,导致员工呈现较高的消费频次,该类用户的消费行为绝大程度依赖于企业,在实际的RFM模型可踢出此类订单,降低此类人群的分值,其次数据中的M值为客户实付金额,该商户支持预定、会餐、大小桌,同一单的消费群体不同,或可使用人均消费总额作为M值。

RFM数据合并,建立R、F、M数据框:

  • pandas+numpy

计算RFM综合分值:

  • 权重法 权重值主要赋值方法可分为主观赋权法、客观赋权法,如下:
  • 主观赋权法:主要由专家经验得到权数,然后对指标进行综合评价。是一种结合性方法,易操作,存在一定主观性。常用方法:层次分析法AHP、权值因子判断表法、德尔菲法、模糊分析法、二项系数法、环比评分法、最小平方法、序关系分析法等。
  • 客观赋权法:依据历史数据研究指标之间的相关关系或指标与评估结果的影响关系来综合评价。这是定量研究,无须考虑决策者主观意愿和业务经验,计算方法较为复杂。常用方法:主成分分析、因子分析、熵值法、变异系数法、均方差法、回归分析法等。 因样本数据分布不均匀,故手动赋权重值,去除部分极值。

结论:

  • 以近90天的消费活跃来看,用户消费频次集中在1-6次,呈现出极佳的复购率。可以针对消费一次的人群进行特征分析。比如针对人群的流动性,若流动人群占比较大,可进一步推广特色菜吸引客户,若周边人群占比较高,可基于复购人群的特征进行分析,同时平台可提供该类人群近期消费偏好,供商家参考,制定针对性方案。 了解RFM定义后,将3个指标作为坐标系的XYZ坐标轴,从空间上切割成8类,作为用户的价值分层,如下图:

用户价值分层说明:

  • 上面我们已经计算得到各个用户的RFM分值,接下来要依据分值进行分类。
  • 定义RFM 的分值等级
  • 使用pyecharts绘制玫瑰图:

结论:

  • 商家顾客表现出来的忠诚度较高,但新客获取能力较低。但是单纯看分层占比,并没有实际意义,可以基于价值分层与其他特征关联分析进行精准投放。如下图(网络参考图,本期实验并未涉及其他特征)所示: 用户画像是基于用户信息与行为衍生出来的特征属性,用户的准入信息是用户的主观特征,是一种既定的事实,通过对用户行为的采集、研究,刻画出单个用户的特征。其意义在于基于某一事物对群里特征进行分类,有效的体现事物的合适人群;同时针对群里特征的偏爱、习惯研究,可以刻画出用户的需求,实现精准化营销。 用户画像的基础成分来源于用户的准入信息(会员注册时的登记信息),更多的特征数据来源于用户的各类行为,而RFM模型便是基于用户消费行为提炼出来的价值指标。通过对各个价值分层的群体特征研究,可以有效提升获客能力以及针对各类人群实现精准化营销。 市场和运营往往绞尽脑汁做活动、上新品、蹭热点、做营销,拓渠道,不断开发客户、做回访维系客户感情,除了少数运气好的之外,但大多效果寥寥,这是为何? 经验丰富的营销人员都知道“了解客户”和“客户细分”的重要性。营销人员不仅要着眼于创造更多的访问量和点击量以提高客户获取,还必须遵循从提高点击率(CTR)转变为提高保留,忠诚度并建立客户关系的新范式。与其将整个客户群作为一个整体进行分析,不如将其划分为同类群体,了解每个群体的特征,并使他们参与相关的活动,而不是仅根据客户年龄或地理位置进行客户细分。而RFM分析是市场营销人员分析客户行为的最流行、最简单、最有效的客户细分方法之一。

针对RFM分层用户制定相应的营销策略:

  • 重要价值客户:您的最佳客户,他们是那些最新购买,最常购买,并且花费最多的消费者。提供VIP服务和个性化服务,奖励这些客户,他们可以成为新产品的早期采用者,并有助于提升您的品牌。
  • 重要发展客户:近期客户,消费金额高,但平均频率不太高,忠诚度不高。提供会员或忠诚度计划或推荐相关产品以实现向上销售并帮助他们成为您的忠实拥护者和高价值客户。
  • 重要保持客户:经常购买、花费巨大,但最近没有购买的客户。向他们发送个性化的重新激活活动以重新连接,并提供续订和有用的产品以鼓励再次购买。
  • 重要挽回客户:曾经光顾,消费金额大,购买频率低,但最近没有光顾的顾客。设计召回策略,通过相关的促销活动或续订带回他们,并进行调查以找出问题所在,避免将其输给竞争对手。
  • 一般价值客户:最近购买,消费频次高但消费金额低的客户,需要努力提高其客单价,提供产品优惠以吸引他们。
  • 一般发展客户:最近购买,但消费金额和频次都不高的客户。可提供免费试用以提高客户兴趣,提高其对品牌的满意度。
  • 一般保持客户:很久未购买,消费频次虽高但金额不高的客户。可以提供积分制,各种优惠和打折服务,改变宣传方向和策略与他们重新联系,而采用公平对待方式是最佳。
  • 一般挽留客户:RFM值都很低的客户。针对这类客户可以对其减少营销和服务预算或直接放弃。 此外,目前的RFM分析中,一般给与M值更高的权重,如果一般挽留客户与一般发展客户占据多数,说明公司的用户结构不是很合理,需要尽快采取措施进行优化。

基于RFM的客户价值分析报告

项目背景

在面向客户制定运营策略、营销策略时,我们希望针对不同的客户推行不同的策略,实现精准化运营,以期获取最大的转化率。精准化运营的前提是客户分类。通过客户分类,对客户群体进行细分,区别出低价值客户、高价值客户,对不同的客户群体开展不同的个性化服务,将有限的资源合理地分配给不同价值的客户,实现效益最大化。在客户分类中,RFM模型是一个经典的分类模型,模型利用通用交易环节中最核心的三个维度——最近消费(Recency)、消费频率(Frequency)、消费金额(Monetary)细分客户群体,从而分析不同群体的客户价值。

项目目标

本项目借助某电商客户数据,探讨如何对客户群体进行细分,以及细分后如何利用RFM模型对客户价值进行分析。在本项目中,主要希望实现以下三个目标:

  1. 借助某电商客户数据,对客户进行群体分类;
  2. 比较各细分群体的客户价值;
  3. 对不同价值的客户制定相应的运营策略。

分析过程

  1. 数据预览
    • 我们的源数据是订单表,记录着用户交易相关字段
    • 通过数据可以发现,订单状态有交易成功和退款关闭的,检查是否还有其他情况
    • 只有这两种情况,后续清洗中需剔除退款订单。然后观察数据类型与缺失情况
    • 订单一共28833行,没有缺失,付款日期是时间格式,实付金额、邮费和购买数量是数值型,其他均为字符串类型
  2. 数据清洗
    • (1) 剔除退款
    • (2) 关键字段提取:提取RFM模型所需要的买家昵称,付款时间,实付金额
    • (3) 关键字段构造:构建模型所需的三个字段,R(最近一次购买时间间隔), F(购买频次), M(平均或累计购买金额)
      • 首先构造R值,思路是按买家昵称分组,选取付款日期最大值
      • 为了得到最终的R值,用今天减去每位用户最近一次付款时间,就得到R值了,这份订单是7月1日生成的,所以这里我们把“2019-7-1”当作“今天”
      • 然后处理F,即每个用户累计购买频次(明确一下单个用户一天内购买多次订单合并为一次订单)
        • 思路:引入一个精确到天的日期标签,依照“买家昵称”和“日期标签”分组,把每个用户一天内的多次下单合并,再统计购买次数
      • 最后处理M,本案例M指用户平均支付金额,可以通过总金额除以购买频次计算出来
  3. 维度打分
    • 维度确认的核心是分值确定。RFM模型中打分一般采取5分制,依据数据和业务的理解,进行分值的划分
      • R值依据行业经验,设置为30天一个跨度,区间左闭右开
      • F值和购买频次挂钩,每多购买一次,分值多加一分
      • M值我们按照50元的一个区间来进行划分
    • 这一步我们确定了一个打分框架,每一个用户的每个指标,都有其对应的分值
  4. 分值计算
    • (1) 算出每个用户的R, F, M分值
    • (2) 简化分类结果
      • 通过判断每个客户的R, F, M值是否大于平均值,来简化分类结果。0表示小于平均值,1表示大于平均值,整体组合下来有8个分组
  5. 客户分层
    • RFM经典分层按照R, F, M每一项指标是否高于平均值,把用户划分为8类
    • Python实现思路如下:先定义一个人群数值,将之前判断的R, F, M是否大于均值的三个值加起来
      • 人群数值是数值类型,位于前面的0会自动略过,比如1表示001的高消费唤回客户人群,10对应010的一般客户
    • 然后在python中定义一个判断函数,通过判断人群数值,来返回对应的分类标签

数据解读与建议:

  • 首先查看各类用户占比情况
  • 然后查看不同类型客户消费金额贡献占比
  • 最后导出数据,在tableau中数据可视化展示 通过数据可视化后,我们可以发现:
  1. 客户流失情况严重,高消费唤回客户,流失客户占比超过总客户的50%
  2. 高消费唤回客户和频次深耕客户的金额总占比约66%,这两部分客户是消费的重点客户
  3. 流失客户和新客户的总人数占比约38%,但金额总占比只有约13%

建议:

  1. 针对高消费唤回客户,流失客户采用唤回策略,推送相关信息,发礼品券等挽留客户
  2. 针对高消费唤回客户和频次深耕客户,考虑继续挖掘其消费特性,如喜爱购买的产品,消费的时间段,后续据此加强店铺产品与时间段的改进,最大程度留住这两部分客户
  3. 针对流失客户和新客户金额总占比低,建议推出一些低价产品,用来拉取新客户,保证店铺的活跃性。

Python数据分析项目:用户消费行为分析

为了创造更多利润、实现数据驱动运营,某CD网站拟对18个月以来的近7万条消费数据进行分析。具体的研究思路如下:

  • 新增['month']列,便于后续按月分析。
  • 重新查看,此时的时间列已转换为正常格式。
  • 由上图可知,
  • 接下来我们用之前清洗好的字段进行数据分析。
  • 前三个月消费订单数在10000笔左右,后续月份的平均则在2500笔。
  • 前三个月产品购买数在20000以上,后续月份的产品购买量在6000~8000左右。
  • 前三个月每月的消费人数在8000-10000之间,后续月份平均消费人数在2000人不到
  • 上述消费趋势的分析可以通过数据透视表分析(不建议数据透视表进行去重操作)

本章小结——

  • 趋势分析:总体来看,消费总金额、消费次数、产品购买量、消费人数的趋势相似:均先上升、下跌、趋于平稳并下降。
  • 可以看出网站的流失用户在增加,采用开源(拉新)节流(留存)的运营方式,来增加销售收入。 上一部分是按月分析,主要看趋势;本部分按用户个体分析,来看消费能力。
  • 按用户消费金额进行降序排列,由图可知,共计约25000个用户:
  • 启发,只要维护好这5000个用户(占比20%)就可以把业绩KPI完成70%,如果能把5000个用户运营的更好就可以占比更高。 通过以上基本数据描述分析可以清楚该网站整体的消费趋势和用户消费能力,现在进一步挖掘用户消费行为数据,通过RFM模型、生命周期等方法对用户进行分层,为后续运营管理提供依据。
  • 首购可以进一步依渠道划分,衡量不同渠道的差异性,从而量化渠道能力,为后期渠道优化提供依据。
  • 用户第一次购买分布,集中在前三个月(1997年1-3月);其中,在2月11日至2月25日有一次剧烈波动
  • 由图可知,1997年1-4月新用户数量由90%跌落至80%以下;之后几个月的新用户量保持在80~82%区间。 RFM是一个经典的用户分类模型,模型利用通用交易环节中最核心的三个维度——最近消费(Recency)、消费频率(Frequency)、消费金额(Monetary)细分用户群体,从而分析不同群体的用户价值,最终达到精准营销。
  • RFM从3个维度、分2个等级(均值)得到8类用户分层。
  • 通过RFM模型,把用户分为8个类别,分别给用户打标签、将客户分为重要价值、重要保持、重要挽留、重要发展、一般价值、一般保持、一般保留、一般发展8类客户。
  • 从RFM分层可知,本网站的大部分用户为一般挽留客户(可适当放弃这部分低价值客户、也可进一步提高活跃度)、重要保持客户(企业优质的客户群,采用会员制运营)。具体运营策略依据参照如下:
  • 为了避免划分用户群体过多(RFM从3个维度、分2个等级得到8类用户分层的数据立方),可能导致针对性的营销成本负担上升;下面将通过聚类方法,基于RFM模型划分成4类用户,更快实现后期用户管理。
  • 显然,归一化预处理后,当n=2时,轮廓系数取最大值0.79,仅从模型聚类效果来讲分2类合适;而标准正态化预处理后显示,分4类的轮廓系数最大,达0.6964(但2-7类的轮廓系数整理差别波动不大)
  • 参考漏斗模型,针对每个用户,按18个月内的每个月对用户情况进行分类,即新用户、活跃用户、回流用户、流失用户。
  • 通过下面的数据透视表即可得到每个用户每个月的购买情况,从而进行转化分析。
  • 若本月无消费(即为0)
  • 若本月有消费(即为1)
  • 由上表可知,每月的用户消费状态变化

K-means与RFM模型结合进行用户群体划分

在CRM系统中经常要对用户进行划分,以标记不同的标签,进行个性化的营销触达动作。通常的用户群体划分会使用用户的一些属性信息,例如年龄,职业,性别等。但是这些属性基本上都是用户本身的特征属性,并不是和品牌关联产生的属性信息。另外一种常用的用户模型,就是 RFM模型 ,是以用户的实际购买行为数据作为基础,进行用户群体的划分的,在实践中更加具有实际价值。

RFM模型由三个指标组成,分别为:

  • 最近一次消费 (Recency)
  • 消费频率 (Frequency)
  • 消费金额 (Monetary) 可以看到这三个属性都是通过用户的购买行为计算得出的,这些指标基本上代表了用户是否活跃,购买能力,忠诚度等信息。 而我们的目标是通过对每个用户的RFM属性进行计算,将用户群体划分为不同的种类进行区分,以便我们进行分析和精准营销。例如我们可以分析出高价值用户,重点发展用户,流失用户等群体进行针对性营销动作。 本文将使用Python的一些工具包,对用户数据集进行分析处理,例如建立RFM模型,数据标准化,以及使用k-means聚类算法将用户群体进行划分。需要读者具有一些基础的Python和数据统计知识。 首先我们通过一些订单数据分析得到一部分用户的样本数据来:
  • 这里包括了用户的id,总购买笔数,总购买金额以及最后一笔订单时间的信息。我们将文件加载进来,截取一部分后对字段类型进行处理: 为了将其转化为我们要使用的RFM属性,我们需要对last_order_date进行处理,转换为最后一次订单时间到目前的天数。这样我们就获得了RFM的基本属性,分别为last_order_day_from_now(R), total_order_count(F), total_order_price(M)。处理完成后对数据进行可视化观察数据分布:
  • 其散点图为: 我们会发现实际上的数据大部分都聚集在了一起,并且有一些非常离散的极端值数据,这对我们后续进行数据聚类会产生不利影响,所以我们使用log函数对数据进行处理,让其分布的更加均匀:
  • 可以看到现在数据分布的已经比较均匀了,这为我们进行聚类打下一个比较好的基础。但同时我们也会发现RFM这三个属性的单位却并不相同,分别是天数,交易笔数和交易金额。这就造成了其数值差别巨大。而聚类算法一般都是使用不同向量间的距离进行计算划分的,属性单位不同造成的数值差异过大会造成计算距离时的权重分布不均衡,也并不能反映实际情况,所以我们还要对数据进行标准化处理,这里我们使用z-score对RFM属性进行加工运算。 z-score是一种数据标准化的计算方法,其公式为:
z = (x – μ) / σ

μ代表x所属数据组的平均值,σ代表x所属数据组的方差。所以通过z-score计算,我们将绝对值数据转化为一个数据在所属数据组中的位置(得分),这样不同单位和类型间的数据使用z-score做相互的比较也就有了一定的意义。 这时候会看到数据不但分布较为均匀,而且不同维度间的数值差异也很小了,这样我们可以把三种不同单位的属性一起进行处理。 当我们建立好RFM的数据模型之后,期望通过不同的RFM值,对用户进行区分以进行精准化营销。当然我们可以通过对RFM这三组数值的平均值或者中位数和每个用户进行比较,以建立起一个数据立方,进行群体划分。但另外一方面,一般来说用户群体会大致符合28原则,80%左右的收入是由20%左右的客户所贡献的,所以根据平均值或者中位数进行群体划分也并不能总是科学的反应出不同的用户群体来,所以我们也可以基于数据本身的特性,使用聚类算法进行处理,以便让数据更加“自然”的区分。 这里我们选用非常常用的k-means算法进行聚类计算,k-means聚类的原理并不复杂,首先随机的或者通过更高效的方式(例如k-means++)选取k个点,然后不断迭代的计算,修正这k个点的坐标,目的是让集合中的每个点的距离(有很多种距离算法,比较常用的是欧氏距离)都和k个点里的其中一个尽量的近,而和其他的尽量的远。这样数据集合就能根据自身的分布规律,自然的区分出不同的类别来。 这里我们将k值设定为3,也就是将数据划分为三个部分,通过使用我们处理后的RFM属性进行计算,最终我们得到:

  • 可以看到不同的颜色代表不同的用户类别,可以简单的认为标记为0的是流失用户,1是重点发展用户,2是高价值用户。这样我们就可以对不同的群体使用适合的营销策略了,同时当有新的用户加入后,我们也可以使用得到的k-means模型对其进行预测划分。 在使用这种方式做实际的数据处理时,可能因为数据分布的原因导致区分度并不是特别好,因为根据销售数据进行用户区分,并不是总能发现比较明显的区分“界限”,也就是不同群体间的边界其实是非常模糊和混杂的(从上面的最终分析图也可以看出这样的情况),所以从这个角度讲,单纯通过RFM模型和聚类进行用户群体划分也是有它的局限性的。