【Python】RFM模型实现

1 RFM模型

RFM模型:根据用户历史行为数据,结合业务理解,实现用户分层分类,助力用户的精准营销,是衡量客户价值和客户创利能力的重要工具和手段

  • Recency 最近一次消费
  • Frequency 消费频次
  • Money 消费金额
客户标签 客户标签 运营方向 客户状态 R F M
重要价值用户 VIP客户 保持现状 最近交易时间近、交易频率和交易金额高,“两高一近” 1 1 1
重要发展用户 频次深耕客户 提升频次 最近交易时间近,交易金额高,但交易次数少;不太活跃,忠诚度不高,需要通过相关激励,提高其购买频率。 1 0 1
重要保持用户 流失预警VIP客户 用户回流 交易金额和交易频次都很高,但最近一次交易时间远,很长时间没来的忠实客户,需要主动和客户互动,及时唤回。 0 1 1
重要挽留用户 高消费换回客户 重点召回 交易金额高,但最近交易时间远、交易频次低;消费力较高,是潜在的价值客户,需要重点维持。 0 0 1
一般价值用户 消费潜力客户 刺激消费 最近交易时间近、交易频次也高,唯独交易金额小,属于低客单价群体。分为两种情况,低价高利润产品可适当维持及发展;低价低利润不需要额外大量投资预算维持。 1 1 0
一般发展用户 新客户 挖掘需求 最近交易时间近,但交易频次和交易金额小,说明属于意向用户,有推广价值,以此提高交易频次和交易金额。 1 0 0
一般保持用户 一般客户 流失召回 交易次数多,但是贡献不大,一般维持即可。 0 1 0
一般挽留用户 流失客户 可放弃治疗 最近交易时间远、交易频次和交易金额也都很小,贡献度最小,如果不需要额外的运营预算和精力,也可适当进行维护。 0 0 0

2 Python实现

2.1 数据结果

# -*- coding: utf-8 -*-
# In[0] 导入库
import numpy as np
import pandas as pd
import datetime as dtimport matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# In[1] 数据处理
df = pd.read_csv('F://Retail_Data_Transactions.csv')df["trans_date"] = pd.to_datetime(df["trans_date"])
print(df['trans_date'].min(), df['trans_date'].max())
R_today = dt.datetime(2015,3,17)
df['R_diff'] = (R_today - df['trans_date']).dt.daysR = df.groupby(by=['customer_id'])['R_diff'].agg([('R_diff','min')])
F = df.groupby(by=['customer_id'])['customer_id'].agg([('F_fre','count')])
M = df.groupby(by=['customer_id'])['tran_amount'].agg([('M_sum',sum)])# In[2.1] 直接加权划分, 权重:R0.3,F0.4,M0.3
RFM = R.join(F).join(M)
RFM['r_score'] = pd.cut(RFM['R_diff'], 5, labels=[5, 4, 3, 2, 1])
RFM['f_score']  = pd.cut(RFM['F_fre'], 5, labels=[1, 2, 3, 4, 5])
RFM['m_score']  = pd.cut(RFM['M_sum'], 5, labels=[1, 2, 3, 4, 5])RFM['r_s']=pd.factorize(RFM['r_score'])[0]
RFM['f_s']=pd.factorize(RFM['f_score'])[0]
RFM['m_s']=pd.factorize(RFM['m_score'])[0]RFM["RFMsum"] = RFM['r_s']*0.3+RFM['f_s']*0.4+RFM['m_s']*0.3
labels = ['一般挽留用户','一般发展客户','一般保持客户','一般价值客户','重要挽留客户','重要发展客户','重要保持客户','高价值客户']
RFM['labels_1'] = pd.cut(RFM["RFMsum"], bins=8, labels=labels, include_lowest=True)# In[2.2] RFM直接组合
dftmp = RFM.copy()dftmp['r']= (dftmp['R_diff']<dftmp['R_diff'].mean())*1
dftmp['f']= (dftmp['F_fre']>dftmp['F_fre'].mean())*1
dftmp['m']= (dftmp['M_sum']>dftmp['M_sum'].mean())*1dftmp['r'] = dftmp['r'].astype('string')
dftmp['f'] = dftmp['f'].astype('string')
dftmp['m'] = dftmp['m'].astype('string')
RFM['rfm'] = dftmp['r'].str.cat(dftmp['f']).str.cat(dftmp['m'])RFM['lables'] = RFM['rfm'].apply(lambda x : '重要价值用户(VIP)' if x=='111'else '重要发展用户(频次深耕)' if x=='101'else '重要保持用户(流失预警)' if x=='011'else '重要挽留用户(重点召回)' if x=='001'else '一般价值用户(刺激消费)' if x=='110'else '一般发展用户(挖掘需求)' if x=='100'else '一般保持用户(流失召回)' if x=='010'else '一般挽留用户(流失放弃)' if x=='000'else x)

