ケンタッキーで一日分の栄養を取れる組み合わせを計算したら衝撃的な結果が！

# ケンタッキーで一日分の栄養を取りたい！

ケンタッキーフライドチキン（以下KFC）はマクドナルド、モスバーガーに次いで日本で店舗数の多いファーストチェーン店です。マクドナルドが2,909店、モスバーガーが1,293店に対して、KFCは1,131店とモスバーガーに肉薄している巨大チェーン店です。

揚げ物中心のKFCで一日分の栄養を取ることはできるのでしょうか？マクドナルドの記事と同様に、KFCで一日に必要な栄養素を取るための商品の組み合わせを調べてみます。さて、どんな結果が出るでしょうか。

# 式を立てる

KFCは[全商品の栄養素を公開](https://www.kfc.co.jp/pdf/food_info/nutrition)しているので、それを利用します。マクドナルドの記事と同様にドリンク類は食べ物ではないので対象外とします。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670191/fe4cb234-43a3-990b-e436-d83f7af20b15.jpeg)

日本人が一日必要な栄養素も以下の通り[マクドナルドの記事](https://www.transrecog.com/diary/2021/04/01/post-1521/)と同条件にします。

| 栄養素 | 下限 | 上限 |
|:-:|:-:|:-:|
|カロリー (kcal)|2,700||
|たんぱく質 (g)|88|135|
|脂質 (g)|75|90|
|炭水化物 (g)|337.5|438.75|
|ナトリウム (mg)|2,300||
|カリウム (mg)|3,000||
|カルシウム (mg)|738||
|リン (mg)|600||
|鉄 (mg)|6.3||
|ﾚﾁﾉｰﾙ活性当量 (μg)|650||
|ビタミンB1 (mg)|1.4||
|ビタミンB2 (mg)|1.6||
|ナイアシン (mg)|15||
|ビタミンC (mg)|100||
|コレステロール (mg)|0||
|食物繊維 (g)|21||
|食塩相当量 (g)||6.0|

そして目的関数も同様に、**一日必要な栄養素を満たす最もカロリーの低い商品の組み合わせ**とします。金に糸目もつけません。健康第一！

[マクドナルドの記事](https://www.transrecog.com/diary/2021/04/01/post-1521/)と同様に、PuLPというPythonで無料で利用できるソルバーがあるので、これで計算します。

```python:kenta1.py
import pandas as pd
import pulp

nutrition_df = pd.read_csv('nutrition.csv')
limit_lower_df = pd.read_csv('limit_lower.csv')
limit_higher_df = pd.read_csv('limit_higher.csv')
of_coeff_df = pd.read_csv('OFcoeff.csv')

Prob = of_coeff_df['p'].tolist()
Nut_lowerlimt = limit_lower_df['n'].tolist()
Nut_higherlimt = limit_higher_df['n'].tolist()

limit_lower = {row.n:row.limit for row in limit_lower_df.itertuples()}
limit_higher = {row.n:row.limit for row in limit_higher_df.itertuples()}
of_coeff = {row.p:row.coeff for row in of_coeff_df.itertuples()}
nutrition = {(row.p,row.n):row.require for row in nutrition_df.itertuples()}

problem = pulp.LpProblem('kentucky1', pulp.LpMinimize)

x = pulp.LpVariable.dicts('x', Prob, lowBound = 0, cat='Integer')

problem += pulp.lpSum([of_coeff[p] * x[p] for p in Prob])

for n in Nut_lowerlimt:
    problem += pulp.lpSum([nutrition[p,n] * x[p] for p in Prob]) >= limit_lower[n]
for n in Nut_higherlimt:
    problem += pulp.lpSum([nutrition[p,n] * x[p] for p in Prob]) <= limit_higher[n]

status = problem.solve()
print('Status:', pulp.LpStatus[status])

for p in Prob:
    if x[p].value()>0:
        print(p, x[p].value())

print('objective value=', problem.objective.value())
```

## 結果

さて計算開始！結果は・・・

![2_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670191/6bfc546a-9d5e-acee-0627-b8db2633410c.jpeg)

なんと**実行不可能**となりました！先ほどの表で示した「日本人が一日必要な栄養素」の制約内では**解がない**ことになります。そっかー・・・・。マクドナルドの商品数が全95商品あるのに対し、KFCは25商品とバリエーションが少ないので、うまくやりくりできなかったのでしょう。



でもこれで終わりではつまらいないので、参考までに制約を少し緩和してみます。

## 制約を緩和する
揚げ物が中心の飲食店ですので、脂質と食塩相当量の上限を外し、以下の通りにします。
| 栄養素 | 下限 | 上限 |
|:-:|:-:|:-:|
|カロリー (kcal)|2,700||
|たんぱく質 (g)|88|135|
|脂質 (g)|75|**なし**|
|炭水化物 (g)|337.5|438.75|
|ナトリウム (mg)|2,300||
|カリウム (mg)|3,000||
|カルシウム (mg)|738||
|リン (mg)|600||
|鉄 (mg)|6.3||
|ﾚﾁﾉｰﾙ活性当量 (μg)|650||
|ビタミンB1 (mg)|1.4||
|ビタミンB2 (mg)|1.6||
|ナイアシン (mg)|15||
|ビタミンC (mg)|100||
|コレステロール (mg)|0||
|食物繊維 (g)|21||
|食塩相当量 (g)||**なし**|

そして目的関数は、**最も塩分の低い商品の組み合わせ**とします。

## 結果２

再び計算開始！
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670191/5003f988-65be-2209-ea29-e077d0782aa0.jpeg)
最適解が見つかったとのこと！よかった！

コンピューターがはじき出した商品の種類は6種類。マクドナルドの時のように衝撃の組み合わせとなるでしょうか！？見ていきましょう。

## オリジナルチキン（3個）

お、ちゃんとチキンを食べさせてくれるのですね。それも3個。

![1original_chiken.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670191/8b8ed3ab-ee40-9efd-362b-f1134191b1c2.jpeg)

## カーネルクリスピー（2個）

これも定番メニューを食べさせてくれるそうです。

![2kernel_crispy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670191/89290dce-1453-398a-6c1d-b5c46ef97ff0.jpeg)

## フライドポテト Ｌ（2個）

ポテトなんて食べちゃって大丈夫なんでしょうか？しかもL。

![3potato_l.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670191/1b694e61-6144-917b-5f5e-c33ef0f1db6a.jpeg)

## コールスローＳ（1個）

野菜らしきものが出てきました。

![5coleslawS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670191/411a14b1-47c0-cb0c-4df7-c7d77bde573b.jpeg)

## コールスローM（11個）

11個も！でもまあそうなりますよね。

![4coleslawM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670191/a481544a-c766-a7af-aa0e-38cf2793eddb.jpeg)



そして最後は・・・

## ハニーメイプル（16個）

![6honey_maple.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670191/486b9e9b-cb65-5e26-d223-a597f9926a02.jpeg)

出た、おなじみの調味料をちゅうちゅうするやつ！ｗｗｗやっぱり来ましたね。これで炭水化物が基準値内になるように摂っているようです。ちなみに1つ30円で注文できるそうです。

この組み合わせで摂取できる栄養素は以下のようになります。

|栄養素|摂取量|
|:-:|:-:|
|エネルギー (kcal) 	|3,744|
|たんぱく質 (g) 	|92.3|
|脂質 (g) 	|201.1|
|炭水化物 (g) 	|390.1|
|灰分 (g) 	|33.8|
|ナトリウム (mg) 	|8,372|
|カリウム (mg) 	|4,920|
|カルシウム (mg) 	|742|
|リン (mg) 	|1,484|
|鉄 (mg) 	|8.6|
|レチ ノール (μg) 	|221|
|β-ｶﾛ ﾃﾝ当量 (μg) 	|5,253|
|ﾚﾁﾉｰﾙ活性当量 (μg) 	|663|
|Ｂ１ (mg) 	|1.42|
|Ｂ２ (mg) 	|2|
|ナイアシン (mg) 	|34.6|
|Ｃ(mg) 	|507|
|食物繊維総量 (g) 	|33.5|
|食塩 相当量 (g) 	|21|

カロリー、脂質、塩分を取りすぎですね。でもKFCのメニューだけという縛りではこれが制約条件を満たす最も小さい目的関数となるので、受け入れてください！

ちなみに塩分の上限だけはずすのと、脂質の上限だけはずすのも試しましたが、やはり実行不可能になりました。

# KFCで一日分の栄養をちょうど良く取る組み合わせは存在しない！

いかがでしたか？フライドチキン屋さんならではの限界が表出したような気がします。もともと無理があるのは予想していましたが、マクドナルドやモスと違って商品バリエーションの少なさが仇になる結果となりました。

でもおいしいんですよね、KFC。

皆さんも健康に気を付けて、無理なき栄養ライフを送ってください！

## 参考リンク
元記事：[https://www.transrecog.com/diary/2023/06/11/post-3032/](https://www.transrecog.com/diary/2023/06/11/post-3032/)（プログラミングを主題とするように著者自身がQiita向けに加筆）

[モスバーガーで一日分の栄養を取れる組み合わせを計算したら衝撃的な結果が！](https://www.transrecog.com/diary/2021/12/11/post-2540/)

[マクドナルドで一日分の栄養を取れる組み合わせを計算したら衝撃の結果が！](http://www.transrecog.com/diary/2021/02/20/post-1327/)
[続・マクドナルドで一日分の栄養を取れる組み合わせを計算したらさらに衝撃の結果に](https://www.transrecog.com/diary/2021/02/27/post-1426/)
[【完結編】マクドナルドで一日分の栄養を取れる組み合わせを計算したら衝撃の結果が！](https://www.transrecog.com/diary/2021/04/01/post-1521/)