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模型是被广泛应用的,尤其在零售和企业服务领域堪称经典的分类手段.它的核心定义从基本的交易数据中来,借助恰当的聚类算法,反映出对客户较为直观的分类指示,对于 ...
随机推荐
- 『正睿OI 2019SC Day3』
容斥原理 容斥原理指的是一种排重,补漏的计算思想,形式化的来说,我们有如下公式: \[\left | \bigcup_{i=1}^nS_i \right |=\sum_{i}|S_i|-\sum_{i ...
- Java学习:运算符的使用与注意事项
运算符的使用与注意事项 四则运算当中的加号“+”有常见的三种用法: 对于数值来,那就是加法. 对于字符char类型来说,在计算之前,char会被提升成为int,然后再计算.char类型字符,和int类 ...
- Windows服务的安装及配合定时器编写简单的程序
最近要实时统计一些数据,所以就用到了Windows服务及定时任务,在这里记录下. Windows Service简介: 一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应 ...
- @Valid注解的使用springmvc pojo校验
@Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于User类中的属性): ...
- SpringMVC中的400错误,The request sent by the client was syntactically incorrect.
在其他对象属性类型一样情况下,只需要创建一个类,再在springmvc.xml中添加配置: package com.ujiuye.common; import org.springframework. ...
- iOS - 屏幕刷新 ADisplayLink
什么是CADisplayLink CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个r ...
- pandas-16 pd.merge()的用法
pandas-16 pd.merge()的用法 使用过sql语言的话,一定对join,left join, right join等非常熟悉,在pandas中,merge的作用也非常类似. 如:pd.m ...
- 为什么K8s会成为主流?
容器技术和K8s是云原生概念的核心和基础.云计算诞生已有超过10年,但云计算时代的应用到底该是什么样子,一直没人能说清楚,也没人能确定云计算的基础架构将会如何发展.在K8s出现之前,没人设想过会有一个 ...
- Float型 与 Double型数据的存储方式
先来了解一下浮点数在计算机中是以什么形式存储的 首先要知道计算机能懂得只有0和1,每一个0和1都占一个位 bit (比特)(Binary Digits):存放一位二进制数,最小的存储单位. 而对于存放 ...
- gulp与webpack的区别?是一种工具吗?
问:gulp和webpack什么关系,是一种东西吗?可以只用gulp,不用webpack吗 或者反过来?有什么区别? 答:gulp是工具链.自动化构建工具,可以配合各种插件,我们不用再做机械重复的工作 ...