スタバで活動するエンジニアの為に、スタバメニューでPFCバランスの優れているメニューを検出してみた

## はじめに

　私は普段、スタバで勉強したり作業することが多いのですが、他の喫茶店に比べてスタバはPCで何かしらの作業をしている人が多いイメージです。そんなスタバをよく使うエンジニアの健康の為にこんな記事を書いてみました。

## PFCバランスとは
　PFCバランス（Protein, Fat, Carbohydrateの略）は、栄養学において、たんぱく質（Protein）、脂質（Fat）、炭水化物（Carbohydrate）の三大栄養素が適切な比率で摂取されることを指しまず。
 　生活習慣病の予防・改善の指標となるPFCバランスの比率は、厚生労働省「日本人の食事摂取基準（2020）」によると、以下のように提示されています。

・P(タンパク質)：13-20%
・F(脂質)：20-30%
・C(炭水化物)：50-65%

https://www.mhlw.go.jp/file/05-Shingikai-10901000-Kenkoukyoku-Soumuka/0000083872.pdf

 ## スタバメニューの取得

　まずは以下のサイトの内容をcsvに落とし込みます。

https://product.starbucks.co.jp/allergy/nutrient/

　フードとドリンクで表が異なるので、それぞれ別のcsvで計算します。※メニューは2024/3/23時点ものもを使用しています。

## ソースコード

　ここから先はJupyter Notebookを使用します。まずはcsvファイルの読み込み。

 ```python
import pandas as pd

food_menu = pd.read_csv('starbucks_menu_food.csv')
drink_menu = pd.read_csv('starbucks_menu_drink.csv')

print(food_menu.head())
print(drink_menu.head())
 ```

出力結果
 ```
                      商品名  エネルギー(kcal)  タンパク質(g)  脂質(g)  炭水化物(g)  食塩相当量(g)  \
0       【一部店舗】チョコレートデニッシュ          246       3.8   14.3     26.3       0.5   
1       チキン＆チーズ　ホットトルティーヤ          329      25.8   15.6     21.3       2.5   
2  ダブル　ハム＆マリボーチーズ　石窯フィローネ          441      28.3   20.2     38.2       2.7   
3         宇治抹茶ホワイトチョコスコーン          339       5.4   13.6     49.5       0.8   
4         ベーコンとほうれん草のキッシュ          299       7.0   20.4     22.3       1.5   

   食物繊維(g)  糖質(g)  ナトリウム(mg)  カリウム(mg)  トランス脂肪酸(g)  飽和脂肪酸(g) お酒の使用  
0      1.7   24.6        189       100         0.1       6.0    なし  
1      1.3   20.0        998       313         0.0       5.6    なし  
2      2.9   35.3       1076       234         0.2      10.8    なし  
3      1.6   47.9        330        99         0.0       5.7    なし  
4      1.3   21.0        594       139         0.3       9.3    なし  
                      商品名     ミルク種別  エネルギー(kcal)  タンパク質(g)  脂質(g)  炭水化物(g)  \
0  キャラメリー ミルクコーヒー フラペチーノR       ミルク          419       5.2   23.5     46.8   
1  キャラメリー ミルクコーヒー フラペチーノR    低脂肪タイプ          410       5.2   22.3     47.1   
2  キャラメリー ミルクコーヒー フラペチーノR      無脂肪乳          401       5.2   21.2     47.3   
3  キャラメリー ミルクコーヒー フラペチーノR  豆乳（調製豆乳）          416       5.0   24.0     45.2   
4  キャラメリー ミルクコーヒー フラペチーノR  アーモンドミルク          405       3.1   23.9     45.0   

   食塩相当量(g)  食物繊維(g)  糖質(g)  ナトリウム(mg)  カリウム(mg)  トランス脂肪酸(g)  飽和脂肪酸(g)  \
0       0.5      0.2   46.6        192       296         0.3      14.4   
1       0.5      0.2   46.9        211       310         0.3      13.7   
2       0.6      0.2   47.1        230       324         0.3      13.0   
3       0.6      0.3   44.8        207       302         0.3      13.3   
4       0.6      1.1   43.9        212       202         0.3      13.1   

   カフェイン(mg)  
0         35  
1         35  
2         35  
3         35  
4         35  

 ```

 　次にタンパク質、脂質、炭水化物のカロリーとその割合を計算する関数を作成。1gあたりのカロリーは、タンパク質・炭水化物=4kcal, 脂質=9kcalで計算します。

  ```python
def calculate_pfc_ratio(df):
    df['タンパク質カロリー'] = df['タンパク質(g)'] * 4
    df['脂質カロリー'] = df['脂質(g)'] * 9
    df['炭水化物カロリー'] = df['炭水化物(g)'] * 4
    total_calories = df['エネルギー(kcal)']
    df['タンパク質割合'] = df['タンパク質カロリー'] / total_calories * 100
    df['脂質割合'] = df['脂質カロリー'] / total_calories * 100
    df['炭水化物割合'] = df['炭水化物カロリー'] / total_calories * 100
    return df

food_menu = calculate_pfc_ratio(food_menu)
drink_menu = calculate_pfc_ratio(drink_menu)

print(food_menu.head())
print(drink_menu.head())
```

