나만의 시계열 분석법 in r
1. 데이터 불러오기 + 정상성 여부 + 추세/계절성 여부
data <- scan("c:/data")
data <- ts(data, start = c(2010, 1), frequency = 12) # or ts(data)
plot.ts(data, type="b")
#시간에 따라 평균과 분산이 (증가하여/일정치 않아) 정상시계열이 아니다
autoplot(decompose(data))
# 추세와 계절성이 있다. => 계절성이 있으면 sarima모형, 없으면 arima모형
2. 데이터 변환, 차분
data1 <- diff(log(data), lag =1 or 12) or diff(data, difference=1)
# 로그변환(분산) + 차분(평균) or 1차 차분
data2 <- diff(data1, lag =1) #계절차분 후 1차차분
tseries :: adf.test(data2, alternative = "stationary", k=0)
#p-value<0.05이면 data2이 정상시계열
plot(data1)
#평균과 분산이 시간에 따라 의존하지 않음 + 정상성을 만족한다.
#만족하지 않으면 auto.arima(data1)으로 해결함
3. 모델 선택
acf(data1, lag.max=20)
#자기상관계수 그래프 => lag2 MA(1)모형, 선을 나온 것만(1)
pacf(data1, lag.max=20)
#편자기상관계수 그래프 => lag4 AR(3)모형 , 선을 나온 것만(3)
acf2(data1, lag.max=20)
# 자기상관계수 그래프 + 편자기상관계수 그래프
4. 모형 n개 제작
4-1. 2, 3번을 통해 모형 3개 제작
model 1,2,3 <- arima(log(data), order = c(k,k,k))
# aicc값이 작은걸 선택
- AR(3)=>ARIMA(3,1,0), MA(1)=>ARIMA(0,1,1), ARMA(3,1)=>ARIMA(3,1,1)
4-2. auto.arima(data)를 통해 모형 3개 제작(3번 그래프가 애매할 경우)
- sarima(data, 2,1,2, 1,1,1, 12) + aic, bic
model1 <- arima([data/log(data)], order = c(2,1,2),
seasonal = list(order = c(1,1,1), period = 12))
- model2, 3는 order, seasonal의 일부 요인만 변경해서 제작
5. 모형 계수확인 / 진단
5-1. 계수
coeftest(model1,2,3) #ma1, ma2, sar1의 Estimate Std.
5-2. 진단
tsdiag(auto.arima(data)) #3개의 그래프
6. 예측
6-1. 미래 예측 그래프
f_model <- forecast(model, h=12*2) #2년
plot(f_model)
6-2. 3개 모형 예측(train로 test예측값을 만들고 test와 비교) + 최종 모델 1개 선택
# train/test 데이터 분할
train <- subset([data/log(data)], end = length(data)-length(data)*0.2)
test <- subset([data/log(data)], start = length(data)-(length(data)*0.2-1))
# train 데이터의 정상성 확보
train.diff <- diff(log(train), lag =1 or 12) or diff(train, difference=1)
train.dff <- diff(train.diff, lag =1)
plot(train.diff) # 정상성을 만족한다.
6-2-1. 4-1을 반복
Fit 1,2,3 <- arima(log(train), order = c(k,k,k)) # aicc값이 작은걸 선택
- #AR(3)=>ARIMA(3,1,0), MA(1)=>ARIMA(0,1,1), ARMA(3,1)=>ARIMA(3,1,1)
# fit1는 ma()모델
acf(train.diff, lag.max=20); Fit1<- Arima(train, order = c(0,1,2))
# fit2는 ar()모델
pacf(train.diff, lag.max=20); Fit2<- Arima(train, order = c(3,1,0))
# fit3는 auto.arima()모델
Fit3<- auto.arima(train)
6-2-2. 4-2을 반복
Fit1 <- arima([train/log(trian)], order = c(2,1,2), seasonal = list(order = c(1,1,1), period = 12))
- Fit2, 3는 order, seasonal의 일부 요인만 변경해서 제작
7. 예측 그래프 그리기
Fit1 %>% forecast(h=(length(data)*0.2-1)) %>% autoplot() + autolayer(test)
Fit2 %>% forecast(h=(length(data)*0.2-1)) %>% autoplot() + autolayer(test)
Fit3 <- auto.arima(train) ; Fit3 %>% forecast(h=(length(data)*0.2-1)) %>% autoplot() + autolayer(test)
8. 예측값 비교
data.test1,2,3 <- Arima(test, model = Fit1,2,3)
accuracy(data.test1,2,3)
# RMSE, MAE, MAPE, MASE가 가장 작은 모델 선택