拓端tecdat| R语言使用Bass模型进行手机市场产品周期预测

原文链接:http://tecdat.cn/?p=17725 

 

主要观点

巴斯Bass扩散模型已成功地用于预测各种新推出的产品以及成熟产品的市场份额。

该模型的主要思想来自两个来源:

  1. 消费者不受社会影响的产品意愿。

  2. 因为其他人已经采用了该产品,所以倾向于采用该产品。因此,在优质产品的生命周期中的早期采用者的影响变得足够强大,以致驱使许多其他人也采用该产品。

Bass模型显示了如何使用销售数据的前几个时期的信息来对未来的销售做出相当好的预测。可以很容易地看出,虽然该模型来自营销领域,但它也可以很容易地用于对现金流量的预测进行建模以确定初创公司的价值。

历史事例

Bass模型的文献中有一些经典的例子。例如,请参见下图所示的80年代VCR的实际与预测市场增长情况。

 

 

基本思想

将单个人从零时间到时间tt购买产品的累计概率定义为F(t)。那么,在时间tt的购买概率为密度函数f(t)= F'(t)。

从目前来看,在目前没有购买的情况下,时间t的购买率符合逻辑,即

 

建模就像在给定时间t建模产品的采用率

微分方程

巴斯建议将此采用率定义为

 

在这里,我们可以将p定义为 采用产品的消费者的  独立比率,将q定义为模仿率,因为q可以  模拟累积采用强度F(t)的影响。

因此,如果我们可以找到某产品的p和q,则可以预测其随着时间的采用,从而生成销售的时间路径。总结一下:

  • p:创新系数。
  • q:模仿系数。

求解F(t)的模型

我们重写方程:

并注意F(0)= 0。

解决方案中的步骤是:

另一种解决方案

一种替代方法(这是学生Muhammad Sagarwalla根据Alexey Orlovsky的想法提出的)如下。

 

所以我们写

 

 

 

我们得到

 

 

 

与公式(*)相同。以前的解决方案是

 

 

求解f(t)

 

 因此,如果目标市场的大小为m,则在每个t处,采用率简单地由m×f(t)给出。

