機械学習 · 需要予測と在庫最適化 · 食品小売

空の棚の向こうの需要

生鮮商品が売り切れると、販売データは本当のことを語らなくなります。空の棚の向こうにある需要を区間付きで推定し、明日の発注に変えます。

ライブで試す

01

概要

FreshRetailNet-50Kは、生鮮食品の販売に関する公開データセットです。898店舗の50,000の商品系列について、時間ごとの販売と、その商品の在庫の有無を示す時間ごとのフラグが含まれています。データでは、販売時間の19.7%が欠品で、商品日(商品ごとの一日分)の44%で少なくとも一度は在庫が切れています。その時間帯には、販売はほとんど記録されません。そのため、記録された販売で学習した予測は空の棚を客の少ない時間とみなし、予測が低めに出ます。

私たちは、欠品ごとに隠れた需要を、80%区間付きの数値として推定します。モデルは、答えが分かっている時間からだけ学習します。在庫が切れなかった日を選び、実際に売り切れた日の欠品パターンをそこに写して、その時間を隠し、それを復元するよう学習させます。使うのは、その日の残りの時間、商品自身の履歴、値引き、カレンダー、天候、カテゴリーです。モデルが一度も見ていない167店舗で、区間が真の値を含んだ割合は80.0%でした。最初の版では、実際に売り切れた日でのこの割合は71%にとどまりました。そうした日は、在庫のある時間から想像されるより忙しいためです。売り切れた日の在庫があった時間でも学習させることで、この検証は79.5%に戻りました。どちらの検証も、販売を実際に観測できた時間を隠しています。売り切れた後の需要は決して観測できないため、その区間は一つの仮定、つまり検証できる時間と同じように振る舞うという仮定に基づいています。データセット全体では、私たちの中心推定値は記録された販売に17%を上乗せします。

次に、確率的予測によって、復元した需要を発注に変えます。予測はデータセットのホールドアウト週で検証しました。補充方策は、毎晩、予測の分位点を補充点として、まだ販売できる在庫を差し引いた量を発注します。在庫は先入れ先出しで古くなり、その販売可能日数は、利用者が1日、2日、3日から設定する仮定です。ホールドアウト週をシミュレーションで再生し、廃棄と販売機会損失を、記録された販売に基づく発注と並べて示します。この再生では、機会損失のコストを廃棄の二倍とし、需要には私たちの推定値を含めています。その条件で、私たちの推定値に基づく発注は、廃棄と機会損失を合わせたコストを、販売可能日数1日、2日、3日でそれぞれ4.6%、5.6%、10.9%削減しました。欠品がまったく需要を隠していなかったとすれば、二つの方策の差は1.3%以内に収まります。この効果は、機会損失のコストが廃棄より高いことにも依存します。機会損失のコストが廃棄と同じかそれ以下で、欠品が需要を隠していなかった場合、私たちの推定値に基づく発注のほうが1〜5%コストが高くなります。機会損失のコストが1のとき、3日の数値は-10.9%から-0.2%に縮みます。販売可能日数が2日または3日では、両方策とも予測範囲の上限(P95)で発注するため、この二つの数値は最も不確かです。販売量はデータセット独自のスケール単位です。復元した数値はすべて私たちの推定値であり、観測値ではありません。映像の棚は、データにある一つの商品の一日を再生する3Dレンダリングです。

02

開発内容

  • 打ち切られた需要の復元。P10〜P90のLightGBM分位点モデルで、在庫があった時間を隠して学習させます。別の店舗でのsplit-conformalによる検証で校正し、ホールドアウトの167店舗で検証しています。その検証の一つでは、実際に売り切れた日だけを使います。
  • ホールドアウト週を対象に一日先を予測する確率的予測。記録された販売と復元した需要のそれぞれで学習し、単純なベースラインと比べて、CRPS、pinball loss、WAPE、バイアスで評価します。
  • 在庫の経過日数を追跡する補充点方式。仮定した販売可能日数1〜3日のもとで、先入れ先出しで販売します。発注分位点はコスト比ごとに二週間のバックテストで調整し、ホールドアウト週では固定します。
  • 空の棚から始めるシミュレーションによる再生。結果を二通りで挟み込みます。私たちの推定値を含む需要での再生と、記録された販売だけでの再生です。
  • すべてホールドアウト店舗からの2,000系列のインタラクティブな再生。ブラウザ上で店舗と商品を選び、記録された需要か推定した需要かを表示し、廃棄に対する機会損失のコストを動かし、販売可能日数を変えられます。方策はその場で再調整され、再生されます。
03

技術スタック

