巴斯扩散模型针对创新产品、技术的采用和扩散,常被用作市场分析工具,对新产品、新技术需求进行预测。而新产品创新扩散是指新产品从创造研制到进入市场推广、最终使用的过程,表现为广大消费者从知晓、兴趣、评估、试用到最终采用新产品的行为。
巴斯扩散模型的许多变形也已被开发出来,用以满足某些特殊情形的精确需求。
巴斯模型的理论基础是新产品创新扩散理论。下面一张图很好地解释了创新扩散模型。
模型的核心思想是创新群体群体的购买决策独立于社会系统其他成员,而模仿群体购买新产品的时间受到社会系统的影响,并且这种影响随购买人数增加而增加,因为模仿群体的购买决策时间受到社会系统成员的影响。
Bass模型的基本形式:
d N ( t ) d t = p [ m − N ( t ) ] + q N ( t ) m [ m − N ( t ) ] \frac{dN(t)}{dt} = p[m - N(t)] + q\frac{N(t)}{m}[m - N(t)] dtdN(t)=p[m−N(t)]+qmN(t)[m−N(t)]
N ( t ) = m F ( t ) N(t) = mF(t) N(t)=mF(t)
其中,
我们分别看柿子中的两个部分
p [ m − N ( t ) ] p[m - N(t)] p[m−N(t)]
这一部分表示因为外部影响而购买新产品的采用人数,即这些采用者不受那些已经采用该种新产品的人的影响,成为创新采用者。
q N ( t ) m [ m − N ( t ) ] q\frac{N(t)}{m}[m - N(t)] qmN(t)[m−N(t)]
这一部分表示那些受先前购买者影响而购买的采用人数。当t = 0时,
n ( 0 ) = p m n(0) = pm n(0)=pm
即假设在创新扩散开始时,有pm个采用者,也可以理解为新产品引入市场前的试销或赠送的样品。
上面这一个微分方程解出来的结果为:
N ( t ) = m 1 − e − ( p + q ) t 1 + ( q p ) e − ( p + q ) t N(t) = m\cfrac{1 - e^{-(p+q)t}} {1 + (\cfrac{q}{p})e^{-(p+q)t}} N(t)=m1+(pq)e−(p+q)t1−e−(p+q)t
n ( t ) = m p ( p + q ) 2 e − ( p + q ) t [ p + q e − ( p + q ) t ] 2 n(t) = m\cfrac{p(p +q)^2e^{-(p+q)t}} {[p + qe^{-(p+q)t}]^2} n(t)=m[p+qe−(p+q)t]2p(p+q)2e−(p+q)t
如果Bass模型的创新系数p与模仿系数q的参数值上分析,如果q>p,则采纳曲线由最高点,即此产品的扩散是成功的;如果q<=p,则增长曲线没有极值点,随时间呈指数衰减状态,说明此产品的市场扩散失败。
适用范围:
局限:
# 最小二乘法
from math import e # 引入自然数e
import numpy as np # 科学计算库
import matplotlib.pyplot as plt # 绘图库
from scipy.optimize import leastsq # 引入最小二乘法算法
# 样本数据(Xi,Yi),需要转换成数组(列表)形式
ti = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
yi = np.array([8, 11, 15, 19, 22, 23, 22, 19, 15, 11])
# 需要拟合的函数func :指定函数的形状,即n(t)的计算公式
def func(params, t):
m, p, q = params
fz = (p * (p + q) ** 2) * e ** (-(p + q) * t) # 分子的计算
fm = (p + q * e ** (-(p + q) * t)) ** 2 # 分母的计算
nt = m * fz / fm # nt值
return nt
# 误差函数函数:x,y都是列表:这里的x,y更上面的Xi,Yi中是一一对应的
# 一般第一个参数是需要求的参数组,另外两个是x,y
def error(params, t, y):
return func(params, t) - y
# k,b的初始值,可以任意设定, 一般需要根据具体场景确定一个初始值
p0 = [100, 0.3, 0.3]
# 把error函数中除了p0以外的参数打包到args中(使用要求)
params = leastsq(error, p0, args=(ti, yi))
params = params[0]
# 读取结果
m, p, q = params
print('m=', m)
print('p=', p)
print('q=', q)
# 有了参数后,就是计算不同t情况下的拟合值
y_hat = []
for t in ti:
y = func(params, t)
y_hat.append(y)
# 接下来我们绘制实际曲线和拟合曲线
# 由于模拟数据实在太好,两条曲线几乎重合了
fig = plt.figure()
plt.plot(yi, color='r', label='true')
plt.plot(y_hat, color='b', label='predict')
plt.title('BASS model')
plt.legend()
参考资料:
https://baike.baidu.com/item/%E5%B7%B4%E6%96%AF%E6%89%A9%E6%95%A3%E6%A8%A1%E5%9E%8B/10258655?fr=aladdin
https://www.jianshu.com/p/269b8894d630?from=timeline
https://wenku.baidu.com/view/dcc6191155270722192ef7cf.html
https://zhuanlan.zhihu.com/p/28153851
https://www.jianshu.com/p/d3eb8d1a5e8c
https://www.jianshu.com/p/269b8894d630?from=timeline