본문 바로가기
Data Analysis/Statistics

Python_Statistics_TimeSeries

by mansoorrr 2024. 3. 14.

시계열분석

  • 시간의 흐름에 따라 기록된 데이터를 바탕으로 미래의 변화에 대한 추세를 분석하는 방법
  • 데이터의 추세, 시간 외에 어떤 외부요인이 데이터에 영향을 미쳤는지를 나누어 생각해야 함
  • 따라서 시계열분해를 통해 시간요인외부요인으로 구분하여 분석할 수 있음

 

[시계열분해]

  • 시계열 자료를 추세(Trend), 계절성(Seasonal), 잔차(Residual)로 분해하는 기법
  • 시간요인: 추세, 계절성
  • 외부요인: 잔차(불규칙요인)
  • 분해과정
    • 모형판단: 데이터를 보고 주기적반복계절성이 있는지에 따라 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 값으로 설정
  • 시계열 자료 외에 다른 자료가 없을때, 변동 상태를 확인할 수 있음
  • 어떤 시계열에도 적용 가능
  • 파라미터로 (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