Shingoの数学ノート

プログラミングと機械学習のメモ

セブンイレブンで10000円企画の商品を効率的に選択したい

セブンイレブンで10000円企画を効率的にしたい

Youtubeとかで「10000円分食べる」みたいな企画あるじゃないですか。あれってちゃんとプログラム組めば効率的に商品を選択できると思うんですよね。
ということで、Pythonでスクレイピングと最適化のプログラムを作成しました。

スクレイピング

まず、セブンイレブンの商品情報をスクレイピングしました。セブンイレブンの公式サイトからPythonのライブラリで商品名や価格、カテゴリなどを収集しました。

データはこんな感じ

最適化

次に、スクレイピングで取得したデータを使って10000円以上となるような組み合わせで、最もカロリーなどが少なくなるように最適化を行いました。

栄養基準としては成人男性を基準に以下のようにしました

1.熱量:2600kcal

2.たんぱく質:57.5g

3.脂質:25g

4.炭水化物:375g

5.食塩相当量:7.5g

この基準に基づき、各商品に対して栄養価の標準化スコアf(xi)f(x_i)を算出し、それらのスコアの総和を最小化するように最適化を行いました。最適化問題は以下のように数式で表せます:

minimize i=1nf(xi)subject to i=1npixi10000,xi{0,1,2}f(xi)=j=15cijxi/gj\begin{equation} \text{minimize } \sum_{i=1}^{n} f(x_i)\\ \text{subject to } \sum_{i=1}^{n} p_i x_i \ge 10000, \quad x_i \in \{0, 1, 2\} \\ f(x_i) = \sum_{j=1}^{5}c_{ij} x_i /g_j \end{equation}

ここで、xix_i は商品 ii の個数(0から2の整数値)、cijc_{ij} は商品 iijj番目の栄養価、gjg_{j}jj番目の栄養基準、pip_i は商品 ii の価格を表します
整数計画問題なので、Pythonの最適化ライブラリ「pyomo」で実装しました。

結果

結果はこちら

確かに栄養価は抑えられていそうだが、コーヒー多すぎてやばそう。あと、サラダとか多くて健康的だけど飽きそう。

ということで、カテゴリごとに3個までにして再チャレンジ。

結果(カテゴリごとに3個に制限)

脂質と炭水化物がオーバーしてるけど、なんとかできそう?と言っても量はかなり多いですね。

まとめ

セブンイレブンで10000円企画を効率的に進めるため、Pythonでスクレイピングと最適化を組み合わせたアプローチを紹介しました。お金に余裕がある人はやってみて(責任は負いません)。

おまけ

1000円以下でできるだけ多く栄養素をとるにはどうすればいいかも求めました。

1000円以下で3533kcal。さすが菓子パン。

Comments

Loading comments...