AI・機械学習
Instacartの320万件の注文における面白い商品の共起
Funny item co-occurrences in 3.2M Instacart orders (rogerdickey.com)
要約
この記事は、Instacartの320万件の注文データを用いて、通常では考えにくい商品の組み合わせを分析した結果を報告しています。当初、単純な共起頻度ではノイズが多く、興味深い結果が得られませんでしたが、商品の詳細なバリアントをGPC(Global Product Classification)という標準的な分類システムにマッピングし直すことで、より意味のある「ブリック」レベルでの共起分析が可能になりました。この手法により、ワインと冷凍穀物、スピリッツとベビーフードといった、より示唆に富む商品の組み合わせが特定されました。
全文翻訳
先日、スーパーマーケットで人々が購入する最も奇妙な商品の組み合わせについて、ふと疑問に思いました。レジ係がくすくす笑い、後で友人に「おい、この男が来てコンドームとリンゴしか買わなかったんだぜ、信じられるか?」と言うような買い物カートです。
そこでClaudeを起動し、見つけられるレシートデータを調べ始めました。
最終的な結果については、一番下までスクロールしてください。そうでなければ、この旅を追って読んでください。
食料品店はこの種のデータを非常に厳重に管理しています。レシートデータを収集する消費者向けアプリ(ReceiptHogやFetchなど)はありますが、それらは推測ですがヘッジファンドなどに販売しているのでしょう。しかし、数年前、Instacartはレコメンデーションアルゴリズムの最適化を目的とした機械学習コンペティションの一環として、300万件の注文データをオープンソース化しました。このデータはKaggleで入手可能で、非常に豊富です。私たちが欲しいのは、レコメンデーションアルゴリズムとは正反対のものですが、このデータはうまく機能するはずです。
Instacartのデータセットには以下のものが含まれています。
3,214,874件の注文
平均約10個の商品/注文
49,688個のユニークな商品
134個のユニークな「通路」(商品カテゴリ)
ですから、やるべきことは、すべてのカートを見て、どの商品の組み合わせが出現しにくいかを確認することだけです。試してみましょう。いくつかのグループ分けをテストするために、ペア、トリプル、クアッドを含めました。
商品の共起カウント:ペア
カウント 商品1 商品2
1 バナナ エキストラファンシー無塩ミックスナッツ
1 オーガニックハスアボカド ベビーキュウリ
1 オーガニックハスアボカド トレイルミックス
1 オーガニックバナナバッグ バナナ
1 ライム トレイルミックス
1 オーガニックガーネットスイートポテト(ヤム) クレメンタイン
1 オーガニックアボカド ゼロカロリーコーラ
1 オーガニックフジアップル ベビーキュウリ
注:ペアの最大共起カウントは62,341です。
商品の共起カウント:トリプル
カウント 商品1 商品2 商品3
1 バナナ オーガニックバナナバッグ ソーダ
1 バナナ オーガニックバナナバッグ クレメンタイン
1 バナナ オーガニックバナナバッグ スパークリングミネラルウォーター
1 バナナ オーガニックバナナバッグ フラットパセリ、束
1 バナナ オーガニックバナナバッグ スパークリングウォーター
1 バナナ オーガニックバナナバッグ フレッシュCA産卵
1 バナナ オーガニックバナナバッグ レッドシードレスグレープ
注:トリプルの最大共起カウントは15,066です。
商品の共起カウント:クアッド
カウント 商品1 商品2 商品3 商品4
1 バナナ オーガニックバナナバッグ オーガニックベビーほうれん草 ハーフ&ハーフ
1 バナナ オーガニックバナナバッグ オーガニック全乳 オーガニックズッキーニ
1 バナナ オーガニックバナナバッグ オーガニックアボカド オーガニックハーフ&ハーフ
1 バナナ オーガニックバナナバッグ ストロベリー オーガニックレモン
1 バナナ オーガニックバナナバッグ オーガニックハスアボカド スプリングウォーター
1 バナナ オーガニックバナナバッグ オーガニックイエローオニオン オーガニックフジアップル
注:クアッドの最大共起カウントは3,828です。
うーん。これらはあまり面白くありません。おそらく、一度しか発生しない組み合わせが大量にあるためで、上位5〜10件しか見ていないため、ソート方法を改善する必要があるのでしょう。
ユニークな商品のペアは約12億通り(5万件のセットからの順序なしペア)あります。そのうち約97%はデータに現れず、現れるものの中でも、約2200万ペアがちょうど1回だけ発生します。ほとんどすべてのペアがゼロまたは1でタイする場合、「最も少ない」は無意味になります。
では、どのようにソートすべきでしょうか?Claudeは「リフト」で各組み合わせをランク付けするという良いアイデアを出しました。これは、実際に発生する頻度を、発生すると予想される頻度で割ったものです。リンゴとオレンジという非常に一般的な2つの商品がある場合、それらはたくさん共起すると予想されます。もしそうでないなら、それは注目に値し、そのペアはより高くランク付けされるべきです。では、それを試してみましょう。
リフトによる商品の共起:ペア
リフト 商品1 商品2
0.0007 バナナ エキストラファンシー無塩ミックスナッツ
0.0010 オーガニックハスアボカド ベビーキュウリ
0.0012 オーガニックハスアボカド トレイルミックス
0.0017 オーガニックバナナバッグ バナナ
0.0019 ライム トレイルミックス
0.0020 オーガニックガーネットスイートポテト(ヤム) クレメンタイン
0.0021 オーガニックアボカド ゼロカロリーコーラ
0.0025 オーガニックフジアップル ベビーキュウリ
リフトによる商品の共起:トリプル
リフト 商品1 商品2 商品3
0.0016 バナナ オーガニックバナナバッグ ソーダ
0.0019 バナナ オーガニックバナナバッグ クレメンタイン
0.0032 バナナ オーガニックバナナバッグ スパークリングミネラルウォーター
0.0043 バナナ オーガニックバナナバッグ フラットパセリ、束
0.0047 バナナ オーガニックバナナバッグ スパークリングウォーター
0.0056 バナナ オーガニックバナナバッグ フレッシュCA産卵
リフトによる商品の共起:クアッド
リフト 商品1 商品2 商品3 商品4
0.0111 バナナ オーガニックバナナバッグ オーガニックベビーほうれん草 ハーフ&ハーフ
0.0128 バナナ オーガニックバナナバッグ オーガニック全乳 オーガニックズッキーニ
0.0137 バナナ オーガニックバナナバッグ オーガニックアボカド オーガニックハーフ&ハーフ
0.0148 バナナ オーガニックバナナバッグ ストロベリー オーガニックレモン
0.0155 バナナ オーガニックバナナバッグ オーガニックハスアボカド スプリングウォーター
パターンが見えてきました...
もちろん、オーガニックバナナと非オーガニックバナナの両方を購入する可能性は低いですが、これは50,000もの商品が細かすぎることという大きな問題を示しています。各商品には dozen+ のバリアントがあります。生鮮食品部門だけでも28種類のコンドーム製品と110種類のリンゴ製品があるため、私たちのくだらない「コンドーム+リンゴ」の例はノイズを上回るのに苦労するでしょう。
私たちは49,688個の商品(細かすぎる)を134個の通路(広すぎる)に分類しています。その中間のレベルが必要です。分類器を構築する時です!しかし、どうやって?
GPCの登場
ほぼ100%の食料品小売業者がGS1 Global Product Classification(GPC)と呼ばれる商品分類システムを使用していることが判明しました。GPCは、大型店や食料品店で見つかる可能性のあるあらゆるもののオントロジーです。製品をセグメント(キャンプ、履物、照明、工具、食品…)に分割し、それらはファミリー(パン、飲料、果物、肉、野菜…)を含み、それらはクラス(豆、メロン、ピーマン、キノコ…)を含み、それらはブリック(シャントレル、エノキタケ、トリュフ、モレル…)を含みます。
一部のブリックは、subtypeやattributeにさらに深く入り込みます。例えば、モレルはCONVENTIONALまたはORGANICの栽培方法を持つことができますが、私たちの目的のためにはブリックレベルで止めることができます。GPCシステム全体には5,318個のブリックがあります。多くのセグメント(配管、生きた動物、産業システムなど)は食料品店では販売されていないため、それらを削除できます。これにより、食料品に関連する9つのセグメントと合計1,697個のブリックが残ります。そして、私たちの商品はそのうち約1,000個しか占めていません。これは適切な粒度レベルのように感じられ、複雑さが50倍削減されます!
いつもの分類器を起動する時です。約50,000個の商品を約1,000個のブリックに押し込んでいるため、標準的な2段階のアプローチを使用しました。
各商品のブリックオプションを絞り込む。まず、各商品と各ブリックの埋め込みを取得します。これはローカルでqwen3-embedding:8bを使用して行いました。次に、各商品について、コサイン類似度によって最も近い10個のブリックを見つけます。
最適なブリックを選択する。LLMを使用して、10個のオプションから各商品に最適なブリックを選択します。これには約5ドルかかり、数分で完了しました。gpt-4.1-miniを使用して60個のリクエストを並列実行しました。製品からブリックへの完全なマッピングは、誰かに役立つ場合に備えてここにあります。
これで、共起アルゴリズムを再度実行し、商品ではなくブリックを使用するとより良い結果が得られるか確認してみましょう。
リフトによるブリックの共起:ペア
リフト ブリック1 ブリック2
0.004 ワイン – スティル 穀物/シリアル – 未調理(冷凍)
0.007 スピリッツ 穀物/シリアル – 未調理(冷凍)
0.012 ビール ベビーリーフ
0.013 スピリッツ デーツ
0.019 ワイン – スティル 茎野菜(生カット)
0.020 スピリッツ 魚 – 未加工/未処理
0.022 ビール 魚 – 未加工/未処理(常温保存可能)
リフトによるブリックの共起:トリプル
リフト ブリック1 ブリック2 ブリック3
0.014 チーズ ワイン – スティル 冷凍穀物/シリアル
0.019 ミルク 香ばしい穀物料理(常温保存可能) スピリッツ
0.019 キュウリ ベビー/乳幼児用特殊食品 スピリッツ
0.020 ケール クレメンタイン ワイン – スティル
0.021 ブロッコリー ベビー/乳幼児用特殊食品 スピリッツ
リフトによるブリックの共起:クアッド
リフト ブリック1 ブリック2 ブリック3 ブリック4
0.027 バナナ ストロベリー ガーリック スピリッツ
0.028 ミルク代替品 ストロベリー ニンジン スピリッツ
0.032 バナナ ミルク代替品 ベビーフード スピリッツ
0.035 バナナ ミルク ワイン – スティル 香ばしい穀物料理