需要予測の先は数理最適化か?予測との違いと進むべき企業の特徴

産業インサイト・課題解決///

需要予測のモデルを整え、将来の需要を数値で見通せるようになった。それでも、その値を生産量・在庫配置・配送へ落とし込む段階では、担当者の経験とExcelによる調整が続いている。製造業・卸売業・小売業の計画部門では、こうした状況は珍しくありません。

予測精度を高める取り組みには、確かに価値があります。ただし、予測精度が上がっても、在庫や欠品が思うように改善しないことがあります。工場の能力、倉庫の容量、コスト、ロット、リードタイムなどの条件が絡み合うため、「予測値を知っていること」と「全体として良い計画を決められること」は別の課題だからです。

最初に決めたいのは、予測モデルをさらに改良するかどうかではなく、「予測値をもとに、何を決め、何を守り、何を良しとするか」を言葉にすることです。この問いが整理されて初めて、数理最適化が役立つ段階かどうかを判断できます。

本記事では、予測と最適化(処方的分析)の違い、数理最適化に進むべき企業の特徴、決定変数・制約条件・目的関数の整理方法を解説し、工場・倉庫・地域の簡易な配分例を紹介します。本記事の数値はすべて説明用の架空データであり、実際の効果を示すものではありません。

需要予測ができても、計画の悩みが減らないのはなぜか

需要予測は「将来の需要がどの程度になりそうか」を示します。一方で、「どの工場で、どれだけ生産し、どの倉庫に置き、どの経路で運ぶか」までは示しません。この間を埋めるのが計画業務であり、多くの現場では担当者の経験とExcelが担っています。

条件が少ないうちは、この進め方で十分に機能します。しかし、能力、容量、輸送コスト、生産ロット、リードタイム、欠品の許容度などが同時に関係すると、実行可能な計画は作れても、それが全体として良い計画かどうかを比較・確認することが難しくなります。

また、予測の誤差を小さくすることと、その予測を使った意思決定の質を高めることは、同じとは限らないという指摘があります(Elmachtoub and Grigas, 2022)。予測精度を改善しても在庫や欠品が変わりにくい背景には、予測値を判断に変換する部分の課題が残っている場合があります。

  • 予測値を生産量・在庫配置・配送へ落とす作業が、経験とExcelに依存している
  • 条件が多く、できあがった計画が全体として良いのか判断しにくい
  • 予測精度を改善しても、在庫や欠品の状況が変わりにくい
  • 需要変動に対して、計画の修正が追いつかない

ただし、これらがすべて数理最適化で解決するという意味ではありません。業務ルールが整理されていない場合や、条件のデータが把握できていない場合は、先に取り組むべきことがあります。

予測と最適化(処方的分析)は何が違うのか

データ分析は、一般に「何が起きたか」「何が起きるか」「何をすべきか」という三つの段階で整理されます(Lepenioti et al., 2020)。

分析の三つの段階

記述的分析

何が起きたか

主な内容出荷実績・在庫推移の集計と可視化

人の役割状況の把握

予測的分析

何が起きるか

主な内容需要予測など、将来の見通しの推定

人の役割見通しを踏まえた計画の立案

処方的分析(数理最適化など)

何をすべきか

主な内容条件のもとで、計画案の候補を算出

人の役割計画案の評価・修正・判断

概念図であり、すべての企業が第3段階まで進む必要があることを意味しません。

記述的分析(Descriptive Analytics)は、過去に何が起きたかを集計・可視化します。予測的分析(Predictive Analytics)は、これから何が起きそうかを推定します。需要予測はここに位置します。処方的分析(プリスクリプティブ分析、Prescriptive Analytics)は、予測や条件を踏まえて、何をすべきかの候補を示します。

数理最適化(Mathematical Optimization)は、処方的分析を実現する代表的な手法のひとつです。守るべき条件のもとで、定めた指標を最も良くする決め方を、数式を用いて探索します。処方的分析にはシミュレーションやルールベースの方法もあり、数理最適化だけを指すものではありません。

