栄養素の相関を分析して、お得な栄養素を見つけたかった

Python,データサイエンス,データ分析の活用

はじめに

健康のためにバランスの良い栄養素を摂る必要があるのはわかるんですが、必要な栄養素が多くてこの辺の知識に疎い私のような人間にとっては覚えるのはかなり厳しいです。例えば、厚生労働省作成の「日本人の食事摂取基準(2020年版)」は下図のような基準を出しています。

日本人の食事摂取基準(2020 年版), p.2 より引用

多いです。かといって、「これで大丈夫スーパーサプリ」的なものは食事として全く美味しくも楽しくもない上に料理は好きなので、食材ベースで必要な栄養を確保して行きたいです。

そこで、「栄養素Aが含まれている食材は、だいたい栄養素Bなども含まれてる」といった関係を見出すことで、より少ない必要栄養素を覚えておき、それらを摂取するように食材を選ぶだけで、気付かないうちに他の栄養素も摂取できてしまっている状態を目指します。

結論

無理でした。

食品カテゴリによって相関構造は大きく異なり、カテゴリごとの栄養素の相関を覚える必要があるので結局覚えることは多くなりそうです。おとなしく世間一般に言われるバランスの良い食事を参考に、いろんな食材を摂取しましょう。

ということで、この記事は栄養素を可視化して遊んでみたというレポートです。

使用データと前処理

使用データについて

日本食品標準成分表(八訂)増補2023年を使用します。文部科学省により作成された、2,538個の食品とその栄養素が掲載されたデータです。pdf の本文第一章にある通り、"国民が日常摂取する食品の成分に関する基礎データとして、関係各方面での幅広い利用に供することを目的としている"データだそうです。

データの前処理

  • 未計測を表す '-' は0とする。独自に文献等で調査した結果、該当栄養素が含まれていないとされるものは計測していない場合が多いらい。ちなみに、もし0とせず欠損として扱う場合、「ある栄養が '-' だった時の別の栄養の値」が分析から外れてしまい、相関などを不当に高く計算してしまう可能性がある。一方で、0とした場合は’-'が0でない場合を無視していることになり、本来あった関係を見逃してしまう可能性がある。今回は、相関がないのにあると判断してしまう(第一種の過誤)ことを避けるために、’-'は0とした。
  • 微量を表す “Tr" は0とする

  • チャーハン、お菓子、菓子パンなど、料理となっているものは除外

  • 味付け缶詰、天ぷら、練り物など成分が著しく変わるような調理をした食材は除外(食材本来の成分と調理法による成分が混ざってしまうため)。なお、「ゆで」などは油ほど栄養素がぶれていなかったので使用。

  • 食材を独断で大雑把に7カテゴリに分類した。分類とそれらに属する食品数は以下の通り。
食品分類野菜穀物果物乳製品その他
68233042820618558409

  • ↑の分類にある”その他”は調味料や油などで構成されており、栄養素の傾向に参考になるような項目が少ないため除外

  • “脂質"には3項目含まれているが、その中の’脂質’を使用

  • “灰分" は冒頭のガイドラインで触れられていない&無機物の総量的な意味合いなので解析から除外

  • “塩分相当量" は “ナトリウム" から計算されるので、よりわかりやすい “塩分相当量" のみ使用

  • “ビタミンE" の構成要素として4種の “トコフェロール" が記録されているが、それら4種の和を “ビタミンE" とした

  • “(でん粉糖類) 還元水あめ" の食物繊維の値に†がついているが、なんの意味かわからんが他サイトでは表記されたままの値を使ってるので†は削除してそのまま使用

  • ある3つの食品の “ヨウ素" の値が*となっており、意味が不明なので0とする

以上の前処理を行って最終的に残った1,889個の食材に対して解析を行います。

変数同士の相関を考察

2つの栄養素の相関関係(ピアソンの積率相関係数)

まずはざっくりと「ある栄養素ペアはどんな比例関係にあるか」を相関係数を用いて確認します。相関係数は$-1$から$1$をとる量で、$1$に近ければ一方が増えれば他方も増える傾向にあり「正の相関がある」といわれ、逆に$-1$に近ければ一方が増えれば他方は減る傾向にあり「負の相関がある」といわれます。

全ての栄養同士の相関係を計算し、相関が強い(相関係数の絶対値が高い)かつ冒頭の「健康増進法に基づき定める食事摂取基準」に掲載されている栄養素ペアからいくつかピックアップして考察をしていきたいと思います。

なお、描写する点は食品分類ごとに色と形を分けており、カテゴリごとの相関係数もタイトル部分に記述しています。

脂質とカロリーは正の相関

よく知られていることだと思います。果物に関しては相関がないというより、そもそもほとんど脂質がないため相関が弱くなっています。ちなみに、脂質が高いところに肉だけでなく野菜も入っているのが意外でしたが、これらはほとんどナッツ類でした(100g換算しているので高脂質)。

タンパク質とリンは正の相関(特に野菜、果物)

全体的に概ね正の相関がありそうです。特に野菜と果物で非常に強い相関が見られました。リンもタンパク質も体を作るのに必須のようなので、これはありがたいですね。ちなみに、右下に例外がありますが、これらはカゼイン、乾燥卵白、ゼラチンなど、どれも特殊な食材でした。

βカロテンとビタミンKは正の相関(野菜限定)

乳製品が最も相関が高いですが、拡大すると外れ値に引っ張られているような感じでしたので野菜限定と結論づけました。ちなみに、右上の圧倒的な食材は"あまのり ほしのり"。

カリウムと食物繊維は正の相関(穀物限定)

