在庫最適化のための最適なサービスレベルの数式


著者Joannès Vermorel、2012年1月最終推敲



サービスレベル(在庫)とは、在庫切れにならないと予想される確率を表します。この割合は安全在庫を計算するために必要なものです。サービスレベルとは在庫コストと在庫切れコスト(逃した販売、販売機会の喪失、顧客の不満などさまざまな状況が含まれます)のトレードオフです。この項では、サービスレベル値を最適化する方法を詳述します。その後、「生鮮食品」という特別なケースについての分析を行います。

モデルと公式

標準的なサプライチェーン論文で、サービスレベルに採用されている数値はいくらか「あいまい」です。以下に在庫コストと在庫切れコストをそれぞモデル化し、「最適」サービスレベルを計算する方法を提案します。

以下の変数を導入しましょう:
  • $p$ はサービスレベルとします。つまり在庫切れと「ならない」確率です。
  • $H$ はリードタイム期間のユニットごとの「維持費用」とします。(1)
  • $M$ 在庫切れの限界ユニットコストとします。(2)

エクセルシートをダウンロードする: service-level-formula.xlsx (計算例)

(1) ここで考慮されるタイムスコープ(時間範囲)は、リードタイムです。したがって、より一般的である「年間」維持費用$H_y$を考慮する代わりに、$d$ が日で表されるリードタイムと仮定して $H = \frac{d}{365}H_y$ を考慮します。

(2) 在庫切れコストは売上総利益「最小値」を含みます。つまり在庫切れが起こっていなければ瞬時の利益が保証されていたわけです。しかし、売上総利益の喪失は費用だけではありません。例えば、顧客の不満や顧客からの信頼の喪失も考慮に入れなければなりません。経験則から言うと、多くの食料品店では$M$ を売上総利益の3倍としています。

最適サービスレベルは以下のようになります(理由は以下に詳しく述べます): $$p=\Phi\left(\sqrt{2\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)}\right)$$ $\Phi$ は正規分布に関する累積分布関数であるとします。この値はエクセルで簡単に計算でき、$\Phi$ は NORMSDIST 関数となります。また、数値計算にするとA $\sqrt{2 \pi} \approx 2.50$ となります。

費用関数

費用関数をモデル化するには、もう2つ変数を使います:
  • $Q$ 「償却(ならし)」在庫量 (3)、 関数は$p$ に依存します。
  • $O$ 在庫切れになった際の「平均」オーバーフロー需要

(3) ここではAmortized Analysis(償却解析)の観点を採用しています。在庫レベルは常に変化していますが、ここでの私たちの目標は、分析を役立てるために需要予測自体から切り離したサービスレベル値を手に入れることです。したがって、$Q$ が「再注文ポイント」と等しくなることを仮定します(詳細については弊社のガイド安全在庫をご参照ください)。

あるサービスレベルでは、「在庫保持」費用および「在庫切れ」費用の両方を合わせた合計費用 $C(p)$ はこのように表せます: $$C(p) = Q(p)H + (1-p)MO$$ $Q(p)H$ が在庫費用、$MO$ が在庫切れ費用とし、$1-p$ の確率で起こるとします。弊社の安全在庫チュートリアルで紹介されている公式を使い、また $Q(q)$ は再注文ポイントと等しいので、$Q(p) = Z + \sigma \Phi^{-1}(p)$ となり、$Z$ はリード需要、 $\sigma$ は予期される予測エラー、$\Phi(p)^{-1}$ は「標準的な」正規分布に関する逆 累積分布関数となります(ゼロ平均および1の分散)。

平均商品ロスの分析

平均商品ロスである$O$ の分析は、捕らえにくいものです。需要分布が「正規」分布$\mathcal{N}$、$q$ が入手可能な在庫と考えると、 $x > q$のとき(入手可能在庫$q$ をマイナスする)、$O(q)$ は需要$x$ の条件付平均で、以下のように表すことが出来ます。 $$O(q)=\frac{\int_q^\infty{x\mathcal{N}(x)dx}}{\int_q^\infty{\mathcal{N}(x)dx}}-q=\frac{1}{q}+\mathcal{o}\left(\frac{1}{q}\right)$$ (1)のサイトをブラウズして関数を閲覧してください。