ここで切り分けたいのは、「予測が当たること」と「計画が良いこと」は別だという点です。予測は最適化への入力のひとつにすぎず、制約条件と目的関数が定義されていなければ、最適化は動きません。また、最適化が出す「最適」は、設定したモデルの中での最適です。現実の業務で最適であることを意味するものではありません。

数理最適化まで進むべき企業の特徴は何か

次の表は、数理最適化まで進むことを検討したい状態と、現時点では不要な可能性があるケースを対比したものです。当てはまる観点が多いほど検討の価値は高まりますが、数で機械的に判断するものではありません。

観点検討したい状態まだ不要な可能性があるケース
拠点・品目・制約が多い複数の工場・倉庫・品目があり、能力・容量・リードタイムなどが同時に絡む拠点や品目が少なく、経験者が短時間で全体を見渡せる
トレードオフがある生産・輸送・在庫のコストと欠品リスクなど、一方を優先すると他方が悪化する優先順位が明確で、選択肢が実質的にひとつに定まる
見直し頻度が高い週次・日次で計画を引き直しており、手作業の再計算が負担になっている見直しが四半期に一度程度で、手作業でも対応できる
根拠の説明を求められる計画の理由を経営層・他部門・取引先に説明する必要がある説明の機会が限られ、計画の根拠が関係者に共有されている
計画が属人化している特定の担当者の頭の中に判断ルールがあり、引き継ぎが難しい判断ルールが文書化され、担当者が替わっても運用できる

ただし、これは「小規模な事業には不要」という意味ではありません。拠点が少なくても、条件の絡み方が複雑であれば検討に値する場合があります。反対に、条件が多くても、業務ルールが定まっていなければ、先にルールの整理が必要です。

着手の前に、次の4点を手元で確認してみてください。ひとつでも曖昧であれば、そこが最初の整理対象になります。

  1. 計画の単位(品目・拠点・期間)が決まっている
  2. 能力・容量・コストなどの条件について、一次情報の所在が分かる
  3. 現行計画の結果が記録として残っている
  4. 計画の良し悪しを測る指標(コスト、欠品など)が共有されている

決定変数・制約条件・目的関数をどう整理するか

数理最適化の入口は、ツールの選定ではなく、計画業務を三つの要素に分けて言葉にすることです。

  • 決定変数(Decision Variables):計画担当者が決めたい量。例:工場ごとの生産量、倉庫への輸送量
  • 制約条件(Constraints):守るべき条件。例:工場の能力、倉庫の容量
  • 目的関数(Objective Function):計画の良し悪しを測る指標。例:総コスト

制約条件は、性質によって二つに分けて考えると整理しやすくなります。ハード制約は、例外なく守る必要がある条件です(設備の物理的な能力など)。ソフト制約は、破ることを許容する代わりに、不利益(ペナルティ)を目的関数に加える条件です(欠品など)。次の表は、本記事の簡易例を整理シートの形にしたものです。

項目内容(本記事の例)区分データの所在
決定変数工場から倉庫への輸送量、倉庫から地域への配送量、地域ごとの欠品量該当なし現行の計画表
工場能力各工場の月間生産量は能力以下ハード制約生産管理部門の能力表
倉庫容量各倉庫の月間取扱量は保管容量以下ハード制約物流部門の拠点台帳
入出庫バランス倉庫に入る量と出る量が等しい(在庫の繰り越しは簡略化のため考慮しない)ハード制約倉庫管理の記録
需要充足地域の需要は、配送量と欠品量の合計で満たすソフト制約(欠品を許容しペナルティを課す)需要予測値
目的関数生産・輸送・配送のコストと欠品ペナルティの総コストを最小化該当なし原価表、運賃表

