今天用Python做了一个RFM模型分析,数据来源是Kaggle上的一个专门用于RFM模型学习的数据集,数据链接我会在文章附上。
日常呼唤一下,喜欢点赞呀
正文开始:
模型介绍:RFM模型根据客户活跃程度和交易金额的贡献,进行客户价值细分的一种方法。R(Recency)——最近一次交易时间间隔。基于最近一次交易日期计算的得分,距离当前日期越近,得分越高。如5分制。反映客户交易活跃度。
F(Frequency)——客户在最近一段时间内交易次数。基于交易频率计算的得分,交易频率越高,得分越高。如5分制。反映客户交易活跃度。
M(Monetray)——客户最近一段时间内交易金额。基于交易金额计算的得分,交易金额越高,得分越高。如5分制。反映客户价值。
数据:
在开始数据分析之前,先把用excel的查找空值功能,查找空值,进行数据预处理
做好知识准备+数据准备,开始数据分析!!!!
把要用的库都先引用上
import os
import numpy as np
import pandas as pd
import seaborn as sns
import datetime as dt
import matplotlib.pyplot as plt
输出数据前5条展示一下:
df = pd.read_csv('Retail_Data_Transactions.csv')
df.head()
需要查看时间列是否为时间格式,不是的话要进行修改:
df.dtypes
df["trans_date"] = pd.to_datetime(df["trans_date"])
df.dtypes
开始构建3个指标R,F,M,R指标需要先计算一下每条数据举例今天的时间差
print(df['trans_date'].min(), df['trans_date'].max())
R_today = dt.datetime(2015,3,17)
df['R_diff'] = (R_today - df['trans_date']).dt.days # 计算时间差
df.head()
再计算每个用户最近一次购买行为的时间差作为R指标的基础
R = df.groupby(by=['customer_id'])['R_diff'] #客户ID进行分组
R = R.agg([('R_diff','min')]) #求每个客户最小时间差
R.head()
构建F、M指标,F为客户交易频率,M为总交易金额
F = df.groupby(by=['customer_id'])['customer_id'].agg([('F_fre','count')])
M = df.groupby(by=['customer_id'])['tran_amount'].agg([('M_sum',sum)])
RFM = R.join(F).join(M)
RFM.head()
接下来需要构建评分体系,按照各指标的分位数进行1-4的打分。需要先查看一下分位数情况,手动进行划分
RFM.describe()
然后构建RFM总体评分指标,这个就需要大家更具自己的数据富于不同的权重了,我是R给了0.3,F给了0.4,M给了0.3
RFM["R_score"]=np.where(RFM.R_diff<=23,4,np.where(RFM.R_diff<=54,3,np.where(RFM.R_diff<=112,2,1)))
RFM["F_score"]=np.where(RFM.F_fre<=14,1,np.where(RFM.F_fre<=18,2,np.where(RFM.F_fre<=22,3,4)))
RFM["M_score"]=np.where(RFM.M_sum<=781,1,np.where(RFM.M_sum<=1227,2,np.where(RFM.M_sum<=1520,3,4)))
RFM.head()
RFM["RFM"] = RFM["R_score"]*0.3+RFM["F_score"]*0.4+RFM["M_score"]*0.3
RFM.head()
最后就是根据RFM得分,判断客户类别啦,一共8个客户类别
bins = RFM.RFM.quantile(q=np.linspace(0,1,num=9),interpolation='nearest')
labels = ['潜在客户','一般发展客户','一般保持客户','一般价值客户','重要挽留客户','重要发展客户','重要保持客户','高价值客户']
RFM['types'] = pd.cut(RFM.RFM, bins=bins, labels=labels, include_lowest=True)
RFM.head()
看一下我们这个数据集各个类别的分布情况吧,还挺平均的
plt.figure(figsize=(20,5))
sns.countplot(data=RFM,x="types")
plt.show()
大功告成!!!
期待大家点评,有什么想实现的其他数据分析模型告诉我呀,我来准备准备~