Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 그로스 마케팅
- ImageDateGenerator
- 데이터 핸들링
- 컨브넷
- 마케팅 보다는 취준 강연 같다(?)
- WITH CUBE
- 데이터 정합성
- 분석 패널
- 부트 스트래핑
- 그로스 해킹
- 데이터 증식
- python
- 스태킹 앙상블
- lightgbm
- pmdarima
- 캐글 신용카드 사기 검출
- Growth hacking
- 인프런
- 그룹 연산
- ARIMA
- 3기가 마지막이라니..!
- 로그 변환
- DENSE_RANK()
- splitlines
- 리프 중심 트리 분할
- tableau
- XGBoost
- 캐글 산탄데르 고객 만족 예측
- sql
- WITH ROLLUP
Archives
- Today
- Total
LITTLE BY LITTLE
[2] ARIMA - 시계열 데이터, 정상성, 검정 방법(ADF/KPSS) 본문
0. 시계열 데이터
: 연속 시계열 데이터는 모든 시점이 연결되어 있기 때문에 분석하기 부담스러워 이산 시계열 데이터를 많이 사용한다. 특정 시점에서 측정한 관측값들의 집합
1. 정상성을 나타내는 시계열 확인하기
1-1. 정상성을 나타내지 않는 시계열
: 추세가 있고 수준이 변하는 경우 & 계절성이 보이는 경우 & 평균과 분산이 일정하지 않은 경우
(a),(c),(e),(f),(i) - 추세가 있고 수준이 변하는 경우
(d).(h) - 분명하게 계절성이 보이는 경우
(i) - 분산이 증가하는 경우
1-2. 정상성을 나타내는 시계열
: 규칙적인 주기나 추세, 계절성이 없고 평균과 분산이 일정한 경우
(b),(g) 정상성을 나타내는 시계열
※ 헷갈릴 수 있는 경우
: (g)는 뚜렷한 주기가 나타나긴 하지만, 불규칙적인 주기이기 때문에 정상성을 나타냄
- 주기성 행동을 가지고 있는 시계열은 정상성을 나타내는 시계열 (당연히 추세나 계절성은 없어야 함)
- 주기가 고정된 길이를 갖고 있지 않기 때문
- 주기의 고점이나 저점이 어디일지 확실하게 알 수 없어 예측할 수 없는 패턴을 나타냄 → 정상성
- 일반적으로는, 정상성을 나타내는 시계열은 장기적으로 볼 때 예측할 수 있는 패턴을 나타내지 않을 것
- 어떤 주기적인 행동이 있을 수 있더라도 시간 그래프는 시계열이 일정한 분산을 갖고 대략적으로 평평하게 될 것을 나타낼 것
비정상성 시계열이 정상성 시계열이 된 모습
2. 정상성 검증 - ADF Test와 KPSS Test
1. ADF Test (Augmented Dickey-Fuller Test)
2. KPSS Test
예제 연습
In [95]:
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.stattools import kpss
In [46]:
#pip install yfinance
In [8]:
import yfinance as yf
# 테슬라
df_tsla = yf.download('TSLA', start='2022-11-01', end='2023-10-30')
# LG화학
df_lg = yf.download('051910.KS', start='2022-11-01', end='2023-10-30')
# 리튬아메리카
df_lac = yf.download('LAC', start='2022-11-01', end='2023-10-30')
# merge
df = pd.merge(df_tsla['Adj Close'], df_lg['Adj Close'], left_index=True, right_index=True, how = 'left').rename(columns={'Adj Close_x' : 'TSLA', 'Adj Close_y' : 'LG'})
df = pd.merge(df, df_lac['Adj Close'], left_index=True, right_index=True, how = 'left').rename(columns = {'Adj Close':'LAC'})
df.dropna(inplace=True)
df.head()
[*********************100%%**********************] 1 of 1 completed [*********************100%%**********************] 1 of 1 completed [*********************100%%**********************] 1 of 1 completed
Out[8]:
TSLA | LG | LAC | |
---|---|---|---|
Date | |||
2023-10-10 | 263.619995 | 497500.0 | 10.70 |
2023-10-11 | 262.989990 | 518000.0 | 9.86 |
2023-10-12 | 258.869995 | 529000.0 | 9.58 |
2023-10-13 | 251.119995 | 528000.0 | 8.68 |
2023-10-16 | 253.919998 | 513000.0 | 9.33 |
In [42]:
# 테슬라 주가 데이터 시각화
column1 = ['TSLA']
df[column1].plot(title="TSLA",figsize=(12.2,6.4));
In [43]:
# LG화학 주가 데이터 시각화
column2 = ['LG']
df[column2].plot(title="LG_CHEM",figsize=(12.2,6.4));
In [44]:
# 리튬아메리카 주가 데이터 시각화
column3 = ['LAC']
df[column3].plot(title="LAC",figsize=(12.2,6.4));
ADF 안정성(stationary)테스트¶
H0: 시계열이 안정적이지 않다.
In [80]:
df
Out[80]:
TSLA | LG | LAC | |
---|---|---|---|
Date | |||
2023-10-10 | 263.619995 | 497500.0 | 10.70 |
2023-10-11 | 262.989990 | 518000.0 | 9.86 |
2023-10-12 | 258.869995 | 529000.0 | 9.58 |
2023-10-13 | 251.119995 | 528000.0 | 8.68 |
2023-10-16 | 253.919998 | 513000.0 | 9.33 |
2023-10-17 | 254.850006 | 516000.0 | 9.10 |
2023-10-18 | 242.679993 | 506000.0 | 8.16 |
2023-10-19 | 220.110001 | 494000.0 | 7.12 |
2023-10-20 | 211.990005 | 479000.0 | 6.96 |
2023-10-23 | 212.080002 | 481000.0 | 6.55 |
2023-10-24 | 216.520004 | 492000.0 | 6.74 |
2023-10-25 | 212.419998 | 458000.0 | 6.83 |
2023-10-26 | 205.759995 | 426000.0 | 6.76 |
2023-10-27 | 207.300003 | 438500.0 | 6.85 |
In [75]:
result = adfuller(df['LG'], autolag='AIC')
In [92]:
def adf_test(df):
result = adfuller(df.values, autolag='AIC')
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
for key, value in result[4].items():
print('Critial Values:')
print(f' {key}, {value}')
print('ADF Test: TSLA')
adf_test(df['TSLA'])
print('ADF TEST: LG')
adf_test(df['LG'])
print('ADF TEST: LAC')
adf_test(df['LAC'])
ADF Test: TSLA ADF Statistic: -2.356071144663024 p-value: 0.15452063735060456 Critial Values: 1%, -4.473135048010974 Critial Values: 5%, -3.28988060356653 Critial Values: 10%, -2.7723823456790124 ADF TEST: LG ADF Statistic: 0.10447255658839494 p-value: 0.9663651329418883 Critial Values: 1%, -4.6651863281249994 Critial Values: 5%, -3.3671868750000002 Critial Values: 10%, -2.802960625 ADF TEST: LAC ADF Statistic: -1.9232990187561405 p-value: 0.3211811368877018 Critial Values: 1%, -4.068853732362312 Critial Values: 5%, -3.1271488757396453 Critial Values: 10%, -2.7017297633136095
→ 세 가지 모두 p-value가 0.05를 넘어 귀무가설을 기각할 수 없다. 비정상성 시계열
KPSS 안정성 테스트¶
H0: 시계열이 안정적이다.
In [ ]:
def kpss_test(df):
statistic, p_value, n_lags, critical_values = kpss(df.values)
print(f'KPSS Statistic: {statistic}')
print(f'p_value: {p_value}')
print(f'num lags: {n_lags}')
print('Critical Values:')
for key, value in critical_values.items():
print(f' {key} : {value}')
print('KPSS Test: TSLA')
kpss_test(df['TSLA'])
print('KPSS Test: LG')
kpss_test(df['LG'])
print('KPSS Test: LAC')
kpss_test(df['LAC'])
KPSS Test: TSLA KPSS Statistic: 0.535342770842159 p_value: 0.03370658314365789 num lags: 2 Critical Values: 10% : 0.347 5% : 0.463 2.5% : 0.574 1% : 0.739 KPSS Test: LG KPSS Statistic: 0.6294035630510826 p_value: 0.01996331244990158 num lags: 1 Critical Values: 10% : 0.347 5% : 0.463 2.5% : 0.574 1% : 0.739 KPSS Test: LAC KPSS Statistic: 0.7249550093592487 p_value: 0.011276817330977388 num lags: 1 Critical Values: 10% : 0.347 5% : 0.463 2.5% : 0.574 1% : 0.739
→ 세 가지 모두 p-value가 0.05를 넘지 않아 귀무가설을 기각한다. 비정상성 시계열
PACF, ACF TEST 이어서
'데이터 분석 > 시계열 데이터 분석' 카테고리의 다른 글
[5] ARIMA - auto_arima를 활용한 예제 실습 (0) | 2023.12.11 |
---|---|
[4] ARIMA - 시계열 모형 추가 설명 / 정상성 검정 정리 (0) | 2023.11.29 |
[1] 시계열 군집 분석 - 계층적 군집화의 개념과 종류 (1) | 2023.11.24 |
[3] ARIMA - 직관적인 정상성 검정 방법 ACF/PACF Plot, 차분 (0) | 2023.11.13 |
[1] ARIMA - 시계열 모델의 개념 (0) | 2023.11.08 |
Comments