コンピュータビジョン(画像認識)と並んで、ビジネスの現場で最もニーズが高いAIタスクが「時系列データの未来予測」です。店舗の来客数予測から、金融市場の変動、サーバーの負荷予測まで、時間に沿って発生するデータの振る舞いを予測するモデリングは極めて価値が高い技術です。
本記事では、統計的時系列解析の王道である「ARIMA (自己回帰和分移動平均) モデル」と、ディープラーニングの世界で再帰的ネットワークとして強みを発揮する「LSTM (Long Short-Term Memory)」の2つのアプローチを取り上げ、それぞれの違いと実装の基礎について解説します。
1. 統計的アプローチ:SARIMAモデルによる自己回帰と季節変動の解析
ARIMAモデルは、対象のデータの「過去の自己のデータ(AR)」「データの差分(I)」「過去の予測誤差の移動平均(MA)」を組み合わせて将来を予測する古典的かつ強力なモデルです。特にビジネスにおける売上データには「週末に売上が伸びる」「夏に売上が落ちる」といった季節変動(Seasonality)が含まれることが多いため、それを拡張した「SARIMAモデル」がよく実務で採用されます。
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
# 時系列データセットの読み込み (Date列をインデックスに設定)
df = pd.read_csv('sales_data.csv', parse_dates=['Date'], index_col='Date')
y = df['Sales']
# SARIMAモデルの実装 (statsmodelsライブラリを使用)
# order=(p, d, q) : AR(自己回帰), I(差分), MA(移動平均)の各パラメータ
# seasonal_order=(P, D, Q, s) : 季節変動のパラメータ (sは周期、月次の場合は12など)
model = sm.tsa.statespace.SARIMAX(y, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
results = model.fit()
# 将来12ヶ月の売上を予測してプロット
pred = results.get_prediction(start=len(y), end=len(y)+12)
pred_mean = pred.predicted_mean
pred_ci = pred.conf_int() # 信頼区間の取得
plt.plot(y.index, y, label='Observed')
plt.plot(pred_mean.index, pred_mean, label='Forecast')
plt.fill_between(pred_ci.index, pred_ci.iloc[:, 0], pred_ci.iloc[:, 1], color='k', alpha=.2)
plt.legend()
plt.show()統計モデルの最大のメリットは「モデルの解釈性が高い(なぜその予測が出たかの理由を重みパラメータから説明できる)」点にあります。また、少ないデータ量でもそれなりに妥当な予測を出せるのが特徴です。
2. 深層学習アプローチ:LSTMによる長期依存関係の学習
一方、自然言語処理や複雑な波形解析のために生まれた「LSTM」は、データ量が膨大な場合にその真価を発揮します。LSTMは「忘却ゲート」「入力ゲート」「出力ゲート」というセル機構を持ち、データの長期的な関連性(例えば「1年前の巨大セールの影響が今日に出る」など)を内部状態として記憶しながら非線形な予測を行うことができます。
import torch
import torch.nn as nn
class LSTMForecastModel(nn.Module):
def __init__(self, input_size=1, hidden_size=50, num_layers=2, output_size=1):
super(LSTMForecastModel, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
# batch_first=True で (Batch, Seq_len, Features) の入力形式を受け付ける
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
# 隠れ状態とセル状態の初期化
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
# LSTMのフォワードパス (系列全体の出力 out と、最後の状態が返る)
out, _ = self.lstm(x, (h0, c0))
# 予測にはシーケンスの最後のタイムステップの出力だけを取り出して全結合層に渡す
out = self.fc(out[:, -1, :])
return outディープラーニングであるLSTMを使う最大のメリットは、「気温」「競合の価格」「SNSのトレンドスコア」といった多変量(複数の指標)を同時にモデルに放り込める適応性の高さにあります。一方で、スモールデータ(データが極端に少ない場合)においてはすぐに過学習してしまい、ARIMAのような古典的モデルに精度で完敗することも珍しくありません。データの「質と量」を見極めてアプローチを使い分けることがデータサイエンティストの腕の見せ所です。
まとめ:現場での適材適所
時系列予測の実務では、「まずはデータ量が少なくて済むARIMA/Prophet等の軽量な統計モデルでベースライン構築を行い、予測精度に不満がありかつ十分な過去ログデータが存在する場合に限りLSTMやXGBoostなどの重い機械学習モデルに移行する」というステップダウンのアプローチを取るのが最も安全です。
Pythonでの時系列データ前処理(Pandas操作や欠損値補完など)に不安がある方は、まずは以下の書籍でPandasや基礎的な統計モデリングをマスターすることをお勧めします。


コメント