Time Series Data Analysis in r

9566·2021년 5월 29일
1

데이터 분석

목록 보기
3/10

나만의 시계열 분석법 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가 가장 작은 모델 선택

profile
안녕하세요 안녕안녕하세요 안녕하세요오오오~~

2개의 댓글

comment-user-thumbnail
2021년 6월 1일

오오 성실한 업데이트 응원합니다👏

1개의 답글