【ハイブリッド発注方式】定期発注方式に対するメリットを在庫シミュレーション

2024年5月18日

Photo by Isaac Quesada on Unsplash

◆仕事や勉強の息抜きに。。。

ハイブリッド発注方式とは?

いつ発注するかという観点で言うと、発注方式は大きく2つに分けられます。

発注点を切ったら発注する方式と、定期的に発注する方式です。

ハイブリッド発注方式は両者を併せて、いいとこ取りした発注方式です。

 

在庫を常に監視していて少なくなってきたら発注するというのは、わかりやすくて理にかなった発注方法です。

しかし一方で、発注タイミングが不定期になるというデメリットがあります。

多数の商品アイテムを取り扱っている場合、発注が不定期になるということは、まとめて発注できないということです。

これは発注先が海外にある場合には特に不都合です。

船便であろうと航空便であろうと、まとめて輸入する方が安いに決まっているからです。

 

一方で定期発注方式には在庫量が多くなりがちというデメリットがあります。

これは在庫補充のための目標量が、調達リードタイムだけでなく発注サイクルも合わせて決められるためです。

詳しくはこちらを参照下さい。

適正在庫を維持するための発注数の決め方をわかりやすく【定期発注方式の場合】

しかも、これだけの在庫量を持っていても、急激な需要が変動があって発注サイクル期間中に在庫が足りなくなりそうになったとしても発注がかかりません。

需要変動に対する柔軟性がないのです。

ハイブリッド発注方式は定期発注方式をベースとしつつ、危なくなったら発注点方式を使うという合せ技です。

 

必要な設定パラメータとその決め方

ハイブリッド発注方式で設定すべきパラメータは、定期発注方式発注点方式のそれと同じです。

 

定期発注方式では設定パラメータとして在庫補充目標量さえ決めておけば、発注サイクルごとに在庫補充目標量-在庫量を発注すれば事足ります。

在庫補充目標量の計算式は次の通りです。

目標在庫数=安全在庫+需要予測在庫

=√(リードタイム+発注間隔)×標準偏差*安全係数+(リードタイム+発注間隔)×1日当たりの平均出荷数

詳しくは適正在庫を維持するための発注数の決め方をわかりやすく【定期発注方式の場合】

 

一方、発注点方式には定量発注方式Min-Max発注方式があります。

定量発注方式で必要な設定パラメータは発注点発注量で、次のように計算できます。

発注点=リードタイム期間中の需要予測数+安全在庫

発注量=EOQ=√((2×輸送コスト×年間需要量)/保管コスト)

詳しくは【定量発注方式】PythonのInventorizeライブラリで在庫シミュレーションしてみた

 

Min-Max発注方式で必要な設定パラメータは発注点(MinMaxで、発注点は先ほどと同様、Max点は発注点+n日分の平均需要という形で経験的に決めるのが普通です。

詳しくはMin-Max発注方式のMaxはどうやって決めるのか?Pythonでシミュレーションしてみた

 

Pythonで在庫シミュレーション

あるアイテムについて次のような需要実績データがあるものとします。

この時、最初の45日間を見たデータとして需要の平均と標準偏差を求め、残りの75日間をまだ見ぬデータとしてシミュレーションするものとします。

 

ハイブリッド発注方式を在庫シミュレーション

ハイブリッド発注方式はinventorizeライブラリのHibrid_normal関数を使えばPythonでシミュレーションできます。

指定する引数は需要データ、平均、標準偏差、リードタイム、サービス率(=1-許容欠品率)、発注間隔、発注点です。

需要データはまだ見ぬ75日間の需要データをリストとして渡します。

平均と標準偏差は既に見た45日間のデータから計算し、それぞれ変数avsdに入っているものとします。

リードタイムは3日とします。

サービス率は95%とします。

これは許容欠品率が5%であることを意味します。

発注間隔は7日とします。

 

発注点はinventorizeライブラリのreorderpoint関数で次のように求めることができます。

import inventorize as inv
rop_dict = inv.reorderpoint(
  dailydemand = av,
  dailystandarddeviation = sd,
  leadtimein_days = 3,
  csl = 0.95
)
rop_dict

このように辞書形式で結果が出るので、発注点だけをropという名の変数に入れておきます。

rop = rop_dict['reorder_point']
rop

 

以上からハイブリッド発注方式の在庫シミュレーションは次のように実行できます。

result = inv.Hibrid_normal(
    demand = test_df['Item_A'],
    mean = av,
    sd = sd,
    leadtime = 3,
    service_level = 0.95,
    Review_period = 7,
    Min = rop
)
result

前半に在庫シミュレーションの結果が、後半にその統計値がまとめられています。

前半の在庫シミュレーション結果をcsvファイルにexportして中身を見てみましょう。

result[0].to_csv('result_hybrid_1.csv')

7日間隔で発注され、発注の3日後に納品されているように見えます。

この表では18日間分しか表示していませんが、75日間すべて7日に1度の発注でした。

つまり定期発注方式で行ったシミュレーションと全く同じ結果になりました。

 

定期発注方式と比べたメリットを在庫シミュレーション

「なんだ定期発注方式と同じなのか」と思うところですが、これは最初の45日間の需要傾向とその後の75日間の需要傾向に大きな違いがなかったためです。

最初の45日間のデータをもとに設定した安全在庫で十分だったとも言うことができます。

 

しかしコロナ禍を経験した私たちは、未来の需要傾向が過去の需要傾向とかけ離れることがあることを知っています。

コロナ禍のような極端なことが起こらなくても、このようなことは十分に起こり得ます。

そこでシミュレーション期間の24日目の需要が350ではなく3,500になった場合の在庫シミュレーションを定期発注方式とハイブリッド発注方式で行ってみましょう。

まずは定期発注方式で行った場合です。

定期発注方式の在庫シミュレーション方法については【定期発注方式】PythonのInventorizeライブラリで適正在庫シミュレーションしてみたを参照下さい。

在庫推移は次のようになりました。

315日の在庫がゼロになっています。

シミュレーション結果を詳細に見てみると、この日は237個の需要がありましたが16個しか在庫がなく、221個が機会損失になっていたことが分かります。

 

次にハイブリッド発注方式で行った場合です。

次のような在庫推移になりました。

実は定期発注で在庫切れを起こした315日は3,500個の需要があった日の1週間後です。

ハイブリッド発注方式では3,500個の需要があった日に在庫が急減しましたが、2日後に在庫が4,994個になり発注点である5,261個を切った次の日に9,602個を発注しています。

通常は1週間に1度の定期発注ですが、在庫が急減した時にはこのように緊急発注をかけられるので欠品を避けることができたのです。

このようにハイブリッド発注方式は海外調達のように発注コスト(輸送コスト)が高いために発注をまとめたいが、同時に欠品も極力避けたいという場合に有効な発注方式です。