[파이썬] Keras 시계열 분해 및 예측

이번 포스트에서는 Keras를 사용하여 시계열 데이터를 분해하고 예측하는 방법에 대해 알아보겠습니다. 시계열 데이터는 시간에 따라 변화하는 데이터로, 예측 분석이나 추세 분석에 많이 사용됩니다. Keras는 강력한 딥러닝 라이브러리로, 시계열 예측에 활용할 수 있습니다.

1. 데이터 탐색

먼저, 분석할 시계열 데이터를 탐색하는 단계가 필요합니다. 데이터를 불러오고, 기본적인 시각화와 통계 분석을 진행하여 데이터의 특성을 파악합니다.

import pandas as pd
import matplotlib.pyplot as plt

# 데이터 불러오기
data = pd.read_csv('data.csv')

# 데이터 시각화
plt.plot(data['Date'], data['Value'])
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Time Series Data')
plt.show()

# 통계 분석
data.describe()

2. 시계열 분해

시계열 데이터는 대부분 트렌드(Trend), 계절성(Seasonality), 잔차(Residual) 세 가지 요소로 구성됩니다. 이들 요소를 분해하면 추세에 대한 정보를 추출할 수 있습니다.

import statsmodels.api as sm

# 시계열 분해
decomposition = sm.tsa.seasonal_decompose(data['Value'], model='additive')

# 추세, 계절성, 잔차 추출
trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid

# 시각화
plt.subplot(411)
plt.plot(data['Date'], data['Value'], label='Original')
plt.legend(loc='best')
plt.subplot(412)
plt.plot(data['Date'], trend, label='Trend')
plt.legend(loc='best')
plt.subplot(413)
plt.plot(data['Date'], seasonal,label='Seasonality')
plt.legend(loc='best')
plt.subplot(414)
plt.plot(data['Date'], residual, label='Residuals')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

3. 시계열 예측

분해된 시계열 데이터를 활용하여 예측 모델을 구축할 수 있습니다. Keras를 사용하여 LSTM(Long Short-Term Memory) 모델을 구성하고, 시계열 예측을 수행해봅시다.

from keras.models import Sequential
from keras.layers import LSTM, Dense

# 데이터 전처리
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)

# 훈련 데이터와 테스트 데이터 분할
train_size = int(len(data) * 0.8)
train_data, test_data = data.iloc[:train_size], data.iloc[train_size:]

# 데이터 정규화
scaler = MinMaxScaler(feature_range=(0, 1))
train_data = scaler.fit_transform(train_data)
test_data = scaler.transform(test_data)

# 시계열 데이터를 입력과 출력으로 변환
def create_sequences(data, window_size):
    x = []
    y = []
    for i in range(len(data)-window_size-1):
        window = data[i:(i+window_size), 0]
        x.append(window)
        y.append(data[i + window_size, 0])
    return np.array(x), np.array(y)

window_size = 10
train_X, train_y = create_sequences(train_data, window_size)
test_X, test_y = create_sequences(test_data, window_size)

# LSTM 모델 구성
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(window_size, 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

# 모델 훈련
model.fit(train_X, train_y, epochs=50, batch_size=32, verbose=2)

# 예측 결과 시각화
train_predict = model.predict(train_X)
test_predict = model.predict(test_X)

plt.plot(train_y, label='Train')
plt.plot([None]*len(train_y) + [x for x in test_y], label='Test')
plt.plot([None]*len(train_y) + [x for x in test_predict], label='Predicted')
plt.legend(loc='best')
plt.show()

위의 방법들을 사용하여 Keras를 통해 시계열 데이터를 분해하고 예측하는 방법을 살펴보았습니다. 시계열 분석과 예측은 데이터의 특성과 도메인에 따라 다양한 방법들이 있는데, 자신의 데이터에 적합한 방법을 선택하여 활용해보는 것이 중요합니다.