我们最近为客户发布了一个重新设计的新电子商务网站。他们声称由于这些变化,收入下降了 40%。我们有几年前的每日销售数据。我们正在尝试确定网站重新启动后最近的收入下降是否可以归因于重新设计或仅仅由于正常差异。
我们可以使用哪些工具/方法来证明或反驳最近的收入下降在统计上是否显着?
提前致谢。
我们最近为客户发布了一个重新设计的新电子商务网站。他们声称由于这些变化,收入下降了 40%。我们有几年前的每日销售数据。我们正在尝试确定网站重新启动后最近的收入下降是否可以归因于重新设计或仅仅由于正常差异。
我们可以使用哪些工具/方法来证明或反驳最近的收入下降在统计上是否显着?
提前致谢。
没有什么能以这种或另一种方式证明这一点,因为即使您发现收入从那时起下降了,您也无法排除其他结构变化的可能性(例如新的竞争对手、改变的监管环境、改变的时尚等等)你甚至想不到...)。
您可以使用时间序列技术来确定更改系统的时间是否与收入下降有关;或者,为了您的目标更好,您可能可以驳回该主张(如果没有明显的下降,就没有什么可以解释的,对吧?好吧,也许......问题在于构建一个反事实。)。
您必须处理的问题包括:季节性(微观如每周和宏观如夏季与冬季);增长或其他趋势;和你的观察的序列相关性。
在下面的模拟数据图中,您可以看到解决此问题的一种方法。
您可以根据不随时间变化来拟合某种模型 - 在这种情况下,我已经拟合了一个线性模型,其响应变量为对数尺度,这相当于说每日收入以恒定的速度增长速度。这个零假设用黑线表示。
另一方面,红线和蓝线显示了另一种更复杂的模型,由于引入了新系统。一旦你也拟合了这个更复杂的模型,你就可以测试统计上显着的证据表明需要这个模型而不是简单的黑线模型。

(请注意,在这种情况下,如果您按照@pgericson 的建议对前后情况进行了简单的 t 检验比较,那么您会得出结论,您使用新系统显着增加了收入,因为前几个月的潜在增长率到新系统。)
现在,要注意的危险是,您不能像使用横截面数据那样拟合模型。您需要考虑这样一个事实,即前一天的收入观察不会对前一天的收入观察增加那么多 - 它们可能是高度相关的,而不是全新的信息。任何值得称道的统计数据或计量经济学软件包都将允许这样做;在 R 中,您可以使用 nlme 库中的 gls() 或 arima() 来执行此操作。
我的 R 代码模拟了这些数据并对其进行了一些基本分析,粘贴在下面。
#simulate data
set.seed(80)
x <- ts(100*exp(1:1000*0.001), frequency=7)
e <- rnorm(1002,0,10)
x <- x+ 0.5*e[1:1000] + 0.8*e[2:1001] + e[3:1002]
changed <- rep(c(0,1), c(800,200))
x <- x + cumsum(changed)^0.4 * rnorm(1000, -8,1)
# check it looks ok
par(mfrow=c(2,1))
plot(x, main="Daily revenue ($'000)", xlab="weeks", ylab="(original)")
abline(v=801/7, col="grey50")
plot(x, ylab="(logarithmic)", xlab="weeks", log="y")
abline(v=801/7, col="grey50")
# t test makes it look like you've increased revenue! -
# because it ignores the trend
t.test(x~changed)
# Much better is to illustrate in some kind of model
# that can take into account any growth trend.
# With real data this will be quite complex, but
# in my simulated data the growth is nice and regular
# so it is easy to see if it is disrupted.
x.df <- data.frame(x=x, changed=changed, day=1:1000)
win.graph()
x.lm1 <- lm(log(x)~day, data=x.df)
plot(x, ylab="(logarithmic)", xlab="weeks", log="y", bty="l")
abline(v=801/7, col="grey50")
lines(1:1000/7, exp(predict(x.lm1)), lwd=3)
x.lm2 <- lm(log(x)~day*changed, data=x.df)
lines(1:800/7, exp(predict(x.lm2))[1:800], col="red", lwd=3)
lines(801:1000/7, exp(predict(x.lm2))[801:1000], col="blue", lwd=3)
anova(x.lm2) # shows "changed" is significant
summary(x.lm2) # could be used to estimate how much change has happened
# The problem with this approach though is that
# the errors are serially correlated and hence the inferences
# based on them being iid will not be justifiable. As shown by this diagnostic
# plot:
acf(residuals(x.lm2))
library(nlme)
x.lm3 <- gls(log(x)~day*changed, data=x.df, correlation=corAR1())
anova(x.lm3) # "changed" is still significant but much higher p values
summary(x.lm3)
# I'd like to fit a model with more lags in the autoregression structure
# but the following code takes frigging ages for some reason (eventually came out OK)
x.lm4 <- update(x.lm3, correlation=corARMA(c(0.6, 0.2), p=2, q=0),
control=glsControl(msVerbose=TRUE))
您可以对两个时期的均值进行简单的 t 检验。确保两年内的数据没有某种上升或下降的趋势,因为这会导致 t 检验值的错误结论。
您可能需要使用Welch 的 t 检验(R 将其用作标准),这是对标准学生 t 检验的修改,以考虑不同的方差和样本量。它应该是一个单方面的替代假设,因为您正在测试 period_after_change 是否小于 period_before_change。
这是更改是否产生负面影响的最简单测试。
您可以使用 Welch 的 t 检验(谷歌的第一次命中)计算 excel 中的 t 检验分数,如果测试很重要,那么您做错了什么,并且可以通过重新启动来解释下降(如果我们只将其视为解释变量) . 如果它不重要,那么你没有做错任何事。
这是统计方法,另一方面是向客户解释它......我不会在这里深入探讨......;)
您可能会考虑在 R 中使用 CausalImpact 来估计差异,但 CausalImpact 需要一个辅助数据集(对照)来比较“处理过的”数据——在这种情况下是有问题的网站数据。
CausalImpact 需要一个辅助数据集来对探索性数据进行建模,就像一个单独但非常相似的市场。您还可以提供回归模型作为比较数据集。更好的解释在这里:https ://google.github.io/CausalImpact/
您也可以考虑使用 ITS,即中断时间序列分析。这将需要建立一个强大的时间序列模型,其中包括变量 x1) 发生/未发生变化和 x2) 新网站变化的第 1、2、3 天……。
如果您没有并行数据集或模型可插入 CausalImpact,我的建议是使用 ITS。使用 ITS 需要以下条件:
建立一个强大的“前期”时间序列模型,希望能够解释导致治疗或后期的任何和所有季节性和周期性趋势。您将需要一个您认为可以准确预测“反事实”的模型,或者如果没有对网站进行任何更改会发生什么。这是模型 1。
将我上面提到的两个变量添加到您的模型中,以表示“测试”的开始和趋势。重新运行您的模型以包含测试天数和新的测试变量,并查看您的测试是否显示它在统计上显着(非常低的 p 值)。这是模型 2。
将这两个模型的结果预测点绘制到 Excel 中 - 一直到测试。只要上一步中的两个新“测试变量”系数在统计上显着,两个模型在测试期间的差异就是您的结果。如果有变化,他们还将开始向您展示变化的幅度。
当然,你必须确定没有其他事件与新事件同时发生——相关性不是因果关系,yada yada。