この表で「需要充足」をソフト制約にしている点に注目してください。需要を必ず満たす条件だけを置くと、能力が足りない局面で解が存在しなくなります。欠品を許容してペナルティを課す形にすると、足りない分をどこに寄せるかをモデルが示せます。ペナルティの大きさは業務上の優先順位に依存するため、実務では個別の設計が必要です。

簡易例:工場・倉庫・地域への配分を考える

ここからは、説明用の仮想例です。工場2か所、倉庫2か所、地域4か所からなる単純なネットワークを考えます。数値はすべて架空の疑似データで、実在の企業や業界の状況を表すものではありません。コストは任意のコスト単位で示します。

簡易例のネットワーク構成(架空の疑似データ)

工場

工場A月間生産能力 1,000/単位生産コスト 低め

工場B月間生産能力 800/単位生産コスト 高め

輸送
4経路

倉庫

倉庫X保管容量 900

倉庫Y保管容量 700

配送
8経路

地域(需要予測値)

東日本450

中部300

西日本500

九州250

すべての工場から両倉庫へ、すべての倉庫から全地域へ供給できると仮定した概念図です。経路ごとの単位コストは下表に示します。

工場月間生産能力単位生産コスト倉庫Xへの単位輸送コスト倉庫Yへの単位輸送コスト
工場A1,0001036
工場B8001342
倉庫東日本(450)中部(300)西日本(500)九州(250)
倉庫X2368
倉庫Y6423

欠品は許容し、欠品1単位あたり40のペナルティを全地域共通で置きます。この値は、どの経路を通る場合の単位コストの合計よりも高くなるよう、説明用に設定したものです。決めたい量(決定変数)は、工場から倉庫への輸送量、倉庫から地域への配送量、地域ごとの欠品量です。制約と目的関数は表2のとおりです。

Pythonで確認する線形計画モデルの例

この問題を、Pythonの線形計画ライブラリPuLP(Mitchell et al., 2011)で記述した教育用の簡略版が次のコードです。線形計画法(Linear Programming、LP)は、目的関数と制約条件がすべて一次式で表せる問題を扱う手法です(Bertsimas and Tsitsiklis, 1997)。特定の製品やサービスを推奨するものではありません。

import pulp

# 1. 疑似データ(すべて架空の値)
plants = {"A": 1000, "B": 800}        # 工場の月間生産能力
prod_cost = {"A": 10, "B": 13}        # 単位生産コスト
whs = {"X": 900, "Y": 700}            # 倉庫の保管容量
demand = {"East": 450, "Chubu": 300, "West": 500, "Kyushu": 250}  # 需要予測値
t1 = {("A", "X"): 3, ("A", "Y"): 6, ("B", "X"): 4, ("B", "Y"): 2}  # 工場から倉庫の単位輸送コスト
t2 = {("X", "East"): 2, ("X", "Chubu"): 3, ("X", "West"): 6, ("X", "Kyushu"): 8,
      ("Y", "East"): 6, ("Y", "Chubu"): 4, ("Y", "West"): 2, ("Y", "Kyushu"): 3}  # 倉庫から地域の単位配送コスト
penalty = 40                          # 欠品1単位あたりのペナルティ

# 2. 決定変数(0以上の連続量)
x = pulp.LpVariable.dicts("x", list(t1), lowBound=0)      # 工場から倉庫への輸送量
y = pulp.LpVariable.dicts("y", list(t2), lowBound=0)      # 倉庫から地域への配送量
s = pulp.LpVariable.dicts("s", list(demand), lowBound=0)  # 地域ごとの欠品量
m = pulp.LpProblem("allocation", pulp.LpMinimize)

# 3. 制約条件
for p, cap in plants.items():
    m += pulp.lpSum(x[p, w] for w in whs) <= cap           # 工場能力
for w, cap in whs.items():
    m += pulp.lpSum(x[p, w] for p in plants) <= cap        # 倉庫容量
    m += (pulp.lpSum(x[p, w] for p in plants)
          == pulp.lpSum(y[w, r] for r in demand))          # 入出庫バランス
