お役立ち記事

BLOG

>

>

需要予測の各種手法をPythonで実装する方法を解説

最終更新日:
需要予測の各種手法をPythonで実装する方法を解説

需要予測はビジネスの成功に不可欠ですが、Pythonを活用した予測精度の向上に苦労している方も多いのではないでしょうか。

この記事では、Pythonを使用して需要予測を行う方法を詳しく解説します。需要予測が当たらない原因を探り、AIモデルを活用した予測のメリットを紹介します。

例えば、ARIMAやLSTM、ProphetなどのAIモデルを用いることで、予測精度が向上し、急激な需要変化にも対応可能です。さらに、移動平均法や時系列分析法を含む各種手法をPythonで実装する具体例を提供し、Pythonの基礎知識がある方にも実践的なスキルを身につけるお手伝いをします。


需要予測の手法の選び方ガイドを配布中
初めてでも自社に合った手法が丸わかり!
資料を見てみる

需要予測とは?

需要予測の定義

需要予測とは、将来的にある商品やサービスがどの程度の需要が見込まれるかを推測することを指します。この予測は、企業が効率的に商品やサービスの生産スケジュールを立てたり、在庫を適切に管理したりするために活用されます。ただし、需要を予測すること自体は誰にでも可能ですが、その予測が正確であるとは限りません。そのため、需要予測は今後の生産計画や在庫管理におけるリスクを抑えるための手段として推奨されます。

需要予測について詳しく知りたい方は、以下の記事で詳細を解説していますので、ご参考にしてください。
需要予測の基本的な概念から、直面する課題とその解決策、そして精度を高めるためのポイントがよくわかる内容となっています。
需要予測とは?その意義から手法、最新の活用事例まで徹底解説

需要予測が必要な理由

サプライチェーンマネジメント(SCM)において、需要予測は非常に重要な役割を果たします。サプライチェーンマネジメント(SCM) とは、原材料の調達から製造、物流、販売、消費者への配送までの一連の流れを最適化する管理手法のことです。

なぜなら、複数期間にわたる在庫管理や生産計画を立てる際に、需要予測がなければ、どのタイミングでどの程度生産し、どれだけの在庫を保持すべきかという最適化問題に対応できないからです。

具体的な問題として、需要予測がなければ在庫を適切に管理することが難しくなり、担当者の判断に依存して余剰在庫を抱えてしまうことがあります。この結果、CCC(Cash Conversion Cycle:資金を原料に変えてから最終的に現金に戻るまでの期間)が延びるなどの問題が発生する可能性があります。

さらに、事前に需要予測を行うことで、たとえ予測が実際の需要と異なった場合でも、そのズレに対応するオペレーション計画を立てておくことが可能です。したがって、予測の精度に関わらず、需要予測をしっかり行うことは非常に重要です。

需要予測が当たらない3つの原因

需要予測が「完全に」当たることはほとんどありませんが、それが役に立たない、または使用すべきでないというわけではありません。そこでこの章では、需要予測の精度を少しでも向上させる方法を説明します。

まず、需要予測が「完全に」的中しない原因について考察します。

  • データの質に問題がある
  • 予測の目的や手法に問題がある
  • 避けることができない外部要因の影響

これらの原因についてそれぞれ詳しく見ていきます。

データの質に問題がある

需要予測が当たらない原因として、まず挙げられるのが「データの質に問題がある」ことです。需要予測は、過去のデータを基に未来を予測するため、データの質が予測の精度に直結します。データの不完全さや不正確さ、欠損値の存在、さらには過去のデータが現在の市場状況を反映していない場合、予測結果に大きな誤差が生じます。

予測の目的や手法に問題がある

次に、「予測の目標設定・やり方に問題がある」ことです。予測の目的が明確でなかったり、使用する手法がその目的に適していなかったりすると、期待する成果は得られません。具体的には、短期的な変動を予測したいのに、長期的なトレンドを重視した手法を用いた場合などが該当します。

避けることができない外部要因の影響

