在庫最適化(Inventory Optimization)
在庫最適化は、多段階(マルチエシェロン)サプライチェーンにおいて各拠点で保有すべき最適な安全在庫を算出します。ネットワーク(拠点・フロー・需要・リードタイム・サービス目標)を入力すると、需要とリードタイムのばらつきを吸収しつつ目標サービスレベルを満たすために、各拠点がどれだけの安全在庫を持つべきかを計算します。
TIP
在庫最適化はネットワーク最適化とは別のモジュールです。ネットワーク最適化がコスト最小化・利益最大化のためにネットワーク構成とフローを決定するのに対し、在庫最適化はネットワークを所与として安全在庫を算出します。左サイドバーの Inventory Optimization(箱のアイコン)から開きます。
画面構成
本モジュールには4つのタブがあります。
| タブ | 用途 |
|---|---|
| Data | シナリオの管理、入力データのインポート、入力テーブルの閲覧。 |
| Comparison | 安全在庫の総コスト・総数量やネットワークをシナリオ間で比較。 |
| Analysis | 単一シナリオの詳細分析:ネットワークグラフ、拠点別の需要・リードタイム・安全在庫。 |
| Results | 算出された Safety Stocks テーブルの確認。 |
事前準備
ネットワークデータを含む Excel ファイルを用意します。最も簡単なのは、この機能で使用するシートがそろったサンプルファイルから始める方法です。
TIP
在庫最適化のサンプルファイルをダウンロードし、自社データに編集してください。
入力シート
サンプルファイルにはこの機能が必要とするシートが含まれています。
| シート | 用途 |
|---|---|
Periods | 計画期間。 |
Products / Product Individuals | 製品マスタと製品個別の属性。 |
Locations | 地理マスタ。各ロケーションは Customer・Facility・Supplier のいずれかにも登録が必要です。 |
Suppliers / Facilities / Customers | ロケーションの3つのサブタイプ。Facility は DC・Port・Mfg などの種別を持ちます。 |
Demands | 顧客 × 製品 × 期間ごとの需要量。 |
Flows | 出発地 × 到着地 × 製品 × 期間ごとの輸送量。このシートが最適化対象のネットワーク構造を定義します。 |
Paths | ロケーション間の距離。 |
Facility Processing Times | 拠点 × 製品ごとの処理時間。 |
Inventory Policies | 拠点 × 製品ごとの在庫保有コスト率・在庫回転数、および安全在庫の下限・上限(任意)。 |
Customer Policies | 顧客 × 製品ごとの目標サービスレベル・最大保証サービス時間。 |
WARNING
需要がある顧客 × 製品には Customer Policies の行が必ず必要です。行が無い場合、その製品の実行は Missing Customer Policy エラーで失敗します。
プロダクトグループ単位でサービス水準を決める(ABC 分析)
Customer Policies と Inventory Policies の productName には、製品名の代わりに グループ代表製品名を書けます。その行はグループに属する全メンバー製品に適用されます。
ABC 分析でサービス水準を決める場合は、次の手順になります。
- Products シートに
Class A/Class B/Class Cをtype = Groupとして登録する - Product Groups シートで各製品をどのクラスに属させるかを指定する (
groupProductName= クラス、memberProductName= 製品) - Customer Policies に顧客 × クラスの行を書く(製品数ぶんの行は不要)
解決の優先順位は次のとおりです。
- 製品自身の行があればそれが最優先。クラス全体の水準に対して一部の製品だけ例外を設けたい場合は、 その製品の行を追加します
- 製品自身の行が無ければ、その製品が属するグループ代表製品名の行が適用されます
- 同じ顧客について製品が 2 つのグループ行に一致する場合はエラーになります。どちらを採るべきか 決められないため、製品自身の行を追加して曖昧さを解消してください
安全在庫の下限・上限
Inventory Policies シートの minSafetyStock / maxSafetyStock 列で、拠点 × 製品ごとに安全在庫の 業務上の下限・上限を指定できます。単位は製品の数量単位で、結果の安全在庫と同じ単位です。空欄にすると その方向の制約はかかりません。
minSafetyStockは統計的に必要な量に上乗せする下限です。需要のばらつきから計算される量が下限を 下回る場合、その拠点は下限まで積み増します。保証サービス時間には影響しません。maxSafetyStockはその拠点に積める上限です。上限で持てなくなった分は、下流の拠点や顧客側に 安全在庫が移動します。maxSafetyStockはminSafetyStock以上である必要があります。違反するとインポート時にエラーになります。- 上限が厳しすぎて顧客の最大保証サービス時間を満たせない場合、その製品は Errors シートに 実行不可能として記録され、他の製品の結果は通常どおり出力されます。
WARNING
Flows シートがノード間の接続を定義します。各区間(Supplier → Facility、Facility → Facility、Facility → Customer)は、その接続が最適化対象ネットワークに含まれるために Flow の行が必要です。
Data タブにはこの他の入力テーブル(Transportation Policies や Sourcing Policies など)も表示されますが、これはネットワーク最適化とスキーマを共有しているためであり、在庫最適化の実行には不要です。各シートの列の詳細は Excelファイルフォーマット を参照してください。
1. シナリオを作成する
Data タブの Scenario パネルで New scenario(+)アイコンをクリックし、Scenario name を入力して Create scenario をクリックします。各シナリオは独自の入力データと結果を保持し、これが Comparison タブでの比較を可能にします。
シナリオには自由記述の説明を追加でき、Delete scenarios(✕)アイコンで削除できます。
2. データをインポートする
シナリオを選択した状態で、Input Data パネルの Upload data をクリックし、.xlsx ファイルを選んで Import をクリックします。成功するとメッセージが表示されます。
インポートすると、シートが左サイドバーの Tables に表示されます。任意のテーブルをクリックすると、ソート・フィルタ可能なグリッドで内容を確認できます。
3. 設定して実行する
Run をクリックして実行ダイアログを開きます。実行時に設定する項目はないため、ダイアログは確認のみです。
Run をクリックすると実行が始まります。実行中はボタンにスピナー付きで Running と表示され、完了するとトーストが表示されます(成功時は Check results、失敗時は View errors)。
TIP
目標サービスレベルと最大保証サービス時間は実行時の設定ではなく入力データの一部です。Customer Policies シートで顧客 × 製品ごとに指定してください。別のサービスレベルを試したい場合は、このシートを編集する(または別シナリオを使う)して再実行します。
複数のシナリオを選択して1つのジョブでまとめて実行することもできます。
4. 結果を確認する
Results タブを開きます。上部のサマリーには、最新の実行で使用した Algorithm parameters・Run at(実行時刻)が表示されます。
- Safety Stocks — 主要な出力。ロケーション × 製品ごとに、ノード別の全指標を出力します。
- Errors — 実行が失敗したときのみ表示されます。製品単位の失敗内容が行として表示されるので、入力を修正して再実行できます。
結果グリッドはソート・フィルタ・ページングに対応しています。
Safety Stocks の列
| 列 | 意味 |
|---|---|
location / product | 対象のロケーションと製品 |
propagatedDemandMean | そのノードが受け持つ日次需要の平均(下流の需要を合算) |
propagatedDemandStdDev | 同じく日次需要の標準偏差(下流を二乗和平方根で合算) |
processingTime | Facility Processing Times 由来の処理時間(日) |
inboundGuaranteedServiceTime | 上流から保証される入荷リードタイム(日) |
guaranteedServiceTime | そのノードが下流へ保証するサービス時間(日) |
netReplenishmentTime | 正味補充時間 τ(日)。安全在庫がカバーすべき期間 |
cycleStock | サイクル在庫 |
safetyStock | 安全在庫 |
inTransitInventory | 輸送中在庫 |
serviceLevel | そのノードに適用された目標サービス水準 |
在庫の 3 成分
拠点の平均在庫は次の 3 つに分解され、cycleStock + safetyStock + inTransitInventory が総在庫になります。
cycleStock(サイクル在庫) — 発注ロットに起因する平均在庫です。Inventory Policies.inventoryTurns (1 期間あたりの在庫回転数)から求めます。
1 回の補充がカバーする需要 Q = propagatedDemandMean × 期間長(日) ÷ inventoryTurns
cycleStock = Q ÷ 2÷ 2 は、補充サイクル内で在庫が Q から 0 へ減っていく(のこぎり波)ときの平均値です。Inventory Policies の行を持たないサプライヤ・顧客のノードでは空欄になります(ロット発注の概念が無いため)。
WARNING
在庫最適化のインポートでは inventoryTurns が必須です。空欄のままだとサイクル在庫が半期分の需要という 実態から離れた値になるため、既定値で代用せずエラーにしています。
safetyStock(安全在庫) — 需要とリードタイムのばらつきを吸収する在庫で、serviceLevel から求めた z 値 × propagatedDemandStdDev × √netReplenishmentTime が統計的な必要量です。Inventory Policies に minSafetyStock を設定した拠点では、統計的必要量がそれを下回る場合に下限まで積み増した値になります。
inTransitInventory(輸送中在庫) — 入荷レーン上にある在庫です。propagatedDemandMean に入荷輸送 日数(Paths の距離と輸送手段の速度から算出)を掛けた値なので、距離だけでなく需要にも比例します。入荷 レーンが複数ある場合は最も長いものを使い、入荷レーンが無い最上流のノードでは 0 になります。
TIP
cycleStock と inTransitInventory は最適化の決定変数ではありません。どちらも入力データから導出される 値で、安全在庫の配置がその拠点の総在庫にどう効くかを見るために出力しています。
5. シナリオを分析する
Analysis タブは単一シナリオの詳細分析です。Scenario を選択し、結果があれば Product を選択すると、グラフとチャートがその製品に絞り込まれます。
サプライチェーンネットワークグラフ
選択した製品の Flows から構築される、上流 → 下流に配置されたインタラクティブなノード・エッジ図です。
- Supplier(上流)・Facility(種別付き。例: 「DC1 (DC)」)・Customer(下流)が色分けされます。
- ノードをクリックするとフォーカスされ、その上流・下流が強調表示され、無関係なノードは薄く表示されます。
- パン・ズームで大規模ネットワークも確認できます。
チャート
- Demand by facility — 拠点別の伝播需要の平均。標準偏差のエラーバー付き。
- Supply capacity vs Demand by facility — 拠点別の供給能力と需要の比較。稼働率をラベル表示。
- Lead time breakdown by facility — 処理時間・入荷保証リードタイム・正味補充時間(τ)の積み上げ棒グラフ。
- Inventory by facility — サイクル在庫・安全在庫・輸送中在庫の積み上げ棒グラフ。棒の全高がその拠点の総在庫になります。
- サイクル在庫 は発注ロットに起因する平均在庫で、
Inventory Policies.inventoryTurns(1 期間あたりの在庫回転数)から算出します。1 回の補充がカバーする需要Q = 日次伝播需要 × 期間長 ÷ 回転数に対し、サイクル在庫はQ ÷ 2です(補充サイクル内で在庫がQから 0 へ減っていく平均値)。Inventory Policiesの行を持たないサプライヤ・顧客のノードでは未定義になります。 - 輸送中在庫 は入荷レーン上にある在庫で、その拠点の日次伝播需要に入荷輸送日数(
Pathsの距離と輸送手段の速度から算出)を掛けた値です。距離だけでなく需要にも比例します。入荷レーンが複数ある場合は最も長いものを使います。最上流の拠点は入荷レーンが無いため輸送中在庫は 0 になります。
- サイクル在庫 は発注ロットに起因する平均在庫で、
輸送中在庫やサイクル在庫が追加される前に最適化したシナリオでは、その帯は表示されません。どちらも無い場合はタイトルが Safety stock by facility になります。再実行すると表示されます。
これらのチャートの元になっているノード別の数値は、Results タブの Safety Stocks グリッドにあります。ソート・フィルタが可能です。
TIP
拠点別の需要・リードタイム・正味補充時間・輸送中在庫の指標はソルバーが算出します。これらの項目が追加される前に最適化したシナリオでは、再実行すると値が反映されます。該当する場合は Analysis タブに案内が表示されます。
6. シナリオを比較する
Comparison タブで、チェックボックスから比較するシナリオを選択します。比較には各シナリオの最新の成功結果が使われます。
- 比較テーブル — シナリオごとの Total safety stock cost(安全在庫総コスト)と Total safety stock quantity(安全在庫総数量)。
- 棒グラフ — シナリオ間の安全在庫総コストと総数量。
- Scenario map comparison — 選択した各シナリオのロケーションとフロー線を、シナリオ名ラベル付きの地図で表示。
現状(ASIS)と比較する
いま実際に持っている安全在庫と最適化結果を比べたい場合は、ASIS 用のシナリオを作り、通常のデータ インポートに加えて Upload ASIS data から現状の安全在庫を取り込みます。取り込んだ結果は他の結果と 同じように扱えるので、Comparison タブで最適化シナリオと並べて選択できます。手順は ASISデータをインポートするを参照してください。
関連ドキュメント
- Excelファイルフォーマット — インポートファイルのシート・列仕様
- ASISデータをインポートする — 現状の安全在庫を結果として取り込み、最適化結果と比較する
- 補充計画(Replenishment) — 需要を予測し、補充ポリシーを期間ごとにシミュレーション
- シナリオを比較する — シナリオ比較の操作方法