IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【Python】RFM模型实现 -> 正文阅读

[Python知识库]【Python】RFM模型实现

【Python】RFM模型实现

1 RFM模型

RFM模型:根据用户历史行为数据,结合业务理解,实现用户分层分类,助力用户的精准营销,是衡量客户价值和客户创利能力的重要工具和手段

  • Recency 最近一次消费
  • Frequency 消费频次
  • Money 消费金额
客户标签客户标签运营方向客户状态RFM
重要价值用户VIP客户保持现状最近交易时间近、交易频率和交易金额高,“两高一近”111
重要发展用户频次深耕客户提升频次最近交易时间近,交易金额高,但交易次数少;不太活跃,忠诚度不高,需要通过相关激励,提高其购买频率。101
重要保持用户流失预警VIP客户用户回流交易金额和交易频次都很高,但最近一次交易时间远,很长时间没来的忠实客户,需要主动和客户互动,及时唤回。011
重要挽留用户高消费换回客户重点召回交易金额高,但最近交易时间远、交易频次低;消费力较高,是潜在的价值客户,需要重点维持。001
一般价值用户消费潜力客户刺激消费最近交易时间近、交易频次也高,唯独交易金额小,属于低客单价群体。分为两种情况,低价高利润产品可适当维持及发展;低价低利润不需要额外大量投资预算维持。110
一般发展用户新客户挖掘需求最近交易时间近,但交易频次和交易金额小,说明属于意向用户,有推广价值,以此提高交易频次和交易金额。100
一般保持用户一般客户流失召回交易次数多,但是贡献不大,一般维持即可。010
一般挽留用户流失客户可放弃治疗最近交易时间远、交易频次和交易金额也都很小,贡献度最小,如果不需要额外的运营预算和精力,也可适当进行维护。000

2 Python实现

2.1 数据结果

# -*- coding: utf-8 -*-
# In[0] 导入库
import numpy as np
import pandas as pd
import datetime as dt

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# In[1] 数据处理
df = pd.read_csv('F://Retail_Data_Transactions.csv')

df["trans_date"] = pd.to_datetime(df["trans_date"])
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

R = df.groupby(by=['customer_id'])['R_diff'].agg([('R_diff','min')])
F = df.groupby(by=['customer_id'])['customer_id'].agg([('F_fre','count')])
M = df.groupby(by=['customer_id'])['tran_amount'].agg([('M_sum',sum)])

# In[2.1] 直接加权划分, 权重:R0.3,F0.4,M0.3
RFM = R.join(F).join(M)
RFM['r_score'] = pd.cut(RFM['R_diff'], 5, labels=[5, 4, 3, 2, 1])
RFM['f_score']  = pd.cut(RFM['F_fre'], 5, labels=[1, 2, 3, 4, 5])
RFM['m_score']  = pd.cut(RFM['M_sum'], 5, labels=[1, 2, 3, 4, 5])

RFM['r_s']=pd.factorize(RFM['r_score'])[0]
RFM['f_s']=pd.factorize(RFM['f_score'])[0]
RFM['m_s']=pd.factorize(RFM['m_score'])[0]

RFM["RFMsum"] = RFM['r_s']*0.3+RFM['f_s']*0.4+RFM['m_s']*0.3
labels = ['一般挽留用户','一般发展客户','一般保持客户','一般价值客户','重要挽留客户','重要发展客户','重要保持客户','高价值客户']
RFM['labels_1'] = pd.cut(RFM["RFMsum"], bins=8, labels=labels, include_lowest=True)

# In[2.2] RFM直接组合
dftmp = RFM.copy()

dftmp['r']= (dftmp['R_diff']<dftmp['R_diff'].mean())*1
dftmp['f']= (dftmp['F_fre']>dftmp['F_fre'].mean())*1
dftmp['m']= (dftmp['M_sum']>dftmp['M_sum'].mean())*1

dftmp['r'] = dftmp['r'].astype('string')
dftmp['f'] = dftmp['f'].astype('string')
dftmp['m'] = dftmp['m'].astype('string')
RFM['rfm'] = dftmp['r'].str.cat(dftmp['f']).str.cat(dftmp['m'])

RFM['lables'] = RFM['rfm'].apply(lambda x : 
                                            '重要价值用户(VIP)' if x=='111'
                                            else '重要发展用户(频次深耕)' if x=='101'
                                            else '重要保持用户(流失预警)' if x=='011'
                                            else '重要挽留用户(重点召回)' if x=='001'
                                            else '一般价值用户(刺激消费)' if x=='110'
                                            else '一般发展用户(挖掘需求)' if x=='100'
                                            else '一般保持用户(流失召回)' if x=='010'
                                            else '一般挽留用户(流失放弃)' if x=='000'
                                            else x)

2.2 图像展示

# In[3] 气泡图,8个类别显示不明显
categories = np.unique(RFM['lables'])
colors = [plt.cm.tab10(i / float(len(categories) - 1)) for i in range(len(categories))]

fig = plt.figure(figsize=(10, 6), dpi=120, facecolor='w', edgecolor='k')

for i, category in enumerate(categories):
    plt.scatter('F_fre', 'M_sum', data=RFM.loc[RFM.lables == category, :]
                , s=RFM.loc[RFM.lables == category, 'R_diff']
                , c=np.array(colors[i]).reshape(1, -1)
                , edgecolors=np.array(colors[i]).reshape(1, -1)
                , label=str(category)
                , alpha=0.7
                , linewidths=.5)

plt.gca().set(xlim=(0, 40), ylim=(0, 3000),xlabel='F', ylabel='M')
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.title('客户RFM分类模型图', fontsize=18)
plt.legend(loc='best',fontsize=10,frameon=True,markerscale=0.5)
plt.show()

# In[4] 3D散点图
import matplotlib as mpl

ax = plt.subplot(projection = '3d')
ax.set_title('客户RFM分类模型图', fontsize=18)

for i, category in enumerate(categories):
    ax.scatter('R_diff','F_fre', 'M_sum', data=RFM.loc[RFM.lables == category, :]
                , s=RFM.loc[RFM.lables == category, 'R_diff']
                , c=np.array(colors[i]).reshape(1, -1)
                , edgecolors=np.array(colors[i]).reshape(1, -1)
                , label=str(category)
                , alpha=0.7
                , linewidths=.5)

ax.set_xlabel('R')
ax.set_ylabel('F')
ax.set_zlabel('M')

legend_lines = [mpl.lines.Line2D([0], [0], linestyle="none", marker='o', c=colors[y]) for y in range(len(categories))]
ax.legend(legend_lines, categories, numpoints=1, title='客户RFM分类模型图')

plt.show()


# In[5] 直方图

data = RFM.groupby('lables')['rfm'].count().sort_values(ascending = False)
plt.figure(figsize=(8,6))
data.plot(kind='bar', width=0.6)

plt.ylabel(u'客户数量')
p = 1.0*data.cumsum()/data.sum()
p.plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)

for i in range(len(p)):
    plt.annotate(format(p[i], '.2%'),xy = (i, p[i]), xytext=(i*1.005, p[i]*1.005))

plt.ylabel(u'客户数量(比例)')
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:28:59  更:2022-10-17 12:30:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 2:56:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计