はじめに
私は普段、スタバで勉強したり作業することが多いのですが、他の喫茶店に比べてスタバはPCで何かしらの作業をしている人が多いイメージです。そんなスタバをよく使うエンジニアの健康の為にこんな記事を書いてみました。
PFCバランスとは
PFCバランス(Protein, Fat, Carbohydrateの略)は、栄養学において、たんぱく質(Protein)、脂質(Fat)、炭水化物(Carbohydrate)の三大栄養素が適切な比率で摂取されることを指しまず。
生活習慣病の予防・改善の指標となるPFCバランスの比率は、厚生労働省「日本人の食事摂取基準(2020)」によると、以下のように提示されています。
・P(タンパク質):13-20%
・F(脂質):20-30%
・C(炭水化物):50-65%
スタバメニューの取得
まずは以下のサイトの内容をcsvに落とし込みます。
フードとドリンクで表が異なるので、それぞれ別のcsvで計算します。※メニューは2024/3/23時点ものもを使用しています。
ソースコード
ここから先はJupyter Notebookを使用します。まずはcsvファイルの読み込み。
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で計算します。
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バランスの範囲を定義し、指定範囲に近いメニューを見つけるための関数を作成し結果を表示します。
# 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バランスに収まっていますね。
・キャラメル クリーム(ホット) 無脂肪乳
・抹茶 ティー ラテ(ホット) ミルク
・コーヒー & クリーム ラテ(ホット) 無脂肪乳
・ほうじ茶 ティー ラテ 低脂肪タイプ
・キャラメル マキアート(ホット) 低脂肪タイプ
・ココア(ホット) 無脂肪乳
・ホワイト モカ(ホット) 無脂肪乳
・カフェ モカ(ホット) 無脂肪乳
・アイス ホワイト チョコレート 低脂肪タイプ
・ココア(アイス) 低脂肪タイプ
最後に
この記事を通じて、スタバで働くエンジニアの皆さんが健康的な食生活を送る一助となれば幸いです。