客户终身价值(CLV)

客户终身价值(CLV)是从一个关键人物业务。它通常描述了客户在整个“客户生活”期间实现的贡献边际,折扣到分析时。因此,CLV可以理解为客户多年来对公司或未来的平均价值。因此,除历史收入外,未来预期收入也会被考虑(客户潜力)。在确定CLV时,必须将可能的客户价值与实际客户价值区分开来。可能的客户价值考虑了某个区域内客户的总支出,包括竞争对手的支出,而实际的CLV仅考虑了客户对其公司的支出。公司使用CLV更有效地为客户量身定制营销。例如,高CLV证明更高的预算用于照顾特定客户。

数据

下载链接在此。

数据集信息:

这是一个跨国数据集,其中包含2010年12月1日至2011年12月9日期间发生的所有在英国和注册的非商店在线零售业务的交易。该公司主要销售独特的全场礼品。该公司的许多客户都是批发商。

属性信息:

  • InvoiceNo:发票编号;标称值,为每个事务唯一分配的6位整数;如果此代码以字母’c’开头,则表示取消。
  • StockCode:产品(项目)代码。标称值,为每个不同的产品唯一分配的5位整数。
  • Description:产品(项目)名称。标称。
  • Quantity:每笔交易的每件产品(项目)的数量。数字。
  • InvoiceDate:Invice日期和时间。数字,生成每个事务的日期和时间。
  • UnitPrice:单价。数字,英镑单位产品价格。
  • CustomerID:客户编号。标称值,为每个客户唯一分配的5位整数。
  • Country:国家名称。Nominal,每个客户所在国家/地区的名称。

数据预处理

import pandas as pd
import numpy as np
import warnings
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
from lifetimes.plotting import *
from lifetimes.utils import *
from lifetimes.estimation import *warnings.filterwarnings('ignore')# 读取数据
df = pd.read_excel('Online Retail.xlsx')
df = df.copy()
df.head(2).T

df.describe()


可见有数量、价格小于0的情况,数量小于0应该是有退货现象,而且此代码以字母’C’开头,则表示取消

查看以‘C’开头的是否都是数量为负

(df[df.InvoiceNo.map(lambda x:str(x)[0] == 'C')].Quantity > 0).any()

False

说明的确以‘C’开头的是否都是数量为负

取消订单情况 取消单发票以‘C’开头,长度为7

df.InvoiceNo.map(lambda x:str(x)[0] == 'C').value_counts()

(df.Quantity < 0).value_counts()


由上可见除了以“C”开头的数据,还有其他数量小于0的数据

df[df.InvoiceNo.map(lambda x:str(x)[0] != 'C')].query('Quantity < 0')

由上可见除了以“C”开头的数据,还有其他数量小于0的数据,简单看了一下这些数据都是价格为0,没有用户ID,是什么数据无法推断,反正之后要弃去

### 筛选出数量价格
df.query('Quantity > 0 & UnitPrice >0', inplace=True)
# 检查缺失值
df.isna().sum()# 弃去缺失值
df.dropna(inplace=True)### 创建价格列(数量×单价)
df['Sales'] = df.Quantity*df.UnitPrice

这里我们需要的数据为订单号,消费者id,下单时间,价格(数量×单价)

df = df[['InvoiceNo', 'CustomerID', 'InvoiceDate', 'Sales']]### 更改用户ID类型
df.CustomerID = df.CustomerID.astype('object')df.nunique()

数据中包含共18532订单,4338个用户

CLV建模探索

data = summary_data_from_transaction_data(df, 'CustomerID', 'InvoiceDate',monetary_value_col='Sales',observation_period_end='2011-12-9')
data.sort_values('monetary_value').head()

频率为0说明只有一次购买。

频率分布情况

data['frequency'].plot(kind='hist', bins=50)


可见0居多,分布偏左

频率为0占比

# 说在周期内只消费过一次比例
(data.frequency == 0).value_counts().plot.bar()

sum(data['frequency'] == 0)/float(len(data))

结果为:0.35684647302904565
频率为0占总体35.7%

使用BG / NBD模型进行频率/新近度分析

from lifetimes import BetaGeoFitter
bgf = BetaGeoFitter(penalizer_coef=0.0)
bgf.fit(data['frequency'], data['recency'], data['T'])
print(bgf)

结果如下:
<lifetimes.BetaGeoFitter: fitted with 4338 subjects, a: 0.00, alpha: 68.91, b: 6.75, r: 0.83>

可视化(频率/新进度)矩阵

from lifetimes.plotting import plot_frequency_recency_matrix
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12,8))
plot_frequency_recency_matrix(bgf)

