RFM客户价值分类

# 自定义好的包,亲测可用 原数据和代码思想来自以下网址
# https://github.com/joaolcorreia/RFM-analysis
import datetime as dt
import pandas as pd
def RFM(data_,ri_qi,user_id,money,*time_):
'''
return:
dataframe表格
列有r,f,m,r_四分位分数,f_四分位分数,m_四分位分数,RFM,用户分类
行为用户id,唯一,分类汇总后
desc:
如 : RFM(orders,'order_date','customer','grand_total',2018,1,2)
返回df数据会复制到粘贴板
params:
data_ : 表格数据 pandas dataframe (表格中的字段名)
ri_qi : 订单日期 (表格中的字段名)
user_id : 用户id (表格中的字段名)
money : 消费金额 (表格中的字段名)
*time_ : 不定长参数 不写默认当天 ''' # 设置参考时间点,无参数则默认为当天
if time_ == ():
NOW = dt.datetime.now()
else:
y,m,d = time_
NOW = dt.datetime(y,m,d) # 日期列进行格式转换
data_[ri_qi] = pd.to_datetime(data_[ri_qi]) # 创建RFM标签
rfmTable = data_.groupby(user_id).agg({ri_qi: lambda x: (NOW - x.max()).days, # Recency 顾客最近一次购买距今天数(days)
'order_id': lambda x: len(x), # Frequency 按顾客分组后次数,即顾客订单频次
money: lambda x: x.sum()}) # Monetary Value 顾客消费金额总和
# 日期列转换数据类型
rfmTable[ri_qi] = rfmTable[ri_qi].astype(int)
# 列名重命名
rfmTable.rename(columns={ri_qi: 'recency',
'order_id': 'frequency',
money: 'monetary_value'}, inplace=True) # 确定RFM四分位数
quantiles = rfmTable.quantile(q=[0.25,0.5,0.75])
quantiles = quantiles.to_dict() # 创建RFM分割表
rfmSegmentation = rfmTable.copy(deep=True)
# Arguments (x = value, p = recency, monetary_value, frequency, k = quartiles dict)
# 日期间隔越小越好
def RClass(x,p,d):
# p,d = args = ('recency',quantiles,)
# x即rfmSegmentation['recency'].apply(RClass) 日期间隔数据
if x <= d[p][0.25]:
return 1
elif x <= d[p][0.50]:
return 2
elif x <= d[p][0.75]:
return 3
else:
return 4 # Arguments (x = value, p = recency, monetary_value, frequency, k = quartiles dict)
# 消费频次和金额越大越好
# 分数范围1-4
def FMClass(x,p,d):
if x <= d[p][0.25]:
return 4
elif x <= d[p][0.50]:
return 3
elif x <= d[p][0.75]:
return 2
else:
return 1 # 评分应用 R F M
rfmSegmentation['R_Quartile'] = rfmSegmentation['recency'].apply(RClass, args=('recency',quantiles,))
rfmSegmentation['F_Quartile'] = rfmSegmentation['frequency'].apply(FMClass, args=('frequency',quantiles,))
rfmSegmentation['M_Quartile'] = rfmSegmentation['monetary_value'].apply(FMClass, args=('monetary_value',quantiles,)) # 评分应用 RFMClass
rfmSegmentation['RFMClass'] = rfmSegmentation.R_Quartile.map(str) \
+ rfmSegmentation.F_Quartile.map(str) \
+ rfmSegmentation.M_Quartile.map(str) def type_(x,R,F,M):
'''
r,f,m即每行的r,f,m分值
'''
r,f,m = x[R],x[F],x[M]
if r > 2 and f > 2 and m > 2:
return '高价值客户'
elif r <= 2 and f > 2 and m > 2:
return '高重点保护客户'
elif r > 2 and f <= 2 and m > 2:
return '重点发展客户'
elif r <= 2 and f <= 2 and m > 2:
return '重点挽留客户'
elif r > 2 and f > 2 and m <= 2:
return '一般价值客户'
elif r <= 2 and f > 2 and m <= 2:
return '一般保持客户'
elif r > 2 and f <= 2 and m <= 2:
return '一般发展客户'
elif r <= 2 and f <= 2 and m <= 2:
return '潜在客户'
else:
return rfmSegmentation['type_'] = rfmSegmentation.apply(type_,args=('R_Quartile','F_Quartile','M_Quartile'),axis=1)
rfmSegmentation.to_clipboard() # 数据复制到 粘贴板
return rfmSegmentation

