R에서 시계열 데이터 분해하는 방법
time series 데이터를 체계적 성분으로 분해하는 함수 중 하나가 stl() 이다.
stl(x, s.window, s.degree = 0,
t.window = NULL, t.degree = 1,
l.window = nextodd(period), l.degree = t.degree,
s.jump = ceiling(s.window/10),
t.jump = ceiling(t.window/10),
l.jump = ceiling(l.window/10),
robust = FALSE,
inner = if(robust) 1 else 2,
outer = if(robust) 15 else 0,
na.action = na.fail)
stl() 함수에 input으로 들어가는 데이터의 형태와, default값이 없는 s.window parameter에 대해 알아보겠다.
일반적으로 stl(x, s.window = "periodic")의 형태를 가장 많이 쓴다.
1. x
stl()은 시계열 자료를 계절성분, 추세성분, 불규칙성분으로 분해하는 함수로, ts 데이터를 input으로 받는다.
* ts()
vector 혹은 matrix type의 데이터를 시계열자료로 변형해주는 함수.
예)
> ex <- sample(1:100,100,replace = T)
> ts(ex, start=1, frequency = 4) # 데이터를 주기가 4인 시계열자료로 변환
Qtr1 Qtr2 Qtr3 Qtr4
1 15 88 10 25
2 27 36 92 61
3 22 92 13 9
4 55 86 95 34
> ts(ex, start=1995, frequency = 12) # 데이터를 1995년부터 월별 시계열자료로 변환
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1995 15 88 10 25 27 36 92 61 22 92 13 9
1996 55 86 95 34 1 11 31 73 17 73 70 34
1997 95 33 85 40 15 70 81 69 94 36 51 3
1998 62 73 56 39 17 75 66 21 30 70 62 86
1999 45 82 74 51 48 10 50 10 98 53 31 86
2000 64 67 8 31 29 9 23 91 74 41 37 70
2001 48 61 58 85 72 47 1 98 51 63 87 14
2002 5 96 54 88 75 33 8 56 2 7 17 2
2003 56 64 13 68
> ts(ex, start=1995, end = 2000, frequency = 12) # 실제 데이터보다 짧은 end 지정
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1995 15 88 10 25 27 36 92 61 22 92 13 9
1996 55 86 95 34 1 11 31 73 17 73 70 34
1997 95 33 85 40 15 70 81 69 94 36 51 3
1998 62 73 56 39 17 75 66 21 30 70 62 86
1999 45 82 74 51 48 10 50 10 98 53 31 86
2000 64
> ts(ex, start=1995, end = 2005, frequency = 12) # 실제 데이터보다 긴 end 지정시 처음 데이터부터 다시 반복
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1995 15 88 10 25 27 36 92 61 22 92 13 9
1996 55 86 95 34 1 11 31 73 17 73 70 34
1997 95 33 85 40 15 70 81 69 94 36 51 3
1998 62 73 56 39 17 75 66 21 30 70 62 86
1999 45 82 74 51 48 10 50 10 98 53 31 86
2000 64 67 8 31 29 9 23 91 74 41 37 70
2001 48 61 58 85 72 47 1 98 51 63 87 14
2002 5 96 54 88 75 33 8 56 2 7 17 2
2003 56 64 13 68 15 88 10 25 27 36 92 61
2004 22 92 13 9 55 86 95 34 1 11 31 73
2005 17
단, ts 데이터의 주기가 최소 2바퀴 초과 되어야 한다.
10개뿐인 데이터를 주기가 5인 ts 데이터로 변환하면 딱 두 바퀴. -> error
> ex <- sample(1:100,10,replace = T)
> stl(ts(ex, start=1995, frequency = 5), s.window = "periodic")
Error in stl(ts(ex, start = 1995, frequency = 5), s.window = "periodic") :
series is not periodic or has less than two periods
2. s.window
time series 데이터에서 seasonal component를 추출하기위한 parameter로, "periodic" 혹은 7이상의 숫자를 입력해준다.
이 때, 계절의 패턴이 시간에 따라 일정하다고 판단되면 "periodic" 혹은 큰 수를, 계절의 패턴이 시간의 흐름에 따라 진화한다고 판단되면 최근 데이터만 사용하도록 작은 수를 입력한다.
예) AirPassengers 데이터
> plot(stl(AirPassengers, s.window = 100))
> plot(stl(AirPassengers, s.window = "periodic"))
> plot(stl(AirPassengers, s.window = 10))
'AI > 시계열자료 분석' 카테고리의 다른 글
Deep Learning for Time Series Forecasting (kaggle 코드 리뷰) (30) | 2021.05.27 |
---|---|
[Python] 날씨 시계열 데이터(Kaggle)로 ARIMA 적용하기 (16) | 2021.05.25 |
ARIMA란? :: ARIMA 분석기법, AR, MA, ACF, PACF, 정상성이란? (6) | 2021.05.24 |
시계열 분해란?(Time Series Decomposition) :: 시계열 분석이란? 시계열 데이터란? 추세(Trend), 순환(Cycle), 계절성(Seasonal), 불규칙 요소(Random, Residual) (0) | 2021.05.24 |
[시계열 자료 분석] R에서 AirPassengers 데이터 선형계절추세모형 적합시키기 (0) | 2019.10.31 |