【用户价值分析 RFM模型】用户价值分析

2024-09-07 06:32
文章标签 分析 模型 用户 价值 rfm

本文主要是介绍【用户价值分析 RFM模型】用户价值分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RFM模型是衡量客户价值和客户创利能力的重要工具和手段。RFM分析模型主要由三个指标组成,下面对这三个指标的定义和作用做下简单解释:

1、最近一次消费(Recency)
最近一次消费意指用户上一次购买的时间,理论上,上一次消费时间越近的顾客应该是比较好的顾客,对提供即时的商品或是服务也最有可能会有反应。因为最近一次消费指标定义的是一个时间段,并且与当前时间相关,因此是一直在变动的。最近一次消费对营销来说是一个重要指标,涉及吸引客户,保持客户,并赢得客户的忠诚度。
2、消费频率(Frequency)
消费频率是顾客在一定时间段内的消费次数。最常购买的消费者,忠诚度也就最高,增加顾客购买的次数意味着从竞争对手处偷取市场占有率,由别人的手中赚取营业额。
根据这个指标,我们又把客户分成五等分,这个五等分分析相当于是一个“忠诚度的阶梯”(loyalty ladder),其诀窍在于让消费者一直顺着阶梯往上爬,把销售想像成是要将两次购买的顾客往上推成三次购买的顾客,把一次购买者变成两次的。
3、消费金额(Monetary)
消费金额是对购彩产能的最直接的衡量指标,也可以验证“帕雷托法则”(Pareto’s Law)——公司80%的收入来自20%的顾客。

FRM就是根据客户活跃度和交易金额贡献,进行客户价值细分的一种方法。

RFM算法步骤:
1.计算RFM各项分值
R_S,距离当前日期越近,得分越高,最高7分,最低1分,按实际数据分布情况切割依次从高到低取分数。
F_S,交易频率越高,得分越高,最高7分,最低1分,按实际数据分布情况切割依次从高到低取分数。
M_S,交易金额越高,得分越高,最高7分,最低1分,按实际数据分布情况切割依次从高到低取分数。

2.归总RFM分值
RFM赋予权重(目前权重采用R:F:M = 1:1:1),权重乘以分数归总RFM分值。这个总RFM分值作为衡量用户价值的关键指标。公式如下:

3.根据RFM分值对客户分类

