如何为 CLVTools::clvdata() 准备数据

How to prepare data for CLVTools::clvdata()

我正在尝试使用 CLVTools 包在 R 中进行 CLV 分析。根据作者的说法,这个包是 BTYD 包的改进版本。 我没有使用过这个包,所以我相信这个问题可以很容易地解决。

我的数据由 client_id、transaction_date 和 total_revenue 组成,其中每个观察代表一次客户购买。这是在我的上下文中进行 CLV 分析所需的所有数据。

当我尝试使用 clvdata() 函数创建 CLV 数据对象时出现问题。 我收到错误消息:

Error: Parameter estimation.split needs to indicate a point at least 2 periods before the last transaction!

我找不到任何解释为什么会发生这种情况,我的数据看起来与他们用于示例的数据相同。

这是包含参数的 clvdata() 函数:

clv.apparel <- clvdata(Data_for_CLV,  
                   date.format="ymd", 
                   time.unit = "week",
                   estimation.split = 40,
                   name.id = "Client_ID",
                   name.date = "Transaction_Date",
                   name.price = "Total_Revenue")

--------编辑--------

删除 estimate.split 后,我能够在整个数据集上训练 pareto/nbd 模型,并得到下面的结果。但是,我也想使用模型进行预测,这需要一个保持期。如果我理解正确,SmokeyShakers,我现在应该能够将 estimation.split 设置为有效的东西,这到底是什么?

> summary(est.pnbd)
Pareto NBD Standard  Model 

Call:
pnbd(clv.data = clv.apparel)

Fitting period:                               
Estimation start   2019-12-21   
Estimation end     2020-08-21   
Estimation length  34.8571 Weeks

Coefficients:
      Estimate Std. Error  z-val Pr(>|z|)    
r      0.29540    0.02195 13.459  < 2e-16 ***
alpha 21.59114    1.18486 18.223  < 2e-16 ***
s      0.76215    0.04841 15.745  < 2e-16 ***
beta   1.45651    0.27221  5.351 8.76e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Optimization info:                  
LL     -26233.7198
AIC    52475.4396 
BIC    52512.0753 
KKT 1  TRUE       
KKT 2  TRUE       
fevals 26.0000    
Method L-BFGS-B   

Used Options:                 
Correlation FALSE```

免责声明:我是该软件包的共同创建者

这些潜在流失的概率模型通常应用于客户队列,因为假设队列之间存在显着差异。因此,您在每个队列上都安装了一个单独的模型。群组的定义最常见的是指加入日期(=首次交易),但任何其他(进一步)定义都是可能的,例如按渠道或按业务部门。 另请参阅 Fader 和 Hardie (2010) 关于为什么按队列应用很重要:http://www.brucehardie.com/papers/022/fader_hardie_mksc_10.pdf

但是,无论您对同类群组的确切定义如何,所有客户都必须在估计期内完成首次交易: 该模型适用于估计期内存在的交易数据。对于在估计期内进行交易的所有客户,在您指定的预测范围内预测未来的交易数量,就像您站在估计期末一样。因此,所有客户都需要在估计期内完成他们的第一笔交易,以便模型“知道”他们的存在。该模型不能简单地为它不知道它存在的客户做出预测(=在估计期间没有进行交易)。

该软件包可以简单地删除未在估计期内进行首次交易的客户,而只对进行了交易的客户进行预测。但是,我们认为用户应该知道发生了什么,因此有意识地准备数据 him/herself.

I should now be able to set the estimation.split to something valid, which is what exactly

您必须将估计结束指定为您数据中的所有客户都已进行第一笔交易的日期。如果您的数据不是这种情况,您应该将数据分成由第一笔交易定义的同类群组。

假设您有从 2015-01-01 到 2020-01-01 的客户交易,并且想在 2017-01-01 拆分。然后,您可以将第一个队列定义为在 2015-01-01 到 2015-12-31 之间进行首次交易(=加入)的所有客户,并将第二个队列定义为从 2016-01-01 到 2016-12-31。您将为每个队列创建 2 个单独的 clvdata 对象,然后还适合 2 个单独的模型。请注意,您不能创建从 2017-01-01 到 2018-01-01 的第三个群组,估计拆分时间为 2017-01-01,而对于这个第三个群组,您必须定义一个较晚的拆分日期,比如 2019-01 -01.

其他分组 windows 例如 1 个月、3 个月、6 个月等也是惯例,但取决于您的数据。确保选择足够长的估计期,以便模型实际看到每个客户的重复购买模式(检查 summary(clvdata) 中的平均购买间时间)。出于这个原因,估计周期通常比分组window长,即队列的估计结束在max(customer_join_date之后。您可能也对我在这里关于数据准备和队列分析的更深入的回答感兴趣:

https://github.com/bachmannpatrick/CLVTools/issues/101

https://github.com/bachmannpatrick/CLVTools/issues/146

However, I would also like to use the model for prediction, which requires a holdout period

成功拟合模型后,您可以始终进行预测,也没有保持期。但是,您必须指定 prediction.end 参数来说明您要预测多远(周期数或确切日期)。如果您的数据有保留期,则不必指定 prediction.end,因为它会默认为保留期。 plot()中的prediction.end也是如此。 为了做出最终的 CLV 预测,实际上习惯于将模型拟合到队列中的所有数据(即没有保持期)

我目前正在使用同一个包并且遇到了类似的问题。问题是 一些客户在保留期间进行了第一笔交易 (并且在校准期间没有交易)。其他软件包(例如 BTYD 和 BTYDplus)似乎会自动过滤这些情况,但 CLVTools 不会。

因此,您必须手动过滤这些案例(即首次交易发生在拒绝期间的客户)。