BG/NBD Model
…继续
想象每一个客户有两个硬币,一个“Buy Coin"控制客户购买的概率;一个"Die Coin"控制客户流失、不再购买的概率。
- 前面假设了客户的交易次数服从泊松过程:
在一年中的每个月,客户都以抛硬币的方式来决定是否购买。我们所观察到的购买次数取决与泊松分布的参数 𝜆。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import poisson,expon,nbinom
poisson_lambda = 4.3
p_arr = []
distribution = poisson(poisson_lambda)
for transactions in range(0,10):
p_arr.append(distribution.pmf(transactions))
plt.ylabel('Probability')
plt.xlabel('Number of Transactions')
plt.xticks(range(0, 10))
plt.title('Poisson Probability Mass Function')
plt.plot(p_arr, color='black', linewidth=0.7, zorder=1)
plt.scatter(range(0, 10), p_arr, color='purple', edgecolor='black', linewidth=0.7, zorder=2)
plt.show()
上图展示了以 𝜆=4.3 建模的购买概率的分布情况
- 假设交易率服从Gamma分布
这也就是说,每个客户有自己的Buy Coin,每个Coin的正反面出现的概率是不一样的。
gamma_shape = 9
gamma_scale = 0.5
for customer in range(0, 100):
distribution = poisson(np.random.gamma(shape=gamma_shape, scale=gamma_scale))
p_arr = []
for transactions in range(0,9):
p_arr.append(distribution.pmf(transactions))
plt.plot(p_arr, color='black', linewidth=0.7, zorder=1)
plt.ylabel('Probability')
plt.xlabel('Number of Transactions')
plt.xticks(range(0,9))
plt.title('Poisson Probability Distribution Curves 100 Customers')
plt.show()
上图模拟了以形状参数为9,尺度参数为0.5的Gamma分布建模的100个客户的泊松分布
- 在任意一个交易后,一个客户会以概率 𝑝 流失
因此,客户失效点在交易中呈几何分布。
任何交易之后,客户都会以扔"Die Coin"来确定是否留存
p = 0.52
p_arr = []
for i in range(0,10):
proba_inactive = p*(1-p)**(i-1)
p_arr.append(proba_inactive)
p_arr = np.array(p_arr)
p_arr /= p_arr.sum()
plt.plot(range(0, 10), p_arr, color='black', linewidth=0.7, zorder=1)
plt.ylabel('Probability inactive')
plt.xlabel('Number of Transactions')
plt.xticks(range(0, 10))
plt.title('(Shifted) Geometric Probability Mass Function')
plt.show()
上图展示了,以 𝑝=0.52 为流失概率建模,可以看到客户的交易次数越多,其流失率越低。
- 𝑝 服从Beta分布
每个客户的"Die Coin"不同,每个都有自己的失效率,下面以 𝛼=2,𝛽=3 的贝塔分布建模
beta_a = 2
beta_b = 3
for customer in range(0, 10):
p_arr = []
beta = np.random.beta(a=beta_a, b=beta_b)
for transaction in range(1,10):
proba_inactive = beta*(1-beta)**(transaction-1)
p_arr.append(proba_inactive)
p_arr = np.array(p_arr)
plt.plot(p_arr, color='black', linewidth=0.7, zorder=1)
plt.ylabel('Probability Inactive')
plt.xlabel('Number of Transactions')
plt.xticks(range(1, 10))
plt.title('Geometric Probability Mass Function 10 customers')
plt.show()
模型输出
最后,通过以历史数据来拟合前面的模型可以为每一个客户导出:
- 𝑃(𝑋(𝑡)=𝑥|𝜆,𝑝), 在长度为 𝑡 的时间内观测到 𝑥 个交易的概率
- 𝐸(𝑋(𝑡)|𝜆,𝑝), 在长度为 𝑡 的时间内观测到 𝑥 个交易的期望值
- 𝑃(𝜏>𝑡), 客户在期间 𝜏 流失概率
拟合的参数可以用来预测未来某段时间长度 𝑡 的期望购买量,作者论文中的公式形如:
a + b + x − 1 a − 1 [ 1 − ( α + T α + T + t ) r + x 2 F 1 ( r + x , b + x ; a + b + x − 1 ; t α + T + t ) ] 1 + δ x > 0 a b + x − 1 ( α + T α + t x ) r + x \frac{\frac{a+b+x-1}{a-1}[1-(\frac{\alpha+T}{\alpha+T+t})^{r+x}2^{F_1(r+x,b+x;a+b+x-1;\frac{t}{\alpha+T+t})}]}{1+\delta_{x>0}\frac{a}{b+x-1}(\frac{\alpha+T}{\alpha+t_x})^{r+x}} 1+δx>0b+x−1a(α+txα+T)r+xa−1a+b+x−1[1−(α+T+tα+T)r+x2F1(r+x,b+x;a+b+x−1;α+T+tt)]
其中, x x x=历史交易次数; t x t_x tx=上一次购买时间; T T T=客户的存续时间; 2 F 1 ( . ) 2^{F_1(.)} 2F1(.)为高斯超几何函数。
下一节我们将使用Python来实现整个模型, 未完待续…