需要予測手法の全体像
「需要予測の手法は星の数ほどある。重要なのは、どの手法が自社のデータと課題に合っているかを見極めることだ。」
田中VPoEがホワイトボードに手法の分類図を描き始める。
「統計的手法、機械学習、ディープラーニング。それぞれに強みと弱みがある。今回のStore Salesデータセットでは、複数の手法を試して比較することになる。まずは全体像を把握しよう。」
需要予測手法の分類
需要予測手法
├── 統計的手法
│ ├── 単純手法(移動平均、指数平滑法)
│ ├── ARIMA / SARIMA
│ └── 状態空間モデル(ETS)
├── 機械学習
│ ├── 勾配ブースティング(LightGBM, XGBoost)
│ ├── ランダムフォレスト
│ └── Facebook Prophet(統計+MLのハイブリッド)
└── ディープラーニング
├── LSTM / GRU
├── Transformer
└── N-BEATS / TFT
統計的手法
移動平均法(Moving Average)
直近N期間の平均を次期の予測値とする最もシンプルな手法。
import pandas as pd
# 単純移動平均(SMA)
def simple_moving_average(series, window=7):
return series.rolling(window=window).mean()
# 加重移動平均(WMA): 直近データに重みを置く
def weighted_moving_average(series, weights=[0.1, 0.2, 0.3, 0.4]):
return series.rolling(window=len(weights)).apply(
lambda x: (x * weights).sum() / sum(weights)
)
指数平滑法(Exponential Smoothing)
過去のデータに対して指数的に減衰する重みを付ける手法。直近のデータほど重視される。
| 手法 | 対応パターン | パラメータ |
|---|---|---|
| 単純指数平滑法 | レベルのみ | alpha |
| Holt法 | レベル + トレンド | alpha, beta |
| Holt-Winters法 | レベル + トレンド + 季節性 | alpha, beta, gamma |
ARIMA / SARIMA
自己回帰和分移動平均モデル。時系列データの自己相関構造をモデル化する。
ARIMA(p, d, q):
p: 自己回帰の次数(過去何期分を使うか)
d: 差分の次数(何回差分を取るか)
q: 移動平均の次数
SARIMA(p, d, q)(P, D, Q, s):
大文字: 季節成分のパラメータ
s: 季節周期(月次データなら12)
機械学習手法
LightGBM / XGBoost
時系列データを「特徴量 → 目的変数」のテーブルデータに変換し、勾配ブースティングで予測する。
# 時系列データからの特徴量生成例
def create_features(df, target_col='sales'):
df['lag_1'] = df[target_col].shift(1) # 1日前の売上
df['lag_7'] = df[target_col].shift(7) # 1週間前の売上
df['lag_28'] = df[target_col].shift(28) # 4週間前の売上
df['rolling_7'] = df[target_col].shift(1).rolling(7).mean() # 直近7日平均
df['rolling_28'] = df[target_col].shift(1).rolling(28).mean() # 直近28日平均
df['dayofweek'] = df['date'].dt.dayofweek
df['month'] = df['date'].dt.month
df['is_weekend'] = df['dayofweek'].isin([5, 6]).astype(int)
return df
強み: 外部特徴量(天候、イベント、プロモーション)を柔軟に組み込める 弱み: 時系列の自己相関構造を直接モデル化しない
Facebook Prophet
トレンド + 季節性 + 祝日効果を加法的にモデル化する。ビジネスユーザーにも扱いやすい設計。
from prophet import Prophet
model = Prophet(
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False,
holidays=holidays_df
)
model.fit(train_df) # columns: ds, y
forecast = model.predict(future_df)
手法の比較と選定基準
| 基準 | 統計的手法 | ML手法 | DL手法 |
|---|---|---|---|
| データ量 | 少量でOK | 中〜大量 | 大量必要 |
| 解釈性 | 高い | 中程度 | 低い |
| 外部変数 | 限定的 | 柔軟 | 柔軟 |
| 季節性 | SARIMA対応 | 特徴量で対応 | 自動学習 |
| 実装コスト | 低い | 中程度 | 高い |
| 複数系列 | 個別モデル | 共通モデル可 | 共通モデル可 |
選定フローチャート
データ量が少ない?
├── Yes → 統計的手法(ARIMA/ETS)
└── No → 外部変数が重要?
├── Yes → ML手法(LightGBM + 特徴量エンジニアリング)
└── No → 複数系列を同時予測?
├── Yes → DL手法(TFT)or ML手法
└── No → Prophet or SARIMA
Store Salesデータセットへの適用方針
Kaggle Store Sales - Time Series Forecastingでは、以下の特徴がある。
- 54店舗 x 33商品カテゴリ = 1,782の時系列
- 約4年分の日次データ
- 外部変数: 石油価格、祝日、地震情報
この特徴を踏まえ、以下の手法を順番に試していく。
- ベースライン: 移動平均、指数平滑法
- 統計的手法: SARIMA
- ハイブリッド: Prophet
- ML手法: LightGBM(特徴量エンジニアリング重視)
- アンサンブル: 複数モデルの組み合わせ
まとめ
| 項目 | ポイント |
|---|---|
| 手法の3分類 | 統計的手法、機械学習、ディープラーニング |
| 選定基準 | データ量、外部変数の重要性、解釈性要求 |
| Store Salesへの方針 | 複数手法を試してアンサンブル |
| 最重要の手法 | LightGBM(外部変数活用)+ Prophet(季節性) |
チェックリスト
- 需要予測手法の3分類を説明できる
- 各手法の強みと弱みを比較できる
- ARIMA/SARIMAのパラメータの意味を理解した
- 手法選定のフローチャートを使える
次のステップへ
需要予測手法の全体像を把握したところで、次は演習で需要予測フレームワークを設計しよう。
推定読了時間: 30分