for r, d in demand.items():
    m += pulp.lpSum(y[w, r] for w in whs) + s[r] == d      # 需要充足(欠品を許容)

# 4. 目的関数(総コストの最小化)
m += (pulp.lpSum((prod_cost[p] + t1[p, w]) * x[p, w] for p, w in t1)
      + pulp.lpSum(t2[k] * y[k] for k in t2)
      + pulp.lpSum(penalty * s[r] for r in demand))

# 5. 求解と結果表示
m.solve(pulp.PULP_CBC_CMD(msg=False))
print(pulp.LpStatus[m.status], pulp.value(m.objective))
for v in m.variables():
    if v.value() > 1e-6:
        print(v.name, round(v.value()))
Python
  • 1:入力データです。表3・表4と同じ数値を、能力・容量・コスト・需要として並べています。
  • 2:決めたい量を「変数」として宣言します。最初は値が決まっておらず、求解で決まります。
  • 3:守る条件です。工場は能力以下、倉庫は容量以下、倉庫に入った量と出た量は等しく、各地域は配送量と欠品量の合計で需要を満たします。
  • 4:良し悪しの基準です。生産・輸送・配送のコストと、欠品ペナルティの合計を最小にします。
  • 5:求解して、状態と総コスト、ゼロでない変数の値を表示します。

これは構造を理解するための簡略版です。実務では、データの整備、例外処理、結果の検証が必要になります。本例は量を小数でも扱える線形計画ですが、ロット単位の生産などを扱う場合は次々節で述べる別の枠組みが必要です。

需要上振れや工場の能力低下で、配分はどう変わるか

同じモデルで入力だけを変えると、計画案がどう動くかを比較できます。ここでは次の三つを比べます。基準は上表のとおりです。需要上振れは西日本の需要が20%増の600になる場合、工場B能力低下は工場Bの月間生産能力が800から400に下がる場合です。コード上では、`plants[“B”] = 400` や `demand[“West”] = 600` に書き換えて再実行します。

シナリオ生産コスト工場から倉庫の輸送倉庫から地域の配送欠品ペナルティ総コスト欠品量
基準17,1003,8003,750024,6500
需要上振れ(西日本+20%)18,1004,1004,350026,5500
工場B能力低下(800から400)15,2004,5503,2504,00027,000100
項目基準需要上振れ工場B能力低下
工場Aの生産量8009001,000
工場Bの生産量700700400
倉庫Xの取扱量800900750
倉庫Yの取扱量700700650
倉庫Xから西日本への配送501500
倉庫Yから西日本への配送450450500
倉庫Yから九州への配送250250150
九州の欠品量00100

基準では、欠品なしで総コスト24,650となりました。注目したいのは、倉庫Xから西日本へ50を配送している点です。西日本には倉庫Yのほうが近い設定ですが、倉庫Yの容量700が埋まるため、不足分が倉庫Xから回っています。人の目には不自然に映る配分でも、容量制約から生じた結果であることが、モデルを通すと読み取れます。

需要上振れでは、総需要1,600が倉庫の容量合計1,600と並び、倉庫に余裕がなくなります。倉庫Xから西日本への配送は150に増え、総コストは26,550です。工場の能力にはまだ余裕があり、制約の中心が倉庫容量に移っていることが分かります。さらに上振れする場合は、倉庫容量や追加拠点の検討が論点になります。

工場B能力低下では、総能力1,400が需要1,500を下回るため、100の不足は避けられません。モデルは、配送コストが最も高い九州に欠品を割り当て、総コストは27,000となりました。これは欠品ペナルティを全地域共通としたための結果です。実務では地域や取引先の重要度によって設定が変わるため、個別の設計が必要です。

この結果から、結論を断定することはできません。納期の調整、代替調達、別の工場からの追加といった、モデルに含めていない対応もあります。表にある値は、設定した条件・コスト・ペナルティのもとでの比較であり、現場の知見で修正することを前提とした「人が判断するための根拠ある計画案」として扱うものです。

