Fitbit API × BigQuery × Looker Studioで睡眠分析してみた
概要
Fitbit APIから取得した睡眠データをBigQueryに転送し、Looker Studioで可視化してみました。
「曜日ごとの睡眠パターン」や「ストレッチと入眠時間の関係」を分析しています。
睡眠分析
曜日 vs 入眠時間
-
休日は早く寝やすい?
図1に、曜日ごとの睡眠時間を示したグラフを示します。
図1からは以下の2点が分かります。
→ 日曜・金曜は比較的ゆっくり寝られて長時間睡眠
→ 月曜・木曜は寝不足気味
薄々感じていたことではありましたが、休日は8時間近く十分に睡眠がとれていそうですね。
一方で、平日は睡眠がとれておらず、特に月曜・木曜が寝不足気味でした。
確かに平日1日目と、後半の木曜は身体が疲れている気がします。この2日は今よりも意識的に早めに布団に入ろうと思いました。
ストレッチとsleep_latency
図2に、7/2~20の入床時間と入眠潜時を示しています。
入眠潜時とは、ベッドに入ってから実際に眠りに入るまでの時間のことを指します。
図2からは以下の3点が分かります。
- 7/2~8は、入眠潜時(sleep_latency)が短い
- 7/5は、入眠潜時が極端に長い
- 7/19~20は、入眠潜時が短い
7/2~8の入眠潜時の短さについて
まず1点目について、実は7/2~8は入床前にストレッチを行った期間になります。
つまり、これらの期間で入眠潜時が短い理由は、ストレッチによりリラックスできたため、スムーズに入眠することができたと考察できます。
入眠潜時は、7/2~8でおよそ10分、7/9以降でおよそ20分とすると、10分程度のストレッチであれば、ストレッチ時間を短くなった入眠時間で相殺できることを表しています。
個人的にストレッチの時間は睡眠時間を削っているような感覚があったのですが、このデータを見て安心して取り組めるようになりました。
7/5の特異値
7/5の入眠潜時が、極端に長い理由は、前日より入床時刻が2時間以上早まったことが原因と推定できます。それまで0時過ぎに入床するリズムでいた身体が、急に22時頃に寝ると対応できないのだと思います。
休日の安心感
最後に7/19~20ですが、入眠潜時が平日と比べて低くなっていることが分かります。これは主観ですが、土日は仕事の心配がないため良く眠れていると感じています(笑)。
そのため入眠潜時が、平日ほど長くならず入眠できるのだと考えています。
まとめと今後の展望
今回は、Fitbit APIから取得した睡眠データをBigQueryに転送し、Looker Studioで可視化してみました。
当初Fitbitはスマホアプリもリリースされていて、APIを引っ張って分析する意味も薄いのではないかと考えていました。
しかし、入眠潜時の分析によりストレッチによるリラックス効果を定量的に知ることができて満足しています。
今後は、もっとデータ数を増やして他に特徴的な傾向ないか分析する予定です。
また今回は紹介しませんでしたが、昼寝時に sleep_latency
が短い傾向にあるので、こちらも併せて分析できたら面白そうだなと思ってます。
分析の注意点
Fitbitの睡眠データには is_main_sleep
というフラグがあるので、
昼寝と本睡眠を区別する際にはフィルターをかけるのがおすすめです。
is_main_sleep = true #本睡眠
is_main_sleep = false #昼寝
ソースコード
今回の分析に使用したコードは GitHub に公開しています。
ぜひ clone して試してみてください 👇
データパイプライン概要
-
Fitbit API から
sleep
データを取得 - BigQuery に保存
- Looker Studio で可視化
Pythonでデータ取得 → BigQuery投入をしています。
record = {
"sleep_log_id": record.get("logId"),
"date": record.get("dateOfSleep"), # 睡眠記録日
"weekday": weekday, # 曜日
"startTime": record.get("startTime"), # 睡眠の開始時刻
"endTime": record.get("endTime"), # 睡眠の終了時刻
"minutesAsleep": record.get("minutesAsleep"), # 実際に眠っていた時間
"minutesAwake": record.get("minutesAwake"), # ベッドにいたが寝ていなかった時間
"deep_minutes": deep_minutes, # 深い睡眠の合計
"deep_sleep_ratio": deep_sleep_ratio, # 深い睡眠の割合
"wake_count": wake_count, # 中途覚醒の回数
"sleep_latency": sleep_latency, # 入床から入眠までの時間
"sleep_score": record.get("score"), # Fitbitの睡眠スコア
"timeInBed": record.get("timeInBed"), # ベッドにいた総時間
"efficiency": record.get("efficiency"), # 睡眠効率(minutesAsleep/timeInBed)
"type": record.get("type"), # 睡眠ステージ
"is_main_sleep": record.get("isMainSleep"), # 本睡眠フラグ
"created_at": datetime.now().isoformat()
}