使用 Prophet 或线性回归的销售预测和影响大小回归

Sales prediction and effect size regressors with Prophet or Lineair Regression

我使用 Prophet 和线性回归是为了:

  1. 预测日级别/商店级别的销售额;
  2. 了解我的回归变量(x 个变量)的影响大小。

我不一定要坚持这些建模技巧。

现在我面临的问题是,如果我分别为每个商店建模,观察的数量将会减少(因此我会失去自由度)。但是,如果我聚合所有商店 - 并立即对它们进行建模 - 我预计该模型将不会很好地拟合。此外,如果我汇总这些商店的销售额,最大的商店在组中的权重系数会更高。

最后,我需要对商店级别进行预测。但是,我想使用所有商店来确定我的外部阻遏物的作用大小。

我的数据是 100 家商店 4 年的日级销售数据。附加回归变量是折扣深度(以百分比表示)。请参阅下面的示例,了解我的数据:

> head(data)
        Date Sales_EUR Store_ID Discount_depth
1 2017-01-01       101        1           0.10
2 2017-01-01       105        2           0.12
3 2017-01-01       104        3           0.11
4 2017-01-01       200        4           0.09
5 2017-01-01       170        5           0.10
6 2017-01-01       150        6           0.12

有人对此问题有解决方案或最佳做法吗?

非常感谢。

我不熟悉 Prophet,但我认为,根据你所说的,听起来你想要执行一个线性混合效果 (运行dom-effects) 模型,它可以解释商店之间和商店内部的差异。这将有助于整体销售预测,但也有助于个别商店的销售。我已经根据您的数据创建了一些示例数据,并提供了一个非常基本的 RE 模型,其中 Store_id 作为 RE。

library(dplyr) 
library(zoo) #create season variable
library(nlme) #random effects

set.seed(10)
df<-data.frame(Date = rep(seq.Date(from =as.Date("01/01/2016", "%d/%m/%Y"), 
                               to=as.Date("01/01/2020", "%d/%m/%Y"), by="day"), times = 100), 
               Sales_EUR = rnorm(146200, 150, 25),
               Store_ID = rep(1:100, each = 1462),
               Discount_depth = rnorm(146200, 0.10, 0.01))
df <- df %>% 
  dplyr::arrange(Store_ID, Date)

#create season variable to try to capture seasonality, month as factor might suffice?
yq <- as.yearqtr(as.yearmon(df$Date, "%d/%m/%Y") + 1/12)
df$Season <- factor(format(yq, "%q"), levels = 1:4, 
                    labels = c("winter", "spring", "summer", "fall"))
head(df)  
        Date Sales_EUR Store_ID Discount_depth Season
1 2016-01-01  150.4687        1     0.08615730 winter
2 2016-01-02  145.3937        1     0.10361614 winter
3 2016-01-03  115.7167        1     0.09962170 winter
4 2016-01-04  135.0208        1     0.08624449 winter
5 2016-01-05  157.3636        1     0.10553382 winter
6 2016-01-06  159.7449        1     0.08965313 winter

根据这个数据集,我 运行 一个简单的 RE 模型:

#i presume from your question you want to predict "Sales_EUR"?
#basic random-effects model using library(nlme)
m1 <- lme(Sales_EUR ~  Discount_depth + Season,
          random = ~ 1 | Store_ID,
          data = df,
          na.action = "na.omit") 
summary(m1)

Linear mixed-effects model fit by REML
 Data: df 
      AIC     BIC    logLik
  1355776 1355845 -677880.8

Random effects:
 Formula: ~1 | Store_ID
        (Intercept) Residual
StdDev:   0.2288529 24.97051

Fixed effects: Sales_EUR ~ Discount_depth + Season 
                   Value Std.Error     DF   t-value p-value
(Intercept)    151.22885  0.666889 146096 226.76767  0.0000
Discount_depth -13.77271  6.532148 146096  -2.10845  0.0350
Seasonspring     0.02474  0.184847 146096   0.13382  0.8935
Seasonsummer    -0.01271  0.184847 146096  -0.06875  0.9452
Seasonfall       0.20315  0.185349 146096   1.09603  0.2731
 Correlation: 
               (Intr) Dscnt_ Ssnspr Ssnsmm
Discount_depth -0.980                     
Seasonspring   -0.143  0.003              
Seasonsummer   -0.142  0.002  0.504       
Seasonfall     -0.140  0.001  0.503  0.503

Standardized Within-Group Residuals:
         Min           Q1          Med           Q3          Max 
-4.530496999 -0.674513460  0.000275551  0.676791346  4.162294311 

Number of Observations: 146200
Number of Groups: 100 

您会想尝试一下该模型,但这是让您继续前进的基本思路。然后您可以开始尝试做出预测,请参阅此处 help