Python使用RMF聚类分析客户价值
投资机构或电商企业等积累的客户交易数据繁杂。需要根据用户的以往消费记录分析出不同用户群体的特征与价值,再针对不同群体提供不同的营销策略。
用户分析指标
根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有三个神奇的要素,这三个要素构成了数据分析最好的指标
R-最近一次消费(Recency)
F-消费频率(Frequency)
M-消费金额(Monetary)

通过该图将用户进行分类:
R、F、M都很高,重要价值客户(VIP客户)
F、M很高,R不高,重要保持客户
R、F、M都很低,流失客户
M很高,R、F不高,重要挽留客户
根据这8个类别的R、F、M指标,对用户进行标注,哪些是重要价值客户,哪些是重要保持客户,哪些是重要发展客户,哪些是流失客户等
流程介绍
以R、F、M这三个核心指标为维度进行聚类分析
利用K-means聚类分析将用户分类
根据R、F、M指标,对用户进行标注
准备工作:
数据:
某电商企业客户近期购买的数据。包含客户注册日期,最后购买日期以及购买消费总金额
参数:
R-求出最近一次投资时间距提数日天数
F-月均投资次数
M-月均投资金额
目标:分析客户交易数据,用户群体的特征与价值,进行精准营销,降低营销成本,提高销售业绩。
1 分析数据获取RFM
R-求出最近一次投资时间距提数日天数
确定一个提现日,减去用户的最新投资日期
F-月均投资次数
总投资次数/总月数
M-月均投资金额
投资总金额/总月数

处理数据获取R-F-M
def dataChange(data):
deadline_time = datetime(2016,7,20)
print(deadline_time) # 时间相减 得到天数查 timedelta64类型
diff_R = deadline_time - data["最近一次投资时间"] # 渠道具体天数
# days = diff_R[0].days
R = []
for i in diff_R:
days = i.days
R.append(days) print(R)
'''
用户在投时长(月
Python没有直接获取月数差的函数
1、获取用户在投天数
2、月=在投天数/30,向上取整
'''
diff = deadline_time - data["首次投资时间"]
print(diff) # 利用向上取整函数
months = []
for i in diff:
month = ceil(i.days/30)
months.append(month) print(months) # 月均投资次数
month_ave = data["总计投标总次数"]/months
F = month_ave.values
print(F) # 月均投资金额
M = (data["总计投资总金额"]/months).values
print(M) return R, M, F
2 训练KMeans模型
先对数据进行转换,然后通过K—Means模型训练,生产模型
def analy_data(data, R, M, F):
cdata = DataFrame([R, list(F), list(M)]).T
# 指定cdata的index和colums
cdata.index = data.index
cdata.columns = ["R-最近一次投资时间距提数日的天数", "F-月均投资次数", "月均投资金额"]
print("cdata_info:\n", cdata) print("cdata:\n", cdata.describe()) # K-Means聚类分析 # 01 数据标准化 均值:cdata.mean() 标准差:cdata.std()
# 对应位置分别先相减 再相除
zcdata = (cdata-cdata.mean())/cdata.std()
print("zcdata:\n", zcdata) # n_clusters:分类种数 n_jobs:计算的分配资源 max_iter:最大迭代次数 random_state:随机数种子,种子相同,参数固定
kModel = KMeans(n_clusters=4, n_jobs=4, max_iter=100, random_state=0)
kModel.fit(zcdata)
print(kModel.labels_)
3 通过模型对用户标注
# 统计每个类别的频率
value_counts = Series(kModel.labels_).value_counts()
print(value_counts) # 将类别标签赋回原来的数据
cdata_rst = pd.concat([cdata, Series(kModel.labels_, index=cdata.index)], axis=1)
print(cdata_rst) # 命名最后一列为类别
cdata_rst.columns = list(cdata.columns) + ["类别"]
print(cdata_rst) # 按照类别分组统计R, F, M的指标均值
user_ret = cdata_rst.groupby(cdata_rst["类别"]).mean()
print(user_ret)
'''
R-最近一次投资时间距提数日的天数 F-月均投资次数 月均投资金额
类别
0 27.859375 2.820312 21906.754297
1 20.684211 4.552632 115842.105263
2 10.568182 5.579545 26984.313636
3 12.111111 17.277778 107986.000000 结论:
类别3:R、F、M都比较高,属于重要价值客户 或 超级用户
类别0:R、F、M都比较低,属于低价值客户
类别1:R一般、F一般、M很高,也属于重要价值客户 ''' 通过模型对新用户标注
1、获取新用户数据
2、通过和原数据处理获取RFM
3、通过训练模型得出用户类型
def user_classes(cdata, user_info):
'''
# 模拟一条用户数据
1、获取当前时间表示为截止时间
2.计算出: R F M '''
R, M, F = user_info_change(user_info)
user_data_info = DataFrame([[R], [F], [M]]).T
print(user_data_info) # user_data_info = DataFrame([[12.5], [18.0], [20000.0]]).T
user_data_info.index = ["lily"]
user_data_info.columns = cdata.columns
print("cdata_info:\n", user_data_info) new_zcdata = (user_data_info-cdata.mean())/cdata.std()
print("new_zcdata", new_zcdata) kModel = load_model("user_classes.pkl")
ret = kModel.predict(new_zcdata)
print("new_zcdata_ret:", ret)
# new_zcdata_ret: [3]