出力結果

```
                      商品名  エネルギー(kcal)  タンパク質(g)  脂質(g)  炭水化物(g)  食塩相当量(g)  \
0       【一部店舗】チョコレートデニッシュ          246       3.8   14.3     26.3       0.5   
1       チキン＆チーズ　ホットトルティーヤ          329      25.8   15.6     21.3       2.5   
2  ダブル　ハム＆マリボーチーズ　石窯フィローネ          441      28.3   20.2     38.2       2.7   
3         宇治抹茶ホワイトチョコスコーン          339       5.4   13.6     49.5       0.8   
4         ベーコンとほうれん草のキッシュ          299       7.0   20.4     22.3       1.5   

   食物繊維(g)  糖質(g)  ナトリウム(mg)  カリウム(mg)  トランス脂肪酸(g)  飽和脂肪酸(g) お酒の使用  タンパク質カロリー  \
0      1.7   24.6        189       100         0.1       6.0    なし       15.2   
1      1.3   20.0        998       313         0.0       5.6    なし      103.2   
2      2.9   35.3       1076       234         0.2      10.8    なし      113.2   
3      1.6   47.9        330        99         0.0       5.7    なし       21.6   
4      1.3   21.0        594       139         0.3       9.3    なし       28.0   

   脂質カロリー  炭水化物カロリー    タンパク質割合       脂質割合     炭水化物割合  
0   128.7     105.2   6.178862  52.317073  42.764228  
1   140.4      85.2  31.367781  42.674772  25.896657  
2   181.8     152.8  25.668934  41.224490  34.648526  
3   122.4     198.0   6.371681  36.106195  58.407080  
4   183.6      89.2   9.364548  61.404682  29.832776  
                      商品名     ミルク種別  エネルギー(kcal)  タンパク質(g)  脂質(g)  炭水化物(g)  \
0  キャラメリー ミルクコーヒー フラペチーノR       ミルク          419       5.2   23.5     46.8   
1  キャラメリー ミルクコーヒー フラペチーノR    低脂肪タイプ          410       5.2   22.3     47.1   
2  キャラメリー ミルクコーヒー フラペチーノR      無脂肪乳          401       5.2   21.2     47.3   
3  キャラメリー ミルクコーヒー フラペチーノR  豆乳（調製豆乳）          416       5.0   24.0     45.2   
4  キャラメリー ミルクコーヒー フラペチーノR  アーモンドミルク          405       3.1   23.9     45.0   

   食塩相当量(g)  食物繊維(g)  糖質(g)  ナトリウム(mg)  カリウム(mg)  トランス脂肪酸(g)  飽和脂肪酸(g)  \
0       0.5      0.2   46.6        192       296         0.3      14.4   
1       0.5      0.2   46.9        211       310         0.3      13.7   
2       0.6      0.2   47.1        230       324         0.3      13.0   
3       0.6      0.3   44.8        207       302         0.3      13.3   
4       0.6      1.1   43.9        212       202         0.3      13.1   

   カフェイン(mg)  タンパク質カロリー  脂質カロリー  炭水化物カロリー   タンパク質割合       脂質割合     炭水化物割合  
0         35       20.8   211.5     187.2  4.964200  50.477327  44.677804  
1         35       20.8   200.7     188.4  5.073171  48.951220  45.951220  
2         35       20.8   190.8     189.2  5.187032  47.581047  47.182045  
3         35       20.0   216.0     180.8  4.807692  51.923077  43.461538  
4         35       12.4   215.1     180.0  3.061728  53.111111  44.444444  
```

