使用 Prophet 或线性回归的销售预测和影响大小回归
Sales prediction and effect size regressors with Prophet or Lineair Regression
我使用 Prophet 和线性回归是为了:
- 预测日级别/商店级别的销售额;
- 了解我的回归变量(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。
我使用 Prophet 和线性回归是为了:
- 预测日级别/商店级别的销售额;
- 了解我的回归变量(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。