시계열분석
- 시간의 흐름에 따라 기록된 데이터를 바탕으로 미래의 변화에 대한 추세를 분석하는 방법
- 데이터의 추세, 시간 외에 어떤 외부요인이 데이터에 영향을 미쳤는지를 나누어 생각해야 함
- 따라서 시계열분해를 통해 시간요인과 외부요인으로 구분하여 분석할 수 있음
[시계열분해]
- 시계열 자료를 추세(Trend), 계절성(Seasonal), 잔차(Residual)로 분해하는 기법
- 시간요인: 추세, 계절성
- 외부요인: 잔차(불규칙요인)
- 분해과정
- 모형판단: 데이터를 보고 주기적반복과 계절성이 있는지에 따라 Additive모형과 Multiplicative모형 중 어떤 모형이 더 적합할지 판단
- Additive모형: 추세와 계절성이 별개로 존재할 경우
- Multiplicative모형: 추세에 따라 계절성이 있는 경우
- 모형판단: 데이터를 보고 주기적반복과 계절성이 있는지에 따라 Additive모형과 Multiplicative모형 중 어떤 모형이 더 적합할지 판단
- statsmodels.tsa.seasonal.seasonal_decompose(ts, model="")를 사용하여 시계열 분해
statsmodels.tsa.seasonal.seasonal_decompose - statsmodels 0.14.1
statsmodels.tsa.seasonal.seasonal_decompose statsmodels.tsa.seasonal.seasonal_decompose(x, model='additive', filt=None, period=None, two_sided=True, extrapolate_trend=0)[source] Seasonal decomposition using moving averages. Parameters: xarray_likeTime seri
www.statsmodels.org
예시) 임의 데이터로 시계열 분해 확인
- 데이터 시각화
- 추세와 계절성 둘다 있는것으로 확인됨
- 시계열 분해
- 추세와 계절성 모두 있는것으로 확인되니 분해시 model="multiplicative" 적용하여 분해
- 분해 결과 Trend와 Seasonal 모두 명확하게 있는것으로 나타나고 불규칙 요인은 거의 없는 것으로 나타난다.
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(data.set_index("day"), model="multiplicative") #datetime부분을 index로 놔야함
result.plot()
plt.show();
[정상성 변환]
- 정상성이란 평균과 분산이 시간에 따라 일정한 성질을 가지고 있음을 의미
- 즉, 추세나 계절성이 있다는 것은 정상시계열이 아님
- 비정상 시계열의 경우 정상 시계열로 변환해 주어야 함
- 대표적인 방법으로 로그변환과 차분이 있음
- 로그변환: 변동폭(분산)이 일정하지 않은경우
- 차분: 로그변환 후 추세, 계절성이 존재하는 경우
- Augmented Dickey-Fuller Test(statsmodels.tsa.stattools.adfuller(parameters)
statsmodels.tsa.stattools.adfuller - statsmodels 0.15.0 (+215)
statsmodels.tsa.stattools.adfuller(x, maxlag=None, regression='c', autolag='AIC', store=False, regresults=False)[source] Augmented Dickey-Fuller unit root test. The Augmented Dickey-Fuller test can be used to test for a unit root in a univariate process in
www.statsmodels.org
가설 | 내용 |
H0 | 데이터가 정상성을 갖지 않는다 |
H1 | 데이터가 정상성을 갖는다 |
예시) 위 데이터로 정상성 검정 및 변환
- 정상성 검정
- 정상성 검정 결과 p-value > .05 이므로 귀무가설을 채택(정상성을 갖지 않는다.)
- 데이터는 계절성과 추세 둘다를 보이고 있기 때문에 차분을 진행한다.
#정상성판단
data2 = data.set_index("day")
data2.head()
#데이터 분리
train = data2[:"2016-12-01"]
test = data2.drop(train.index)
#정상성 검정
from statsmodels.tsa.stattools import adfuller
adf = adfuller(train, regression="ct") #계절성을 가지고 있었기 때문에 regression="ct" or "ctt"
print(f"adfuller t: {adf[0]}\np-value: {adf[1]}") #adf[0]: t-val, adf[1]: p-val
'''
adfuller t: -1.9997199341327594
p-value: 0.601586330379429
'''
- 1차 차분 후 정상성 검정
- 다음달 값에서 전달값을 뺌(차분)
- 차분 후 시계열 분해를 통해 trend와 seasonal을 확인
- 차분 후 trend가 없어졌다.
- 차분 후 데이터 정상성 검정을 진행한 결과 p-value < .05 로 나타나 귀무가설을 기각한다.(정상성 만족)
#1차 차분(다음-전)
diff_train = train.diff(1)
diff_train = diff_train.dropna()
#1차 차분 시각화
plt.figure(figsize=(12, 5))
diff_train.plot()
plt.show();
#1차 차분 결과 시계열 분해
result2 = seasonal_decompose(diff_train, model="additive")
result2.plot()
plt.show();
#정상성 검정
diff_adf = adfuller(diff_train)
print(f"adf t-val: {diff_adf[0]}\np-val: {diff_adf[1]}")
'''
t-val: -12.094547576926397
p-val: 2.085160639961322e-22
'''
[ARIMA]
- 비정상 시계열 자료에 대해 분석하는 모형
- AR 모형과 MA모형을 결합하여 미래 시점의 데이터를 예측하는 모형
- AR(Auto Regressive)모형
- 자기회귀과정모형: 과거의 값이 현재의 값에 얼마나 영향을 미쳤는지 파악하는 것
- 과거가 현재에 영향을 미치지 않는다면 모형의 성능은 낮아짐
- 최적의 성능을 낼 수 있는 과거의 값(p)을 찾음 > AR(p)모형이라고 함
- ACF(Auto Correlation Function) 그래프를 통해 p값을 찾을 수 있음
- ACF: 자기상관 함수
- 과거 t시점 까지의 데이터와 현재시점의 상관성
- 비정상 시계열일 경우 느리게 0으로 가까워짐, 양수일 수도 있음
- 정상 시계열일 경우 빠르게 0에 수렴, 0으로 수렴할때 시차를 p로 설정
- MA(Moving Average)모형
- 과거 예측오차의 가중이동평균을 이용해 미래를 예측하는 모형
- 모형이 최적이 되게끔 하는 변수 값(q)를 찾음 > MA(q) 모형이라고 함
- PACF(Partial Auto Correlation Function) 그래프를 통해 q값을 찾을 수 있음
- PACF: 편자기상관 함수
- 과거 t시점과 현재 시점의 상관성
- 시차가 다른 두 시계열 데이터간의 상호 연관성을 나타냄
- 0에 수렴할때 시차를 q 값으로 설정
- AR(Auto Regressive)모형
- 시계열 자료 외에 다른 자료가 없을때, 변동 상태를 확인할 수 있음
- 어떤 시계열에도 적용 가능
- 파라미터로 (p, d, q)를 사용
- p: ACF
- d: 차분 횟수
- q: PACF
- (p, d, q) 산출
- p=2 > ACF그래프가 2 이후에 0으로 수렴
- d=1 > 정상성 만족하게 하기 위해 차분을 1회 실행함
- q=2 > PACF그래프가 2 이후에 0으로 수렴
#----------- ARIMA를 위해 p, d, q 산출
#p: acf
#d: 1(차분횟수)
#q: pacf
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
#p산출(정상성 만족된 데이터로 acf 그래프 그리기): 2
plot_acf(diff_train)
plt.show();
#q산출(정상성 만족된 데이터로 pacf 그래프 그리기): 2
plot_pacf(diff_train)
plt.show();
- from statsmodels.tsa.arima.model import ARIMA
statsmodels.tsa.arima.model.ARIMA - statsmodels 0.14.1
statsmodels.tsa.arima.model.ARIMA class statsmodels.tsa.arima.model.ARIMA(endog, exog=None, order=(0, 0, 0), seasonal_order=(0, 0, 0, 0), trend=None, enforce_stationarity=True, enforce_invertibility=True, concentrate_scale=False, trend_offset=1, dates=None
www.statsmodels.org
예시) ARIMA 적용
'Data Analysis > Statistics' 카테고리의 다른 글
Python_Statistics_Association (0) | 2024.03.13 |
---|---|
Python_Statistics_Cluster (0) | 2024.03.07 |
Python_Statistics_Regression (0) | 2024.03.01 |
Python_Statistics_Chi-square (0) | 2023.12.15 |
Python_Statistics_Anova(분산분석) (0) | 2023.12.11 |