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模型是被广泛应用的,尤其在零售和企业服务领域堪称经典的分类手段.它的核心定义从基本的交易数据中来,借助恰当的聚类算法,反映出对客户较为直观的分类指示,对于 ...
随机推荐
- [Atcoder AGC032C]Three Circuits
题目大意:有一张$n$个点$m$条边的无向连通图,判断是否可以从中分出$3$个环,满足三个环覆盖整张图并且没有重复的边.$n,m\leqslant10^5$ 题解:分类讨论.有度数为奇肯定不行,因为连 ...
- JavaScript由来
在互联网时代,网速还很差劲的时候,表单输入数据的合法性验证需要与服务器交换数据,从而加重了使用者的负担. 网景公司为了解决这种简单问题开发了JavaScript.在1995年2月网景公司在发布自己的浏 ...
- String.Operation
// 字符串切割 StringField.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
- NVIDIA-docker Cheatsheet
TensorFlow Docker requirements Install Docker on your local host machine. For GPU support on Linux, ...
- Nginx优化配置,轻松应对高并发
Nginx现在已经是最火的web服务器之一,尤其在静态分离和负载均衡方面,性能十分优越.接下来我们主要看下Nginx在高并发环境下的优化配置,主要是针对 nginx.conf 文件的属性设置.我们打开 ...
- Map接口---Day20
Map接口概述: 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系 ...
- Java DbUtils 操作数据库
示例 1.新建项目,把数据库驱动.DbUtils的jar包添加到项目中 2.新建文件夹resource,标识为资源根目录,下面新建数据库连接的配置文件mysql.properties driver=c ...
- Java 虚拟机 - GC 垃圾回收机制分析
Java 垃圾回收(Garbage Collection,GC) Java支持内存动态分配.垃圾自动回收,而 C++ 不支持.我想这可能也是 为什么 Java 脱胎于 C++ 的一个原因吧. GC 的 ...
- Shell 编程 case语句
本篇主要写一些shell脚本case语句的使用. 字符判断 #!/bin/bash read -p "请输入一个字符:" char case $char in [a-z]|[A-Z ...
- 【异常】Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30005ms.
一.异常出现的场景 一次线上订单历史数据字段刷新操作,3张表100多万数据.由于同步更新太慢大概20分钟以上,所以采用异不的方式.代码如下: private void batchUpdate(List ...