この結果は次のように解釈することができます:需要が正確に正規分布に従う場合、「(条件付)在庫切れイベント」における商品ロスの平均量は在庫レベルが大きくなるにつれてすばやく0に収束していきます。

しかし、私たちの経験から、予測エラーは正規分布が予期するとおりにうまく収束しません。したがって、以下では、$O=\sigma$ すなわち「商品ロス」の平均量は「平均予測エラー」に等しいと仮定します。明らかに、これは綿密な分析というよりは「経験則的」ではありますが、実際上この近似値が理にかなった結果をもたらしています。

費用関数の最小化

上記で定義した代替を$C(p)$ 式に適用させると、以下のようになります: $$C(p) = \left(Z + \sigma \Phi^{-1}(p)\right)H + (1-p)M\sigma$$ 次に、$C(p)$ 式は$p$ において以下のように分化できます: $$\frac{\partial C}{\partial p} = \sigma H \partial \Phi^{-1}(p) - \sigma M$$ 私たちは「最小」値を求めているので、$\frac{\partial C}{\partial p} = 0$ を解き、それによって以下が与えられます: $$\sigma H \partial \Phi^{-1}(p) - \sigma M = 0$$ これは$\sigma$ において以下のように簡略化できます: $$H \partial \Phi^{-1}(p) - M = 0$$ そして最終的に: $$\partial \Phi^{-1}(p) = \frac{M}{H}$$ それから$\partial \Phi^{-1}$ と$\Phi^{-1}$ の関係を用います: $$\partial \Phi^{-1}(p)=\sqrt{2\pi}e^{\frac{1}{2}\Phi^{-1}(p)^2}$$ 同等性を視覚的に証明するには(1)(2)を比較することができます。

この関係によって以下が得られます: $$\sqrt{2\pi}e^{\frac{1}{2}\Phi^{-1}(p)^2}=\frac{M}{H}$$ $$\frac{1}{2}\Phi^{-1}(p)^2=\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)$$ 方程式の正の累乗根解(負の累乗根は関数の「極大」に対応)を取ります: $$\Phi^{-1}(p)=\sqrt{2\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)}$$ そして最終的に$\Phi$ を両側に適用させ、最適サービスレベルを得ます: $$p=\Phi\left(\sqrt{2\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)}\right)$$

公式について

公式の興味深い点の一つ目は最適サービスレベルは$H$ (在庫コスト)と$M$ (在庫切れコスト)だけに依存するということです。しかし、$H$ が「リードタイム間の」維持コストとして定義されているので、リードタイムには暗黙の依存があります。

二つ目は、より大きい在庫コストは最適サービスレベルを「下げ」、同様により大きい在庫切れコストはサービスレベルを「上げる」ということです。この動きは直感的に理解できます。なぜならサービスレベルはより多くの在庫とより多くの在庫切れを相殺するからです。

次に、公式は$M$ と$H$ のすべての値に有効ではありません。$\sqrt{2\pi}\frac{M}{H} > 1$ とする必要があり、そうでないと対数が負の値を作り、これは平方根外を考慮するときに扱いにくくなります。これは$M > \sqrt{2 \pi} H$ となり、$M > 2.5 H$ に近づけることができます。この条件が確認できない場合は初期費用関数$C(p)$ が最小ではない、または$p=0$ の時に$-\infty$ となります。実際的な観点から、$M < 2.5 H$ は最も利益のある在庫レベルが0という病的状態と解釈することができます(100%の在庫切れ)。

具体例

1リットルの牛乳を$1.50で販売し、10%の利益(つまり売上総利益のうち$0.15)を得ることにしましょう。リードタイムは4日間とします。年間維持コストは$1.50(牛乳は腐りやすいため値は高くなります)在庫切れコストは売上総利益の3倍と仮定して、$0.45となります。これにより$M=0.45$ となり、$H=\frac{4}{365} 1.5\approx 0.0055$となります。