最後に、「避けられない外部要因の影響」が挙げられます。経済状況の変化、自然災害、政治的な要因など、企業の努力では制御しきれない外部要因が需要に影響を与えることがあります。これらの要因は予測モデルに組み込むことが難しく、予測の精度を低下させる要因となります。需要予測を改善するには、データの質を高め、目的に合った手法を選び、外部要因を考慮した柔軟なアプローチが必要です。

需要予測にAIモデルを用いるメリットは?

予測精度が上がる

AIモデルを需要予測に導入することにより、ビジネスにおけるさまざまなメリットを享受できます。まず、AIモデルは大量のデータを迅速かつ正確に処理する能力があります。これにより、従来の手法よりも高い予測精度を実現できるのが大きな利点です。特に、AIは過去のデータからパターンを学習し、未来の需要をより正確に予測するため、在庫管理や生産計画における誤りを大幅に減少させることが可能です。

カスタマイズ性の高さ

さらに、AIモデルは非常に柔軟でカスタマイズ性が高いため、特定の業種や市場の特性に合わせた予測が可能です。これにより、企業は自社のニーズに最も適したモデルを選択し、導入することができます。また、AIは需要の急激な変化にも対応可能です。例えば、突発的なイベントや市場のトレンド変化にも迅速に対応でき、予測の精度を維持します。

需要の急激な変化にも対応可能

加えて、AIモデルは継続的に学習を重ねることで、予測の精度を向上させ続けます。これにより、時間が経つほどに予測能力が進化し、ビジネスの戦略的な意思決定をより強力にサポートします。最後に、AIを用いることで、スタッフの予測業務にかかる時間や労力を削減し、より戦略的な業務にリソースを割り当てることができるため、企業全体の効率化にも寄与します。これらのメリットは、AIが今後ますます多くの企業で需要予測手法として採用される理由となっています。

AI予測について詳しく知りたい方は、こちらの記事をご覧ください。
AI予測の仕組み、メリットとデメリット、活用事例についてよくわかる内容になっています。
AI予測とは?なぜ必要?知っておきたい仕組みや導入のメリットまで解説

AIモデルの種類

需要予測に用いられるAIモデルは多岐にわたります。

それぞれのモデルは異なるデータやパターンに強みを持っており、ビジネスの特性に応じて最適なモデルが異なることがあります。

このセクションでは、代表的な「ARIMAモデル」「LSTM」「Prophet」の3つのモデルを取り上げ、それぞれの特徴について詳しく見ていきましょう。

ARIMAモデル

特徴説明
実装が比較的容易Pythonや、Excelなどでパッケージを用いて使用できる
解釈性数学的に理解がしやすく、モデルの構造やパラメータについて把握した上でユーザーがモデルの調整を行える
柔軟なモデルである非線形や定常・非定常データ、季節データなど、様々な時系列データに対して適用できる

ARIMA(Autoregressive Integrated Moving Average)モデルは、時系列データの予測に広く使用される統計的手法です。このモデルは、自己回帰(AR)、差分(I)、移動平均(MA)の3つの要素を組み合わせて、過去のデータから未来の値を推定します。ARIMAモデルは特に、データがトレンドや季節性を持たない場合に有効で、過去の観測値に基づいて未来を予測するため、データのパターンを捉えるのに優れています。

ARIMAモデルを使用する際の第一歩は、データが定常かどうかを確認することです。定常でないデータに対しては、差分を取ることで定常化を図ります。次に、自己回帰次数(p)、差分次数(d)、移動平均次数(q)を決定する必要があります。これらのパラメータは、データの特徴に応じて最適な値を選定し、モデルの精度を最大化します。

このモデルは、売上予測や在庫管理、さらには金融市場の分析など、さまざまな分野での需要予測に応用されており、データの傾向を活かした精度の高い予測が可能です。ARIMAモデルを適切に利用することで、業務の効率化やリソースの最適配分に貢献することができます。

LSTM

特徴説明
非線形データへの相性非線形なデータや複雑な時系列パターンをモデリングするのに優れている
長期記憶に強い時系列データの長期記憶も保持しつつ新しい記憶をインプットしていくことが可能

