職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

たべたものログ:雑に集計しよう

測定できないものは制御できない

そういった言葉は我々の世界の仕事の多くの場面(例外あり)では常識であり、これを意識できない経営者や管理職が万一すごい成果を出していたとしてもそれは偶然のものであって再現は何ら期待できません。
しかしながら、日常生活の成績について労働安全衛生法に基づく健康診断という測定の機会を得ながらも、生活習慣病の予防すらままならない人間は私を含めて多数存在しています。そう、我々は「自分の身体の経営者」として失格なのであります。

人は何故ここまで失敗を繰り返すのか?

そう疑問に思っていた今春のある日、学生時代からの音楽仲間の一人であり、工場の生産管理の偉い人になっていた友人から「測定が荒すぎるのではないか?」という助言を賜りました。確かに、年1〜2回の健康診断の結果の優劣に一喜一憂していても、生活スタイルを変えるのは難しいです。もっと測定する必要があります。

細かな測定の記録を残さないのは、その行為に時間がかかるからです。何でもかんでも記録を取るのは愚かな行為ですが、それを嫌って何も記録しないのもまた愚かです。適切な頻度と粒度で、適切な項目を測定して記録していけば、生活習慣病に繋がる要因を検出して距離を置くこともきっと現実的なものになっていくことでしょう。
日常生活への負荷が許容範囲内であり、かつ、生活習慣病の予防するに至るような、適切な頻度、適切な粒度、そして適切な測定項目…。みなさんは想像できますか? もちろん、想像はできると思いますし、私も想像できます。でも、その想像に自信がある人はどれほど居るでしょうか? 医療系や保健系、スポーツ科学系、栄養系の皆さんは大丈夫でしょうけれども、そうでない我々にとっては、その自信はきっと砂上の楼閣です。想像とは仮説、立てた仮説は実践して検証していきましょう。

この記事では、次のことについて述べています。

  • 測定をする意義(上記の内容)
  • 記録内容の紹介
  • 雑な集計
  • 将来の展望

記録内容の紹介

項目

以下のような項目を毎日記録するようにしました。

  • 朝(とは限らない)起きてすぐの体重(kg)
  • 論理朝食の内容
  • 論理昼食の内容
  • 論理夕食の内容
  • 健康上の特記事項

朝食、昼食、夕食それぞれに接頭辞「論理」が付加されているのは、例えばその日の最初の食事は朝ではなくて昼かもしれないから、です。「論理朝食」「論理昼食」「論理夕食」はそれぞれ「起きて最初の食事」「起きて二番目の食事」「起きて三番目の食事」を指します。
ここでもしも厳格に朝食昼食夕食を記録しようという精神で立ち向かうと、生活リズムが狂った途端に、記録する手が止まってしまうのです。こういう雑さは継続した記録のためには重要です。
「起きて四番目の食事」の趣旨の列は、設けないことによって私自身が1日4食を摂らないように制約をかけています。constraint violation から始まる洗脳だって、この世にはあるのです。
何か矛盾したことを言っているように見えるかもしれませんが、この2つの項目(雑さを重要視する項目と、constraintを重要視する項目)の違いは、意識して制御可能であるかどうか、の違いです。寝坊は意図せずやってしまいますが、意識していれば1日4食摂ることは帽子できるのです。

記録媒体

記録媒体としてはExcelを採用しました。

なぜExcelなの?もしかしてあなたSEなの?

という言葉が飛んで来るような気もします。確かに、SE(Super Excel user)を自称している時期が私にもありました。
Excelでのデータ管理の問題点というのは、大抵次のようなものでありますから、今回の仮説検証では無関係であって寧ろExcelが適切です。

  • 複数人数に read/write 権限を付与している状態で共有するとバージョン管理がつらい
  • ネ申エクセノレ化する

Office365とかの契約が無いのなら、もちろん他のspreadsheetでもOKです。

雑な集計

移動平均

体重の7日間の単純移動平均を取っています。こういうのを雑に作れるのがExcel(や、その他のspreadsheet)の良いところです。
測定値がこの移動平均を上回ると緊急事態宣言が発令され、食事量が減ります。

なぜ7日間なのかと言うと、生活スタイルが1週間周期で動いているからです。多くの人も同じでしょう。

たべた回数

