概要
データの見えざる手によれば、人間の身体活動はある規則に従って分配される
出典 データの見えざる手
このグラフは
- 手首にリストバンド型加速度センサを付けて、身体運動の回数(N回/分)を測定する
- 一定期間中の、身体運動の回数の、出現頻度累積確率を縦軸に取る(対数目盛)
ことで、描ける
ここから、分かることは
- 60回/分の活動は一日の半分を占める(占めることになる)
- 60~120回/分の活動は一日の1/4を占める(占めることになる)
例えば、ある仕事が60~120回/分の運動量だとすれば、
その仕事は一日の間で1/4分の時間しか費やせない(それ以上の時間、その仕事は頑張れない)
という事
なるほど、面白いと思って、これと似たことをOuraRingでやってみた
OuraRingからMetsを取得する
データの見えざる手では、加速度センサによる動きを使っていた
自分の所有しているOuraRingではMetsという値が取れているため、これで代用する
OuraRingのAPIを使って、Metsを取得する
OuraAPIの使い方はこの記事が参考になる
import requests
import json
import os
import datetime
import collections
import pprint
BASE_URL = "https://api.ouraring.com/v1/"
TOKEN = "access_token=" + str(os.environ.get("OURA_TOKEN"))
def create_date_str(weeks_offset=0):
today = datetime.datetime.today()
target_date = today - datetime.timedelta(days=1,
weeks=weeks_offset)
return target_date.strftime("%Y-%m-%d")
def create_url(weeks_offset=0):
end_date = create_date_str(weeks_offset)
start_date = create_date_str(weeks_offset+1)
url = f"{BASE_URL}activity?start={start_date}&end={end_date}&{TOKEN}"
return url
if __name__ == "__main__":
headers = {"content-type": "application/json"}
mets_counter = collections.Counter()
for week_offset in range(5):
responce = requests.get(create_url(week_offset), headers=headers)
data = responce.json()
for activity in data["activity"]:
mets_counter.update(activity["met_1min"])
total_num = sum(mets_counter.values())
for mets,count in mets_counter.items():
mets_counter[mets] = count/total_num
with open("mets.txt","w") as f:
for mets,probability in mets_counter.items():
f.write(f"{mets}\t{probability}\n")
metsを取得するためのurlは
https://api.ouraring.com/v1/activity?start=YYYY-MM-DD&end=YYYY-MM-DD&access_token=TOKEN
create_date_str
,create_url
で一週間ごとのactivityデータを取得するURLを生成する
一週間分毎に{mets : 出現回数}を更新する
(結構データ量大きそうだからメモリ節約のため、必要な分だけ細かく取得しているつもり)
これを、何かしら出力する
データの可視化
まず、単純にmets - 出現確率
を可視化する
2mets以下の出現頻度が高い事が分かる
次にmets - 累積確率
を可視化する
(累積確率は、あるmetsと、それ以前すべてのmetsの出現確率の和→総和が1)
2mets以下で一日の80%を占めている
2mets以上は20%
この時点でmetsもU分布に従いそうなことが分かった
これを
出典 データの見えざる手
この画像っぽく見せてみる
mets - (1-累積確率)
の縦軸を対数目盛にすると出来た
Metsと実際の運動の紐づき
例えば、
- 立ちながらの読書 : 1.8mets
- リクライニングでの読書 : 1mets
- 座位作業(読書含む) : 1.5mets
とある
データの見えざる手を参考に、読書のカルノー効率を計ると
1 - 1/1.8 = 0.44
最大、1日の44%(活動時間16時間として7時間くらい)までしか読書できない
(metsで言えばの話だから、読書に限らず1~1.8mets程度の活動は1日7時間しか出来ない)
と言えそう
筋トレは
- ウェイトリフティング : 6mets
- 一般的な健康教室での運動 : 5.5mets
で
1 - 5.5/6 = 0.083
1日の8%程度(1時間程度)が限界
まとめ
- データの見えざる手マジおもしれぇ
- MetsもU分布に従っていた
- Mets表とOuraRingのトラッキングがあれば、効果的に一日のスケジューリングが出来る