LSTM(Long Short Term Memory)は、時系列データに対するニューラルネットワークの一種です。

LSTMモデルでは下記のイメージ図のように、長期的な情報と短期的な情報を同時に保持し、不要になった長期的な情報を忘れ、新しい情報を取り入れるプロセスが組み込まれています。

このモデルはデータ内の複雑な非線形の関係性を捉えることに優れており、特に大量のデータがある場合にその力を発揮します。

Prophet

特徴説明
外れ値に強い外れ値に対して頑健であり、データの不安定性や異常値の存在があっても安定した予測が可能
オープンソースで広く利用されているFacebookが開発・メンテナンスしており、豊富なドキュメントやコミュニティサポートを利用できる

 

Prophetは、Facebookが開発した時系列データの予測に特化したツールで、シンプルで使いやすいのが特徴です。季節変動や祝日などの時間的要因を柔軟に考慮し、トレンドの変化に対応することができます。その使いやすさとパラメータの調整のしやすさから、初めての方にも適したAIモデルです。

AIモデルによる需要予測の事例

ARIMAモデルを用いた需要予測

ARIMAモデルは過去のデータパターンに基づいて予測を行うため、短期的な予測において特に有効です。例えば、小売業や製造業において、在庫管理や生産計画の最適化に活用され、多くの企業がその精度の高さを評価しています。さらに、このモデルはユーザーが設定するパラメータによってカスタマイズ性が高く、特定のビジネスニーズに合わせた予測が可能です。

ある小売業界において、スーパーマーケットの商品需要を予測するためにARIMAモデルが活用されました。

過去の販売データから学習したARIMAモデルを使用して将来の需要を予測し、在庫管理を最適化した結果、在庫コストの削減、機会損失の低減、そして顧客満足度の向上が実現しました。

LSTMを用いた需要予測

LSTMは、過去のデータから重要な情報を長期にわたり保持し、短期的な変動も同時に捉えることができるため、特に需要の変動が激しい市場において有用です。例えば、季節変動やトレンドの変化を反映しやすく、企業はこれによりより正確な需要予測が可能になります。

さらにLSTMは、異常検知や予測の自動化にも対応可能であり、需要が急激に変動する状況にも迅速に対応できます。これにより、在庫管理の最適化や、供給チェーンの効率化にも貢献します。例えば、予測された需要に基づいて最適な発注量を決定することで、過剰在庫や品切れを防ぐことが可能です。

ある製造業では、機械の故障データや生産量を元に、将来の需要を予測し、生産計画を最適化するためにLSTMを利用しています。

LSTMはデータ内の複雑な時系列の関係を学習し、非線形のパターンにも対応できるため、導入前に比べてより効率的な生産計画を達成しました。

Prophetを用いた需要予測

Prophetは、トレンド、季節性、休日効果などの複雑なパターンを自動的に捉えることで、未来の需要を予測する能力に優れています。異なる季節性やイベントの影響を考慮に入れることができるため、より現実的な予測が可能になります。

例えば、小売業におけるセールスのピークや製造業の生産スケジュールにおける需要の変動を正確に予測するために、特定の季節性やイベントをモデルに組み込むことができます。

需要予測のそれぞれの手法については、以下の記事でさらに詳しく解説しています。
需要予測の手法や、予測に用いられるツール、各職種・業界での具体的な事例がよくわかる内容になっています。
需要予測5つの手法!ビジネスに活用した事例までわかりやすく解説

需要予測の各種手法

サンプルデータの生成

需要予測の手法を解説する前に、Pythonでサンプルデータを生成します。

このコードを実行すると、2022年1月1日から2024年12月31日までの需要データ を生成できます。

# ライブラリのインポート
import numpy as np
import pandas as pd
# 疑似乱数の設定(再現性の確保)
np.random.seed(1)
# 2022/1/1 〜 2024/12/31 までの日付データを生成
date_range = pd.date_range(start='2022-01-01', end='2024-12-31', freq='D')
# 需要データの生成(正規分布 + 周期性)
demand_data = np.random.normal(loc=50, scale=10, size=len(date_range)) + np.sin(np.linspace(0, 6*np.pi, len(date_range)))
# DataFrame にまとめる
data = pd.DataFrame({'Date': date_range, 'Demand': demand_data})