2.2 图像展示

# In[3] 气泡图,8个类别显示不明显
categories = np.unique(RFM['lables'])
colors = [plt.cm.tab10(i / float(len(categories) - 1)) for i in range(len(categories))]fig = plt.figure(figsize=(10, 6), dpi=120, facecolor='w', edgecolor='k')for i, category in enumerate(categories):plt.scatter('F_fre', 'M_sum', data=RFM.loc[RFM.lables == category, :], s=RFM.loc[RFM.lables == category, 'R_diff'], c=np.array(colors[i]).reshape(1, -1), edgecolors=np.array(colors[i]).reshape(1, -1), label=str(category), alpha=0.7, linewidths=.5)plt.gca().set(xlim=(0, 40), ylim=(0, 3000),xlabel='F', ylabel='M')
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.title('客户RFM分类模型图', fontsize=18)
plt.legend(loc='best',fontsize=10,frameon=True,markerscale=0.5)
plt.show()# In[4] 3D散点图
import matplotlib as mplax = plt.subplot(projection = '3d')
ax.set_title('客户RFM分类模型图', fontsize=18)for i, category in enumerate(categories):ax.scatter('R_diff','F_fre', 'M_sum', data=RFM.loc[RFM.lables == category, :], s=RFM.loc[RFM.lables == category, 'R_diff'], c=np.array(colors[i]).reshape(1, -1), edgecolors=np.array(colors[i]).reshape(1, -1), label=str(category), alpha=0.7, linewidths=.5)ax.set_xlabel('R')
ax.set_ylabel('F')
ax.set_zlabel('M')legend_lines = [mpl.lines.Line2D([0], [0], linestyle="none", marker='o', c=colors[y]) for y in range(len(categories))]
ax.legend(legend_lines, categories, numpoints=1, title='客户RFM分类模型图')plt.show()# In[5] 直方图data = RFM.groupby('lables')['rfm'].count().sort_values(ascending = False)
plt.figure(figsize=(8,6))
data.plot(kind='bar', width=0.6)plt.ylabel(u'客户数量')
p = 1.0*data.cumsum()/data.sum()
p.plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)for i in range(len(p)):plt.annotate(format(p[i], '.2%'),xy = (i, p[i]), xytext=(i*1.005, p[i]*1.005))plt.ylabel(u'客户数量(比例)')
plt.show()



