r 분석 알려진 대규모 주문을 다루는 시계열 예측



시계열 분석 기초 (3)

이미 다른 Arima 모델을 시도했지만 WaltS에서 언급했듯이 시리즈에 큰 이상 치를 포함하지는 않지만 계절 구성 요소는 forecast 패키지의 auto.arima() 에 의해 잘 포착됩니다.

myTs <- ts(as.numeric(data[,2]), start=c(2008, 1), frequency=4) 
myArima <- auto.arima(myTs, lambda=0)
myForecast <- forecast(myArima)
plot(myForecast)

여기서 auto.arima() 대한 lambda=0 인수는 계절 구성 요소의 증가하는 진폭을 boxcox 하기 위해 boxcox 에 의한 데이터 변형 (또는 로그를 취할 수 있음 auto.arima() 강제합니다.

알려진 이상치 (큰 주문)가있는 많은 데이터 세트가 있습니다.

data <- matrix(c("08Q1","08Q2","08Q3","08Q4","09Q1","09Q2","09Q3","09Q4","10Q1","10Q2","10Q3","10Q4","11Q1","11Q2","11Q3","11Q4","12Q1","12Q2","12Q3","12Q4","13Q1","13Q2","13Q3","13Q4","14Q1","14Q2","14Q3","14Q4","15Q1", 155782698, 159463653.4, 172741125.6, 204547180, 126049319.8, 138648461.5, 135678842.1, 242568446.1, 177019289.3, 200397120.6, 182516217.1, 306143365.6, 222890269.2, 239062450.2, 229124263.2, 370575384.7, 257757410.5, 256125841.6, 231879306.6, 419580274, 268211059, 276378232.1, 261739468.7, 429127062.8, 254776725.6, 329429882.8, 264012891.6, 496745973.9, 284484362.55),ncol=2,byrow=FALSE)

이 특정 계열의 상위 11 개 이상 항목은 다음과 같습니다.

outliers <- matrix(c("14Q4","14Q2","12Q1","13Q1","14Q2","11Q1","11Q4","14Q2","13Q4","14Q4","13Q1",20193525.68, 18319234.7, 12896323.62, 12718744.01, 12353002.09, 11936190.13, 11356476.28, 11351192.31, 10101527.85, 9723641.25, 9643214.018),ncol=2,byrow=FALSE)

이러한 outliers를 고려하여 시계열을 예측할 수있는 방법은 무엇입니까?

나는 다음으로 가장 큰 outlier를 교체하려고 시도했다. 그래서 10 번째 데이터 세트가 모든 outlier를 대체 할 때까지 다음으로 가장 큰 outlier를 10 번 교체한다. 나는 또한 단순히 이상 치를 제거하려고 노력했다. (다시 10 번 데이터 세트를 10 번 모두 제거 할 때까지 매번 특이 치를 제거하면서 10 번 데이터 세트를 다시 실행했다.)

이 주문을 제거한다고해서 해당 분기에 발생하는 다른 거래가 있기 때문에 데이터 포인트가 완전히 삭제되지는 않습니다.

내 코드는 여러 예측 모델을 통해 데이터를 테스트합니다 (ARIMA는 샘플에 가중치를, ARIMA는 샘플에 가중치, ARIMA 가중치, ARIMA, Additive Holt-Winters 가중치 및 Multiplcative Holt-Winters 가중치를 가짐). 이러한 여러 모델에 적용됩니다.

여기에 내가 사용하는 몇 가지 더 많은 데이터 세트가 있는데, 나는이 시리즈에 대한 특이점을 아직 가지고 있지 않다.

data <- matrix(c("08Q1","08Q2","08Q3","08Q4","09Q1","09Q2","09Q3","09Q4","10Q1","10Q2","10Q3","10Q4","11Q1","11Q2","11Q3","11Q4","12Q1","12Q2","12Q3","12Q4","13Q1","13Q2","13Q3","13Q4","14Q1","14Q2","14Q3", 26393.99306, 13820.5037, 23115.82432,    25894.41036,    14926.12574,    15855.8857, 21565.19002,    49373.89675,    27629.10141,    43248.9778, 34231.73851,    83379.26027,    54883.33752,    62863.47728,    47215.92508,    107819.9903,    53239.10602,    71853.5,    59912.7624, 168416.2995,    64565.6211, 94698.38748,    80229.9716, 169205.0023,    70485.55409,    133196.032, 78106.02227), ncol=2,byrow=FALSE)

data <- matrix(c("08Q1","08Q2","08Q3","08Q4","09Q1","09Q2","09Q3","09Q4","10Q1","10Q2","10Q3","10Q4","11Q1","11Q2","11Q3","11Q4","12Q1","12Q2","12Q3","12Q4","13Q1","13Q2","13Q3","13Q4","14Q1","14Q2","14Q3",3311.5124,    3459.15634, 2721.486863,    3286.51708, 3087.234059,    2873.810071,    2803.969394,    4336.4792,  4722.894582,    4382.349583,    3668.105825,    4410.45429, 4249.507839,    3861.148928,    3842.57616, 5223.671347,    5969.066896,    4814.551389,    3907.677816,    4944.283864,    4750.734617,    4440.221993,    3580.866991,    3942.253996,    3409.597269,    3615.729974,    3174.395507),ncol=2,byrow=FALSE)

이것이 너무 복잡한 경우 특정 명령을 사용하여 outliers가 감지되면 R에서 어떻게 데이터가 예측되는지 처리되는 방법에 대한 설명이 제공됩니다. 예를 들어 스무딩 (smoothing) 등. 그리고 코드 자체 작성에 접근 할 수있는 방법 (이상 치를 감지하는 명령을 사용하지 않음)


Answer #1

당신의 특이 치는 4 분기에 나타나는 가장 큰 주문과 함께 계절적 변화로 보입니다. 언급 한 많은 예측 모델에는 계절 조정 기능이 포함됩니다. 예를 들어, 가장 단순한 모델은 모든 계절에 대한 보정이있는 연도에 대해 선형 의존성을 가질 수 있습니다. 코드는 다음과 같습니다.

df <- data.frame(period= c("08Q1","08Q2","08Q3","08Q4","09Q1","09Q2","09Q3","09Q4","10Q1","10Q2","10Q3",
                       "10Q4","11Q1","11Q2","11Q3","11Q4","12Q1","12Q2","12Q3","12Q4","13Q1","13Q2",
                       "13Q3","13Q4","14Q1","14Q2","14Q3","14Q4","15Q1"),
                 order= c(155782698, 159463653.4, 172741125.6, 204547180, 126049319.8, 138648461.5,
                        135678842.1, 242568446.1, 177019289.3, 200397120.6, 182516217.1, 306143365.6,
                        222890269.2, 239062450.2, 229124263.2, 370575384.7, 257757410.5, 256125841.6,
                        231879306.6, 419580274, 268211059, 276378232.1, 261739468.7, 429127062.8, 254776725.6,
                        329429882.8, 264012891.6, 496745973.9, 42748656.73))

seasonal <- data.frame(year=as.numeric(substr(df$period, 1,2)), qtr=substr(df$period, 3,4), data=df$order)
ord_model <- lm(data ~ year + qtr, data=seasonal)
seasonal <- cbind(seasonal, fitted=ord_model$fitted)
library(reshape2)
library(ggplot2)
plot_fit <- melt(seasonal,id.vars=c("year", "qtr"), variable.name = "Source", value.name="Order" )
ggplot(plot_fit, aes(x=year, y = Order, colour = qtr, shape=Source)) + geom_point(size=3)

결과는 아래 차트와 같습니다 :

계절 조정이 있지만 1 년에 비선형 의존성을 갖는 모델은 더 잘 맞는 경우가 있습니다.


Answer #2


특이점 데이터를 정리하는 데 사용하려는 접근 방식은 특이점을 식별 할만큼 강력하지는 않습니다. 나는 tsoutliers라고 불리는 R에 무료 outlier 패키지가 있다고 덧붙여 야하지만, 나는 당신에게 보여줄 일을하지 않을 것이다 ....

흥미로운 시간 시리즈가 있습니다. 추세는 조금씩 약화되는 상승 추세와 함께 시간에 따라 변합니다. 첫 번째 시작점이 1이고 두 번째 시간 트렌드 변수를 가져오고 14 번째 시점에서 시작하면 앞으로이 변경 사항을 캡처합니다. 계절성에 관해서는 더미 변수를 사용하여 높은 4 분기를 포착 할 수 있습니다. 다른 3/4은 평균치와 다르지 않고 AR12, 계절별 차이 또는 3 계절성 인형이 필요하지 않으므로 모델은 파기됩니다. 또한 두 개의 더미 변수를 사용하여 아웃 라이어 인 마지막 두 관측치의 영향을 포착 할 수 있습니다. trend라는 단어 위에있는 49는 모델링되는 시리즈의 이름 일 뿐이므로 무시하십시오.