上記で得た最適サービスレベルに対して、これらの値と公式に基づくと、$p\approx 98.5\%$ が得られます。これは生鮮食品の「マストアイテム」として倉庫保管して食料品店に供給する商品の典型的な価です。

生鮮食品

2012年2月13日 サプライチェーンのエキスパートである、Vyacheslav Grinkevych氏からの質問。

私は賞味期間の短い乳製品の予測とサプライ・プランニングをしていますが、この仕事は最適サービスレベルが非常に重要です。ここで最も興味深くかつ「注意が必要」なコンポーネントは「維持費用」Hで、実際に使う際の適切な値について疑問があります。

例えば賞味期間の短い乳製品の場合、Hで重要なのは、在庫により凍結している純粋な「経済的」費用およびオペレーション上のロジスティックス倉庫費用だけではなく、賞味期限切れ商品の損金処理を行う場合のポテンシャル・ロス、または期限間近の商品の値引き販売です。これは売上げが予測を下回る時に起こります。

このオフセットは「超過在庫の可能性のリスク」vs「不足在庫の可能性のリスク」のふたつで表されます。この二つのリスクは、その性質は同源でありながらまったく逆の方向に働きます。言い換えれば安全在庫に相互に結びついていると言えます。大規模な超過予測のケース、これは通常は期限切れが問題となりますが、普通予測エラーは分配されません。したがってこのような「ポテンシャル・超過在庫」リスクを表すよりよい方法を模索しています。

貴社の公式に話を戻しますと、公式では総費用C(p)を最小化する以前に、Hとpの間の関係を見つけることにある、またはHをpの関数にする(すなわちH(p))ことになります。このことについてどのようにお考えでしょうか?

上記のサービルレベル関数は確かに単純化した仮定に基づいており、その仮定は在庫と在庫切れの両方の費用について、厳密に線形であると言えます。しかし、実際には厳格な非線形性は次のような場合に見つけられます。

  • 倉庫がいっぱいである状態で、在庫を1単位増やすと新たに倉庫が必要になり、管理費が膨大になる。
  • 在庫切れは販売損失を増幅させ、在庫切れの1単位増加によってすべての常連客を失うという点に到達する。

生鮮食品はもうひとつのねじれを示します:在庫を単位数で表わさずに日数で表す在庫カバーが、もし商品の賞味期限に近づくなら、維持費用である$H$は無限値に向かって増加します。

確かに、$H$はそもそも在庫を持つことに関連して「抵抗」を表します。商品の賞味期限以上の在庫カバーは不条理な状況を表しています。FIFO在庫を考えたときに倉庫から出される最初の商品は賞味期限切れという状態となっているためです。

在庫の「生鮮性」の効果をモデル化するために、キーとなる継続期間を導入しましょう:

  • $\lambda$ - リードタイム
  • $\lambda_\infty$ - 最終期限に到達する前の商品生命(すなわち市場価値ゼロ)。
  • $\lambda_½$ - 市場価値損失のため元の維持費の2倍になる期間。
  • $\lambda_c(p)$ - 在庫量単位ではなく日数で在庫量を表される在庫カバー。この期間は安全在庫要因による。したがって$p$に依存。

これらの期間で、維持費を以下のようにモデル化できます:

$$ H(p) = H \left(1 - \frac{\lambda_\infty - \lambda_½}{\lambda_\infty - \lambda} + \frac{\lambda_\infty - \lambda_½}{\lambda_\infty - \lambda_c(p)} \right) $$ 損金処理リスクをファクター化するため維持費の通常概念を曲げているので、ここで潜在する仮定について詳述しましょう。

まず一つ目に、$H(0.5)=H$となります。これは上記の定義にて得られます。確かに、サービスレベル50%で$\lambda_c(0.5)=\lambda$とすると、在庫カバーはリードタイムに等しくなります。したがって、このモデルでは、$H$は維持費を表しており、50%のサービスレベルに関連した損金処理費はすでに費用$H$にファクター化されています。注目すべきことは、安全在庫ゼロは損金処理ゼロを意味することではない、「不定期に起こる」損金処理だということです。

