売上予測にディープラーニングは本当に必要でしょうか。古典のARIMA、手軽なProphet、強力なLSTM——3つの代表手法の得意・不得意と使い分けの基準を整理します。
時系列予測入門:ARIMA・Prophet・LSTMの使い分け

AIを知りたい
時系列予測ってどんな場面で使われるんですか?

AIエンジニア
時系列予測は過去のデータのパターンから未来の値を予測する技術です。株価予測、需要予測、売上予測、気象予報、電力需要予測など、ビジネスから科学まで非常に幅広く使われています。時間とともに変化するデータならすべて対象になります。

AIを知りたい
通常の機械学習と何が違うんですか?

AIエンジニア
大きく2つ違います。1つはデータに時間的な順序があること。ランダムにシャッフルすると情報が失われます。もう1つは未来のデータを使ってはいけないこと。交差検証でも時間を考慮した分割が必要で、通常のk-Foldは使えません。
時系列予測とは、時間順に並んだデータの過去のパターンをもとに将来の値を予測する手法の総称です。
統計的手法(ARIMA等)、機械学習手法(Prophet等)、深層学習手法(LSTM等)があり、データの特性やタスクの要件に応じて使い分けます。トレンド、季節性、ノイズの3つの成分を理解することが基本です。
時系列データの3つの成分

AIを知りたい
時系列データにはどんな要素がありますか?

AIエンジニア
時系列データは主に3つの成分で構成されます。トレンドは長期的な上昇・下降傾向。季節性は周期的に繰り返すパターン(月ごとの売上変動など)。残差(ノイズ)はトレンドと季節性で説明できないランダムな変動です。この分解を理解することが時系列分析の第一歩です。

AIを知りたい
定常性という概念も聞いたことがあります。

AIエンジニア
定常性とは、データの統計的性質(平均、分散)が時間によって変化しない性質です。ARIMAなどの統計モデルは定常性を前提としています。多くの実データは非定常なので、差分を取って定常化する前処理が必要です。ADF検定で定常性を統計的に判定できます。
ARIMA:統計的アプローチ

AIを知りたい
ARIMAモデルについて教えてください。

AIエンジニア
ARIMAはAuto-Regressive Integrated Moving Averageの略で、時系列予測の古典的手法です。AR(自己回帰:過去の値から予測)、I(和分:差分で定常化)、MA(移動平均:過去の誤差から予測)の3つを組み合わせます。パラメータ(p,d,q)でそれぞれの次数を指定します。

AIを知りたい
季節性がある場合はどうしますか?

AIエンジニア
SARIMA(季節性ARIMA)を使います。ARIMAの(p,d,q)に加えて季節成分(P,D,Q,m)が追加されます。mは季節周期で、月次データなら12です。Pythonではstatsmodelsのauto_arimaやpmdarima等で自動的に最適なパラメータを選択できます。
Prophet:ビジネス向け手法

AIを知りたい
Facebookが作ったProphetはどんなツールですか?

AIエンジニア
ProphetはMeta(旧Facebook)が開発したビジネスユーザー向けの時系列予測ツールです。トレンド+季節性+祝日効果を加法的にモデル化します。最大の利点は専門知識がなくても使いやすいこと。欠損値にも強く、祝日や特殊イベントの効果も簡単に組み込めます。

AIを知りたい
ARIMAと比べてどちらが良いですか?

AIエンジニア
用途によります。Prophetは複数の季節性(週・月・年)や祝日効果があるビジネスデータに強いです。一方ARIMAは短期予測や単変量の精密な予測で優れることが多いです。Prophetは手軽さが魅力で、まずProphetで試してから精度が足りなければ他の手法を検討するのがおすすめです。
LSTM:深層学習アプローチ

AIを知りたい
ディープラーニングの時系列予測はどうなんですか?

AIエンジニア
LSTM(Long Short-Term Memory)はRNNの一種で、長期的な依存関係を学習できます。複数の特徴量を同時に使える(多変量時系列)のが強みで、複雑なパターンの学習に向いています。ただしデータ量が十分でないと統計モデルに負けることもあります。

AIを知りたい
最近はTransformerも時系列に使われているんですか?