如图可见:

  • 右下角的数据120/350,该用户进行了120次购买,并且他最近购买时间大约是350天(她的第一笔交易和她最近的交易之间的时间间隔),那么她属于最有价值客户,依照其消费惯性,将来也会进行多笔交易
  • 右上角黑了的部分可能是已经失去的客户
  • 20/250这样的数据,代表客户不经常来,最近没有见过他,所以他可能再次购买
  • 最近购买的顾客应该还“活着”

预测哪些客户还在

from lifetimes.plotting import plot_probability_alive_matrix
fig = plt.figure(figsize=(12,8))
plot_probability_alive_matrix(bgf)


黄色部分为还在用户,深色部分为丢失用户

我们将客户从“下一期最高预期购买量”排名降至最低。模型公开了一种方法,该方法将使用其历史记录预测下一时期客户的预期购买:

t = 1
data['predicted_purchases'] = bgf.conditional_expected_number_of_purchases_up_to_time(t, data['frequency'], data['recency'], data['T'])
data.sort_values(by='predicted_purchases', ascending=False).head()

上面列出的是我们的前五大客户,模型的predict_purchases列给出了购买的概率。

评估模型拟合

from lifetimes.plotting import plot_period_transactions
plot_period_transactions(bgf)


结果相近,看起来模型的预测还不错

分数据集进行预测

现在将数据集划分为校准周期数据集和保持数据集。这很重要,因为我们想要测试我们的模型如何对尚未看到的数据执行(就像机器学习实践中的交叉验证一样)

from lifetimes.utils import calibration_and_holdout_data
summary_cal_holdout = calibration_and_holdout_data(df, 'CustomerID', 'InvoiceDate',calibration_period_end='2011-06-08',observation_period_end='2011-12-9' )
summary_cal_holdout.head()

预测结果

from lifetimes.plotting import plot_calibration_purchases_vs_holdout_purchases
bgf.fit(summary_cal_holdout['frequency_cal'], summary_cal_holdout['recency_cal'], summary_cal_holdout['T_cal'])
plot_calibration_purchases_vs_holdout_purchases(bgf, summary_cal_holdout)

样本期间从开始到2011-06-08; 验证期从2011-06-09到2011-12-09。该图通过重复购买次数(x轴)对校准期内的所有客户进行分组,然后在保持期(y轴)中对其重复购买进行平均。橙线和蓝线分别表示模型预测和y轴的实际结果。正如我们所看到的,我们的模型能够非常准确地预测出样本中客户群的行为,模型低估了4次购买和5次购买后。

客户交易预测

根据客户历史记录,我们现在可以预测个人未来的购买情况:

t = 10
individual = data.loc[12347]
bgf.predict(t, individual['frequency'], individual['recency'], individual['T'])

预测12347用户未来10天内购买商品为概率为0.157

客户概率历史

根据客户交易历史记录,我们可以根据我们训练的模型计算其存活的历史概率。例如,我们想看看我们最好的客户的交易历史,看看活着的可能性:
1.

from lifetimes.plotting import plot_history_alive
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12,8))
id = 14606
days_since_birth = 365
sp_trans = df.loc[df['CustomerID'] == id]
plot_history_alive(bgf, days_since_birth, sp_trans, 'InvoiceDate')


我们最好的客户肯定还活着只是在2011年1月有中断情况

fig = plt.figure(figsize=(12,8))
id = 12347
days_since_birth = 365
sp_trans = df.query('CustomerID == @id')
plot_history_alive(bgf, days_since_birth, sp_trans, 'InvoiceDate')


这位顾客来的频率不是很高但是分布还算均匀,最近也有消费,是‘活着’的用户

gamma-gamma模型估算客户终生价值

我们仅估算至少有一次重复购买的客户。因此,我们估计有2,790位客户:

returning_customers_summary = data[data['frequency']>0]
returning_customers_summary.shape[0]# 模型训练
from lifetimes import GammaGammaFitter
ggf = GammaGammaFitter(penalizer_coef = 0)
ggf.fit(returning_customers_summary['frequency'],returning_customers_summary['monetary_value'])# 这样我们可以估算每个客户的平均交易价值
ggf.conditional_expected_average_profit(data['frequency'],data['monetary_value']).head()


这样我们获取每个客户的估计平均交易价值