以下のコードを実行すると、2022年1月1日から2024年12月31日までの需要データを可視化できます。

# ライブラリのインポート
import matplotlib.pyplot as plt
import japanize_matplotlib

# データの可視化
plt.figure(figsize=(12, 5))
plt.plot(data['Date'], data['Demand'], label="実績値", color="blue")
plt.xlabel("日付")
plt.ylabel("需要量")
plt.title("需要予測サンプルデータ (2022-2024)")
plt.legend()
plt.show()

2022年1月1日から2024年12月31日までの需要データの可視化画像は以下のようになります。

青い線は日ごとの需要の変動を示しており、ランダムなノイズと周期的な変動が見て取れます。

以下では代表的な手法を用いてサンプルデータについて需要予測をしていきます。

移動平均法

移動平均を追加することで、日々の需要の変動を滑らかにし、長期的なトレンドを把握しやすくなります。

移動平均(rolling mean) とは、一定の期間(例えば7日間や30日間)の平均値を計算する方法です。

例えば、7日間の移動平均を計算する場合:

sales_rolling_7[i] = (sales[i-6] + sales[i-5] + … + sales[i]) / 7

つまり、直近7日間の売上の平均を現在の日付に適用します。これにより、短期的な変動を滑らかにし、全体の傾向が見やすくなります。

コードの解説

移動平均の計算

  • rolling(window=30).mean() を使い、30日間の移動平均を計算。
  • NaN(最初の30日間の平均が取れない部分)はそのまま。

移動平均を追加したコード

以下のコードを実行するとプロットが日本語になります。

# 30日間の移動平均を計算
data['rolling_mean_30'] = data['Demand'].rolling(window=30).mean()
# 可視化
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 5))
plt.plot(data['Date'], data['Demand'], label="実績値", color="blue", alpha=0.5)
plt.plot(data['Date'], data['rolling_mean_30'], label="30日移動平均", color="red", linewidth=2)
plt.xlabel("日付")
plt.ylabel("需要量")
plt.title("需要量の30日移動平均 (2022-2024)")
plt.legend()
plt.show()

このコードのポイント

1. data[‘rolling_mean_30’] = data[‘Demand’].rolling(window=30).mean()

  • 30日間の移動平均 を rolling_mean_30 カラムとして追加
  • window=30 は「過去30日間のデータ」を考慮することを意味します。

2. plt.plot(data[‘Date’], data[‘Demand’], label=”実績値”, color=”blue”, alpha=0.5)

  • 元の需要データ(青色) を薄め(alpha=0.5)に表示し、移動平均と区別。

3. plt.plot(data[‘Date’], data[‘rolling_mean_30’], label=”30日移動平均”, color=”red”, linewidth=2)

  • 赤色で移動平均を表示(linewidth=2 で太く)

4. plt.legend()

  • 凡例を表示(どの線が何を表すか分かりやすく)

こちらが 30日間の移動平均を追加した需要データを可視化したグラフです。

  • 青色の線日ごとの需要データ(元のデータ)
  • 赤色の線30日間の移動平均(トレンドを滑らかに)

移動平均のポイント

  • 青線は日ごとの変動が激しく、短期的なノイズが多い
  • 赤線(30日移動平均)は滑らかで、全体の傾向が見えやすい

この方法により、長期的な需要の傾向を把握しやすくなるため、需要予測の前処理や分析に役立ちます。

加重移動平均法

加重移動平均法(Weighted Moving Average、WMA)は、通常の移動平均とは異なり、新しいデータにより大きな重みを与える手法です。

これにより、最新のデータをより重視しながら、トレンドを滑らかにすることができます。

加重移動平均(WMA)を計算するには、numpyconvolve()関数を使用するのが便利です。

コードの流れ

