16
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MATLABでスタバのフードを選ぼう

Posted at

スタバに行って仕事をしよう。

 いつものようにパイクプレイスのグランデをお願いしたのはいいんですけど、なんかつまみながら仕事をしたい気もします。アップルパイがあれば一択なんですけど、秋限定でした。

一緒に行った人の意識が高い。

 「私、今日のカロリーは残り 200kcal しか取れないんだけど、何がいいかな。」
 「・・・」

 じゃあコーヒーだけでいいじゃん、とは言わずに、スタバの Wi-Fi に接続してMATLABのプログラムを書きましょう。
 ここにいろいろ情報がありそうですね。
 https://www.starbucks.co.jp/allergy/

 MATLAB だと websave ってコマンドで保存できます。カロリーのついでに、タンパク質・脂質・炭水化物・塩分も取ってきちゃいましょう。

%% ウェブから持ってこよう。
url = "https://www.starbucks.co.jp/assets/images/web2/images/allergy/pdf/allergen-food.pdf";
websave('starbucks_food.pdf',url)

%% 関連しそうな文字列をごっそり取り出す。
D = extractFileText('starbucks_food.pdf');
D = extractBetween(D,"食塩相当量(g)","お問い合わせ先");
D = replace(D,newline,' ');
X = regexp(D,'[^0-9]+ [0-9.]+ [0-9.]+ [0-9.]+ [0-9.]+ [0-9.]+','match');

%% テーブルを作ろうね
for n = 1:length(X)
    spl = split(X(n));
    Name(n,1) = join(spl(1:end-5));
    Energy(n,1) = double(spl(end-4));
    Protein(n,1) = double(spl(end-3));
    Fat(n,1) = double(spl(end-2));
    Carbo(n,1) = double(spl(end-1));
    Salt(n,1) = double(spl(end));
end

T = table(Name,Energy,Protein,Fat,Carbo,Salt);

%% 表示
T = sortrows(T,'Energy');
X = reordercats(categorical(T.Name),T.Name);
h = barh(X,T.Energy);

hold on  % 限界 200kcal の線
y = ones(size(X)) * 200;
plot(y,X,'LineWidth',5,'Color','g')
hold off

% 200を超えたやつは、危険な赤色で塗っておこう。
h.FaceColor = 'flat';
idx = h.CData(T.Energy > 200,:);
[m,n] = size(idx);
h.CData(T.Energy > 200,:) = repmat([1 0 0],m,1);

 extract** とかは Text Analytics Toolbox の関数ですね。
 rexexp は \d とか使っても数字が取れるけど、6枚入り!みたいな全角数字も取っちゃうので、[0-9.] って書いて半角の数字とピリオドだけ取りましょう。

 こんな結果が出たら安心。

starbucks200over.png

 一番上のシュトーレンすごいな。とりあえず下の13個くらいから選べばいいね。

追加の要望があります。

 「とりあえず13個に絞ったから、適当に選んでよ。」
 「最近、塩分も控えてるから、塩分 0.2g 未満のものがいいな。」
 「・・・」

 ご注文を繰り返させていただきながら、コマンドにでも打ってみましょう。

% カロリーが 200kcal 未満で、塩分が 0.2g 未満。
Res = T.Name(T.Energy < 200 & T.Salt < 0.2)

 コマンドウィンドウを見てみよう。

Res = 

  4×1 の string 配列

    " パッケージフード アフターコーヒーミント(ペパーミント)"
    " パッケージフード ホワイトチョコレートマシュマロ"
    " パッケージフード エスプレッソビーンズチョコレート"
    " デザート クランベリーブリスバー"

ミントが嫌われる。

 「4種類あったよ。ペパーミントのやつと・・・・」
 「ミント嫌いなんですけど!ミントってあのフリスクみたいなやつでしょ。あれって口が臭い人が食べるやつじゃん!ミント以外で脂肪分が一番少ないやつがいい!」
 「・・・」

 偏見はさておき、文字は contains で分かるからミント以外を取ればいいね。

% カロリーが 200kcal 未満で、塩分が 0.2g 未満で、ミント嫌い。。
Res = T(T.Energy < 200 & T.Salt < 0.2 & ~contains(T.Name,'ミント'),:);
[~,idx] = min(Res.Fat);   % その中で一番脂質が少ない。
Res.Name(idx)
ans = 

    " パッケージフード ホワイトチョコレートマシュマロ"

マシュマロでいいか。

 「マシュマロ買ってきたよ」

DSC_0004.JPG

 「かわいい!これクリスマスツリーに飾るから、2番目に脂肪分が少ないやつ買ってきて!」
 「・・・」

 脂質順に並べ替えて、2番目を取ればいいね。

%% 二番目に脂質が低い。
R = sortrows(Res,'Fat');
R.Name(2)
ans = 

    " デザート クランベリーブリスバー"

ブリスバーって何なのさ。

 「クランベリーブリスバーっていうの買ってきたよ」

DSC_0001.JPG

 「おいしい!これ意外にカロリー低いのね。」

 よかった、一安心。

グラフの中ではどれだったんでしょうか。

 プロットが残ってたら、こんな感じを追記して確かめよう。

%% 図で見てみよう。
idx = find(h.XData == R.Name(2));
text(h.YData(idx),idx,'← これ','FontSize',24,'FontName','Yu Gothic UI');

starbucksfood.png

見つかってよかった。

 MATLAB の練習にはちょうどいいくらいの問題ですね。
 さて仕事するか。。。

16
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?