python数据分析:使用lifetimes进行客户终身价值(CLV)探索相关推荐

  1. 零售行业交易数据分析(1)——客户终身价值(CLTV)计算和回归预测模型(Python)

    内容介绍 本文整理了客户终身价值(CLV或者CLTV)的相关概念,并对一家英国线上零售公司的一年交易数据进行分析,计算该公司所有客户的CLV并且建立回归预测模型. 一.客户生命周期价值 用户生命周期价 ...

  2. 什么是客户终身价值(LTV)

    经常在CRM相关的资料里看到一个名词--客户终身价值.那么什么是客户的终身价值呢,研究客户终生价值对我们企业又能带来哪些好处呢?客户终身价值是指随着时间的推移,客户未来可能为企业带来的收益总和. 1. ...

  3. 企业如何计算客户终身价值?

    客户终身价值的具体分析包括以下几个步骤. 1.收集客户资料和数据 企业需要收集的基本数据包括∶ 个人信息(如年龄.婚姻.性别.收入.职业等).住址信息(如区号.房屋类型.拥有者等).生活方式(如爱好. ...

  4. 大数据之Python数据分析 实训 信用卡客户风险评价之二、构建信用卡客户风险评价关键特征

    构建信用卡客户风险评价关键特征 实训数据:https://pan.baidu.com/s/1RduW2P0UtdgvQowIu26u7A 1 实训目标 (1) 掌握评分卡模型的原理. (2) 构建信用 ...

  5. 大数据之Python数据分析 实训 信用卡客户风险评价之一、处理信用卡数据异常值

    一.处理信用卡数据异常值 实训数据:https://pan.baidu.com/s/1RduW2P0UtdgvQowIu26u7A 1 实训目标 (1) 掌握异常值的识别与处理方法. (2) 构建信用 ...

  6. 使用机器学习进行客户终身价值和RFM模型分析

    对公司而言,在产品的『生产-变现』这一过程当中,用户决定了价值兑现的关键,也就是在产品设计过程中为产品赋形,更好的满足用户需求,以用户为中心,其中用户价值细分是了解用户价值度的重要途经. 公司在市场研 ...

  7. Python数据分析之用户留存

    Python数据分析之用户留存 前言 概览 数据预处理和数据集探究 规范列名 删除多余的列 dummy化类别型特征 探究通话时间与费用的关系 探究流失率 添加平均通话时长 可视化缺失值分布 训练模型 ...

  8. 微信私域流量池运营:提升客户终生价值(LTV)之激励老客户重复购买!

    对于企业和商家来说,未来销售战场上的决定性因素的并不是人员多寡,而是对电子信息化管理系统的理解和在整个销售流程的应用,以及预测和计算LTV(客户终生价值),进而指导后续一系列运营发展策略. 一个案例: ...

  9. python 数据分析 电信_基于Python的电信客户流失分析和预测

    一.项目背景 电信服务是生活中常见的消费服务,在现代社会,凡是使用手机打电话,或者在家看电视,都必须通过电信运营商提供的通话.网络等服务才能实现.本文采用来自kaggle平台的电信客户数据集,来分析人 ...

最新文章

  1. 使用jsonp跨域请求后可以获得数据,但是进入error方法,返回parseerror
  2. 迁移学习的挑战和六大突破点
  3. SQL 从一个表读取数据存到另一个表
  4. Kafka设计解析(六)- Kafka高性能关键技术解析
  5. Web前端三剑客之CSS基础
  6. id和instancetype的区别
  7. Android官方开发文档Training系列课程中文版:支持不同的设备之支持不同的平台版本
  8. python 千万级数据处理_Python实现 ! 千万级别数据处理
  9. VMware Pro16 安装MacOS 11/12教程
  10. matlab宝典pdf,《MATLAB 宝典(第4版)》---- 优化.pdf
  11. 项目经验|电流信号检测装置(“TI杯”)
  12. 图片像素低,图片模糊怎么变清晰?
  13. [vba]快速更新表格标题序号
  14. img.shape[0]、[1]、[2]到底代表什么(转)
  15. [python][project][爬虫] 时光网抓取信息
  16. (一)Python基础语法
  17. php入门写法PHP入门基础之php代码写法
  18. VMware16安装MacOS【详细教程】
  19. HttpClient 实现 socks 代理
  20. java课程设计qq_Java课程设计(qq聊天程序)

热门文章

  1. 云南昆明主城区一在建工地围墙倒塌致2人死亡
  2. 进程和线程.View椭圆运动
  3. jquery 动态按钮绑定点击事件
  4. NORDIC softDevice 蓝牙协议栈初始化程序分析(蓝牙从机,ble_peripheral)
  5. TLS协商 wireshark 抓包分析
  6. leetcode977
  7. ☀️苏州程序大白解析Linux 中的虚拟网络接口☀️《❤️记得收藏❤️》
  8. 如何做好 OSPO,推动企业开源丨雨林开源行
  9. matlab矩阵定义、矩阵元素引用、矩阵操作
  10. 中南大学软件工程修习课程