1. 加重移動平均の重みを設定
2. 各データポイントに重みをかけて加重移動平均を計算
3. 元のデータと加重移動平均を可視化

      実装コード

      # 加重移動平均を計算する関数
      def weighted_moving_average(data, window):
      weights = np.arange(1, window + 1) # 1, 2, ..., window の重み
      wma = np.convolve(data, weights/weights.sum(), mode='valid') # 加重平均を計算
      return np.concatenate([np.full(window-1, np.nan), wma]) # 最初の (window-1) 個は NaN にする
      # 7日間の加重移動平均を計算
      window_size = 7
      data['wma_7'] = weighted_moving_average(data['Demand'].values, window_size)
      # 可視化
      plt.figure(figsize=(12, 5))
      plt.plot(data['Date'], data['Demand'], label="実績値", color="blue", alpha=0.5)
      plt.plot(data['Date'], data['wma_7'], label="7日間加重移動平均", color="orange", linewidth=2)
      plt.xlabel("日付")
      plt.ylabel("需要量")
      plt.title("需要量の7日間加重移動平均 (2022-2024)")
      plt.legend()
      plt.show()

      コードの解説:加重移動平均を計算

      • weights = np.arange(1, window + 1) で 1, 2, …, window の線形的な重みを作成
      • np.convolve(data, weights/weights.sum(), mode=’valid’) で加重平均を適用
      • np.concatenate([np.full(window-1, np.nan), wma]) で 最初の数値が足りない部分を NaN に補完

      こちらが 加重移動平均(Weighted Moving Average、WMA)を適用した需要データを可視化 したグラフです。

      • 青色の線元の需要データ(ノイズあり)
      • オレンジ色の線7日間の加重移動平均(新しいデータを重視)

      加重移動平均のポイント

      • 単純移動平均よりも、新しいデータをより重視する(直近のトレンドを捉えやすい)
      • 短期的な変動を滑らかにしつつ、トレンドの変化を適度に反映
      • 指数平滑法(EMA)よりも直感的に理解しやすい(線形的な重み付け)

      加重移動平均は、需要予測や在庫管理の分析 に活用できます。

      指数平滑法(EWM:Exponentially weighted method)

      指数平滑法(Exponential Smoothing)は、時系列データの変動を滑らかにし、トレンドをより明確にする手法です。

      移動平均(Rolling Mean)と異なり、過去のデータに指数的な重みを与えることで、新しいデータにより敏感に反応できます。

      指数平滑法の特徴

      • 移動平均よりも新しいデータを重視できる
      • 過去のすべてのデータを考慮しつつ、重みを指数的に減少
      • 短期的な変動を抑えながら、全体のトレンドを反映

      Pythonの statsmodels ライブラリの SimpleExpSmoothing を使用すると簡単に計算できます。

      • 指数平滑法(α=0.2)を適用(SimpleExpSmoothing を使用)
      • 元のデータと指数平滑化したデータを可視化
      • 指数平滑法の効果を確認

      実装コード

      # 必要なライブラリのインポート
      from statsmodels.tsa.holtwinters import SimpleExpSmoothing
      import matplotlib.pyplot as plt
      # α(スムージング係数)の設定
      alpha = 0.2
      # モデルの適用
      model = SimpleExpSmoothing(data['Demand'])
      fitted_model = model.fit(smoothing_level=alpha, optimized=False)
      data['exponential_smoothing'] = fitted_model.fittedvalues
      # 可視化
      plt.figure(figsize=(12, 5))
      plt.plot(data['Date'], data['Demand'], label="実績値", color="blue", alpha=0.5)
      plt.plot(data['Date'], data['exponential_smoothing'], label="指数平滑 (α=0.2)", color="green", linewidth=2)
      plt.xlabel("日付")
      plt.ylabel("需要量")
      plt.title("需要量の指数平滑 (2022-2024)")
      plt.legend()
      plt.show()

      コードの解説

      1. SimpleExpSmoothing(data[‘Demand’])

      • SimpleExpSmoothing を使って指数平滑モデルを作成。

      2. fitted_model = model.fit(smoothing_level=alpha, optimized=False)

      • smoothing_level=alpha でスムージング係数(α)を設定。
      • optimized=False でαの最適化をせず、手動で設定。

      3. data[‘exponential_smoothing’] = fitted_model.fittedvalues 

      • 計算した指数平滑値を新しい列 exponential_smoothing に保存。

      以下が 指数平滑法(Exponential Smoothing)を適用した需要データを可視化したグラフです。

      • 青色の線日ごとの需要データ(元のデータ)
      • 緑色の線指数平滑法(α=0.2)で滑らかにしたデータ

      指数平滑法のポイント

      • 青線は日ごとの変動が激しい(ノイズあり)。
      • 緑線(指数平滑)は新しいデータを考慮しつつ、過去のデータを滑らかに反映。
      • 移動平均よりも変動に敏感で、新しいトレンドを素早く反映 できる。

      この方法は 短期的な需要予測やトレンド分析に役立つので、移動平均と組み合わせることでより精度の高い分析が可能になります。

      時系列分析法 (機械学習:NeuralProphet)

      時系列分析(Time Series Analysis) とは、時間の経過とともに変化するデータを解析し、パターンやトレンドを見つける手法 です。

      例えば、需要予測、株価分析、気温予測、経済指標の分析などに利用されます。

      時系列データは、主に以下の4つの要素で構成されます。

      カテゴリ説明
      トレンド(Trend)長期的な上昇・下降の傾向人口の増加、経済成長
      季節性(Seasonality)一定の周期で繰り返すパターン夏にエアコンの需要が増加
      周期変動(Cyclic Variation)不規則な経済サイクルのような変動景気の好不況
      ランダム性(Irregular Component)予測不能な変動自然災害、パンデミック

      時系列分析では、統計的手法と機械学習手法 の両方を使用できます。今回は、PythonでProphetを使った時系列分析のやり方を解説します。

      それでは、Prophetモデルを使って、2022年〜2024年の需要データを分析します。

      実装コード

      # 必要なライブラリのインポート
      from prophet import Prophet
      # data を Prophet の形式に合わせる
      data_prophet = data.rename(columns={'Date': 'ds', 'Demand': 'y'}) # Prophetは 'ds'(日付)と 'y'(値)を使う
      # Prophet モデルの定義と学習
      model = Prophet()
      model.fit(data_prophet)
      # 1年(365日)先までの予測データを作成
      future = model.make_future_dataframe(periods=365, freq='D')
      forecast = model.predict(future)
      forecast = forecast[forecast['ds'] >= pd.to_datetime('2025-01-01')]
      # 予測結果の可視化
      plt.figure(figsize=(12, 5))
      plt.plot(data_prophet['ds'], data_prophet['y'], label="実績値", color="blue")
      plt.plot(forecast['ds'], forecast['yhat'], label="予測値", color="red")
      plt.xlabel("日付")
      plt.ylabel("需要量")
      plt.title("Prophet モデルによる需要予測")
      plt.legend()
      plt.show()

       以下がProphetモデルを適用した時系列データの予測結果のグラフです。

      • 青色の線元の需要データ(2022年〜2024年)
      • 赤色の線Prophetで予測した2025年の需要データ

      この予測結果を基に、将来の需要傾向を分析し、在庫管理やビジネス戦略に役立てることができます


      誰でも簡単に扱えるAIで手軽に需要予測を始めてみませんか?
      お客様の業界に精通した専任担当が導入前後で手厚く支援いたします。
      資料を見てみる

      まとめ

      Pythonを使った需要予測は、ビジネスの効率化や顧客満足度の向上に大きく貢献します。しかし、正確な予測を行うためには、適切なモデル選びやデータの質が重要です。本記事で紹介したARIMA、LSTM、ProphetなどのAIモデルを活用し、実際のデータに基づいた予測を行うことで、予測精度を向上させることができます。まだPythonを使った需要予測に取り組んでいない方は、ぜひ一度挑戦してみてください。まずは自身のビジネスに合った手法を見極め、適用してみることが次のステップです。また、データの収集や前処理をしっかり行うことで、より信頼性の高い予測が可能になります。