调用函数处理后:

RFM客户价值分类的更多相关文章
- k-means实战-RFM客户价值分群
数据挖掘的十大算法 基本概念 导入数据集到mysql数据库中 总共有940个独立消费数据 K-Means 算法 K-Means 算法是一个聚类算法.你可以这么理解,最终我想把物体划分成 K 类.假设每 ...
- 数据分析之客户价值模型(RFM)技术总结
作者 | leo 管理学中有一个重要概念那就是客户关系管理(CRM),它核心目的就是为了提高企业的核心竞争力,通过提高企业与客户间的交互,优化客户管理方式,从而实现吸引新客户.保留老客户以及将已有客户 ...
- 如何通过CRM评估客户价值和提高客户忠诚度?
随着市场经济的日益繁荣,同行业之间企业的竞争越来越激烈,企业纷纷各出奇招吸引和挖掘客户,力求让自己的品牌成为更多客户的第一选择.那么,我们可以用什么方法来评估客户价值,提高客户忠诚度呢? 在互联网时代 ...
- Python使用RMF聚类分析客户价值
投资机构或电商企业等积累的客户交易数据繁杂.需要根据用户的以往消费记录分析出不同用户群体的特征与价值,再针对不同群体提供不同的营销策略. 用户分析指标 根据美国数据库营销研究所Arthur Hughe ...
- 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good
作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...
- RFM模型+SOM聚类︱离群值筛选问题
笔者寄语:一般情况下离群值不应该直接删除,应该进行筛选,然后进行专门的离群值分析.笔者在这进行一下思考,在聚类基础之上的一种离群点检验. 基于聚类的离群点检测的步骤如下:数据标准化--聚类-- ...
- 数据挖掘应用案例:RFM模型分析与客户细分(转)
正好刚帮某电信行业完成一个数据挖掘工作,其中的RFM模型还是有一定代表性,就再把数据挖掘RFM模型的建模思路细节与大家分享一下吧!手机充值业务是一项主要电信业务形式,客户的充值行为记录正好满足RFM模 ...
- 航空客户价值分析特色LRFMC模型——RFM升级
本文转载自微信公众号TIpDM. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 我们说RFM ...
- 使用ML.NET实现基于RFM模型的客户价值分析
RFM模型 在众多的客户价值分析模型中,RFM模型是被广泛应用的,尤其在零售和企业服务领域堪称经典的分类手段.它的核心定义从基本的交易数据中来,借助恰当的聚类算法,反映出对客户较为直观的分类指示,对于 ...
随机推荐
- 【题解】保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006]
[题解]保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006] 传送门:皇宫看守\([LOJ10157]\) 保安站岗 \([P2458]\) \([SDOI2006]\) [题目描述 ...
- MySQL面试题及答案整理,史上最全!
原文链接:https://juejin.im/post/5d351303f265da1bd30596f9 前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐 ...
- Elastic Stack 7.5.0白金版永不过期
适用版本:7.4.0~7.5.0 警告:本文章仅限于学习,非商业用途. 目录结构 # 先创建相关目录,具体结构如下: /opt |-- bulid # 编译目录 | |- src |-- instal ...
- opencv imshow plt imshow
opencv官方文档上写的,https://docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html Color image loade ...
- Bagging 和RF的区别
跑训练无聊看了看别人的面经,发现自己一时半会答不上来,整理一下. 一.Bagging介绍 先看一个Bagging的一个概念图(图来自https://www.cnblogs.com/nickchen12 ...
- pytest之mark功能
pytest系列(一)中给大家介绍了pytest的特性,以及它的编写用例的简单至极. 那么在实际工作当中呢,我们要写的自动化用例会比较多,不会都放在一个py文件里. 如下图所示,我们编写的用例存放在不 ...
- Python - 实现矩阵转置
有个朋友提出了一个问题:手头上现在有一个二维列表,比如[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]],现在要把该二维列表变成为[[1, 4, 7, 10 ...
- Java 之 Set 接口
一.Set 概述 java.util.Set 接口继承 collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Co ...
- sqlserver语句随笔
替换数据:update 表名 set 列=replace(列,'要替换的数据','替换成的数据'),例子:update kers set KeyConn=replace(KeyConn,'-','/' ...
- SaltStack--快速入门
saltstack快速入门 saltstack介绍 Salt,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯 主要功能远程执 ...