Python、pandas、NumPy、LightGBM(分位点回帰)、split-conformalによる校正 · three.js(物理ベースレンダリング、累積方式の被写界深度とソフトシャドウ) · ブラウザ内の最適化にvanilla JavaScript

04

数値

すべての数値は、FreshRetailNet-50K(Dingdong-Inc、CC BY 4.0)での私たち自身の実行結果です。販売量はデータセット独自のスケール単位です。

数値測定方法
販売時間の19.7%が欠品

06:00–22:00の時間ごとの在庫フラグで、全50,000系列・97日分を対象にしています。商品日の44.0%で少なくとも一度欠品し、4.0%では終日欠品でした。

区間の被覆率80.0%(目標80%)

ホールドアウトの167店舗の444,393商品日です。実際の欠品パターンを在庫のあった時間に写し、その時間を隠して、真の合計が私たちのP10–P90区間に入るかを確認しました。

実際に売り切れた日での被覆率79.5%

12:00以降に欠品した、ホールドアウトの222,549日です。欠品の2時間前に終わる、在庫のあった3時間を隠しました。売り切れた日で学習しなかった場合、被覆率は71.4%、推定値は39%低くなりました。

隠した時間の誤差40%(P50のWAPE)

同じ444,393日での値です。直近の在庫があった日の同じ時間を使うと誤差は49%、その日の在庫があった時間を通常の時間帯別パターンで拡大推計すると60%です。

欠品で隠れた需要+17%

欠品のあった全210万商品日についてのP50推定値の合計を、記録された販売の総量と比べたものです。中央値の合計は総量を過小に見積もります。代わりに日ごとのP10とP90の部分を合計すると、8%と30%になります。

ホールドアウト週でCRPSが2.4%低い

復元した需要で学習した予測と、記録された販売で学習した同じモデルとの比較で、0.192 対 0.197です(スケール化したCRPS、低いほど良い)。在庫が切れなかったホールドアウトの206,562商品日で評価しており、そこでは記録された販売が需要と一致します。28日間の経験分位点ベースラインは0.240です。

売り切れた日の過小予測42% 対 56%

ホールドアウトの売り切れた日のうち、予測の中央値が実際に記録された販売(その日の需要の下限)を下回った日の割合です。復元需要による予測と、記録販売による予測の比較です。この検証は高めの予測を有利にするため、在庫のあった日のバイアス(+3.1% 対 -6.4%)とあわせて読んでください。

販売可能日数1 / 2 / 3日での再生コスト-4.6% / -5.6% / -10.9%

コスト = 需要単位あたりの(2 × 機会損失 + 廃棄単位)で、空の棚から始め、全50,000系列のホールドアウト週について求めました。再生での需要 = 記録された販売 + 欠品時間に対する私たちのP50推定値。私たちの推定値に基づく発注と、記録された販売に基づく発注を比べています。各方策の発注分位点は、直前の二週間で調整しました。隠れた需要を代わりに私たちの区間から抽出すると(200回)、-4.0% / -7.2% / -12.6%になります。

何も隠れていなかった場合は1.3%以内

記録された販売だけを需要とした同じ再生で、+1.3% / -0.3% / +0.8%です。

-5%〜+5%(機会損失のコストが廃棄0.5〜1単位分のとき)

同じ再生で、コスト比を変えたものです。私たちの推定値を需要とした場合は-5.5%〜-0.2%。記録された販売だけの場合は+0.8%〜+5.4%で、何も隠れておらず機会損失が安い場合には、私たちの推定値に基づく発注のほうがコストが高くなります。販売可能日数2日と3日では、調整後の両方策とも予測範囲の上限P95に張り付いています。

販売可能日数1日での廃棄20.4% 対 23.0%

上記と同じ再生です。私たちの推定値に基づく発注では需要の20.4%を廃棄し、7.2%が販売機会損失になります。記録された販売に基づく発注では、廃棄23.0%、機会損失6.7%です。前日の販売に調整済みの係数を掛けて発注すると、需要単位あたりのコストは0.600で、私たちの方法は0.347です。

ブラウザでの再調整と再生に42 ms

私たちのM1 ProのノートPC上のヘッドレスChromiumで10回実行した中央値です。各実行では、2,000系列について、14日間のバックテストで37通りの発注分位点 × 2方策を調整し、その後7日間の週を再生します。スマートフォンではもっと遅くなります。

05

静止画

06

ライブで試す

ブラウザ上で動くインタラクティブビューです。開くまでは何も読み込みません。

ライブで試す ダウンロード 3.3 MB

同じような課題をお持ちですか?

計算したいこと、シミュレーションしたいこと、判断したいことをお聞かせください。私たちならどのように取り組むかをお伝えします。

相談する AI・機械学習