実務で出てくる論点:線形計画法と混合整数計画法、制約の見直し

簡易例は線形計画法で扱いましたが、実務では次の論点が出てきます。

  • 線形計画法(LP):決定変数を連続量として扱います。小数の配分も許容されるため、大まかな配分の検討に向いています。
  • 混合整数計画法(Mixed Integer Programming、MIP):整数や0・1の変数を含められます。最低ロット、拠点の稼働有無、段取りなどを表現できる一方で、計算の負荷が大きくなる場合があります。
  • 実行可能解がない場合:すべての制約を同時に満たす計画が存在しないと、モデルは「解なし」を返します。入力データの誤りや単位の不一致、制約の過剰がないかを確認し、必要に応じて一部の制約をソフト制約へ見直します。
  • 欠品ペナルティと重み付け:ペナルティの値は、結果の配分を大きく左右します。業務上の優先順位の反映が必要なため、案件ごとの個別設計が前提になります。

大規模な問題の扱い方やペナルティの設計の詳細は、対象業務によって大きく異なります。ここでは、LPとMIPのどちらが適切かを、現場の業務ルールを確認したうえで選ぶ必要があることの指摘にとどめます。

予測の不確実性とどう付き合うか

需要予測は外れることがあります。最適化は、与えられた予測値を前提に計画案を出すため、予測が外れれば計画案も見直しが必要になります。ここでは、モデルを複雑にする前に取りうる3つの対応を整理します。

  • シナリオ比較:前節のように、上振れ・下振れ・供給側の制約変化を並べて、計画案がどう動くかを確認します。
  • 安全在庫(Safety Stock):予測の外れに備えて持つ余裕在庫を、需要の見通しの幅に応じて設定します。点の予測だけでなく、不確実性を含めて予測を表す考え方があります(Gneiting and Katzfuss, 2014)。
  • ローリング計画(Rolling Horizon):一定期間ごとに最新の予測と実績で計画を再計算し、直近の期間だけを実行に移します。

不確実性を確率的に直接扱う確率計画法という発展的な手法もあります(Birge and Louveaux, 2011)。ただし、これは最初から必要という意味ではなく、シナリオ比較で十分な場合も多くあります。時系列データの扱い方については、技術ブログSCI-Naviの関連記事も参考にしてください。

予測から意思決定まで:人の判断と小さく始める進め方

最適化の結果は、答えではなく、人が判断するための材料です。予測値から実行、実績の確認までを一連の流れとして描くと、人の判断が入る位置が見えます。

需要予測から意思決定までの流れ

需要予測値

将来需要の見通し。幅や不確実性も確認する

最適化モデル

制約条件と目的関数を数式で表す

計画案

モデル上で良いとされる配分案。複数シナリオで比較

人の判断・修正

現場の知見で例外を反映し、採否を決める

実行

生産・在庫・配送の指示

実績の確認

予測誤差と、制約の実態を確かめる

フィードバック実績は、次回の予測と制約条件の見直しに使います(ローリング計画)。

人の判断・修正の段階で、現場が計画案を変更した理由を記録しておくと、モデルに入っていなかった制約を発見する手がかりになります。修正が多い箇所は、モデルの改善点でもあります。

進め方は、完璧に整備してから始めるのではなく、小さい範囲で確認する形が現実的です。

  1. Step 1:対象を絞る ひとつの品目群と2〜3拠点など、全体を見渡せる範囲を選びます。
  2. Step 2:整理シートを埋める 表2の形式で、決めること・守ること・良しとする基準を書き出します。
  3. Step 3:現行計画と比べる モデルの計画案と現行計画の差を現場と読み解き、制約の漏れを修正します。

