파이썬 Python

[Python] 파이썬으로 하는 시계열 데이터 분해 (Seasonal_decompose)

sseozytank 2024. 4. 24.

파이썬으로 시계열 분해를 해보자! 샘플 데이터로는 애플의 주가 데이터를 사용해볼 것이다. 

 

연습용으로 데이터 사용할 사람만 샘플 데이터 다운로드 

#패키지가 없는 사람만 
pip install yfinance
import pandas as pd
import yfinance as yf

# 시작 날짜와 끝 날짜 지정
start_date = '2020-01-01'
end_date = '2024-04-24'

# 애플 주식의 데이터를 불러오기
aapl = yf.download('AAPL', start=start_date, end=end_date)

# 결과 출력
aapl.head()

 

받아오면, 아래와 같이 멀티 인덱스로 개장 시, 고점, 저점 ,폐장 시, 조정 종가, 거래량 데이터가 받아진 것을 확인할 수 있다. 연습용으로 쓰기는 살짝 불편하니 간단한 전처리를 Date 인덱스를 컬럼으로 바꾸고, Open 컬럼만 선택해오장

 

 

aapl.reset_index(inplace=True)
aapl=aapl[['Date','Open']]

 

아주 깔끔하게 데이터셋이 나왔다~! 어떻게 생겼는지 한번 살펴보자.

 

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 3))

plt.plot(aapl['Date'], aapl['Open'], color='navy', linewidth=1)

plt.title('AAPL Stock Open Price Over Time')
plt.xlabel('Date')
plt.ylabel('Open Price')

plt.xticks(rotation=30,fontsize=9)
plt.yticks(fontsize=9)

plt.grid(True)

plt.show()

 

주식 사둘걸 ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ

 

추세는 상향인거 같긴한데 계절성, 주기성, 불규칙성에 대해선 찾아보기가 힘들다 ㅜㅜㅜ 시계열 분해를 해야할 필요성이 느껴지지 않는가!!! 그럼 이제 진짜 파이썬으로 시계열 분해를 해보자.

 

파이썬 시계열 분해 

seasonal_decompose 구성 요소 

파이썬으로 시계열 분해는 보통, statsmodels.tsa.seasonal의 seasonal_decompose를 이용하는데, 당장 사용하기 앞서 각 옵션에 어떤것을 넣어서 돌려야하는지 살펴보고 가자. 

result=seasonal_decompose(data, 
			  model = 'additive' or 'multiplicative',
                          filt = None,
                          period = None,
                          two_sided = True or False,
                          extrapolate_trend = True or False, 
                          freq : '', 
                          weighted : True or False
                          )
  • data : 분해할 시계열 데이터 셋, 보통 Pandas의 Series나 DataFrame 사용 
  • model : 분해 모델 지정

https://yoongaemii.github.io/seasonal_decomposition/

  • filt : 추세 추정에 사용되는 필터, 기본값은 None (그 외, 'hp', 'convolution')

Chat-GPT 3.5

  • period : 계절성 주기의 길이를 지정, None으로 지정 시 자동 계산 
  • two_sided : True이면 분해에 대해 양방향 필터링, False이면 단방향 필터링 (기본값 True) 
  • extrapolate_trend : True이면 추세가 범위 외에 지점에서 추정됨 (기본값 False) 
  • freq :  시계열 데이터의 주기 지정, None으로 지정 시 자동 계산 
  • weighted : True이면 가중치 적용되어 회귀분석에 사용 (기본값 False)  

그럼 이제 본격적으로 애플 주식 시계열 데이터를 분해해보잣 얍 

 

 

파이썬 예제 

aapl의 경우 비선형보단 선형 느낌이 나기 때문에 , 나는 model = 'additive'를 선택해주었다. 

 

*statsmodels 패키지가 없을 경우 

pip install statsmodels

 

from statsmodels.tsa.seasonal import seasonal_decompose

#date_time이 index로 가야한다고해서 아래 전처리 한번 더 진행 
aapl.set_index('Date',drop=True,inplace=True)

result = seasonal_decompose(aapl, model='additive', period=365)

 

이렇게하면 끝..!!!!!!!! 이러니 파이썬을 사랑할 수 밖에 ...  

 

분해한 모델은 아래와 같이 시각화 하면 된다. 

 

그래프 출력 

# 결과 시각화
plt.figure(figsize=(8, 6))

# 원본 데이터 플롯
plt.subplot(4, 1, 1)
plt.plot(aapl, label='Original', color='navy')
plt.legend(loc='upper left',fontsize=9)
plt.xticks(fontsize=7)
plt.yticks(fontsize=7)

# 추세 플롯
plt.subplot(4, 1, 2)
plt.plot(result.trend, label='Trend', color='navy')
plt.legend(loc='upper left',fontsize=9)
plt.xticks(fontsize=7)
plt.yticks(fontsize=7)

# 계절성 플롯
plt.subplot(4, 1, 3)
plt.plot(result.seasonal, label='Seasonal', color='navy')
plt.legend(loc='upper left',fontsize=9)
plt.xticks(fontsize=7)
plt.yticks(fontsize=7)

# 잔차 플롯
plt.subplot(4, 1, 4)
plt.plot(result.resid, label='Residual', color='navy')
plt.legend(loc='upper left',fontsize=9)
plt.xticks(fontsize=7)
plt.yticks(fontsize=7)

plt.tight_layout()
plt.show()

 

에서 대충 예측한대로 추세는 상향이고, 약 1년 반 단위의 계절성을 가지고 있다. 원본 데이터만 봤을 때는 전혀 몰랐는데, 이렇게 보니까 하눈에 확인해볼 수 있음.  (지금 풀매수각 ?;;!) 



내용은 길었지만, 결론은 단순했던 seasonal decomposition 끝! 

댓글