二つ目に、サービルレベルが$p_½$ で $\lambda_c(p_½) = \lambda_½$となる時、$H(p_½)=2H$となります。 ここでも、これは$H(p)$に採用された定義の結果に過ぎません。$\lambda_½$は、「安全在庫ゼロ」状態に比較したときに、維持費プラス損金処理費用を組み合わせた2倍の期間を表しています。消費期限間近の値引きに伴う管理費と損金処理に個別のステップを踏むことは、実際上明確です。しかし、「典型的な期間」を通して管理費を計上することは、実際上商品生命のわずかな期間と定義できますが、不確実な変数に依存するきめの細かいモデルと比較した時に、全体アプローチに必要な様々な近似値に対し「回復の早い・弾力性のある」ものと考えます。

最後に$\lambda_c(p_\infty)=\lambda_\infty$において、$p$が$p_\infty$から近づくにつれて$H(p)$は無限に近づく傾向になりますが、ここで採用される関数は再度$H(p)$となります。一見したところ、維持費が商品の単位コストを超えるのは変に思われますが、パラドックスはありません。値$H(p)$は、1単位をクライアントに送り出すときのフリクション・コストを表します。 もし仮に、大量の損金処理があるために、最終クライアントに1単位送るために倉庫は平均して3単位入荷するとして(2単位は発送される前に期限切れとなる)、フリクション・コストは元の商品の単位原価よりもずっと高くなります。

要約すると、$\lambda_½$ はひとつの「不確実変数」に過ぎないということを紹介しました。$\lambda$ と $\lambda_\infty$ は安全に仮定し知ることができます。$H(p)$のこのモデルは可能な限り単純なもので、1つの追加変数を導入することで行うことができると考えます。そして、 $\lambda_c(p)$については適当な近似値を使って、以下のようになります:

$$\lambda_c(p) = \lambda \left(1 +\frac{\sigma}{Z}\Phi^{-1}(p)\right)$$ 確かに、在庫カバー$\lambda_c$は、リード需要プラス「正常な」安全在庫ファクターを含むリードタイムに対する比率としてみることができます。これによって代替費用関数を得ます:

$$C^*(p) = \left(Z + \sigma \Phi^{-1}(p)\right)H\left(1 - \frac{\lambda_\infty - \lambda_½}{\lambda_\infty - \lambda} + \frac{ \lambda_\infty - \lambda_½}{\lambda_\infty - \lambda \left(1 +\frac{\sigma}{Z}\Phi^{-1}(p)\right)} \right) + (1-p)M\sigma$$ 以前の費用関数とは異なり、この関数は単純代数極小値があるようには見受けられません。しかし、経済発注量(EOQ)の計算で使ったものに類似したアプローチを採用することにより、0.1%の増幅を80%から99.9%に繰り返し適用することにより、比較的複雑でない方法で「近似の」解決策を見つけることができます。これは200の反復を行うことで0.1%の正確さを達成し、実務目的には十分であるといえます。

対象とする実際の利用法

サービスレベル公式はいくつか近似値を使うため、数値は「そのままの形で」すぐには使えないかもしれません。通常は多少の調整が必要になります。特に、因数$\frac{1}{\sqrt(2\pi)}\approx0.4$ は必要に応じて適応させることができます。しかし、この公式は商品の各サービスレベルをどのように比較するかのよいヒントを与えると考えます。例えば、商品AとBの二つがあるとして、それぞれのサービスレベルを95%(商品A)と90%(商品B)とし、最終的な商品設定では商品Aのサービスレベルは商品Bよりも高くなることが予想されます。

次に、上記に示した分析の性質を考えると、この公式は低需要・間欠的需要の商品には関係がないと考えます。確かに、このように低容量の商品は一般的に0や1単位での低い再注文ポイントになります。これらの商品の保管費用の「線形」モデルは、ひとつ余分に保管しても必ずしも複雑性として意味を成さない、ということを考慮しなければなりません。

弊社のウェブアプリSalescastで販売予測の最適化を図ってください。Lokadは需要予測を通して在庫最適化を専門に行っています。サービスレベル、およびその他多くの機能はSalescast本来の特徴です。