방문자수 데이터 분석을 하는데 RNN, LSTM도 중요하지만 ARIMA도 한 번 내가 가진 데이터에 적용해볼 수 있지 않을까하여 ARIMA를 더 공부해보기로 했다.
가보자고!
전반적인 출처는
https://assaeunji.github.io/statistics/2021-08-23-arima/
입니다...
ARIMA
Autoregressive Integreted Moving Average, AR(Autoregression) 모형 + MA(Moving Average) 모형
시계열을 예측하는 대표적 방법이다.
지수평활(Exponential smoothing)과 ARIMA는 시계열을 예측할 때 가장 널리 사용하는 두 가지 방법인데,
ARIMA 모델은 데이터에 나타나는 자기상관(autocorrelation)을 표현하는 것이 목적이다.
※ 지수평활: 최근 자료에 더 큰 가중값을 주고 과거로 갈 수록 가중값을 지속적으로 감소시킴으로써 미래를 예측
시스템이 변화한 최근 시점에 큰 가중치를 두는 것임(여러 event가 발생하여 최근 바뀐 추세를 반영하는 개념)
추세와 계절성(seasonality)에 대한 설명에 기초
출처: https://datalabbit.tistory.com/75
ARIMA 모형은 시계열 데이터의 정상성(Stationary)를 가정하고 있다.
정상성이란?
평균, 분산이 시간에 따라 일정한 성질
시계열 데이터의 특성이 시간의 흐름에 따라 변하지 않음을 의미함
ex) 추세, 계절성 시계열은 정상 시계열이 아님
정상성을 나타내지 않는 데이터는 정상성을 갖도록 로그변환, 차분 등 전처리 후 분석을 시행함
차분(differencing)이란?
연이은 관측값들의 차이를 계산한 것, 수열에서 연속하는 두 항의 차
차분은 시계열의 수준에서 나타내는 변화를 제거하여 시계열의 평균 변화를 일정하게 만드는 것을 돕는다.
정상 시계열로의 변환
방법
1) 변동폭이 일정하지 않은 경우 → 로그 변환
2) 추세, 계절성이 존재하는 경우 → 차분(differencing)
AR 모형이란? Auto Correlation
자기상관성을 시계열 모형으로 구성, 예측하고자 하는 특정 변수의 과거 관측값이 선형결합으로 미래값을 예측함
이전 자신의 관측값이 이후 자신의 관측값에 영향
yt가 그 직전 시점인 yt-1에만 의존하는, 즉 차수가 1인 AR(1) 모형
- ϕ1
- c
- ϵt : 백색잡음(white noise, 자기상관이 없는 시계열)
※ 백색잡음: 평균이 0이며 분산(σ^2)은 일정하고 서로 다른 시점에서의 공분산도 0인 시계열, 정상성을 띔
일반적으로 정규분포에서 도출된 Random Noise.
이 세 개에 따라 다양한 이름으로 불린다.
자신의 최신 과거에 기반한 변동 루틴을 파악하기에 적합한 방식이다.
1. 백색 잡음(White Noise Model)
yt = ϵt
과거의 값과 현재의 값이 상관관계가 없는, 단순한 Shock 상태
과거 값으로 현재를 예측할 수 없다.
c = ϕ1 = 0
2. 확률 보행(Random Walk Model)
현재의 값을 예측할 수 있는 가장 좋은 값은 어제의 값
ϕ1=1ϕ1=1, c=0c=0이면
이 모형은 정상성을 띠지 않는다. 오늘 시계열 값(yt)가 어제의 시계열값(yt-1)+예측할 수 없는 변화량(ϵt)로 설명된다.
(시간이 지남에 따라 분산이 커지기 때문에 정상성을 띠지 않는다)
3. 표류가 있는 확률 보행(Random Walk Model with a Drift)
시간이 지남에 따라 평균적으로 값이 증가하거나 감소하는 형태
여기서 ϕ1=1, c≠0일 때 상수c를 표류(drift)라고 한다.
위 식을 다르게 표현하면
이렇게 생김
이 모형은 확정적인 추세를 가지고 있고, c>0인 경우 평균적으로 증가하는 모습
4. -1 < ϕ1 < 1인 정상성을 만족하는 모형
MA 모형이란? Moving Average
예측 오차를 이용하여 미래를 예측하는 모형
과거의 충격(Shock)이 현재의 값에 영향을 줄 때 쓸 수 있는 모형이다.
※ Shock? 이동평균 모델은 과거의 시계열을 이용하는 대신 과거의 오차를 이용해 회귀식을 세움
'이동'(평균 µ를 기준으로 해당 시계열이 왔다갔다 이동함) + '평균'(왔다갔다 움직이는 정도를 백색잡음의 현재값과 과거값의 가중 합)
트렌드(평균 혹은 시계열 그래프에서의 y값)가 변화하는 상황에서 적합한 회귀모델이며
MA는 정의 상 평균과 분산이 일정하므로 정상성을 만족한다.
즉, AR모델이 정상성을 띠기 위해 −1 < ϕ1 < 1 조건이 필요했는데, 정의상 MA모델은 어떠한 모수에 제약이 없어도 정상성을 띤다.
차수가 1인 MA(1) 모형
(AR모형과 다른 점은 세타로 바뀐 것)
다시, ARIMA
Autoregressive Integreted Moving Average,
AR(Autoregression) 모형 + MA(Moving Average) 모형
주식처럼 충격(Shock)에도 민감하고, 과거 값에도 영향을 받을 때 쓰는 모형
ARIMA(p, d, q) 모델은 AR 모형 + MA 모형도 있는데 + 차분까지 된 모형이다.
- p: AR부분의 차수
- d: 차분의 정도
- q: MA부분의 차수
ARIMA(0,1,0): 확률보행 *상수가 있는 경우: 표류를 포함하는 확률보행 |
※ ARMA(p,q)은 차분만 안했을 뿐 AR과 MA과정이 합쳐진 모양임
더 필요한 개념이 생기면 하단에 추가를 하겠다..
facebook의 prophet은 다른 글로 공부를 해보겠다.. 지금은 데이터 적용이 더 시급함
ARIMA 해보기
그러나 결과는 처참한..
* 참고
https://byeongkijeong.github.io/ARIMA-with-Python/
0) 데이터셋
활용 데이터: Kaggle - Recruit Restaurant Visitor Forecasting
https://www.kaggle.com/competitions/recruit-restaurant-visitor-forecasting/code
기존 전처리 데이터 중 데이터가 가장 많은 가게를 찾아서 분석 (id = air_8093d0b565e9dbdf)
air | AirREGI 포스기능을 수행하는 스마트 앱 |
|
hpg | Hot Pepper Gourmet 레스토랑 찾기, 예약 웹사이트 |
|
데이터셋 | air_visit_data.csv | air restaurants의 과거 방문 data |
데이터셋air_reserve.csv / hpg_reserve.csv | air & hpg 레스토랑 예약 시스템 | |
데이터셋air_store_info.csv / hpg_store_info.csv | air & hpg 레스토랑 세부 정보 | |
데이터셋store_id_relation.csv | air & hpg id | |
데이터셋date_info.csv | 일본 공휴일 정보 | |
데이터셋sample_submission.csv | test set으로 사용. ‘id’는 air id와 방문 날짜를 결합하여 생성 |
* 전처리 및 EDA는 여기서 확인하세요 :)
https://heesleisure.tistory.com/34
1) Time-series
> visitors 및 기온 수가 부족한 부분을 자르고 데이터가 연속적으로 존재하는 구간만 사용: 2016.10.27 ~ 2017.04.22 사용
visit_date를 index로 갖고 visitors를 값으로 갖는 st_tokyo_visitors 데이터프레임을 구성하여 시계열 분석으로 사용할 것이다.
2) 시계열 성분 분해: Seasonal_decompose()
#seasonal_decompose()
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(x=st_tokyo_visitors['visitors'], model='additive',period=7)
fig=plt.figure()
fig=result.plot()
fig.set_size_inches(20,15)
맨 위는 raw data이며 각각 trend, seasonal, resid로 그린 그래프이다.
Resid 그래프가 아주 엉망이다 ...
트렌드나 계절성이 있는지는 모르겠다.
3-1) 차분의 필요성 확인 (ADF 검정)
이 과정이 필요한데 안했네 :) 확인도 안하고 ARIMA 실시한게 레전드...
실시하는 코드는 이러하다. 다른 데이터의 시계열분석을 하고 있어서 코드는 있음
결과는 이러한데, p-value를 보고 차분을 할지 말지 결정하면 된다.
p-value가 0.05 이상일경우, 차분을 하고 ACF, PACF 그래프를 그려서 추세와 시즈널리티, 잔차를 확인하며 다시 검정을 실시한다.
위 과정을 p-value < 0.05 를 만족할 때까지 반복하면 된다.
3-2) ACE, PACF plot
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(st_tokyo_visitors, lags=50)
plot_pacf(st_tokyo_visitors, lags=50)
plt.show()
이 그래프를 통해 '현재 값이 과거 값과 어떤 relation이 있는가?'를 파악할 수 있다.
- ACF: 현재값과 p개 이전 값 간의 correlation, 간접영향(indirect)까지 모두 고려. 변화가 거의 없다면 주기성 X
- PACF: S(t-p)가 S(t)에 주는 direct 영향만 고려
위의 그래프는 차분을 실시하지 않아서 보고 모델을 구성하기에는 적합하지 않다...
그래도 설명을 이어가보자면,
ACF가 작아지고 있을 때 PACF를 보고 AR(p), PACF가 작아지고 있을 때 ACF를 보고 MA(q) 모델을 판단한다.
둘 다 작아질 경우 ARMA를 쓰면 된다.
이때 차분에 따라 ARIMA(p, d, q)가 결정된다. d는 차분 횟수이다.
위 그래프는 현재 산학프로젝트에서 분석중인 데이터셋의 시계열 분해 및 ACF, PACF이다.
① ACF 그래프가 작아지고 있으니 PACF 그래프를 보고 AR모형을 적용한다.
② 첫 값으로부터(x=0 지점) 1개가 지난 값(X=3)부터 그래프가 무너지고 파란 박스에 들어가게 된다.
그래프가 첫값(0에 위치한 첫번째 실핀)이후로 몇 번째 이후에 모양이 끊기는지, 혹은 파란 박스 안에 들어가 0에 가까워지는지 살펴보자.
4) AIRMA 모형 구축
from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(st_tokyo_visitors, order=(1,0,0))
model_fit = model.fit()
print(model_fit.summary())
각각 상수(constant)와 AR 부분의 p value가 0.05보다 낮아 유효하다고 판단하고 모델을 적용했는데...
5) Forecast 결과
from pandas import datetime
#predict
start_index=datetime(2017,3,31)
end_index=datetime(2017,4,22)
forecast=model_fit.predict(start=start_index, end=end_index, type='levels')
#visualization
plt.figure(figsize=(22,8))
plt.plot(test_tokyo_visitors.visit_date, test_tokyo_visitors.visitors, label='original')
plt.plot(forecast, label="predicted")
plt.title("Time Series Forecast")
plt.xlabel("Date")
plt.ylabel("Visitors")
plt.legend()
plt.show()
하하.. 차분을 제대로 안했으니 당연히 박살나지
나중에 다시 해봐야지
얘는 산학프로젝트 그래프
위에거보단 나은데 그닥 ...
애초에 다변량 예측을 해야되기 때문에 :)
다변량 예측은 다중회귀처럼 여러 변인(variables)로 y를 예측하는데, 일변량보다 예측의 정확도가 높을 수 있다.
이 다변량 시계열 모형을 때로는 '전달함수모형'이라고 부르기도 한다.
만약 추가된 변수가 더미변수일 경우, 간섭 모형(intervention model)이라 하며, 다변량시계열 모형의 특수한 형태로 간주한다.
(엄밀히 말하면 다변량은 종속변수의 특성을 이야기하는데, 여러 변수의 측정값이 있는 상황에서 시계열 분석을 적용하는 점에서 다변량 시계열이라 부르는 것 같다.)
이건 다변량 시계열 예측 관련 게시물이다.
https://codetorial.net/tensorflow/time_series_forecasting/forecast_a_multivariate_time_series.html
(2023.5.11 수정)
'Data Science > ML' 카테고리의 다른 글
Ensemble(앙상블): Bagging과 Boosting, Stacking (1) | 2024.07.06 |
---|---|
ML 1. 회귀분석 (0) | 2023.02.25 |
ML 0. 통계분석 | 통계적 추론과 통계적 검정 (0) | 2022.11.16 |
ML 0. 통계분석 (0) | 2022.10.22 |
ML 2. Logistic Regression(로지스틱 회귀모형) (0) | 2022.07.23 |