Python使用RMF聚类分析客户价值的更多相关文章
- 数据分析之客户价值模型(RFM)技术总结
作者 | leo 管理学中有一个重要概念那就是客户关系管理(CRM),它核心目的就是为了提高企业的核心竞争力,通过提高企业与客户间的交互,优化客户管理方式,从而实现吸引新客户.保留老客户以及将已有客户 ...
- 如何通过CRM评估客户价值和提高客户忠诚度?
随着市场经济的日益繁荣,同行业之间企业的竞争越来越激烈,企业纷纷各出奇招吸引和挖掘客户,力求让自己的品牌成为更多客户的第一选择.那么,我们可以用什么方法来评估客户价值,提高客户忠诚度呢? 在互联网时代 ...
- 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good
作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...
- k-means实战-RFM客户价值分群
数据挖掘的十大算法 基本概念 导入数据集到mysql数据库中 总共有940个独立消费数据 K-Means 算法 K-Means 算法是一个聚类算法.你可以这么理解,最终我想把物体划分成 K 类.假设每 ...
- RFM客户价值分类
# 自定义好的包,亲测可用 原数据和代码思想来自以下网址 # https://github.com/joaolcorreia/RFM-analysis import datetime as dt im ...
- [Python数据挖掘]第7章、航空公司客户价值分析
一.背景和挖掘目标 二.分析方法与过程 客户价值识别最常用的是RFM模型(最近消费时间间隔Recency,消费频率Frequency,消费金额Monetary) 1.EDA(探索性数据分析) #对数据 ...
- 数据挖掘应用案例:RFM模型分析与客户细分(转)
正好刚帮某电信行业完成一个数据挖掘工作,其中的RFM模型还是有一定代表性,就再把数据挖掘RFM模型的建模思路细节与大家分享一下吧!手机充值业务是一项主要电信业务形式,客户的充值行为记录正好满足RFM模 ...
- python 面向对象终极进阶之开发流程
好了,你现在会了面向对象的各种语法了, 但是你会发现很多同学都是学会了面向对象的语法,却依然写不出面向对象的程序,原因是什么呢?原因就是因为你还没掌握一门面向对象设计利器, 此刻有经验的人可能会想到 ...
- 2019年Python数据挖掘就业前景前瞻
Python语言的崛起让大家对web.爬虫.数据分析.数据挖掘等十分感兴趣.数据挖掘就业前景怎么样?关于这个问题的回答,大家首先要知道什么是数据挖掘.所谓数据挖掘就是指从数据库的大量数据中揭示出隐含的 ...
随机推荐
- BZOJ1113 海报PLA1(单调栈入门题)
一,自己思考下 1,先自己思考下 N个矩形,排成一排,现在希望用尽量少的海报去cover住它们. 2,不懂. 着实不懂. 3,分析下,最优性问题对吧,然后就每什么想法了.. 虽然肯定和单调栈和单调队列 ...
- navicat设置唯一
https://blog.csdn.net/Song_JiangTao/article/details/82192189
- 关于System.ArgumentNullException异常
什么是ArgumentNullException 当将 null 引用(Visual Basic 中为 Nothing)传递到不接受其作为有效参数的方法时引发的异常. 继承 Object Except ...
- yugabyte docker-compose 运行试用
以前运行yugabyte 使用的是yb-docker-ctl,现在直接可以方便的使用docker-compose 运行了 pull image docker pull yugabytedb/yugab ...
- springboot2.0整合redis作为缓存以json格式存储对象
步骤1 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr ...
- 记一次CDH集群日志数据清理
背景 集群运行一段时间(大概一月多)后,cloudera manager管理界面出现爆红,爆红的组件有hdfs.zookeeper. 发现问题 点击详细内容查看,报日志空间不够的错误.初步判断是各个组 ...
- Eclipse安装jbpm插件
1.1 eclipse mar 和neon有什么区别? Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境. . ...
- Flume(一) —— 启动与基本使用
基础架构 Flume is a distributed, reliable(可靠地), and available service for efficiently(高效地) collecting, a ...
- linux服务器磁盘挂载
1.先查看当前服务器挂载的磁盘个数 fdisk -l 2.将vdb磁盘挂载到/data目录下 mount /dev/vdb /data 3.df -h 检查磁盘挂载的情况
- 《JAVA程序设计》_第十周学习总结
一.学习内容 12.1进程与进程 程序是一段静态的代码,进程是程序的一次动态执行过程,这个过程也是进程本身从产生.发展至消亡的过程. 线程不是进程,是比进程更小的执行单位.但与进程不同的是,线程的中断 ...