运用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")