renue

ARTICLE

Pythonで時系列予測をするには?Prophet・LSTM・LightGBMの使い方と比較

公開日: 2026/4/3

Pythonを使った時系列予測の手法比較(Prophet・LSTM・LightGBM・SARIMA)から実装コード例、売上予測・在庫管理への活用まで解説します。

時系列予測とは?基本概念と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

データ分析・AI予測モデル導入支援

時系列予測・需要予測のAIシステム構築から、データサイエンティスト採用まで支援します。

無料相談はこちら

よくある質問(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では入力の次元数を増やすことで多変量に対応できますが、特徴量選択とスケーリングに注意が必要です。