파이썬 nan 제거: ARIMA 모델 예측에서 nan 문제 해결하기
이전 포스트에서 우리는 S&P 500 주식 데이터를 분석하고 ARIMA 모델로 주가를 예측했지만, 예측값과 실제값을 비교하는 과정에서 평균 제곱 오차(MSE)를 계산할 때 nan
오류가 발생했습니다. 이번 포스트에서는 파이썬 nan 제거 방법을 중심으로 ARIMA 모델을 사용한 시계열 예측에서 자주 발생하는 nan
문제를 해결하는 과정을 설명하겠습니다.
nan이란?
nan
은 “Not a Number”의 약자로, 연산 과정에서 잘못된 값이 생성되었거나 데이터에 누락된 값이 있을 때 발생하는 결과값입니다. 주로 시계열 분석에서 데이터가 손실되었거나, 데이터셋에 불완전한 값이 있을 때 nan
값이 발생합니다. 특히 파이썬에서 시계열 분석을 할 때, nan
값이 포함된 데이터를 사용하면 예측 모델의 성능이 왜곡되거나 연산 자체가 실패할 수 있습니다.
nan이 발생하는 주요 원인
- 누락된 데이터: 데이터셋에 일부 값이 비어있거나 잘못된 값이 포함되어 있을 때
nan
값이 발생합니다. - 잘못된 연산: 분모가 0인 계산, 잘못된 데이터 형식 등으로 인해
nan
이 발생할 수 있습니다. - 인덱스 불일치: 예측된 값과 실제 값의 인덱스가 맞지 않으면 계산 과정에서
nan
이 발생할 수 있습니다.
파이썬 nan 제거의 중요성
시계열 분석과 같은 데이터 예측 작업에서 nan
값이 포함된 상태로 모델을 학습하거나 평가하면, 모델이 적절히 작동하지 않거나 잘못된 결과를 도출할 수 있습니다. 파이썬 nan 제거를 통해 데이터의 무결성을 유지하고, 모델 예측의 정확도를 높일 수 있습니다. 예를 들어, 주식 데이터에서 일부 날짜의 가격 정보가 없으면 nan
값이 발생하고, 이를 제거하지 않으면 모델이 제대로 예측할 수 없습니다.
nan 문제 해결 단계별 가이드
이제 파이썬 nan 제거를 통해 ARIMA 모델 예측에서 발생한 nan
문제를 해결하는 방법을 단계별로 알아보겠습니다.
1. 누락된 데이터(nan 값) 확인 및 제거
먼저, 데이터에 nan
값이 포함되어 있는지 확인하고 이를 제거해야 합니다. 파이썬의 dropna()
함수를 사용하면 데이터에서 nan
값을 쉽게 제거할 수 있습니다.
# S&P 500 종가 데이터에서 nan 값 제거
sp500_close_clean = sp500['Close'].dropna()
이 코드를 통해 S&P 500 종가 데이터에서 모든 nan
값을 제거할 수 있습니다. 데이터가 깨끗하게 정리된 상태에서만 ARIMA 모델을 적용할 수 있습니다.
2. ARIMA 모델 학습
이제 깨끗해진 데이터를 사용해 ARIMA 모델을 학습합니다. nan
값이 제거된 데이터를 바탕으로 모델을 학습시키면 예측 과정에서 오류가 발생하지 않습니다.
from statsmodels.tsa.arima.model import ARIMA
# ARIMA 모델 학습
model = ARIMA(sp500_close_clean, order=(5, 1, 0))
model_fit = model.fit()
이 단계에서는 nan
값이 제거된 데이터를 사용해 ARIMA 모델을 학습합니다. 이제 깨끗한 데이터로 모델을 훈련했으므로, 이후 예측에서 문제가 발생하지 않습니다.
3. 주가 예측
ARIMA 모델을 학습한 후, 우리는 30일간의 미래 주가를 예측할 수 있습니다. 이 과정에서 예측된 데이터에도 nan
값이 포함되지 않도록 주의해야 합니다.
# 미래 30일 동안의 주가 예측
forecast = model_fit.forecast(steps=30)
예측된 값에는 nan
값이 포함되지 않으며, 이 값은 미래의 주가를 추정하는 데 사용됩니다. 하지만 예측값과 실제값의 인덱스가 맞지 않으면 여전히 nan
문제가 발생할 수 있습니다.
4. 실제 데이터와 예측값의 인덱스 맞추기
다음으로, 예측된 데이터와 실제 데이터의 인덱스를 맞추는 것이 중요합니다. 만약 인덱스가 일치하지 않으면, 예측값과 실제값을 비교할 때 nan
이 발생할 수 있습니다. 아래 코드를 사용해 인덱스를 맞춰줍니다.
# 실제 데이터 중 마지막 30일 추출
sp500_last_30 = sp500_close_clean[-30:]
# 예측값의 인덱스를 실제 데이터의 인덱스로 설정
forecast.index = sp500_last_30.index
이 코드를 사용하면 예측된 값과 실제 데이터의 인덱스가 일치하게 되어, 비교 시 nan
이 발생하지 않습니다.
5. 평균 제곱 오차(MSE) 계산
이제 nan
문제를 해결했으므로, 예측값과 실제값 간의 평균 제곱 오차(MSE)를 정상적으로 계산할 수 있습니다.
# 평균 제곱 오차(MSE) 계산
mse = ((sp500_last_30 - forecast)**2).mean()
print(f'평균 제곱 오차(MSE): {mse}')
이 코드를 통해 nan
문제 없이 MSE를 계산하고, 모델의 성능을 평가할 수 있습니다.
전체 수정코드
import yfinance as yf
from statsmodels.tsa.arima.model import ARIMA
import matplotlib.pyplot as plt
# S&P 500 데이터 다운로드 및 NaN 값 제거
sp500 = yf.download('^GSPC', start='2010-01-01', end='2023-01-01')
sp500_close_clean = sp500['Close'].dropna()
# ARIMA 모델 학습
model = ARIMA(sp500_close_clean, order=(5, 1, 0))
model_fit = model.fit()
# 미래 30일 예측
forecast = model_fit.forecast(steps=30)
# 마지막 30일 실제 데이터
sp500_last_30 = sp500_close_clean[-30:]
# 예측값의 인덱스를 실제 데이터의 인덱스로 설정
forecast.index = sp500_last_30.index
# 평균 제곱 오차(MSE) 계산
mse = ((sp500_last_30 - forecast)**2).mean()
print(f'평균 제곱 오차(MSE): {mse}')
# AIC 값 출력
print(f'AIC: {model_fit.aic}')
# 결과값
평균 제곱 오차(MSE): 15599.163498498263
AIC: 31515.10069070282
정리하기
이번 포스트에서는 파이썬 nan 제거 방법을 통해 ARIMA 모델 예측에서 발생한 nan
문제를 해결하는 과정을 다뤘습니다. 데이터셋의 nan
값을 제거하고, 예측값과 실제 데이터의 인덱스를 맞추는 과정이 중요하며, 이를 통해 nan
없이 예측 모델을 정확하게 평가할 수 있습니다.