在时间序列分析中发现异常值,我是否应该预处理数据?

机器算法验证 r 时间序列 数据挖掘 异常值
2022-03-20 18:51:10

我的问题建立在上一篇关于通用时间序列中异常值检测的文章的基础上,特别是始终出色的 Rob H.

我在一家小型制造公司工作,目前正在处理这个问题,即检测销售数据时间序列中的异常值,采用(可疑的)自动化现成软件程序。

我认为这种方法充其量是有问题的,而且我通常对得到的结果不满意。因此,我想使用一些替代方法“仔细检查”我们软件的输出。

Rob 的想法似乎合理、直接且易于实施,因此我决定尝试一下。问题是:如果我的时间序列不是“通用的”怎么办?

Stl 分解突出显示了我的数据中的强烈季节性和变化趋势:

在此处输入图像描述

(顺便说一句,我stl(x,s.window="periodic")像 Rob 建议的那样使用,但恕我直言stl(x,s.window="periodic",robust=TRUE),因为异常值检测是手头的问题,所以恕我直言。此外,我不太确定这s.window="periodic"部分,我尝试了一些不同的值,但我没有知道如何解释结果。也许有人可以指出我正确的方向?)。

回到我的问题,我是销售数据,季节性模式(或者我认为是)受到日历效应的强烈影响。我也有理由相信,2009 年的水平大转变是金融危机造成的,与趋势无关。

我在这里做什么?我应该让模型处理这个问题,还是应该预处理数据?我是在 2009 年之前和 2009 年之后执行工作日调整并重新对齐(有这样的事情吗?),还是让 STL 分解来完成这项工作?

我可以再写 1000 行,但我认为这应该足以让信息通过。我为 WOT 和我糟糕的英语道歉。另外我希望我没有违反太多的论坛规则......

我希望有人可以提供帮助!

3个回答
  • 平稳的趋势应该可以毫无问题地应对经济影响。
  • 在 stl 中使用 robust=TRUE 在这里是有意义的(我已经改变了我的原始函数来做同样的事情)。
  • 除非你有超过十年的数据,否则我会坚持周期性的季节性。它不太可能以足够快的速度变化以检测较短的时间序列。
  • 对工作日数据进行预处理是有意义的,因为它消除了已知的可变性原因。

我建议你尝试 stl 方法,看看它在哪里给出了与你现有方法截然不同的结果。然后看看这些案例,看看哪种方法给出了最合理的结果。

我不会走 ARIMA 路线,因为它远没有 stl 强大。

好的,让我们试试这个进行比较。如果我通过将原始时间序列除以每个月的实际工作日数,然后将结果乘以 21 来消除日历影响,该怎么办?

原始时间系列为黑色,日历调整后的系列为红色: 在此处输入图像描述

我首先想到的是:嘿,这些数据真的是季节性的吗?八月可能是,但十一月/十二月呢?在我看来,工作日调整抵消了冬季月份的大部分(如果不是全部)季节性。各位怎么看?

最重要的是:我仍然注意到 05 年 11 月和 09 年 1 月的脉搏,我不太确定 06 年 5 月,在我看来,08 年 1 月可能更多地与工作日有关,而不是与工作日有关。到一个实际的脉冲。

另外,我完全可以看到 09 年 2 月的水平变化,但 06 年 12 月的水平变化呢?是不是更像是 06 年 11 月脉冲的副作用(考虑到日历调整的数据,06 年 11 月甚至是脉冲)?意甲升得如此之高,以至于当它回落时,似乎水平发生了变化。脉冲调整后的数据是否仍会在 06 年 12 月产生电平偏移警告?

同样,这里的想法是尝试看看数据的预处理是否真的可以改善正确的异常值识别。我认为像这样的并行测试可能会有所帮助。IrishStats(或其他任何人)愿意接受挑战吗?:-)

问题/机会是识别潜在的 ARIMA 或季节性虚拟模型并根据需要进行扩充。与季节性 ARIMA 结构相比,这个特定系列证明了字符串/占主导地位的确定性季节性假人。然后,我们确定了两个异常值,它们是脉冲、季节性脉冲、电平变化和/或本地时间趋势,以及生成“噪声”所需的自回归结构。在第 50 期(2009 年/2 月)和第 24 期(2006 年/12 月)或前后确定了两个级别转换。数据建议以下模型在此处输入图像描述在此处输入图像描述此处列出了异常值,即 PULSES 。一个非常有启发性的图形是经过清洗的与此处显示的实际图形在此处输入图像描述最后,拟合/实际/预测图是一个很好(但很忙)的总结在此处输入图像描述预测图是在此处输入图像描述. 最终的模型统计数据显示在最后三张图像 和 在此处输入图像描述在此处输入图像描述在此处输入图像描述中。模型的残差是合理随机在此处输入图像描述的,没有剩余的自在此处输入图像描述相关结构。希望这个小例子对大家有帮助!我是我在这里使用的软件的开发人员之一。还有其他商业上可用的产品可以提供类似的东西。