例如,设置m = 100,000,p = 0.01和q = 0.2。然后,采用率如下图所示。

  1.  
    f = function(p,q,t) {
  2.  
     
  3.  
    p = 0.01
  4.  
    q = 0.20
  5.  
    plot(t,m*f(p,q,t),type="l",col="blue",l

 

 

 

R中的符号数学

  1.  
    #BASS 模型
  2.  
     
  3.  
    FF = expression(p*(exp((p+q)*t)-1)/(p*exp((p+q)*t)+q))
  4.  
     
  1.  
    ## expression(p * (exp((p + q) * t) - 1)/(p * exp((p + q) * t) +
  2.  
    ## q))
  1.  
    #取导数
  2.  
    D(FF,"t")
  1.  
    ## p * (exp((p + q) * t) * (p + q))/(p * exp((p + q) * t) + q) -
  2.  
    ## p * (exp((p + q) * t) - 1) * (p * (exp((p + q) * t) * (p +
  3.  
    ## q)))/(p * exp((p + q) * t) + q)^2
  1.  
    #设置函数
  2.  
    ff = function(p,q,t) {
  3.  
    res
  1.  
    #评估
  2.  
    plot(t,m*eval(ff(p,q,t)),type="l",col="red",lwd=3)

 

 

iPhone销售预测

例如,让我们看一下iPhone销量的趋势(我们将季度销量存储在一个文件中并读入文件,然后进行Bass模型分析)。

此计算的R代码如下:

  1.  
    #使用苹果iPHONE销售数据
  2.  
    data = read.table("tecdat/iphone.txt",header=TRUE)
  1.  
    ## Quarter Sales_MM_units
  2.  
    ## 1 Q3_07 0.27
  3.  
    ## 2 Q4_07 1.12
  4.  
    ## 3 Q1_08 2.32
  5.  
    ## 4 Q2_08 1.70
  6.  
    ## 5 Q3_08 0.72
  7.  
    ## 6 Q4_08 6.89
print(tail(data))
  1.  
    ## Quarter Sales_MM_units
  2.  
    ## 30 Q4_14 39.27
  3.  
    ## 31 Q1_15 74.47
  4.  
    ## 32 Q2_15 61.17
  5.  
    ## 33 Q3_15 47.53
  6.  
    ## 34 Q4_15 48.05
  7.  
    ## 35 Q1_16 74.78
  1.  
    ##
  2.  
    ## Call:
  3.  
    ## lm(formula = isales ~ cum_isales + cum_isales2)
  4.  
    ##
  5.  
    ## Residuals:
  6.  
    ## Min 1Q Median 3Q Max
  7.  
    ## -14.050 -3.413 -1.429 2.905 19.987
  8.  
    ##
  9.  
    ## Coefficients:
  10.  
    ## Estimate Std. Error t value Pr(>|t|)
  11.  
    ## (Intercept) 3.696e+00 2.205e+00 1.676 0.1034
  12.  
    ## cum_isales 1.130e-01 1.677e-02 6.737 1.31e-07 ***
  13.  
    ## cum_isales2 -5.508e-05 2.110e-05 -2.610 0.0136 *
  14.  
    ## ---
  15.  
    ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  16.  
    ##
  17.  
    ## Residual standard error: 7.844 on 32 degrees of freedom
  18.  
    ## Multiple R-squared: 0.8729, Adjusted R-squared: 0.865
  19.  
    ## F-statistic: 109.9 on 2 and 32 DF, p-value: 4.61e-15
b = res$coefficients
  1.  
    #拟合模型
  2.  
    m1 = (-b[2]+sqrt(b[2]
  3.  
    m2 = (-b[2]-sqrt(b[2]^2-4
  1.  
    ## cum_isales cum_isales
  2.  
    ## -32.20691 2083.82202
## [1] 2083.822
  1.  
    ## (Intercept) cum_isales2
  2.  
    ## "p,q=" "0.00177381124189973" "0.114767511363674"
  1.  
    ##绘制拟合的模型
  2.  
     
  3.  
     
  4.  
    plot(t,fn_f,type="l"
  5.  
     
  6.  
    lines(1:n,isales,col="red",lwd=2,lty=2)

 

三星Galaxy手机销量

  1.  
    #读取Galaxy销售数据
  2.  
    data = read.csv("tecdat/galaxy.csv")
  3.  
     
  4.  
    #获取系数
  5.  
     
  6.  
    res = lm(isales ~ cum_isales+cum_isales2)
  7.  
    print(summary(res))
  1.  
     
  2.  
    ## Residuals:
  3.  
    ## Min 1Q Median 3Q Max
  4.  
    ## -11.1239 -6.1774 0.4633 5.0862 13.2662
  5.  
    ##
  6.  
    ## Coefficients:
  7.  
    ## Estimate Std. Error t value Pr(>|t|)
  8.  
    ## (Intercept) 5.375e+01 4.506e+00 11.928 2.87e-10 ***
  9.  
    ## cum_isales 7.660e-02 1.068e-02 7.173 8.15e-07 ***
  10.  
    ## cum_isales2 -2.806e-05 5.074e-06 -5.530 2.47e-05 ***
  11.  
    ## ---
  12.  
    ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  13.  
    ##
  14.  
    ## Residual standard error: 7.327 on 19 degrees of freedom
  15.  
    ## Multiple R-squared: 0.8206, Adjusted R-squared: 0.8017
  16.  
    ## F-statistic: 43.44 on 2 and 19 DF, p-value: 8.167e-08
  1.  
    b = res$coefficients
  2.  
     
  3.  
    #拟合模型
  4.  
     
  5.  
    m1 = (-b[2]+sqrt(b[2]^2-4*
  6.  
    m2 = (-b[2]-sqrt(b[2]^
  7.  
    print(c(m1,m2))
  1.  
    ## cum_isales cum_isales
  2.  
    ## -578.9157 3308.9652
## [1] 3308.965
  1.  
    ## (Intercept) cum_isales2
  2.  
    ## "p,q=" "0.0162432614649845" "0.0928432001791269"
  1.  
    #绘制拟合模型
  2.  
    nqtrs = 100
  3.  
    t=seq(0
  4.  
     
  5.  
    plot(t,fn_f,type="l"
  6.  
     
  7.  
    lines(1:n,isales,col="red",lwd=2,lty=2)

 

 

全球半导体销量

  1.  
    #读取半导体销售数据
  2.  
    data = read.csv("tecdat/semi.csv")
  3.  
     
  4.  
    #获取系数
  5.  
    isales = d
  6.  
     
  7.  
    res = lm(isales ~ cum_isales+cum_isales2)
  1.  
     
  2.  
    ## Residuals:
  3.  
    ## Min 1Q Median 3Q Max
  4.  
    ## -42.359 -12.415 0.698 12.963 45.489
  5.  
    ##
  6.  
    ## Coefficients:
  7.  
    ## Estimate Std. Error t value Pr(>|t|)
  8.  
    ## (Intercept) 5.086e+01 8.627e+00 5.896 3.76e-06 ***
  9.  
    ## cum_isales 9.004e-02 9.601e-03 9.378 1.15e-09 ***
  10.  
    ## cum_isales2 -6.878e-06 1.988e-06 -3.459 0.00196 **
  11.  
    ## ---
  12.  
    ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  13.  
    ##
  14.  
    ## Residual standard error: 21.46 on 25 degrees of freedom
  15.  
    ## Multiple R-squared: 0.9515, Adjusted R-squared: 0.9476
  16.  
    ## F-statistic: 245.3 on 2 and 25 DF, p-value: < 2.2e-16
  1.  
     
  2.  
     
  3.  
    #拟合模型
  4.  
    m1 = (-b[2]+sqrt(b[2]^2
  5.  
    m2 = (-b[2]-sqrt(b[
  6.  
    print(c(m1,m2))
  1.  
    ## cum_isales cum_isales
  2.  
    ## -542.4036 13633.3003
## [1] 13633.3
  1.  
    ## (Intercept) cum_isales2
  2.  
    ## "p,q=" "0.00373048366213552" "0.0937656034785294"
  1.  
    #绘制拟合的模型
  2.  
     
  3.  
    plot(t,fn_f,type="l",
  4.  
     
  5.  
    lines(1:n,isales,col="red"

 

显示数据框:

print(df)
  1.  
    ## t V2 fn_f
  2.  
    ## 1 0 1988 50.858804
  3.  
    ## 2 1 1989 55.630291
  4.  
    ## 3 2 1990 60.802858
  5.  
    ## 4 3 1991 66.400785
  6.  
    ## 5 4 1992 72.447856
  7.  
    ## 6 5 1993 78.966853
  8.  
    ## 7 6 1994 85.978951
  9.  
    ## 8 7 1995 93.503005
  10.  
    ## 9 8 1996 101.554731
  11.  
    ## 10 9 1997 110.145765
  12.  
    ## 11 10 1998 119.282622
  13.  
    ## 12 11 1999 128.965545
  14.  
    ## 13 12 2000 139.187272

 

权衡p vs q

在Bass模型中,如果模仿系数相对于创新系数增加,那么以下哪一项是最有效的?

  1. 产品生命周期的高峰发生在稍后。
  2. 产品生命周期的高峰出现得更快。
  3. 两个生命周期高峰的机会可能会增加。
  4. 高峰可能迟早会出现,具体取决于创新系数。

使用高峰时间公式,用x = q / p代替:

x的微分:

从Bass模型中,我们知道q> p> 0,即x> 1,否则我们可以在0≤F<1区域获得负的接受度或形状,而没有最大值。因此,∂t∗ /∂x的符号与:

 

但是这个非线性方程

根x≈3.59

换句话说,当x> 3.59时,导数∂t∗ /∂x为负,而当x <3.59时为正。对于x = q / p的低值,模仿系数q的增加会增加达到销售高峰的时间,而对于q / p的高值,时间会随着q的增加而减少。因此,该问题的正确答案似乎是“它取决于p和q的值”。

  1.  
    t = seq(0,5,
  2.  
    .1)
  3.  
    p = 0.1;
  4.  
     
  5.  
    lines(t,f(p,q,t),type="l",col="red",lwd=2)

 

在图中,当x变小时,峰值更早。


最受欢迎的见解

1.在python中使用lstm和pytorch进行时间序列预测

2.python中利用长短期记忆模型lstm进行时间序列预测分析

3.使用r语言进行时间序列(arima,指数平滑)分析

4.r语言多元copula-garch-模型时间序列预测

5.r语言copulas和金融时间序列案例

6.使用r语言随机波动模型sv处理时间序列中的随机波动

7.r语言时间序列tar阈值自回归模型

8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类

9.python3用arima模型进行时间序列预测

 

posted @ 2020-11-11 15:18  拓端tecdat  阅读(420)  评论(0编辑  收藏  举报