今回の記事を読んだ直後にできる確認として、直近1期分の計画について「何を決めたか」「何を守ったか」「何を重視したか」の3列を書き出してみてください。書き出せない部分が、モデル化の前に整理すべき部分です。なお、整理した結果、「今は進めない」「条件を満たしてから進める」と判断することも、有効な選択肢です。

よくある質問

予測精度が低くても、最適化に意味はありますか

意味がある場合があります。予測が不安定なほど、シナリオ比較で計画案の動き方を確認する価値が高まります。ただし、入力となる予測が極端に不安定な場合は、先にデータや予測の見直しが必要です。最適化は、予測の誤差を補うものではありません。

Excelのソルバーでは足りませんか

変数と制約が少なく、再計算の頻度も低ければ、足りる場合があります。変数と制約が増える、頻繁に再計算する、シナリオを複数比較する、担当者が替わっても再現したいといった状況では、運用面の限界が出てきます。ツールの選定より前に、問題をどう定式化するかが重要です。

どの程度のデータがあれば始められますか

件数での目安は一概に言えません。最低限、表2の項目(能力・容量・コスト・需要予測値)の一次情報が必要です。仮置きの値でも構造は確認でき、その結果から、どの値の精度が計画案に効くかを見て、整備の優先順位を決められます。

最適化の結果を、現場は受け入れてくれますか

受け入れられるかは、結果の見せ方と運用の設計に左右されます。結果を答えとして示すのではなく、計画案とその根拠(どの制約が効いているか)を示し、現場の修正を前提にすることが大切です。修正の理由をモデルに反映していくと、現場の知見が計画に生きる形になります。

まとめ:次に確認したいこと

需要予測と数理最適化は別の課題です。予測は「何が起きそうか」を示し、最適化は条件のもとで「何をすべきか」の候補を示します。ただし、最適化が出す結果は設定したモデル上のものであり、現場の知見による修正を前提とした計画案です。最適化に進むかどうかは、各表の観点と、計画業務の整理状況を見て判断してください。

  • 現行の計画業務で「決めていること」を書き出せている
  • 守るべき条件のうち、例外なく守るものと調整できるものを区別できている
  • 計画の良し悪しを測る指標(コスト、欠品など)が共有されている
  • 計画案を人が修正し、その理由を残す運用を想定している
  • 対象範囲を絞った小さな検証から始める準備がある

需要予測はできているのに、計画の立案や判断に時間がかかっている。そうした段階こそ、制約条件と目的関数の整理が効果を発揮しやすいタイミングです。SCI総合研究所では、RASHINRAによる意思決定支援を中心に、対象範囲を絞った検証から段階的に進める支援を行っています。「最適化が自社に必要かどうか」の段階からでも、お気軽にご相談ください。

技術的な壁打ちはKAMUSHIRUBE(技術・DX相談)、数理モデルの検証やPoCは研究開発サポート、社内向けの基礎研修は調査・研修講師でもご案内しています。

参考文献

  • Lepenioti et al. 2020. Prescriptive analytics: Literature review and research challenges. International Journal of Information Management. Vol. 50. pp. 57-70. https://doi.org/10.1016/j.ijinfomgt.2019.04.003
  • Elmachtoub and Grigas. 2022. Smart “Predict, then Optimize”. Management Science. Vol. 68. Issue 1. pp. 9-26. https://doi.org/10.1287/mnsc.2020.3922
  • Gneiting and Katzfuss. 2014. Probabilistic Forecasting. Annual Review of Statistics and Its Application. Vol. 1. pp. 125-151. https://doi.org/10.1146/annurev-statistics-062713-085831
  • Bertsimas and Tsitsiklis. 1997. Introduction to Linear Optimization. Athena Scientific. https://www.athenasc.com/linoptbook.html
  • Birge and Louveaux. 2011. Introduction to Stochastic Programming (2nd ed.). Springer. https://doi.org/10.1007/978-1-4614-0237-4
  • Mitchell et al. 2011. PuLP: A Linear Programming Toolkit for Python. COIN-OR. https://coin-or.github.io/pulp/