食生活に偏りが無いか、特に不健康な食物に偏っていないか、気にかけています。
何を食べたのかを厳密に記録するには、リレーショナルデータベース脳な私としては、

  • たべものマスタを定義
  • そのマスタの主キーを参照する方式でログを記録

という方式が真っ先に頭に浮かびます。
ところが、こんなことをやっていては、日々の記録の手間がすごいことになってしまい、怠惰な私はきっと記録するのをやめてしまうでしょう。ですので、日々の記録は雑にして、集計のところで頑張ることにしました。

ある2日間の記録を見てみましょう。

日付 曜日 7日平均 体重(kg) 論理朝食 論理昼食 論理夕食
ひみつ ひみつ ひみつ ひみつ ベーコン+卵 ライフの、肉挟み茄子の天ぷらあんかけ2個入り、唐揚げ4個入り うちのごはん もやしのにんにく醤油炒め
ひみつ ひみつ ひみつ ひみつ シーチキン+マルチャンの野菜スープ 東急のメンチカツ1個+アジフライ1枚 東急のチキンこしょう焼き+マルチャンのワンタン

ここでライフスーパーマーケットのライフのことであり、東急東急ストアのことです。全ての食事は自宅の炊飯器で炊いた白米または麦ご飯を伴います。
(食べたものから考えて、二日目のところはきっと長時間労働の日でしょうね。)

このように、読点や、プラスを区切り文字として、食べたものが記入されています。このように1つのセルには複数のオブジェクトが格納されているExcelシートから何を何回たべたか集計するには、どうしましょうか?

そう、シェル芸です!

Excelシートから食べたものの列(論理朝食から論理夕食まで)をコピーし、テキストファイルに保存して、シェル芸です。実行環境はMac(Sierra 10.12.6)のbashです。

cat meal.txt | tr -d '"' | tr '+' '\n' | tr '、' '\n' | tr '\t' '\n' | sort | uniq -c | sort -k 1 -r

簡単に解説。

  • 保存したテキストファイルを meal.txt としています。
  • catコマンドで標準出力に吐いてます。
  • Excelのセル内で改行(Windowsならalt+enter、Macならoption+return)すると、セルのデータが二重引用符"で囲われますので、それをtrコマンドで除去しています。
  • 以後、一連のtrコマンドで、食べ物の区切り文字をどんどん改行文字に変えていっています。そう、1行で1個のたべものになります。
  • uniq -cによって、同じ食べ物(一字一句違いない、同じ食べ物)をグループ化して出現回数を取っています。uniq -cは隣接した行しかグループ化しませんので、直前のsortが必要です。
  • 最後の sort -k 1 -r で、出現頻度の高いものが上に来るように並べ替えています。たぶんオプション-k 1は不要ですけども、癖ですね。

上記のデータ例では ライフの というトークンも一つの食べ物として出てきてしまいますが、雑な記録&雑な集計ですので、ここでは気にしません。

こうして、私が6月下旬から7月下旬の約1ヶ月間に食べたものの集計が出ました。
上位5件を紹介しましょう。

$ cat meal_20170628.txt | tr -d '"' | tr '+' '\n' | tr '、' '\n' | tr '\t' '\n' | sort | uniq -c | sort -r | head -n 5
   8 シーチキン
   7 ベーコン
   6 ソーセージ
   4 卵
   4 マルチャンの野菜スープ

雑な集計においては、最も頻度の高い食べ物はシーチキンと出ました。量にもよりますが、あまり健康的ではなさそうですね。
また、これらは、ほぼ全て論理朝食で摂取している食べ物であることを私は経験的に知っています。論理昼食や論理夕食は変化に富んでいるものの論理朝食は数パターンをぐるぐるまわっていることもここから伺い知ることができます。

将来の展望

ある程度データが貯まったら、食べ物の表記揺れを吸収する手段を取ります。記録時にコストをかけずに表記ゆれを防ぐルールも敷いていきます。
そして、身体に悪影響を及ぼす食べ物を統計的に導き出し、私は健康な肉体を手に入れるのです。

機械学習的なアプローチでも良いですし、QC七つ道具みたいなものを導入するのも良さそうです。目指せ、人生の品質管理!

さいごに

上記の記録内容に出てきた もやしのにんにく醤油炒めは、良いです。