【Python】RFM模型实现相关推荐

  1. python给用户打标签_用Python实现RFM模型——互联网产品用户分层必备技巧

    1.前言 RFM模型即"R"--Recency(最近一次消费时间)."F"--Frequency(一段时间内消费频次)."M"--(一段时间 ...

  2. RFM模型的理解和python案例分析

    RFM模型是什么 RFM是客户关系管理(CRM:Customer Relationship Management)中一种重要的分析模型,通过研究一个客户的交易时间.交易频率和交易总金额来衡量客户的价值 ...

  3. python 估值模型_基于Python的客户价值细分模型(RFM)

    RFM模型:是衡量客户价值和客户创利能力的重要工具和手段.在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的.该机械模型通过一个客户的近期购买行为(recency).购买的总体频率( ...

  4. Python 某电子产品销售数据分析报告及RFM模型(一)

    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64 ...

  5. python数据分析实战之用户分析及RFM模型分析

    理论基础知识可以看我之前的博客: 1.python之Numpy知识点详细总结 2.python最最最重要的数据分析工具之pandas 3.pandas之表连接与高级查询 也可以进入我的专栏:欢迎订阅哦 ...

  6. python 估值模型_利用RFM模型建模,并通过聚类分析、分类,分别算出8中不同的价值会员...

    RFM-Clustering 利用RFM模型建模,并通过聚类分析.分类,分别算出8中不同的价值会员 RFM模型构建会员价值标签 R:最近一次消费(Recency) F:消费频率(Frequency) ...

  7. 【python数据运营】Task02 会员RFM模型的学习和运用

    文章目录 前言 1 RFM模型介绍 2 代码实践 (1) 导入库 (2) 读取数据 (3) 数据审查 (4) 数据预处理,去除缺失值和异常值 (5) 确定RFM划分区间 (6)计算RFM因子权重 (7 ...

  8. 基于客观事实的 RFM 模型(Python 代码)

    CDA数据分析师 出品 0 1 背景 RFM(Recency Frequency Monetary)模型是衡量客户价值和客户创利能力的重要工具和手段.在众多的客户关系管理(CRM)的分析模式中,RFM ...

  9. Python数据挖掘-RFM模型K-means聚类分析-航空公司客户价值分析

    使用教材:<Python数据分析与挖掘实战> 模型:RFM模型 算法:K-means聚类:其他方法还用到了层次聚类 数据:需要数据的可以评论里call. 内容: (1)案例: 航空公司客户 ...

最新文章

  1. Android模拟器环境下SD卡内容的管理[转]
  2. 为jupyter_notebook增加目录
  3. disable path length limit_通过Antsword看绕过disable_functions
  4. A damn at han’s Windows phone book 笔记(23:序列化,图片)
  5. Python之面向对象和正则表达(代数运算和自动更正)
  6. win7桌面取消显示计算机,教您win7系统关闭右下角显示桌面功能的解决办法
  7. hdr_pj410说明书_索尼HDR-PJ410
  8. 疯狂填词 mad_libs 第9章9.9.2
  9. 解决‘GNN’中‘over—smoothing’问题(通俗易懂)
  10. 如何通过github实现个人网页上传
  11. 关于微命令,微指令,微程序,机器周期,机器指令的关系图解(超详细)
  12. Jetpack LiveData
  13. 使用visio来进行画类图
  14. 2019投资总结,5月入市的小账户,收益25%
  15. 文献综述在论文中的应用
  16. 饥荒联机版好友服务器未响应,饥荒联机版机器人wx-78使用心得
  17. 复旦大学2018--2019学年第二学期高等代数II期末考试情况分析
  18. 【Odin插件】Unity补完计划
  19. 记录一次Extmail 邮件服务器崩盘事件
  20. IOT技术在农业生产上的应用

热门文章

  1. DSSS直序扩频与FHSS跳频扩频的对比和扩频技术的优点
  2. 什么是物联移动卡,有哪几种规格?
  3. 大电容滤低频,小电容滤高频?——滤波电容的选择
  4. ISSP与signaltap联调使用
  5. 多屏互动——H5中级进阶
  6. 玩过八音符游戏吗?今天教大家用python做一个八音符游戏
  7. 西门子plc程序代写代写西门子plc程序包括200smart,1200plc和1500plc和上位机系统
  8. Emacs常用命令快速参考
  9. ffmpeg 截取音频
  10. 恢复刚被误删QQ好友的方法