为R中的多个组将时间序列分解为趋势,季节性和随机数,用于月度数据

时间:2018-06-10 19:42:32

标签: r time-series

这是我第一次开始制作时间序列,因此请原谅我的方法有任何不妥之处。

我有多个群组的月度销售数据。数据是3年,我想实现相同的时间序列分析。我不确定3年的数据是否真的足够好,但是我想更好地理解它。

我目前了解时间序列被分解为趋势,季节性和随机三个部分。

我想将每个组的销售数据拆分为趋势,季节性和随机部分。由于趋势和季节性消失,因此我想只使用随机来更好地理解销售指标。

由于数据是每月,因此我需要使用乘法。 我应该使用STL还是分解?

我有基本的分解代码,但不确定如何将多个组合用于多个组,以识别每个组的趋势,季节性和随机性。

我不是指ARIMA模型。我基本上是指标准的时间序列方法。

以下是我的数据的样子。

Group   Date    Month   Sales
Group1  Jan-15  1   75030
Group1  Feb-15  2   16073
Group1  Mar-15  3   17161
Group1  Apr-15  4   94946
Group1  May-15  5   62999
Group1  Jun-15  6   4698
Group1  Jul-15  7   76743
Group1  Aug-15  8   28800
Group1  Sep-15  9   12225
Group1  Oct-15  10  71793
Group1  Nov-15  11  26686
Group1  Dec-15  12  6252
Group1  Jan-16  13  82698
Group1  Feb-16  14  71201
Group1  Mar-16  15  65798
Group1  Apr-16  16  4407
Group1  May-16  17  7491
Group1  Jun-16  18  24366
Group1  Jul-16  19  99616
Group1  Aug-16  20  74443
Group1  Sep-16  21  54122
Group1  Oct-16  22  20762
Group1  Nov-16  23  91376
Group1  Dec-16  24  18693
Group1  Jan-17  25  30395
Group1  Feb-17  26  82049
Group1  Mar-17  27  79701
Group1  Apr-17  28  38862
Group1  May-17  29  84802
Group1  Jun-17  30  81715
Group1  Jul-17  31  60786
Group1  Aug-17  32  88731
Group1  Sep-17  33  28502
Group1  Oct-17  34  79245
Group1  Nov-17  35  15553
Group1  Dec-17  36  3237
Group2  Jan-15  1   8990
Group2  Feb-15  2   47516
Group2  Mar-15  3   15076
Group2  Apr-15  4   60888
Group2  May-15  5   47111
Group2  Jun-15  6   7770
Group2  Jul-15  7   25080
Group2  Aug-15  8   46586
Group2  Sep-15  9   12595
Group2  Oct-15  10  71883
Group2  Nov-15  11  21634
Group2  Dec-15  12  78799
Group2  Jan-16  13  57596
Group2  Feb-16  14  35685
Group2  Mar-16  15  68518
Group2  Apr-16  16  35661
Group2  May-16  17  65294
Group2  Jun-16  18  62602
Group2  Jul-16  19  13506
Group2  Aug-16  20  49215
Group2  Sep-16  21  32008
Group2  Oct-16  22  27924
Group2  Nov-16  23  56146
Group2  Dec-16  24  23975
Group2  Jan-17  25  18686
Group2  Feb-17  26  77076
Group2  Mar-17  27  63992
Group2  Apr-17  28  38087
Group2  May-17  29  19846
Group2  Jun-17  30  46823
Group2  Jul-17  31  11035
Group2  Aug-17  32  73686
Group2  Sep-17  33  35523
Group2  Oct-17  34  97417
Group2  Nov-17  35  27954
Group2  Dec-17  36  79004

以下是我的代码。

x <- ts(df, start = c(2015, 1), end = c(2017, 12), frequency = 12)
m <- decompose(x)

如果我的方法有问题,请纠正我,因为我不熟悉时间序列建模。

谢谢,

1 个答案:

答案 0 :(得分:0)

第一列是factor,因此您可以使用tapply函数按组提取时间序列。结果将存储在list中。您可以将lapply与agruments list的时间序列和函数decompose结合使用。

要访问分解结果,您可以将list编入索引,例如dcs[[1]]将为第1组提取分解。

df <- structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L), .Label = c("Group1", "Group2"), class = "factor"), Date = structure(c(13L, 
10L, 22L, 1L, 25L, 19L, 16L, 4L, 34L, 31L, 28L, 7L, 14L, 11L, 
23L, 2L, 26L, 20L, 17L, 5L, 35L, 32L, 29L, 8L, 15L, 12L, 24L, 
3L, 27L, 21L, 18L, 6L, 36L, 33L, 30L, 9L, 13L, 10L, 22L, 1L, 
25L, 19L, 16L, 4L, 34L, 31L, 28L, 7L, 14L, 11L, 23L, 2L, 26L, 
20L, 17L, 5L, 35L, 32L, 29L, 8L, 15L, 12L, 24L, 3L, 27L, 21L, 
18L, 6L, 36L, 33L, 30L, 9L), .Label = c("Apr-15", "Apr-16", "Apr-17", 
"Aug-15", "Aug-16", "Aug-17", "Dec-15", "Dec-16", "Dec-17", "Feb-15", 
"Feb-16", "Feb-17", "Jan-15", "Jan-16", "Jan-17", "Jul-15", "Jul-16", 
"Jul-17", "Jun-15", "Jun-16", "Jun-17", "Mar-15", "Mar-16", "Mar-17", 
"May-15", "May-16", "May-17", "Nov-15", "Nov-16", "Nov-17", "Oct-15", 
"Oct-16", "Oct-17", "Sep-15", "Sep-16", "Sep-17"), class = "factor"), 
    Month = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 
    13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 
    25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
    15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 
    27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L), Sales = c(75030L, 
    16073L, 17161L, 94946L, 62999L, 4698L, 76743L, 28800L, 12225L, 
    71793L, 26686L, 6252L, 82698L, 71201L, 65798L, 4407L, 7491L, 
    24366L, 99616L, 74443L, 54122L, 20762L, 91376L, 18693L, 30395L, 
    82049L, 79701L, 38862L, 84802L, 81715L, 60786L, 88731L, 28502L, 
    79245L, 15553L, 3237L, 8990L, 47516L, 15076L, 60888L, 47111L, 
    7770L, 25080L, 46586L, 12595L, 71883L, 21634L, 78799L, 57596L, 
    35685L, 68518L, 35661L, 65294L, 62602L, 13506L, 49215L, 32008L, 
    27924L, 56146L, 23975L, 18686L, 77076L, 63992L, 38087L, 19846L, 
    46823L, 11035L, 73686L, 35523L, 97417L, 27954L, 79004L)), class = "data.frame", row.names = c(NA, 
-72L))
tss <- tapply(df$Sales, df$Group, ts, start = c(2015, 1), frequency = 12)
dcs <- lapply(tss, decompose)