LESSON

需要予測手法の全体像

「需要予測の手法は星の数ほどある。重要なのは、どの手法が自社のデータと課題に合っているかを見極めることだ。」

田中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年分の日次データ
  • 外部変数: 石油価格、祝日、地震情報

この特徴を踏まえ、以下の手法を順番に試していく。

  1. ベースライン: 移動平均、指数平滑法
  2. 統計的手法: SARIMA
  3. ハイブリッド: Prophet
  4. ML手法: LightGBM(特徴量エンジニアリング重視)
  5. アンサンブル: 複数モデルの組み合わせ

まとめ

項目ポイント
手法の3分類統計的手法、機械学習、ディープラーニング
選定基準データ量、外部変数の重要性、解釈性要求
Store Salesへの方針複数手法を試してアンサンブル
最重要の手法LightGBM(外部変数活用)+ Prophet(季節性)

チェックリスト

  • 需要予測手法の3分類を説明できる
  • 各手法の強みと弱みを比較できる
  • ARIMA/SARIMAのパラメータの意味を理解した
  • 手法選定のフローチャートを使える

次のステップへ

需要予測手法の全体像を把握したところで、次は演習で需要予測フレームワークを設計しよう。

推定読了時間: 30分