# encoding: utf-8"""
function:RFM用户价值分析分成5类
author:dongli
update_date:2018-06-07
"""# 导入包
import pandas as pd
######################################################写入excel设置问题#########################################
import xlsxwriter
# 定义RFM函数
def RFM(aggData):""":param aggData: 输入数据集,数据集字段要包含recency,frequency,monetary等三个字段:return:返回数据集结果"""# 计算R_Sbins = aggData.recency.quantile(q=[0, 0.28, 0.38, 0.46, 0.53, 0.57, 0.77, 1], interpolation='nearest')bins[0] = 0labels = [7, 6, 5, 4, 3, 2, 1]R_S = pd.cut(aggData.recency, bins, labels=labels)# 计算F_Sbins = aggData.frequency.quantile(q=[0, 0.29, 0.45, 0.60, 0.71, 0.76, 0.90, 1], interpolation='nearest')bins[0] = 0labels = [1, 2, 3, 4, 5, 6, 7]F_S = pd.cut(aggData.frequency, bins, labels=labels)# 计算M_Sbins = aggData.monetary.quantile(q=[0, 0.20, 0.26, 0.45, 0.55, 0.76, 0.85, 1], interpolation='nearest')bins[0] = 0labels = [1, 2, 3, 4, 5, 6, 7]M_S = pd.cut(aggData.monetary, bins, labels=labels)# 赋值aggData['R_S'] = R_SaggData['F_S'] = F_SaggData['M_S'] = M_S# 计算FRM值aggData['RFM'] = R_S.astype(int)*1 + F_S.astype(int)*1 + M_S.astype(int)*1# 根据RFM分值对客户分类#分五类bins = aggData.RFM.quantile(q=[0, 0.2, 0.4, 0.6, 0.8, 1],interpolation='nearest')bins[0] = 0labels = [1, 2, 3, 4, 5]aggData['level'] = pd.cut(aggData.RFM,bins, labels=labels)# 分八类# bins = aggData.RFM.quantile(q=[0, 0.125, 0.25, 0.375, 0.5,0.625, 0.75, 0.875, 1],interpolation='nearest')# bins[0] = 0# labels = [1, 2, 3, 4, 5, 6, 7, 8]# aggData['level'] = pd.cut(aggData.RFM,bins, labels=labels )return aggData# 主函数
if __name__ == '__main__':# 读取数据aggData = pd.read_csv('C:\\Users\\xiaohu\\Desktop\\月刊数据\\4月份用户价值数据.csv')# 调用模型函数result=RFM(aggData)# 打印结果print(result)# 计算每个类别的数据量c1=list(result["level"].value_counts())# 计算每个类别所占的百分比c2 = list(result["level"].value_counts()/len(result)*100)c3=(list(map(lambda x:str(round(x,3))+"%",c2)))c=pd.DataFrame({"level":range(1,len(c1)+1),"数量":c1,"百分比":c3})print(c)# 写出csvresult.to_csv('C:\\Users\\xiaohu\\Desktop\\月刊数据\\result5_50_四月份.csv',index=False)# ## 先写出excel# workbook = xlsxwriter.Workbook("C:\\Users\\xiaohu\\Desktop\\月刊数据\\result_RFM.xlsx",options={'strings_to_urls': False})## format = workbook.add_format()# format = workbook.add_format()# format.set_border(1)# format_title = workbook.add_format()# format_title.set_border(1)# format_title.set_bg_color('#cccccc')# format_title.set_align('center')# format_title.set_bold()# format_ave = workbook.add_format()# format_ave.set_border(1)# format_ave.set_num_format('0')## data_format = workbook.add_format()# data_format.set_num_format('yyyy-mm-dd HH:MM:SS')# data_format.set_border(1)## worksheet2 = workbook.add_worksheet('用户价值')# title2 = [u'user_id', u'recency', u'frequency', u'monetary',u'R_S',u'F_S',u'M_S',u'RFM', u'level']## worksheet2.write_row('A1', title2, format_title)# worksheet2.write_column('A2:', result.iloc[:, 0], format_ave)# worksheet2.write_column('B2:', result.iloc[:, 1], format)# worksheet2.write_column('C2', result.iloc[:, 2], format)# worksheet2.write_column('D2', result.iloc[:, 3], format)# worksheet2.write_column('E2', result.iloc[:, 4], format)# worksheet2.write_column('F2', result.iloc[:, 5], format)# worksheet2.write_column('G2', result.iloc[:, 6], format)# worksheet2.write_column('H2', result.iloc[:, 7], format)# worksheet2.write_column('I2', result.iloc[:, 8], format)## workbook.close()#

RFM+kmeans算法

# encoding: utf-8
"""
function:RFM用户价值分析+kmeans算法自动划分
author:dongli
update_date:2018-05-09
"""# 导入包
from __future__ import  division
import pandas as pd
from sklearn.cluster import KMeans######################################python画图显示中文参数设置####################################
##########设置中文显示#################
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
font_size =11 # 字体大小
fig_size = (8, 6) # 图表大小
# 更新字体大小
mpl.rcParams['font.size'] = font_size
# 更新图表大小
mpl.rcParams['figure.figsize'] = fig_size
#################################################################################################### 定义RFM函数
def RFM(aggData):""":param aggData: 输入数据集,数据集字段要包含recency,frequency,monetary等三个字段:return:返回数据集结果"""# 计算R_Sbins = aggData.recency.quantile(q=[0, 0.31, 0.38, 0.46, 0.53, 0.57, 0.77, 1], interpolation='nearest')bins[0] = 0labels = [7, 6, 5, 4, 3, 2, 1]R_S = pd.cut(aggData.recency, bins, labels=labels)# 计算F_Sbins = aggData.frequency.quantile(q=[0, 0.29, 0.45, 0.60, 0.71, 0.76, 0.90, 1], interpolation='nearest')bins[0] = 0labels = [1, 2, 3, 4, 5, 6, 7]F_S = pd.cut(aggData.frequency, bins, labels=labels)# 计算M_Sbins = aggData.monetary.quantile(q=[0, 0.20, 0.26, 0.45, 0.55, 0.76, 0.85, 1], interpolation='nearest')bins[0] = 0labels = [1, 2, 3, 4, 5, 6, 7]M_S = pd.cut(aggData.monetary, bins, labels=labels)# 赋值aggData['R_S'] = R_SaggData['F_S'] = F_SaggData['M_S'] = M_S# 计算FRM值aggData['RFM'] = R_S.astype(int) + F_S.astype(int) + M_S.astype(int)#分五类bins = aggData.RFM.quantile(q=[0, 0.2, 0.4, 0.6, 0.8, 1],interpolation='nearest')bins[0] = 0labels = [1, 2, 3, 4, 5]aggData['level'] = pd.cut(aggData.RFM,bins, labels=labels)return aggData# 读取数据
aggData = pd.read_csv('C:\\Users\\xiaohu\\Desktop\\用户价值分析\\用户价值分析RFM模型\\source\\RFM_Data_50.csv')
# print(aggData)aggData2=RFM(aggData)
print(aggData2)# 选择recency,frequency,monetary这三列
data=aggData2.loc[:,['recency','frequency','monetary']]print(data)# 定义数据标准化函数 Min-max 标准化
def Normalization(df):return df.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))# 调用函数进行数据标准化(0-1)之间
zsredfile=Normalization(data)# 对列进行重命名
names = ['ZR','ZF','ZM']
zsredfile.columns = namesprint(zsredfile)##########################################选择最佳的K值########################################################"""
一般我们可以 通过迭代的方式选出合适的聚类个数 ,即让k值从1到K依次执行一遍,
再查看每一次k值对应的簇内离差平方和之和的变化,
如果变化幅度突然由大转小时,那个k值就是我们选择的合理个数
"""
K = range(1,15)
GSSE = []
for k in K:print(K)SSE = []kmeans = KMeans(n_clusters=k, random_state=10)kmeans.fit(zsredfile)labels = kmeans.labels_centers = kmeans.cluster_centers_for label in set(labels):SSE.append(np.sum(np.sum((zsredfile[['ZR', 'ZF','ZM']].loc[labels == label,] - centers[label, :]) ** 2)))GSSE.append(np.sum(SSE))# 绘制K的个数与GSSE的关系
plt.plot(K, GSSE, 'b*-')plt.xlabel('聚类个数')plt.ylabel('簇内离差平方和')plt.title('选择最优的聚类个数')plt.show()####################################################################################################################################选择最优的聚类个数为5
seed(123)
#调用sklearn的库函数
num_clusters = 5
kmeans = KMeans(n_clusters=num_clusters, random_state=1)
kmeans.fit(zsredfile)# 聚类结果标签
data['cluster'] = kmeans.labels_
# 聚类中心
centers = kmeans.cluster_centers_cluster_center = pd.DataFrame(kmeans.cluster_centers_)
# 绘制散点图
plt.scatter(x = zsredfile.iloc[:,0], y = zsredfile.iloc[:,1], c = data['cluster'], s=50, cmap='rainbow')
plt.scatter(centers[:,0], centers[:,1], c='k', marker = '*', s = 180)
plt.xlabel('ZR')
plt.ylabel('ZF')
plt.title('聚类效果图')
# 图形显示
plt.show()# # 查看RFM模型8个类别中的用户数量以及占比多少result=dataaggData2['cluster']=result["cluster"]
# 计算每个类别的数据量c1 = list(result["cluster"].value_counts())# 计算每个类别所占的百分比c2 = list(result["cluster"].value_counts() / len(result) * 100)c3 = (list(map(lambda x: str(round(x, 3)) + "%", c2)))c = pd.DataFrame({"level": range(1, len(c1) + 1), "数量": c1, "百分比": c3})print(c)# 写出csvaggData2.to_csv('C:\\Users\\xiaohu\\Desktop\\用户价值分析\\东篱最终项目\\【修改版】用户价值分析项目--东篱\\RFM+K-Means算法对公司客户价值自动划分--东篱\\resource\\python_result_kmeans_50.csv', index=False)cluster_center.to_csv('C:\\Users\\xiaohu\\Desktop\\用户价值分析\\东篱最终项目\\【修改版】用户价值分析项目--东篱\\RFM+K-Means算法对公司客户价值自动划分--东篱\\resource\\cluster_center.csv')

RFM+层次聚类

# -*- coding:utf-8 -*-#######################################
#加载相关库
#######################################
import numpy as np
import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn.cluster import Birch
from sklearn import metrics
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.externals import joblib
import time
import datetime#######################################
#加载数据集及提取数列
#######################################customdata = pd.read_csv(r'C:\\Users\\xiaohu\\Desktop\\RFM\\out_custom_label.csv')new_custom_data = customdata[["R_S","F_S","M_S"]]new_custom_data = new_custom_data.astype(np.float32)
new_custom_data = new_custom_data.values#######################################
#数据标准化
#######################################new_custom_data = StandardScaler().fit_transform(new_custom_data)#######################################
#模型训练
#######################################Birch_model = Birch(threshold=0.85, branching_factor=500,n_clusters=None,compute_labels=True, copy=True).fit(new_custom_data)#######################################
#提取分类结果
#######################################label = Birch_model.labels_#print ("Calinski-Harabasz Score", metrics.calinski_harabaz_score(new_custom_data, Birch_model))label = pd.DataFrame(label)label.columns = ['cluster.label']outresult = pd.concat([customdata, label], axis = 1)cluster_center = pd.DataFrame(Birch_model.subcluster_centers_)
n_clusters = np.unique(label).size
print("n_clusters : %d" % n_clusters)#######################################
#结果输出
#######################################outresult.to_csv('C:\\Users\\xiaohu\\Desktop\\RFM\\birch_outresult.csv')
cluster_center.to_csv('C:\\Users\\xiaohu\\Desktop\\RFM\\cluster_center.csv')

这篇关于【用户价值分析 RFM模型】用户价值分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144324

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者