同じ需要でも異なる運用状態へ移る「在庫・発注閾値」の状態空間を可視化する

在庫管理では、需要予測だけでなく「いま何日分の在庫を持っているか」と「どの水準で再発注するか」の組み合わせが運用結果を左右します。同じ需要系列であっても、この二つの状態が違えば、欠品が続く場合もあれば、在庫を厚く持ちすぎる場合もあります。今回は、在庫水準と発注閾値を2次元のstate spaceとして扱い、発注政策の状態遷移を可視化しました。

この図は何を表しているのか

横方向は在庫水準、縦方向は発注閾値です。どちらも平均需要を1日分とした日数で表しています。

背景色は、そのinitial inventory / initial thresholdから同じ需要系列を流したときに、最初の35日でどのoutcome regimeになったかを示します。

今回のregimeは4種類です。Stockout-proneはstockout-day rateが10%以上、Excess-carryは平均在庫が3日分以上、Reactive-reorderはreorder-day rateが40%以上、それ以外をBalanced-bufferとしています。

背景の上を走る細い線は、実際のinventory / threshold stateの時間変化です。4本の太い線は各regimeの代表trajectoryで、hollow circleが開始、filled squareが終了、小さなcircleがreorder eventを表します。

可視化から読み取れること

今回のSynthetic Dataでは、initial inventoryを-2〜9日分、initial reorder thresholdを0.5〜7日分に変化させ、合計1,575通りをsimulationしました。需要系列はすべてのscenarioで同一です。

OutcomeはStockout-proneが830条件、Reactive-reorderが148条件、Balanced-bufferが347条件、Excess-carryが250条件となりました。

Initial inventoryを固定した45本のvertical sliceのうち、71.1%ではthresholdを変えるだけで複数のregimeが現れました。

具体的にinitial inventoryを4.75日分へ固定すると、threshold 0.50日ではStockout-proneとなり、stockout-day rateは51.4%でした。Thresholdを3.56日へ上げるとBalanced-bufferとなり、同じ需要でもstockout-day rateは0.0%でした。

さらにthreshold 6.62日ではExcess-carryとなり、平均在庫は3.45日分でした。

この構造をどう解釈するか

今回のData Generating Processでは、全scenarioへまったく同じ需要系列を与えています。変えているのはinitial inventoryとinitial reorder thresholdだけです。

低いthresholdでは、inventory positionがかなり減るまで発注しません。Lead timeが3日あるため、需要上振れへ反応する前にon-hand inventoryが負になる条件が増えます。

一方でthresholdを高くすると、より早い段階で発注するためstockoutは減ります。ただし、在庫が十分残っている状態でも補充が入りやすくなるため、初期在庫との組み合わせによっては平均在庫が大きくなります。

このためstate spaceには単純な一方向の「良い・悪い」ではなく、stockout、reorder frequency、inventory carryのtrade-offから複数の領域が生じます。

可視化の仕組み

需要は56日間で、短周期のseasonality、18〜31日の需要上振れ、42日前後の一時peak、noiseを含みます。平均需要は106.3 units/day、最大は127.5 units/dayでした。

発注policyはinventory positionがreorder threshold以下になると300 unitsを発注し、3日後に入荷する単純化したruleです。

Reorder threshold自体は固定せず、需要forecastとforecast error varianceから得たtarget thresholdへ毎日3%ずつ追従させています。そのためtrajectoryは在庫方向だけでなくthreshold方向にも動きます。

Main Visualizationでは、1,575 initial conditionのoutcome classificationをbackground manifoldとし、その上に実際のstate transitionを重ねています。

なぜこの可視化方法を選んだのか

通常の時系列では、一つのpolicyについて在庫がどう動いたかを追うことはできます。一方、今回見たいのは「inventory / threshold combinationのどこで運用状態が切り替わるか」です。

Inventory policy state manifoldでは、policy stateを2次元の空間として並べ、その上にoutcome regionとdynamic trajectoryを同時に置けます。

そのため、同じ需要に対して異なる初期条件がどのregimeへ入るかと、stateが時間とともにどこへ移動するかを一枚で比較できます。

実データへの応用可能性

実データでは、SKU別の日次需要、on-hand inventory、on-order quantity、lead time、reorder point、発注履歴などがあれば、同様のstate-space分析を検討できます。

たとえば、同じ需要変動を持つSKU群でも、reorder pointとcurrent inventoryの組み合わせによってstockout傾向やinventory carryがどのように変わるかを探索できます。

また、policy変更前後のtrajectoryを比較し、どのstate boundaryをまたいだのかという仮説形成にも利用できる可能性があります。

データと分析方法

今回はSynthetic Dataを使用しています。Simulation条件は1,575通り、各scenario 56日、乱数シードは260926です。

Inventory levelとreorder thresholdは平均需要何日分かへ正規化しています。Lead timeは3日、order quantityは300 unitsです。

Outcome classificationは最初の35日を使い、stockout-day rate、average inventory、reorder-day rateの順に判定しています。このclassification thresholdは今回のStudy用に設定したanalysis definitionです。

このVisualization Studyの限界

今回のinventory modelはSynthetic Dataであり、実際の企業の在庫policyを再現したものではありません。

Fixed order quantity、single lead time、lost sales / backorderの単純化、forecast rule、regime classification thresholdなど、結果は今回のData Generating Processへ依存します。

また、Main Visualizationはinventory levelとreorder thresholdの2次元へsystem stateを投影していますが、実際の次stateにはon-order quantityやpipeline timingも影響します。そのため、同じ2次元座標に見えても将来のtrajectoryが完全に同じとは限りません。

したがって、このstate manifoldを一般的な最適policy mapとして扱うことはできません。今回確認しているのは、同じ需要系列でもinventory / threshold combinationの違いが異なる運用状態とtrajectoryを作り得るという構造です。

まとめ

今回は、発注政策をinventory levelとreorder thresholdの2次元state spaceとして捉え、1,575通りのinitial conditionをInventory policy state manifoldとして可視化しました。

Synthetic Dataでは、同じ需要系列を使っていても、initial inventoryとthresholdの組み合わせによってStockout-prone、Reactive-reorder、Balanced-buffer、Excess-carryへ分かれました。

この見方は、在庫policyを一つの設定値として見るのではなく、現在のinventory stateとの組み合わせから運用状態を探索するための一つの方法になります。