時系列予測とは?基本概念とPythonが選ばれる理由
時系列予測とは、過去の時間順データをもとに将来の値を推定する機械学習・統計の手法です。売上予測、在庫管理、需要予測、株価予測など、ビジネスのあらゆる場面で活用されています。
Pythonが時系列予測に選ばれる主な理由は、豊富なライブラリにあります。Prophet(Meta開発)、statsmodels(SARIMA)、TensorFlow/Keras(LSTM)、LightGBM(勾配ブースティング)など、用途に応じたツールが揃っています。2025〜2026年現在、機械学習系ライブラリの進化により、従来は統計専門家が行っていた時系列予測を、データアナリストやエンジニアでも実装できるようになっています。
主要4手法の比較:Prophet・LSTM・LightGBM・SARIMA
時系列予測の主要手法を比較します。
| 手法 | 得意なデータ | 実装難易度 | 主な用途 |
|---|---|---|---|
| Prophet | 季節性・祝日あり | 低 | 売上・トラフィック予測 |
| LSTM | 長期依存関係あり | 高 | 株価・センサーデータ |
| LightGBM | 外部特徴量が豊富 | 中 | 需要予測・在庫管理 |
| SARIMA | 線形・定常時系列 | 中 | 短期需要・経済指標 |
精度面では状況により異なりますが、ベンチマーク比較ではLSTMがR²スコア0.38、LightGBMが0.24、Prophetが0.22と報告される事例もあります(データの性質により大きく変動します)。手法の選択はデータの特性と目的次第です。
Prophetの使い方と実装コード例
ProphetはMetaが開発したオープンソースライブラリで、ビジネスデータの予測に特化しています。季節性(年・週・日次)と祝日効果を自動的に考慮でき、パラメータ調整が少ないため、まず試す手法として最適です。
インストールと基本実装
pip install prophet pandas
from prophet import Prophet
import pandas as pd
# データ準備(ds: 日付列, y: 目的変数列)
df = pd.read_csv('sales_data.csv')
df = df.rename(columns={'date': 'ds', 'sales': 'y'})
# モデル構築・学習
model = Prophet(
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False
)
model.fit(df)
# 将来30日の予測
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)
# 結果確認
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(30))
# 可視化
fig = model.plot(forecast)
fig.savefig('forecast.png')
Prophetの強みはyhat_lower/yhat_upperで予測区間も自動出力される点です。祝日効果を加えたい場合はadd_country_holidays(country_name='JP')で日本の祝日を一行で反映できます。
LSTMの使い方と実装コード例
LSTM(Long Short-Term Memory)は、長期的な時系列依存関係を学習できるリカレントニューラルネットワークです。複雑なパターンや非線形な変動を持つデータに強く、センサーデータや金融データの予測に適しています。
基本実装(Keras使用)
pip install tensorflow pandas scikit-learn
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
# データ読み込みとスケーリング
df = pd.read_csv('sales_data.csv')
data = df['sales'].values.reshape(-1, 1)
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
# シーケンスデータ作成(過去30日で翌日を予測)
def create_sequences(data, seq_length=30):
X, y = [], []
for i in range(len(data) - seq_length):
X.append(data[i:i+seq_length])
y.append(data[i+seq_length])
return np.array(X), np.array(y)
X, y = create_sequences(data_scaled, seq_length=30)
split = int(len(X) * 0.8)
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]
# モデル構築
model = Sequential([
LSTM(50, return_sequences=True, input_shape=(30, 1)),
Dropout(0.2),
LSTM(50, return_sequences=False),
Dropout(0.2),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.1)
# 予測と逆変換
y_pred_scaled = model.predict(X_test)
y_pred = scaler.inverse_transform(y_pred_scaled)
LSTMはデータ量が少ないと過学習しやすい点に注意が必要です。Dropoutで正則化し、学習データが1,000件以上あることが望ましいとされています。
LightGBMによる時系列予測:特徴量エンジニアリングが鍵
LightGBMは勾配ブースティングベースのアルゴリズムで、本来は時系列専用ではありませんが、適切な特徴量エンジニアリングにより高精度な予測が可能です。外部変数(気温、曜日、キャンペーン有無など)を組み合わせた需要予測・在庫管理に特に有効です。
時系列特徴量の作成と学習
pip install lightgbm pandas scikit-learn
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_absolute_error
df = pd.read_csv('sales_data.csv', parse_dates=['date'])
df = df.sort_values('date').reset_index(drop=True)
# 時系列特徴量の作成
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df['dayofweek'] = df['date'].dt.dayofweek
df['is_weekend'] = df['dayofweek'].isin([5, 6]).astype(int)
# ラグ特徴量(過去7日・30日の値)
for lag in [1, 7, 14, 30]:
df[f'lag_{lag}'] = df['sales'].shift(lag)
# 移動平均特徴量
df['rolling_mean_7'] = df['sales'].shift(1).rolling(7).mean()
df['rolling_mean_30'] = df['sales'].shift(1).rolling(30).mean()
df = df.dropna()
# 学習・テスト分割(時系列なので末尾をテストに)
split_date = '2024-10-01'
train = df[df['date'] < split_date]
test = df[df['date'] >= split_date]
feature_cols = ['year','month','day','dayofweek','is_weekend',
'lag_1','lag_7','lag_14','lag_30',
'rolling_mean_7','rolling_mean_30']
model = lgb.LGBMRegressor(n_estimators=500, learning_rate=0.05, random_state=42)
model.fit(train[feature_cols], train['sales'])
y_pred = model.predict(test[feature_cols])
mae = mean_absolute_error(test['sales'], y_pred)
print(f'MAE: {mae:.2f}')
LightGBMは学習速度が速く、特徴量重要度も確認できるため、ビジネス解釈のしやすさという点でも優れています。model.feature_importances_で各特徴量の貢献度を把握し、不要な特徴量を削除してモデルを軽量化できます。
手法選択の実践ガイド:売上予測・在庫管理への活用
どの手法を選べばよいかは、データの特性と目的によって決まります。
売上予測への活用
ECサイトや小売業の売上予測では、季節性・週次パターン・祝日効果が重要です。この場合はProphetが最初の選択肢になります。データ量が豊富で、キャンペーン有無や天気など外部要因も加味したい場合はLightGBMが適しています。
在庫管理・需要予測への活用
在庫最適化では過剰在庫と欠品の両方をコントロールする必要があります。LightGBMに曜日・月・ラグ特徴量を加えたアプローチが実務でよく用いられます。予測精度を評価する指標としてはMAE(平均絶対誤差)やMAPE(平均絶対パーセント誤差)が一般的です。
判断フローチャート
- データが少ない(数百件以下)かつ季節性あり → Prophet
- 外部特徴量が豊富・高速学習が必要 → LightGBM
- 複雑な非線形パターン・大量データあり → LSTM
- 線形・定常データで統計的解釈が必要 → SARIMA
よくある質問(FAQ)
Q1. ProphetとLSTMはどちらが精度が高いですか?
一概には言えません。データの性質によります。季節性が明確で外れ値が少ないビジネスデータではProphetが安定した精度を示すことが多く、長期的な複雑なパターンを持つデータではLSTMが優れる場合があります。まずProphetで試し、精度が不十分な場合にLSTMやLightGBMを検討するのが現実的なアプローチです。
Q2. 時系列予測に必要なデータ量の目安は?
手法によって異なります。Prophetは数十件からでも動作しますが、精度を出すには予測したい季節サイクルの2〜3倍以上のデータが理想です(年次予測なら2〜3年分)。LSTMは1,000件以上が推奨されます。LightGBMは数百件から実用的な予測が可能ですが、ラグ特徴量の作成で先頭データが失われることを考慮する必要があります。
Q3. 時系列データのクロスバリデーションはどうすればよいですか?
通常のランダム分割は使えません。時系列では「過去で学習し、未来を検証する」原則を守ります。Prophetのcross_validation()関数や、scikit-learnのTimeSeriesSplitを使うことで、データの時間的順序を保ったウォークフォワード検証が実装できます。
Q4. 外れ値や欠損値はどう処理すればよいですか?
Prophetは欠損値(NaN)を自動的に無視して学習できます。LightGBMも欠損値をそのまま扱えますが、ラグ特徴量作成後のNaNは削除が必要です。外れ値はProphetのadd_changepointsで対処するか、事前に四分位範囲(IQR法)でクリッピングするのが一般的です。
Q5. Pythonの時系列予測ライブラリは他に何がありますか?
主要なものとして、statsmodels(ARIMA/SARIMA)、sktime(統一APIで複数手法を比較)、NeuralForecast(N-BEATS、N-HiTS等の深層学習モデル)、mlforecast(LightGBM/XGBoostの時系列特化版)などがあります。2025年以降はNeuralForecastやmlfixcastが注目されており、従来のLSTMより高精度を示すケースも増えています。
Q6. 多変量時系列予測(複数の説明変数)はどうすればよいですか?
LightGBMは多変量が得意で、気温・価格・プロモーション情報などを特徴量として直接追加できます。Prophetもadd_regressor()で外部変数を追加可能です。LSTMでは入力の次元数を増やすことで多変量に対応できますが、特徴量選択とスケーリングに注意が必要です。
