나만의 시계열 분석법 in r
1. 데이터 불러오기 + 정상성 여부 + 추세/계절성 여부
data <- scan("c:/data")
data <- ts(data, start = c(2010, 1), frequency = 12)
plot.ts(data, type="b")
autoplot(decompose(data))
2. 데이터 변환, 차분
data1 <- diff(log(data), lag =1 or 12) or diff(data, difference=1)
data2 <- diff(data1, lag =1)
tseries :: adf.test(data2, alternative = "stationary", k=0)
plot(data1)
3. 모델 선택
acf(data1, lag.max=20)
pacf(data1, lag.max=20)
acf2(data1, lag.max=20)
4. 모형 n개 제작
4-1. 2, 3번을 통해 모형 3개 제작
model 1,2,3 <- arima(log(data), order = c(k,k,k))
- 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)
5-2. 진단
tsdiag(auto.arima(data))
6. 예측
6-1. 미래 예측 그래프
f_model <- forecast(model, h=12*2)
plot(f_model)
6-2. 3개 모형 예측(train로 test예측값을 만들고 test와 비교) + 최종 모델 1개 선택
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.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))
- #AR(3)=>ARIMA(3,1,0), MA(1)=>ARIMA(0,1,1), ARMA(3,1)=>ARIMA(3,1,1)
acf(train.diff, lag.max=20); Fit1<- Arima(train, order = c(0,1,2))
pacf(train.diff, lag.max=20); Fit2<- Arima(train, order = c(3,1,0))
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)
오오 성실한 업데이트 응원합니다👏