書店で売っていそうなオライリー技術書みたいなタイトルをつけてみましたが、チョコザップでの筋トレを工学的アプローチでハックすることを検討しました.
背景: ダイエットの成功体験を筋トレにも応用したい
6年くらい前、わたしは100キロを越えるデブだったのだが、データを細かくとりながらダイエットに取り組んだところ、11ヶ月で45キロのダイエットに成功した。1
しかし、そこから筋トレをはじめたものの、あまり成果を感じないまま今日に至る. 1年前からチョコザップでちょこっと頑張り始めたのだが、1年経過しても現状維持のヘナちょこ野郎.
そこで、過去のデータドリブンなダイエットの成功体験を筋トレに活かしたいと考えた. 体重を減らすのではなく、筋肉量を増やすという真逆の目標だが、アプローチは同じだ。利用する計測デバイス, APIもとりあえず同じ.
Claude Codeの力を借りてFitbit API clientを爆速でフル実装!
ブラックフライデーでFitbit Charge6を購入した. なんと10年間のFitbitユーザだ.4 そして、Fitbitデータを分析したいという野望も、何度も繰り替えしている.
何度も挫折してしまうのは、そこそこデータの取得と管理が面倒くさいから. そして面倒くさいならば、公式アプリでいいじゃんと毎回なっている.
しかし、時代は変わった. 生成AIの力を借りると、もはや自分でのコーディング不要で、言葉でデータ分析ができるようになった. 睡眠の専門家の知見から、論文を参照しつつ、睡眠分析をしてくれる時代となった.
私が心底恐ろしいと思ったのは、Fitbit APIの Python Client ライブラリそのラッパーをドキュメントを解読させて数時間で全部完成させたこと. ハマりポイントの認証やトークン監理も手取り足取り教えてくれた. 5
目標設定
マッチョ指数 FFMI 21を目指す
いろんなデータを分析するもの、主観的にはシンプルな数個の指標を追いかけるのがいいと、ダイエットのときに思った. ダイエットならば、体重と体脂肪率.
では筋トレは? 以下のような指標がTANITAのhealth planetから取得可能.
- 体重
- 体脂肪率
- 筋肉量
FFMI(Fat-Free Mass Index)、通称マッチョ指数という指標がある. これが使えそうだ. この計算式は以下.
FFMI = LBM(kg) / (身長(m) ^ 2)
LBM = 体重 × (1 - 体脂肪率 / 100)
- 16-17: 平均的
- 18-19: トレーニング経験者
- 20-21: よく鍛えられた身体
- 22-23: エリートレベル
- 25以上: ナチュラルでは困難(ステロイド使用の可能性)
わたしの現在のFFMIは18.6。FFMI=21がいわゆるマッチョですとのこと. FFMI 21を目指すことにした.
リーンバルクによって 月次0.75kgの増量
次に、リーンバルクで少しずつ体重を増やしたい. 無理なく増やすには 月あたり +0.5-1.0kgがいいらしい。
planA=+0.5kg, planB=+0.75kg, planC=+1.0kgでシミュレートしたところ、planBならば1年でマッチョ可能と言われたため、それを信じることにした.
- 目標: FFMI 21.0 (体重 67.3kg)
- 予測到達: 約10.2ヶ月後 (44週後)
- 増量ペース: +0.75kg/月
筋トレデイリーレポートの全体像
https://github.com/tsu-nera/dailybuild/blob/main/reports/body/monthly/2025-12/REPORT.md
生成されるレポート
日次・週次・月次で自動生成されるマークダウンレポート。内容は以下の通り:
- サマリー: 体重、筋肉量、体脂肪率、FFMIの変化
- トレーニング: 歩数、Active Zone Minutes、VO2 Max
- 栄養: カロリー、PFCバランス、マクロ栄養素
- カロリー分析: TDEE(総消費エネルギー量)の内訳
- 回復: 睡眠時間、深い睡眠、HRV、安静時心拍数
- 詳細データ: 日別の体組成データと推移グラフ
システム構成
[Tanita Health Planet API] 体組成データ
↓
[Fitbit API] 睡眠・HRV・栄養・活動データ
↓
[Python Scripts] データ収集・CSV保存
↓
[generate_body_report_daily.py] レポート生成
↓
[Markdown Report] + [Chart画像]
技術スタック
- データ収集: Python + Fitbit API + Health Planet API
- 分析ライブラリ: pandas, numpy
- 可視化: matplotlib
- レポート形式: Markdown + Chart画像
- 実行: ローカルスクリプト
生成AIをつかったデータ分析のベストプラクティスは模索しているが、今はMarkdownでレポート生成をすることに落ち着いている. Jupiter Notebookをつかうよりも、こっちのほうが解析も簡単、レポートと分析を分離監理しやすい、トークン量的にもやさしい.
苦労したところ
トレーニングボリュームの管理は Hevy アプリを利用
筋トレにはトレーニングボリューム理論というものがメジャーなようで、これを監理したかった. ただ、デイリーレポートというよりは、週次でトレーニング部位ことに監理が必要で、とりあえずの目標のデイリーレポートとは異なる.
ネットで検索すると、Notionで筋トレを監理している筋肉エンジニアがそこそこみつかった.
- Notion活用筋トレ管理法|onose
- 筋トレの記録を Notion で管理する|よし
- タイミー執行役員CTO 亀田彗さんが明かすNotionを自分仕様に作り変える方法
- 効率的に筋肥大をするためのスマートな管理方法 - Tomohisa Oda
はじめは自分もこれを真似してNotionを使っていたが、Hevyというもっといいアプリをみつけた.
無料でもほぼすべての機能がつかえる. なんとWeb APIもあるが、これは課金が必要. 無料でもcsv exportはできる. このアプリの出来が素晴らしいので自分で開発する意味を失い、巨人の肩にのって筋トレ監理はこのアプリに任せることにした.
チョコザップのマシンにも完全対応
チョコザップのマシン名とアプリの英語種目は対応は以下の通り。網羅されているのは嬉しい.
# チョコザップマシン名マッピング(Hevy → チョコザップ)
CHOCOZAP_MACHINE_MAPPING = {
'Seated Shoulder Press (Machine)': 'ショルダープレス',
'Lat Pulldown (Machine)': 'ラットプルダウン',
'Seated Dip Machine': 'ディップス',
'Preacher Curl (Machine)': 'バイセップスカール',
'Leg Press Horizontal (Machine)': 'レッグプレス',
'Chest Press (Machine)': 'チェストプレス',
}
なお、トレーニングボリューム理論のセオリー的にはマシンごとではなく部位別で集計するのだが、チョコザップではマシンが限定されているのでマシンで管理することにした.
食事管理は Fitbit を利用
データドリブンでリーンバルクをするならば、食事管理はしっかりやりたい.
食事管理アプリは、あすけんやカロミルが日本では有名. しかし、Web APIが個人利用では使えない. 法人では使えるようだ. 別のアプリをいろいろ探してみたのだが、いいものがない.
すると、Fitbitにも食事管理機能が一応あることに気づいた. しかし意味不明なことに、WebダッシュボードはGoogleに買収されてから使えなくなってしまい、アプリからしか入力できない. 保守されているのか怪しいものの、よい代替がないので、とりあえずFitbitアプリをつかうことにした. これで APIをつかってPFCバランスや絶対量が計算可能となる.
なお、入力はなれれば数分だがそれでもめんどくさいので、最低プロテインだけを記録することにするずぼら戦略でいく. 完璧は求めない. 近似で雑でもいい. とりあえず記録する.
カロリー分析:TDEEの内訳
TDEEも計算は可能だったので実施してみた.
TDEE(総消費エネルギー量)= BMR + NEAT + TEF + EAT
- *BMR*(基礎代謝): 体組成計から取得
- *NEAT*(非運動性活動熱産生): Activity Calories - EAT
- *TEF*(食事誘発性熱産生): 摂取カロリー × 0.1
- *EAT*(運動活動熱産生): Fitbitのアクティビティログから計算
これにより、カロリー収支(In - Out)の内訳が明確になった。
しかし、どういうわけか In - Out がマイナスになってしまう. Fitbitは最低プロテインだけ記録すればいいルールにして、厳密な入力は採用してないので、そこがずれているのかも。あまり深追いしないことにした。
回復指標:HRV × 睡眠
筋トレの効果を最大化するには、回復が重要. とくに成長ホルモンの深い睡眠時間.
- HRV(心拍変動): 自律神経のバランスを示す。高いほど回復良好
- 安静時心拍数: 低いほど回復良好
- 深い睡眠: 成長ホルモンの分泌に関連
HRV上昇 & HR低下 = 回復良好という簡単な判断基準で、トレーニング強度を調整できる。
おわりに
手元の戦略ノートを元に線形グラフに賭ける
この前読んだエドソープの書籍でのエピソード. エドソープがまだブラックジャック必勝法を検討している段階では勝てないことが続くと、カジノで「あいつなにメモをちらちらみてるんだ」と周りから笑われた. それでも、計算による戦略メモにしたがって賭けつづけることで、大金を得た.
エドソープの自伝を読んだ感想 - 応用数学のかっこよさを魅せてくれる物語 | Futurismo
このエピソードをよく思い出す. これを筋トレで考えてみると、トレーニングボリューム理論のアプリHevyという戦略メモにしたがってボリュームを積み上げる. 筋肥大に大事なのは、理論からするとトレーニングボリュームの総量であり、重量ではない. 軽い重量でもたくさんこなすことでトータルのボリュームを積み上げる.
エドソープは確率論だったがこれは線形グラフ、解析学だ. しかし、どちらも数学を力にするという価値観に結びつく. 確率論は非連続的な未来を予測するツール、解析学は連続的な未来を予測ツール. 数学を信じる. 計算可能性を信じる. 筋肉への投資は必ずリターンがある. 筋肉は裏切らない.
工学的アプローチによって筋肉をビルドアップしていく
工学的手法、エンジニアリングとはなんだろうか?いろいろ議論はありそうだが、ひとつの側面は計測して、予測して、それによって問題を解決すること. それにフザケた遊び心が加われば、ハックとなる.
筋肉をソフトウェア開発、もっといえば工学的に計測して、改良していこと、これはハックではないだろうか? チョコザップでデータ駆動筋肉開発、もうこの言葉がパワーワードだ. 負ける気がしない.
-
https://github.com/tsu-nera/yaseru/blob/master/notebooks/weights_analysis.ipynb ↩︎
-
買い換える理由は最新機種が欲しいわけではなく、すぐ壊れるからであり、今回が6台目. 2年に1度壊れていることになる. ↩︎
-
Pythonには昔からのクライアントライブラリがあるものの保守が滞っているので、全部作り直した. 気軽にAPI Clientを自前作成できる恐ろしい時代となった. https://github.com/orcasgit/python-fitbit ↩︎