AIエンジニア
はい、Temporal Fusion Transformer(TFT)やPatchTSTなどTransformerベースの時系列モデルが注目されています。長期依存関係の学習やAttentionによる解釈性でLSTMを上回るケースが増えています。ただしまだ発展途上で、小〜中規模データではARIMAやProphetの方が安定します。
| 手法 | データ量の目安 | 強み | 弱み |
|---|---|---|---|
| ARIMA/SARIMA | 50点以上 | 少量データ、短期予測 | 多変量に弱い |
| Prophet | 数百点以上 | 祝日効果、手軽さ | 精密な短期予測 |
| LSTM | 数千点以上 | 多変量、複雑パターン | データ不足に弱い |
| Transformer | 数万点以上 | 長期依存、解釈性 | 学習コスト高い |
まとめ
時系列予測はビジネスの意思決定を支える重要な技術です。まずProphetで手軽に試し、精度が必要ならARIMA/SARIMAで統計的にアプローチし、データが豊富で複雑なパターンがあればLSTMやTransformerを検討しましょう。どの手法を使うにしても、時系列特有の評価方法(Time Series Split等)を必ず使うことが信頼性の高い予測のカギです。
関連記事
- 交差検証(Cross Validation)とは?モデル評価の基本手法
- PyTorchとは?深層学習フレームワークの特徴と入門ガイド
- LLMの仕組みをゼロから理解する:Transformer・トークン・推論の基礎
statsmodelsでARIMAを実装する:時系列データの予測と可視化
時系列予測の基本であるARIMAモデルをstatsmodelsで実装します。航空旅客数データを使い、モデルの構築から将来予測、予測区間の可視化までの一連の流れを確認しましょう。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# サンプル時系列データの生成(月次売上を模擬)
np.random.seed(42)
n_months = 120 # 10年分
trend = np.linspace(100, 300, n_months)
seasonal = 30 * np.sin(2 * np.pi * np.arange(n_months) / 12)
noise = np.random.normal(0, 10, n_months)
sales = trend + seasonal + noise
dates = pd.date_range(start="2015-01-01", periods=n_months, freq="MS")
ts = pd.Series(sales, index=dates, name="monthly_sales")
# 訓練データとテストデータに分割
train = ts[:"2023-12"]
test = ts["2024-01":]
# ADF検定で定常性を確認
result = adfuller(train)
print(f"ADF統計量: {result[0]:.4f}")
print(f"p値: {result[1]:.4f}")
# p値が高い場合は差分を取って定常化が必要
# 1次差分で定常化
train_diff = train.diff().dropna()
result_diff = adfuller(train_diff)
print(f"差分後 ADF統計量: {result_diff[0]:.4f}")
print(f"差分後 p値: {result_diff[1]:.6f}")
# ARIMA(1,1,1) モデルの構築と学習
model = ARIMA(train, order=(1, 1, 1))
fitted = model.fit()
print(fitted.summary())
# テスト期間の予測と信頼区間
forecast_result = fitted.get_forecast(steps=len(test))
forecast = forecast_result.predicted_mean
conf_int = forecast_result.conf_int(alpha=0.05)
# 予測精度の評価
from sklearn.metrics import mean_absolute_error, mean_squared_error
mae = mean_absolute_error(test, forecast)
rmse = np.sqrt(mean_squared_error(test, forecast))
print(f"\nMAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
# 可視化
plt.figure(figsize=(14, 6))
plt.plot(train.index, train, label="Training Data", color="blue")
plt.plot(test.index, test, label="Actual (Test)", color="green")
plt.plot(forecast.index, forecast, label="ARIMA Forecast", color="red", linestyle="--")
plt.fill_between(
conf_int.index,
conf_int.iloc[:, 0],
conf_int.iloc[:, 1],
alpha=0.2, color="red", label="95% Confidence Interval"
)
plt.xlabel("Date")
plt.ylabel("Monthly Sales")
plt.title("ARIMA(1,1,1) Time Series Forecast")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("arima_forecast.png", dpi=150)
plt.show()
このコードのポイントは3つあります。第一に、ARIMA適用前にADF検定で定常性を確認し、p値が高ければ差分(d=1)を取る判断プロセスを示しています。第二に、get_forecastで点予測だけでなく95%信頼区間を取得し、予測の不確実性を可視化している点が実務で重要です。第三に、MAEとRMSEという2つの指標で評価することで、平均的な誤差と大きな外れ値の影響を別々に把握できます。季節性が強いデータにはSARIMAX、複数系列にはVARへの拡張が有効です。
