运用python构建RFM模型进行客户精细化管理


运用python构建RFM模型进行客户精细化管理

以下语句是在pycharm 中演示,是直接连接mysql数据库进行运作,帮助大家掌握python跟MySQL的交互,为保护公司隐私,将数据库用户名以及密码隐藏掉,大家可以通过链接下载原文档通过导入CSV文件进行演示,演示源文档链接:https://pan.baidu.com/s/1YKcjTISHoDCbTvxN5C2JvA

#一.RFM模型的解析

信息时代的来临使得企业营销的焦点从产品中心转化为客户中心,客户关系关系成为企业的核心问题,客户关系管理的核心问题是客户分类,通过客户分类区分无价值、高价值客户,针对不同价值的客户采取不同的营销策略,以实现企业利润的最大化;

RFM模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该机械模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱3项指标来描述该客户的价值状况。

R(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则交易发生的日期越近。

F(Frequency):客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。

M(Monetary):客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。

准备一段时间被用户、R、F、M四个字段数据,利用聚类对数据进行聚类,根据聚类结果给每一类数据打标,会形成如下形式

#python链接mysql源文件构建RFM模型具体流程

#建立RFM模型进行用户分类

import numpy as np

import pandas as pd

import pymysql

import openpyxl

#设置DataFrame面板长度以及宽度

pd.set_option("display.max_rows",None)

pd.set_option("display.max_columns",None)

data1=pymysql.connect(host='*******',user='*******',password='*******',db='*******',charset='utf8')

sql='SELECT user_id "用户id",total_fee*0.01 "交易额",creater_time "交易时间" FROM `dy_account_general` WHERE is_sussess=1'

df=pd.read_sql(sql,data1)

print(df)

#R值构造

r=df.groupby("用户id")["交易时间"].max().reset_index()

print(r)

r["R"]=(pd.to_datetime("2019-11-05")-r["交易时间"]).dt.days

r=r[["用户id","R"]]

print(r)

#F值构造

#引入日期标签辅助列

df["日期标签"]=df["交易时间"].astype(str).str[:100000]

#把单个用户一天内订单合并

dup_f=df.groupby(["用户id","日期标签"])["交易时间"].count().reset_index()

#对合并后的用户统计购买频次

f=dup_f.groupby("用户id")["交易时间"].count().reset_index()

f.columns=["用户id","F"]

print(f)

#M值构造

sum_m=df.groupby("用户id")["交易额"].sum().reset_index()

sum_m.columns=["用户id","总支付金额"]

com_m=pd.merge(sum_m,f,left_on="用户id",right_on="用户id",how="inner")

#计算用户平均支付金额

com_m["M"]=sum_m["总支付金额"]/com_m["F"]

print(com_m)

#将R f m三个值合并

rfm=pd.merge(r,com_m,left_on="用户id",right_on="用户id",how="inner")

rfm=rfm[["用户id","R","F","M"]]

print(rfm)

#维度确认

#R值计算

rfm["r-score"]=pd.cut(rfm["R"],bins=[0,30,60,90,120,10000],labels=[5,4,3,2,1],right=False).astype(float)

print(rfm.head())

#F,m值计算

rfm["f-score"]=pd.cut(rfm['F'],bins=[0,5,10,15,30,300],labels=[1,2,3,4,5],right=False).astype(float)

print(rfm)

rfm["m-score"]=pd.cut(rfm["M"],bins=[0,100,600,1000,2000,10000000],labels=[1,2,3,4,5],right=False).astype(float)

print(rfm)

#判断rfm值

rfm["R值是否发育均值"]=(rfm["r-score"]>rfm["r-score"].mean())*1

rfm["F值是否发育均值"]=(rfm["f-score"]>rfm["f-score"].mean())*1

rfm["M值是否发育均值"]=(rfm["m-score"]>rfm["m-score"].mean())*1

print(rfm.head())

rfm["人群数值"]=rfm["R值是否发育均值"]*100+rfm["F值是否发育均值"]*10+rfm["M值是否发育均值"]

print(rfm)

#判断R/F/M是否大于均值

def transform_label(x):

if x == 111:

label = '重要价值客户'

elif x == 110:

label = '消费潜力客户'

elif x == 101:

label = '频次深耕客户'

elif x == 100:

label = '新客户'

elif x == 11:

label = '重要价值流失预警客户'

elif x == 10:

label = '一般客户'

elif x == 1:

label = '高消费唤回客户'

elif x == 0:

label = '流失客户'

return label

rfm["人群类型"]=rfm["人群数值"].apply(transform_label)

print(rfm)

#人数统计

count=rfm["人群类型"].value_counts().reset_index()

count.columns=["客户类型","人数"]

count["人数占比"]=count["人数"]/count["人数"].sum()

print(count)

#购买金额统计

rfm["购买总金额"]=rfm["F"]*rfm["M"]

mon=rfm.groupby("人群类型")["购买总金额"].sum().reset_index()

mon.columns=["客户类型","消费金额"]

mon["金额占比"]=mon["消费金额"]/mon["消费金额"].sum()

print(mon)

resule=pd.merge(count,mon,left_on="客户类型",right_on="客户类型")

resule.to_excel("C:/Users/Administrator/Desktop/RFM模型.xlsx")


原文链接:,转发请注明来源!