　最後にPFCバランスの範囲を定義し、指定範囲に近いメニューを見つけるための関数を作成し結果を表示します。

 ```python
# PFCバランスの理想的な範囲を定義
pfc_range = {
    'タンパク質': (13, 20),
    '脂質': (20, 30),
    '炭水化物': (50, 65)
}

# PFCバランスが指定範囲に近いメニューを探す関数
def find_closest_pfc_menus(df):
    # 指定範囲に近いかどうかのスコアを計算（範囲内=0, 範囲外=差の絶対値）
    df['PFCスコア'] = 0
    for nutrient, (low, high) in pfc_range.items():
        nutrient_col = f'{nutrient}割合'
        df['PFCスコア'] += df.apply(lambda x: max(0, x[nutrient_col] - high) + max(0, low - x[nutrient_col]), axis=1)
    
    # スコアが低い（範囲に近い）上位3品を選出
    closest_menus = df.sort_values(by='PFCスコア')
    return closest_menus

# フードとドリンクのデータフレーに関数を適用
closest_food_menus = find_closest_pfc_menus(food_menu)
closest_drink_menus = find_closest_pfc_menus(drink_menu)

# 結果を表示、ドリンクはミルク種別で結果が変わってくるのでミルク種別も表示
print(closest_food_menus[['商品名', 'タンパク質割合', '脂質割合', '炭水化物割合', 'PFCスコア']].head())
print(closest_drink_menus[['商品名', 'ミルク種別', 'タンパク質割合', '脂質割合', '炭水化物割合', 'PFCスコア']].head())
 ```

 結果表示

 ```
                       商品名    タンパク質割合       脂質割合     炭水化物割合    PFCスコア
27         セミドライトマトのピザトースト  12.413793  23.275862  66.724138  2.310345
18                あんバターサンド   8.988764  30.674157  61.872659  4.685393
42          ヨーグルト＆バナナグラノーラ  14.583333  35.625000  56.666667  5.625000
17  【ドライブスルー店販売】抹茶あんバターサンド   9.876543  24.074074  67.983539  6.106996
13        もっちりあんボール　さくら＆抹茶   5.000000  31.250000  65.000000  9.250000
                     商品名   ミルク種別    タンパク質割合       脂質割合     炭水化物割合  PFCスコア
32   コーヒー ＆ クリーム ラテ（アイス）    無脂肪乳  13.903743  29.358289  57.326203     0.0
110     キャラメル マキアート（アイス）  低脂肪タイプ  17.853107  23.389831  59.209040     0.0
336      ホワイト ホット チョコレート    無脂肪乳  16.341463  23.323171  59.878049     0.0
278       抹茶 ティー ラテ（アイス）     ミルク  14.038462  26.826923  60.769231     0.0
308      キャラメル クリーム（ホット）    無脂肪乳  18.264151  25.471698  55.547170     0.0
 ```

　表示はhead()のデフォルトで5個まで表示しましたが、ドリンクメニューに関しては上記以外にも以下のものが理想のPFCバランスに収まっていますね。
・キャラメル クリーム（ホット）	無脂肪乳
・抹茶 ティー ラテ（ホット）	ミルク
・コーヒー ＆ クリーム ラテ（ホット）	無脂肪乳
・ほうじ茶 ティー ラテ	低脂肪タイプ
・キャラメル マキアート（ホット）	低脂肪タイプ
・ココア（ホット）	無脂肪乳
・ホワイト モカ（ホット）	無脂肪乳
・カフェ モカ（ホット）	無脂肪乳
・アイス ホワイト チョコレート	低脂肪タイプ
・ココア（アイス）	低脂肪タイプ

## 最後に
　この記事を通じて、スタバで働くエンジニアの皆さんが健康的な食生活を送る一助となれば幸いです。