どちらも食事摂取基準掲載食品です。野菜も相関はそこそこありますが、食物繊維が高くなるとあまり相関してなさそうです。穀物にこれほど強い相関があるのは意外でした。

マグネシウムとカリウムは正の相関(野菜、魚以外)

ミネラルコンビ。野菜カテゴリがスケールで圧倒しているため見づらいですが、魚以外では概ね成り立っています。

2つの栄養素の相関関係まとめ

  • 全体的に脂質とカロリーには正の相関があるが、果物に関してはそもそも脂質がああまりないので当てはまらない
  • タンパク質とリンには正の相関があり、特に野菜、果物でその傾向が強い
  • 野菜カテゴリであればβカロテンとビタミンKには正の相関がある
  • 穀物カテゴリであればカリウムと食物繊維には正の相関がある
  • 野菜、魚カテゴリ以外であればマグネシウムとカリウムには正の相関がある

変数同士の関係をネットワークで可視化(グラフィカルモデル)

散布図と相関係数により2変数間の関係はなんとなくわかりました。続いて、「全体としてどのような相互関係にあるのか」をみて行きます。

ここで、変数間の相互関係をいっぺんに見ようとすると、以下の問題が生じます。

問題1:多次元で可視化がそもそもできない

問題2:全ての変数同士は0ではない相関係数を持つので、非常に複雑な相互関係になる

問題3:単純に相関係数を使って関係を定義すると、「ビールの売上とアイスクリームの売上はそれぞれ気温に相関するので、ビースの売り上げとアイスクリームの売上は相関する」という擬似相関に引っかかる

ということで、これらに対処するために、

問題1への対処:生データの可視化ではなく、変数間の関係を定量化し、その要約値で解釈する

問題2への対処:比較的相関が弱い変数に関しては、関係の定量値をピッタリ0にする

問題3への対処:「他の変数の影響を調節した上で関係を定量化(偏相関)」する

の3つを同時に実現してくれる統計手法「グラフィカルラッソ(glasso)」を使います。

グラフィカルラッソについてはグラフィカルラッソのハイパラチューニングに関する記事で軽く触れてます。

早速ですが全食品カテゴリを使用して偏相関関係をネットワークグラフで可視化したものがこちらです。

手法を知っている方向けの説明:glassoの罰則パラメータは解釈しやすいグラフが生成されるいい感じの値に手動で調節しています。また、グラフ中の相関は推定された精度行列(共分散行列の逆行列)から偏相関行列を計算しています。

例えば、「カロリーが高いと脂質は高くなるが水分は減る」という傾向がわかります。このように、変数同士がどのように関係し合っているかが見てわかるような手法です。

これを栄養素ペアの相関と同様、食品カテゴリごとに実行したいところですが、煩雑になってしまうので、栄養を考えて選ぶ食材カテゴリとして関心が高そうな野菜、魚、肉に限定しました。

野菜カテゴリの栄養ネットワーク

ミネラル豊富な野菜はカロリーが高そうで、これはおそらくナッツ類による影響かと思います。また、相関係数を見た際はβカロテンとビタミンKの相関が強そうでしたが、この分析だと代わりにレチノール(ビタミンAの一部)が現れました。

魚カテゴリの栄養ネットワーク

カルシウムがちょっとしたハブになっています。ミネラルに関しては3つの独立したグループがありそうで、これはおそらく貝類も魚カテゴリにしてしまっているからかと思います。また、ナイアシンという重要栄養素が初登場で、ビタミンKと比較的強く相関しており、マグネシウムが亜鉛、レチノールとそれぞれ相関していることがわかります。

肉カテゴリの栄養ネットワーク

タンパク質がない。肉であればタンパク質と一緒に色々取れる、といった抽象的なことは言えなそうです。一方、血液を作る働きを促進してくれるらしいモリブデン、皮膚や爪などの健康に良いビオチン、レチノールなどが相互に相関しており、データを見てみると特にレバー腎臓などの内臓系がこれに寄与していそうでした。上の方で重なっているのは「βクリプトキサンチン」で、コレステロールと相関しているようですが、これは完全に鶏卵の影響でした。私は初めて聞いた成分ですが、丈夫な骨作りを始め、色々といい効果があるようです(参考:農研機構)。

二つの分析のまとめ

  • タンパク質とリンには正の相関がある
  • カロリーと脂質には正の相関があり、カロリーと水分には負の相関がある
  • レチノールを求めれば、ビタミン群、ミネラル、カロテンなどが摂取できそう
  • 肉には基本的にタンパク質は多く含まれるが、それ以外の必要栄養素は種類によって含有量が様々
  • 内臓系は美容に良い栄養群を効率的に摂れそう

このようなことがわかりましたが、結局具体的な食材に行き着いてしまったり、カテゴリごとに覚える必要があったりと、依然として覚える量は多いです。

おまけ:「健康増進法に基づき定める食事摂取基準」に記載がないが相関が高い栄養素

水分とカロリーは負の相関

全体での相関係数が-0.83(強い負の相関)で、穀物以外は全てに関して強い負の相関が見られます。一般的に、単純に水分量が多ければ他のカロリー要素が入る余地がなくなるためだと考えられます。左下の低水分低カロリー群は玄米などの健康志向な米やノンフライ乾麺といったものでした。

βカロテンとαカロテンは正の相関(野菜限定)

注意として、一見βカロテンだけ含まれてαカロテンは含まれていない食材が多いように見えるが、αカロテンに関しては未計測のものが多く、本分析ではそれらを0と置いていることの影響がありそう。