rfm模型python_使用python实现RFM模型

今天用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()

大功告成!!!

期待大家点评,有什么想实现的其他数据分析模型告诉我呀,我来准备准备~

你可能感兴趣的:(rfm模型python)