시계열분석의 애디티브 아웃라이어

시계열분석의 애디티브 아웃라이어

빌드업

1.png

위의 그래프에서 가장 먼저 눈에 띄는 지점은 바로 2015년 2월 근처에 있는 엄청난 아웃라이어다. 이렇듯 극심하게 다른 값을 가지면 분석에 악영향이 있을 수밖에 없다. 다행스러운 건 아주 잠깐, 말 그대로 한 순간의 아웃라이어로 그쳤다는 것이다.

정의 1

이렇듯 데이터의 등락 자체를 바꾸지는 않는 아웃라이어를 애디티브 아웃라이어Additive Outlier라고 부른다.

실습

이러한 애디티브 아웃라이어는 직관적으로 찾아도 좋고, TSA 패키지의 detectAO() 함수를 사용해도 좋다. 사용하는 방법은 다음과 같다:

  1. 원래의 데이터로 애디티브 아웃라이어가 고려되지 않은 시계열분석을 한다.
  2. 리턴된 모형자체를 detectAO() 함수에 넣는다. 그러면 다음과 같은 결과를 얻는다. 20190825\_194758.png
  3. 람다의 절댓값이 가장 큰 인덱스를 최우선적인 후보로 둔다. 위의 스크린샷에선 55번째다.
  4. 애디티브 아웃라이어를 반영해서 다시 분석한다. 마음에 드는 결과가 나올 때까지 반복한다.

애디티브 아웃라이어를 반영한 분석은 동적 회귀 모형을 필요로 한다. 아이디어는 간단하다. 69번째 데이터가 AO라고 생각한다면, 69번째 값만 1이고 나머지는 모두 0인 더미데이터를 만들어서 회귀분석을 하는 것이다. 수식적으로는 순수한 펄스 함수에 해당하며, 코드 역시 별로 어렵지 않다.

12.png

실제로 AO가 반영되고나면 AO 그 지점은 물론, 다른 곳에서의 피팅도 더욱 개선되는 것을 알 수 있다.

코드

다음은 R로 작성된 예제코드다. 적절한 예시가 없어서 데이터를 첨부했는데, 코드에 링크를 그대로 걸어두었으니 귀찮게 직접 다운 받을 필요는 없을 것이다.

library(TSA)
library(forecast)
PM10<-read.csv("https://freshrimpsushi.github.io/posts/additive-outlier/example.csv")
PM10 = ts(PM10[1:365,],start=2015,frequency = 365)
win.graph(6,4); plot(PM10,main="한국의 미세먼지 농도",xaxt='n'); axis(side=1,at=c(2015,2016))
out1<-auto.arima(PM10)
detectAO(out1)
ao=rep(0,365); ao[54]<-1
out2<-auto.arima(PM10,xreg=ao)
win.graph(6,4); par(mfrow=c(1,2))
plot(PM10,main="AO 미반영",xlim=c(2015.1,2015.3),xaxt='n'); lines(fitted(out1),col='red')
plot(PM10,main="AO 반영",xlim=c(2015.1,2015.3),xaxt='n'); lines(fitted(out2),col='red')

  1. Cryer. (2008). Time Series Analysis: With Applications in R(2nd Edition): p257. ↩︎

댓글