【我胡汉三回来啦,大家有没有想我:D。最近比较开心的事:1)IELTS二战拿到6.5了,工作狗纯自学(傲娇),妈妈我出息了,能申更多学校的计算机方向了 2)老板给牛马涨了点薪水,但还是低于市场平均 3)短期计划有条不紊进行】
言归正传,上次说到,我们要利用RFM模型进行客户忠诚度分析,这篇文章将一步步告诉你,怎么看(组合)数据,怎么写代码
一、数据表表头【客户名称,日期,销售额】
二、边讲边解释
# 导入模块
import numpy as np
import pandas as pd
import datetime as dt
# 读取文件,这里我把整理好的excel表格处理成了CSV格式,随意,没固定要求
df = pd.read_csv('C:\\Users\\xxx\\xxxxx\\Desktop\\CSV.csv')
df.dtypes # 此时date是object,要转化成时间格式处理数据
df["date"] = pd.to_datetime(df["date"])
df.dtypes # 日期格式变成了datetime64[ns]
构建三个指标R\F\M
# R指标需要先计算一下每条数据距离今天的时间差,时间我随便取的
R_today = dt.datetime(2024, 1, 1)
df['R_diff'] = (R_today - df['date']).dt.days
# 再计算每个用户最近一次购买行为的时间差作为R指标的基础
# 按照客户名进行分组
R = df.groupby(by=['customer name'])['R_diff']
# 求每个客户最小时间差
R = R.agg([('R_diff', 'min')])
# 构建F、M指标,F为客户交易频率,M为总交易金额
F = df.groupby(by=['customer name'])['customer name'].agg([('F_fre', 'count')])
M = df.groupby(by=['customer name'])['Sales Amount(SGD)'].agg([('M_sum', 'sum')])
RFM = R.join(F).join(M) # 将F和M加到R后面
# 构建评分体系,按照各指标的分数位进行1-4分的打分。这里有必要说两句:分数位根据你的数据情况修改数据,打分等级也多尝试几次。RFM的目的即分出8种用户,明白这一点,就好规划数据了。
# print(RFM.describe()) # 查看分数位,print查看数据分布
# R\F\M 打分
RFM["R_score"] = np.where(RFM.R_diff <= 31, 4, np.where(RFM.R_diff <= 184, 3, np.where(RFM.R_diff <= 518, 2, 1)))
RFM["F_score"] = np.where(RFM.F_fre <= 2, 1, np.where(RFM.R_diff <= 6, 2, np.where(RFM.R_diff <= 27, 3, 4)))
RFM["M_score"] = np.where(RFM.F_fre <= 2800, 1, np.where(RFM.R_diff <= 16079, 2, np.where(RFM.R_diff <= 87616, 3, 4)))
# 客户重要度,按照单位“1”不同比重划分,一开始取的0.3,0.4,0.3,算下来有小数,无法准确map映射,故而我这里取的10
RFM["rfm"] = RFM["R_score"] * 3 + RFM["F_score"] * 4 + RFM["M_score"] * 3
print(RFM["rfm"].value_counts()) # rfm的取值有31, 28, 25, 22, 19, 16, 13, 10,查看value_counts得出来的
# 定义RFM综合分值与客户类型的对应关系表
rfm_mapping = {31:"Significant value customer",28:"Important retention customer",25:"Key development customer",22:"Key retention customer",19:"Potential customer",
16:"New customer",13:"General customer",10:"Lost customer"}
RFM['rfm'].map(rfm_mapping)
RFM["Type"] = RFM["rfm"].map(rfm_mapping)
print(RFM)
分析结果写入文件
# 将RFM结果写入新的csv文件
RFM.to_csv("loyalty.csv")
最终效果是这样的(A/B/C/D四公司情况),黑色的是代码运行,白色的是文件