スタバのリワードで限界を狙う

2020年はいろいろと大変動の年になりました。年始にCOVID-19が世界的大流行し、様々な業種でビジネスモデルの変革や働き方改革が起こりました。

弊社もその一つで、在宅勤務が定常化したおかげで昼食を外で食べる機会が増えました。こと私に関してはカロリー摂取を控えるためにずっとスタバのフード(300kcalちょっとしかないやつ)を昼食にしてます。

# スターバックスカードのポイント
スタバではスターバックスカードというプリペイド式のカード(スマホアプリと連携できる)があり[(*スタバのサイトはこちら)](https://www.starbucks.co.jp/howto/card/)、これで支払いを行うと54円(税込)あたり1Starというポイントがたまります。最初はGreen Star会員と言って、Starにそれほど恩恵はないのですが、250Star集めるとGold Star会員になり、そこから150Star集めるごとにリワードチケットがもらえます。

スタバのドリンクとフードを頼むと大体800円くらいはするので、1/54(Star/円)というポイント率だとStarが貯まる貯まる。使わないと2つ3つ平気でリワードを保持した状態になってしまいますが、有効期限が1年なので定期的に使っていかないともったいないですよね。

# リワードは何に使えるの？
リワードでスタバのビバレッジやフード、コーヒー豆をもらうことができます。普段買わないようなリッチなビバレッジや、普段控えている食後のデザートなんかに使う人が多いようです。

使用条件は

 - 全国のスターバックス店舗で販売しているビバレッジ、フード、コーヒー豆のいずれか1品（700円（税抜）まで）
 - カップ値引き(カップやコップを持参すると20円引きになるサービス)も使える
 - カスタマイズ(ショット追加とかデカフェとか)も可能

です。要するに1商品にしか使えないけど700円までタダになるよってやつです。

僕はリワードブルジョワなのでいちいち700円ギリギリまで使ってやろうとか思いませんが、普通の人はなるべく700円のリミットギリギリを攻めたいでしょう。そんな人のためにMATLABで最適解を導いてみます。

# 値段の決定方法
ビバレッジの場合は

 - サイズごとの値段(Short, Tall, Grande, Venti)
 - カスタマイズ(ショット追加、ディカフェ、ソース追加などなど基本+50円)
 - カップ割引(-20円)

で値段が決まります。物によってはサイズがTallしかなかったり、カスタマイズの種類が少なかったりとややこしいので飲み物の最適解を見つけるべく計算してみます。フードはカスタマイズとかがないので普通に高額商品を買えばいいです。ちなみにショット追加などはいくらでも追加できる(追加ごとに+50円)ので、上限3カスタムとします。

(あとで気づくが普通に高いやつを選べばいい。。。)

計算の作戦としては

1. スタバのサイトでメニューを開く
2. 飲み物単体のページに飛び、サイズごとの値段を取得
3. それぞれがカスタム可能なメニューか調べる
4. カスタム可能なものの場合は最大カスタム数に応じて値段を計算

これは大変そうだ。なんで一覧にしといてくれないの。。。

# ツールボックス
今回はMATLABのText Analytics ToolboxでHTMLを読み込んできて調査します。

# メニューを取得する
まずはメニューページを取得します。このページです。

![スクリーンショット 2020-12-29 13.58.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530192/e3e3ada9-97de-f4f1-8b5c-673403aa8c53.png)

 - メニューの名前
 - 個別ページのリンク

をテーブルに格納します。価格は¥450〜¥570のような表記になっておりサイズごとの価格がわからないのであとで取得します。

![スクリーンショット 2020-12-29 13.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530192/e76a657b-c62c-50df-488c-e38b1cbc7853.png)

ひとまずhtmlからメニュー名と個別ページへのリンクを取得しました。なんとなく季節限定メニューと通常メニューも分けてみました。

# 価格の取得
次に各ビバレッジのページに飛び、サイズごとの価格を取得します。こんなページです。

![スクリーンショット 2020-12-29 14.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530192/c3f9410e-3029-fe75-a58f-980a4b1d26ac.png)

ここから価格を取得し、先ほどのテーブルに追加します。ついでに「季節のおすすめ」や「店舗限定」などの情報も更新しておきます。

![スクリーンショット 2020-12-29 14.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530192/3f2e1fa4-872e-9149-8313-050d8c9f4469.png)

価格は基本的にサイズで決まるのですが、一部そうでないものもあり切り分けが面倒だったのでサイズの情報は取ってきませんでした。

# カスタム可能かどうかを取得
次に各メニューがカスタム可能かどうかを取得します。このページを使いました。ここにはカスタムできるものの一覧が出てます。

![スクリーンショット 2020-12-29 14.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530192/3d52a81e-1832-867f-2561-882b2ccc7f8f.png)

ここに載っているメニューの名前を取得します。

![スクリーンショット 2020-12-29 14.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530192/fd005508-4fdc-754f-05d7-b64416bc0769.png)

どのメニューでどう言ったカスタムが可能かを取ってくるのが困難だったので、今回は一律で3カスタムまでできるとします。

先ほどから情報をまとめているテーブルのほうに、カスタム可能かどうかのフラグを追加します。

![スクリーンショット 2020-12-29 14.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530192/09ffd51d-ed15-cfcf-0720-5705abb9508c.png)

# 価格表を作成
表を価格とカスタム数ごとに展開し、新しくテーブルを作成します。

![スクリーンショット 2020-12-29 14.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530192/9f0209e4-61df-7402-f109-498feab63c37.png)

メニュー名、カスタムの数、サイズごとの価格を一覧表示できました。

# 最適解は。。。
カップ割引を用いら場合は上限720円までが無料になるので、その値段の物を探すと。。。

| カテゴリ | 名前 | 金額 | カスタム数 |
|:-:|:-:|:-:|:-:|
| 季節限定    | アール グレイ ハニー ホイップ ティー ラテ |720| 3  |
| 通常メニュー |  キャラメル フラペチーノ |720|  3 |
| 通常メニュー |抹茶 クリーム フラペチーノ|720|  3 |
| 通常メニュー |バニラ クリーム フラペチーノ|720| 3  |
| 通常メニュー |エスプレッソ アフォガート フラペチーノ|720|   3|

これらに絞られました。カスタム数を固定しているせいで不可能な組み合わせがあるかもしれないので、サイトからこれらのメニューを調べてみます。

調べた結果こうなりました

| カテゴリ | 名前 | 金額 | カスタム数 |
|:-:|:-:|:-:|:-:|
| ~~季節限定~~    | ~~アール グレイ ハニー ホイップ ティー ラテ~~ |~~720~~| ~~3~~ **上限1** |
| 通常メニュー |  キャラメル フラペチーノ |720|  3 |
| ~~通常メニュー~~ |~~抹茶 クリーム フラペチーノ~~|~~720~~|  ~~3~~ **上限2**|
| ~~通常メニュー~~ |~~バニラ クリーム フラペチーノ~~|~~720~~| ~~3~~ **上限2**  |
| ~~通常メニュー~~ |~~エスプレッソ アフォガート フラペチーノ~~|~~720~~|   ~~3~~ **上限1**|

(同じカスタムを複数回適応すれば外したものでも720円は可能)

というわけで**キャラメルフラペチーノ**だけが残りました。具体的に組み合わせを検証してみると

| カスタム1 | カスタム2 | カスタム3 | サイズ |
|:-:|:-:|:-:|:-:|
|コーヒー多め|豆乳に変更|チョコレートチップ|Venti|
|コーヒー多め|アーモンド ミルクに変更|チョコレートチップ|Venti|

となりました。というわけで、スタバのリワードで限界を狙った結果、

 - エクストラコーヒー ソイ キャラメル フラペチーノ® with チョコレートチップ Ventiサイズ
 - エクストラコーヒー アーモンド ミルク キャラメル フラペチーノ ® with チョコレートチップ Ventiサイズ

の2択であることがわかりました。**Ventiが入るくらいのタンブラーを忘れずに!**

# カップ割引を使わない時は？
カップ割引を使わない時は20円の割引がないので上限が700円となります。同じように調べてみると、

 - エクストラショット エスプレッソ アフォガート フラペチーノ® Ventiサイズ

のみが700円となります。カップを持ってない人はこれを頼むといいでしょう。

# 実際にやってみたら更新します。



# 感想
今回初めてMATLABでのHTML分析をやってみました。四苦八苦したのでぜひ「いいね」をお願いします。

# コード改変しました
[コードを改変した方の記事](https://qiita.com/tommyecguitar/items/4898e9bbdb81bac3d943)