健康になるために栄養学勉強
胆嚢を取ったエンジニアです。
これからはちゃんと食べるもの気をつけて健康をハックしていきたいなと思い、栄養学の勉強をすることにしました。
柏の紀国屋書店にふらりと立ち寄ったんですが、ふと目についたこの「時間栄養学」の本をペラペラめくって衝動買いしました。
食べる時間でこんなに変わる 時間栄養学入門 体内時計が左右する肥満、老化、生活習慣病 (ブルーバックス)
この本、食べモノが肥満・ストレス・糖尿そして、体内時計にどのような影響を与えるか?という、いうならばありがち(失礼)な知見だけでなく、「体内時計が何時の時に」食べると食べ物の栄養素がどう吸収されるのかという視点での研究が記載されており、とても目からうろこでした。
いくつか今読んだところまでで気になった知見を書いてみます。(続編も書く予定です)
■高濃度茶カテキンを夕食時に飲むという習慣が、夕食時の血糖値スパイクの抑制につながっているという研究がある 血糖値スパイクが起きると動脈硬化のリスクが上がる/ 糖尿病 https://dm-net.co.jp/calendar/2022/036966.php
■深夜飯はなぜいけないか? 寝なきゃいけない時間に血糖値が上がる 睡眠の質を下げる 血糖コントロールを改善すれば、睡眠の質が改善し、早朝の高血圧を防ぎ、動脈硬化の進展予防にもつながる可能性がある https://dm-net.co.jp/calendar/2015/023361.php
■GABA・テアニン バナナ・メロン、トマト・パプリカに含まれる
抗うつ作用・抗ストレス作用がある。 人を対象にした単回摂取試験にて効果が確認されています。 テアニン摂取により副交感神経を活性化→α波放出を促進→抗ストレス作用を及ぼすと考えられている。
■時間栄養学 本書のメインテーマでもある、「体内時計が何時の時に」食べると食べ物の栄養素がどう吸収されるのかという視点での研究についてです
なぜいつ食べるかによって栄養素の吸収効果が違うのか??に対する一つの解として、本書では絶食時間の長さが挙げられていました。 例えば、昼・夕食と比べて、朝は夜10時間くらい絶食状態になってから食べるので「朝は脂肪の吸収がいい」みたいです。 「絶食中にたまった」胆汁が朝放出されるみたいです。(※)
その性質により、 ●トマトの効果 朝トマト、リコピンの吸収がよい(血中濃度が一番高くなった) 「リコピンは、脂溶性」なので、脂肪と一緒に効率よく吸収されるようになるそう! 朝食べて抗酸化作用をもつリコピンの吸収を効率よく行おう。
●DHA・EPAを朝摂取することの効果(マウス実験) 夕食より、朝食で摂取する方が血中のEPA・DHA濃度が有意に高いことが確認されている 脂肪肝の軽減効果も期待できるとのこと。
一旦以上にします。
おまけ (※)もしかして「朝は脂肪の吸収がいい」という性質は、胆嚢摘出した人には当てはまらないのでは?
........
orz
続く
高額医療費が発生したときの「限度額」制度について落とし穴
胆石いっぱいできて胆嚢摘出したので高額医療費のときの「限度額」制度を活用したが、落とし穴があった。
- - 月次締めで医療費が計上され、月ごとの限度額が設定されている
- 認定証は後からでも申請できると言われるが、x月分の認定証はx+1月の7日までに提出しないといけない(千葉県の場合)
私の場合、月跨ぎの入院だったので、手術後の入院費は限度額超えず、対象にならなかった。血涙が出るほど悔しい。
とりあえず、認定証は
限度額認定証については、マイナンバーカードを提示することで対応可能
- 健康保険証と紐付けたマイナーバーカード提示でもいい
マイナンバーカード以外の方法だと、「限度額証明書」を持参もしくはファックスで通院先の病院へ送付
- 限度額証明書の発行は、健康保険組合に問い合わせないといけない。
まとめ。
chatGPTの利用シーン①: 正規表現
chatGPTが最近とてもホットトピックになっていて、twitter上でもエンジニアだけじゃなくて色々な人が遊んでみた結果を挙げていると思います。
本ブログでは、chatGPTの活用事例をいくつか残しておこうと思います。
難しい正規表現に出くわした
"{'A': 'a', 'text': 'I'll be happy'}"
Pythonでjsonを扱う際に、上記のようなシングルクオート「'」が含まれたjsonだとエラーになると思います。
じゃあとりあえず全てのシングルクオートをダブルクオートにreplaceすればいいかと言うとそうはいかない。"text": "I"ll..."となってしまいJSONDecodeError: Expecting ',' delimiter
を引き起こします。
ここで、あまり正規表現の勉強を避けてきた怠け者の私はstuckしてしまいました。。
じゃあchatGPTに聞いちゃえば良いじゃん!
普通にシニアなエンジニアに相談したとき並みの情報量がもらえる....凄すぎる!!!
r'"([^"]+)"'
の表現も思いつかなかったし、普通に勉強させていただいた。。
実際にいただいたコードを実行すると要件通りの処理となりました!
また追記で"\1"じゃなくて"\0"だとどうなるのかについても聞いてみました。
なるほどnull文字になるのかー、勉強になった....
まとめ
- chatGPT、リリース当時は嘘情報を混ぜてくるとか言われていましたが、正規表現の記法については、要件通りの内容を返してくれますし、解説もかなり高品質なものであることが確認できました。
polarsでちょっとハマりかけた罠①
続編があるかもしれないので①とします。
pandasだとあまり気にしていなかった型についてです。 pandasですと特に指定しなければ、全ての数値データはIntegerかfloatになるかと思います。
しかしpolarsはどうも違うみたいですね。
print(pl.DataFrame({"hoge": [1, 2, 3, 3, 3,3]}).select(pl.col('hoge').unique())) >>> shape: (3, 1) ┌──────┐ │ hoge │ │ --- │ │ i64 │ ╞══════╡ │ 1 │ │ 2 │ │ 3 │ └──────┘
上記の例では、pl.Int64型になっているのに、下記では、UInt32型を返してきます。
import polars as pl pl.DataFrame({"hoge_str": ["hoge", "huga", "huge"]}).select(pl.col('hoge_str').str.lengths()) >>> shape: (3, 1) ┌──────────┐ │ hoge_str │ │ --- │ │ u32 │ ╞══════════╡ │ 4 │ │ 4 │ │ 4 │ └──────────┘
なんで処理によって型推論のロジックを変えているのかは今後documentを見て勉強します。
文字の数え上げなどをするときは、当たり前ですが、負の整数になりません。 しかし数え上げた文字をグループごとに差を特徴量として見たいときがあるかと思います。 なんとなくUIntで返ってきた変数で差分など計算したら、マイナスになった瞬間オーバーフローして10桁の数字が返ってきてしまうかもしれませんね...
Version
pl.__version__ >>> '0.16.4'
zero torelance問題:コイン投げて100回裏が出たので「表が出る確率pは0」と推定したが...
考えたい問題は「確率pの点推定はゼロだったけど、表が出る確率の信頼区間の上限はいくら位と考えるべきか?」です。
pの「信頼区間を求める」ことでこの問題に答えたいと思います。
信頼区間とは、統計的仮説検定で棄却されないパラメータ(ここではp)の範囲・集合のことです。
今、100回投げて表が1回も出なかったので、この事象が発生する確率は、 P(p, n=100) = p0 (1-p)100 となる。
図からは分かりにくいが、この確率はp=0.3の時 大体0.000...3 (3.23447651e-16)
となる。
つまり、p=0.3という帰無仮説を立てると、そのパラメータは有意水準1%では棄却されてしまうため、信頼区間には入らない! (p=0.3だったとしたら、「100回裏」を出せたのはかなりレアだったといえる...)
なお、「100回投げて表が1回も出なかった」データでの有意水準5%でのpの信頼区間は [0, 0.02857143)である。
現実世界でこの話がどう応用されたか?
このことは広津先生の本6章から学びました。
BSE(狂牛病問題)が起きたとき、20月齢以下の牛だと感染牛であることはほぼないことはわかっていた。 日本と異なり年齢を把握できない米牛の月齢をどう判別するかが「牛輸入再開」にあたり論点になったといいます。
広津先生は統計学者としてこの論議に参加し、様々な基準を検討したのち最終的に「A40以下の成熟度であれば、21月齢以上の牛である確率をゼロに近くなること」を確認しました。 そして、「21月齢牛の成熟度がA40以上である確率の推定」を行い、推定値は0(つまり、一頭もA40以上になっていない!)であることを確認し、有意水準5%での信頼区間の上限が1%となるように300頭を検査することを要請しました。
(「A40以上」になる確率"p" が 本当はp=0.01だったとしたら(★)、「1頭もA40以上にならない確率」は(1- 0.01) = 0.99の300乗の0.045、つまり5%に留まる。300頭安全であることを確認することは(★)の仮定の元では非常に起こりにくい。起きたとしても5%の確率でしかないということになる。)
結果として、有意水準5%での信頼区間の上限が1%となるように300サンプルの牛が有害事象を含まないことを確認し、輸入を再開したのでした。 このような「nサンプル抽出し、有害事象を含むサンプルの数が0である時、合格とする方式」を「ゼロトラレンス」方式という。
他にも海外から輸入される植物に病害虫が付帯・寄生していないか検査する「植物検疫」などにも「ゼロトレランス基準」として使われている。 全量のcheckは難しいが、少なくとも300本以上の植物で陽性反応無しとなることを確認することで、信頼上限を(信頼率0.95の元で)0.01に抑えることが出来る(*)
統計学を活用することは人の命を守ることにもつながるエピソードとして、とても印象的です。
(*) 実際に、害虫発見率をpとして、「300件検査して害虫がいないことを確認する」(Aとする)確率は (1 - p)300 である.
仮にp 0.01 であるとすると、(1 - p)300 0.0490 ≒ 0.05 である。 このことは、「p 0.01であるという仮定は、5%以下の確率でしか起こらない(同じAという試行を100回行って5回程度起こる)」ことを表している。
当然、これはそのまま、統計的仮説(片側)検定として捉えられる
参考文献
バイアス バリアンス トレードオフについて
自分がちゃんと人に教えられなかったので、言語化しておくことにする。
モデルを平均二乗誤差で評価することを考えるとき、1つの学習データセットで評価するのは実は危険。。
なぜなら、その学習データセットはノイズが含まれているかもしれないから。
モデルがすごい複雑になればなるほど、学習データを近似する能力は高まる(バイアス小さい)けども、個々の学習データだけに含まれるノイズに過剰に反応してしまう可能性が出てくる。 ⇒その結果、学習データを変えて学習したモデル群の間の出力結果のばらつき(バリアンス)はとても高くなってしまう...!
一方、モデルが単純だと、そもそも学習データを近似出来る能力が低いため、大切なパターン・信号成分を近似することが出来ない。(バイアス大きい) ただし、単純なモデルはノイズにも反応しないため、学習データを変えて学習したモデル群の出力のばらつきは小さくなる(バリアンス小さい)
モデルを複雑にしていくに従って、バイアスは改善されていくが、バリアンスが大きくなっていく。
あちらを立てればこちらが立たず。。
バイアス・バリアンスは、モデルの複雑度に対してトレードオフの関係がある、ということである。
【数学メモ】原点と直線との距離
はじぱた6章を読んでいて改めて気が付いた事実について備忘しておきます。
直線の方程式から「原点と直線との最短距離」を一瞬で計算することができます
解説
左辺を
と変形する。
この時、が、直線の法線ベクトルになる。法線ベクトルを単位ベクトルとするために、両辺を
で割る。すると与式は、
となる。この式の左辺は、
の内積になっているが、これは
「(x,y)ベクトルを法線ベクトル上に射影したときの長さ」、つまり原点から直線までの垂線距離になる....と解釈できる!!
これ、高校で教わったっけかな....?笑
2次元の直線だけじゃなくて、超平面でも応用可能
上記の「原点から直線までの最短距離」の求め方は、2次元で試しましたが、3次元で平面の方程式にしても同じ解釈ができる。