はじめに
こんにちは、データサイエンティストの高橋です。
Oisixでは、お客様は週次のサイクルで食材や商品を購入し、毎週「定期ボックス」という形で個人の嗜好に合わせた商品セットの提案を受け取ります。提案された商品は自由に追加・削除・変更できる柔軟なシステムとなっています。
このようなサービスにおいて、需要予測は非常に重要な要素です。特に、お客様の注文開始後(木曜日の商品公開後)に行う需要予測は、商品の製造計画や在庫管理、欠品防止などの多くのオペレーションに活用されており、ビジネスの根幹を支える重要な予測となっています。
本記事では、現在運用中の注文開始後に需要を予測するモデルの精度評価を実施した際に直面した課題と、その解決に向けて検討・実装した手法について紹介します。
Oisixサブスクの仕組みと需要予測の重要性
サブスクリプションサービスの特性
Oisixのサブスクリプションサービスは次のような特徴があります。
- 週次サイクル:毎週木曜日に新しい商品セットが公開され、お客様は翌週の配送に向けて注文する
- 定期ボックス提案:お客様の過去の購入履歴や嗜好に基づいて、商品セットを提案
- 柔軟な変更:提案された商品の追加・削除・変更が可能
注文開始後の需要予測の役割
木曜日に商品が公開された後、実際の配送日(通常は翌週)まで数日間の猶予があります。Oisixでは、この期間中に刻々と変化する注文状況を踏まえて需要を予測し、次の重要な意思決定に活用しています。
- 製造計画の調整:調理キット(Kit Oisix)など製造が必要な商品の生産数を決定
- 在庫管理:各商品の適切な在庫量を確保し、過剰在庫や欠品を防止
- 商品差し替え:需要が供給を大幅に上回ると予想される商品を、類似の商品に置き換える
この需要予測は、お客様の満足度(欠品回避)と収益性向上(廃棄ロス削減)の両立を図る上で極めて重要な要素となっています。
需要予測の精度評価における課題(反実仮想)
需要予測モデルの精度を評価しようとした際、大きな問題に直面しました。それは、需要が想定より多く、在庫切れが予想される商品に対して「差し替え」処理が実施されることです。
具体的には次のような流れになります。
- 注文開始後、数時間おきに需要を予測する
- 予測需要が在庫を大幅に上回る商品を特定
- 該当商品を代替商品に差し替え
- 差し替えられた商品の実際の販売数が観測できない
この現象は統計学でいう「反実仮想問題」(counterfactual problem)に該当します。つまり、「もし差し替えが行われなかった場合、その商品はどれだけ売れたのか」という事実に反する仮定的な状況を知ることができないのです。
差し替え商品の販売数を推定する手法の検討
この課題を解決するため、差し替えられた商品の販売数を推定する複数の手法を検討しました。
手法1: 購入率差分による推定
基本アイデア
まずは、シンプルなルールベースの方法で解消できないか検討しました。
差分の差分法のように、同じ商品が提案された顧客群において、差し替えられた顧客と差し替えられなかった顧客の間で購入行動の差分を観察し、差し替え商品への購入率を推定する手法です。
具体的な手法
次の変数を定義しました。
- X1: 差し替え対象商品について、差し替えが発生しなかった顧客群の購入率
- Y1: 差し替えが発生しなかった別商品について、X1の顧客群の購入率
- X2: 差し替え対象商品について、差し替えられた顧客群の購入率(観測不可)
- Y2: 差し替えが発生しなかった別商品について、差し替えられた顧客群の購入率
推定式:X2 = Y2 + (X1 - Y1)
この推定式がうまく機能するためには、X1とX2・Y1とY2という商品は同一だが顧客群が異なる場合でも、購入傾向は同一であるという前提が成り立つ必要があります。その前提が成り立つ場合のみ、(X1 - Y1)から商品が異なる場合の購入率の差分を算出して、観測不可であるX2を推定できます。
検証結果と課題
- 提案数が500以上の場合:誤差±数%程度と比較的良好
- 提案数が少ない場合:誤差が大幅に増加
顧客グループのサイズが小さい場合は、個人の嗜好差の影響により手法の前提が成り立たないことが判明しました。商品ごとに購入率差分の傾向には大きな差があり、汎用性に欠けると判断し採用を見送りました。
手法2: 合成コントロール法
手法の概要
合成コントロール法は、複数の非処置ユニット(今回は差し替えされなかった商品)の加重平均により合成ユニットを作成し、処置ユニット(差し替えされた商品)に処置が行われなかった場合の結果を推定する手法です。
以下は、item_id=2501abw0という商品に差し替えという介入が行われなかった場合の購入率の推移を推定したものです。介入を受けていない(2501abw0以外)商品の購入率の推移を加重平均することで、synthetic_2501abw0という差し替えが行われなかった場合の購入率を推定しています。
検証結果と課題
- 推定精度: 加重平均で作成された合成ユニットではうまく推定できないケースが多数存在。具体的には下の画像の1つ目のように介入前の推移を合成ユニットで精度高く再現できた場合はうまく機能しますが、2つ目のように実績と乖離したものになってしまうと推定結果は当てになりません。
- 計算コスト:商品ごとに適用する場合、推論時間がかかりすぎる
- 時系列データの必要性:商品がどのタイミングで購入が確定したか確認できるログが必要(今回は一部のデバイスで取得できないことが判明)
この結果から、実用的ではないと判断し採用を断念しました。また、ここまでの検証でルールベースでの対応が難しいケースが多く確認されたため機械学習モデルの導入に踏み切りました。
手法3: 分類モデルによる購入予測
アプローチ
最終手段として、差し替えられた顧客が「仮に差し替えられなかった場合にその商品を購入したかどうか」を予測する分類モデルを構築しました。
モデル設計の特徴
- モデルについて:すでに構築済みであるLightGBMを用いた注文前に需要を予測するモデルをベースに変更を加えました
- 予測単位:顧客×商品単位で購入確率を予測
- 特徴量追加:差し替えられた商品以外の購入状況など注文前には使用できない情報を用いて特徴量を追加
データ分割
データの分割方法は、やや複雑です。
まず、商品を3つのパターンに分けます。
- 差し替えが発生しなかった商品(A)
- 差し替えにより置き換えられた商品(B)
- 差し替えにより置き換えた商品(C)
そこから、差し替え対象の商品に対して、差し替えが発生した顧客群とそうでない顧客群に分けます。(差し替えは全ての顧客に対して行われるのではなく、注文開始後の早いタイミングでアクセスしていた顧客には行われないため、分離が可能)
商品Aは実際に差し替えが発生していませんが、学習・評価の都合で差し替えが仮に発生した場合として顧客群を分けておきます。
すると、次のようにデータを分割できます。モデルで予測したい商品B×差し替えられた顧客群をTestデータ、擬似的に作成したTestと性質が近いセグメントをValidationデータ、それ以外をTrainデータとできます。
性能評価結果
- AUC: 0.922
- 予測誤差率: 約13%
この結果を受けて、本モデルの出力を差し替え商品の販売数推定値として採用することを決定しました。
全商品を対象とした精度評価結果
評価手法
上記の分類モデルにより差し替え商品の販売数推定が可能となったため、全商品を対象とした精度評価を実施しました。
主要な発見
1. カテゴリ別精度差
商品のカテゴリごとに評価結果を集計することで、現行のモデルの課題を把握でき、改善するべきポイントを分析できるようになりました。
2. 定性評価との整合性
社内で定性的に「精度が低かった」と評価されていた期間において、実際に予測誤差が大きいことが定量的に確認できました。これにより、従来の感覚的な評価が数値的に裏付けられました。
おわりに
本取り組みでは、「商品の差し替え」という介入により生じる反実仮想の問題に対して、複数の手法を検討・実装することで解決策を見出しました。
今回の評価により、現行モデルの課題が定量的に明らかになったことで、今後の改善方針を明確にできました。需要予測の精度向上は、顧客満足度の向上と事業効率化の両方に寄与する重要な要素であり、継続的な改善に取り組んでいく予定です。
また、今回の定期ボックスでの「差し替え」処理における反実仮想の適用に加え、一般的な売り場でも売り切れによる同様の課題が存在します。今後は一般的な売り場の需要予測の精度評価にも同様の手法を適用し、より幅広いケースでの予測精度向上に取り組んでいきます。