睡眠をデータサイエンスする

現職では、データ分析やAIで何かを予測していろいろな業種業態の改善/課題解決をする仕事をさせてもらっています。それっぽく言えば、データサイエンティストでしょうか。

今回の記事では、自分の睡眠時間について理解を深めながら、睡眠改善について考察する作業をとおして、データサイエンティストとして、どういうことをしているのかの一旦を紹介できればと思います。

# 問題意識
最近、ランニングのためにスマートウォッチ（Garmin ForeAthlete）を購入しました。このデバイスでは、ランニングのための機能以外に、睡眠時間などのライフログを計測できます。

数日間眺めていると、いつからいつまで寝たかがほぼ正確じゃないか！と思えます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/104992/17800cc1-e082-b3b1-601c-879e0202544f.png" width=50%>

自分のライフログを記録して、それを見ていくのは面白く、睡眠時間短いなーとか、眠りが浅いなーとか感じるのですが、そのうち、
**..それで何やねん？** 
と、関西人ではないのに大阪弁がでちゃいます。

最近は、睡眠時間を記録するためにほぼ24時間時計をつけて生活しているのですが、それだったら、何かもっとメリットがほしいです。

意識高い系の人だったら、もう少し睡眠時間を増やすようにしてみる、とか、快適な睡眠を取る方法を調べて、環境を改善するとか、いろいろやるでしょう。

ですが自分は、
- 睡眠時間を変えることなく、
- 自分に一番あった方法で、
- 快適な睡眠がとりたい
のです。

# 環境
python 3.5
jupyter notebook

# 作業の流れ
以下のような流れです。
基本的には、目標をできるだけ明確にして、それを達成するために必要なものを分析し、行動し、改善を繰り返して目標達成に向かうというPDCAサイクルです。

1. 目標の設定
    - 快適な、理想的な睡眠とは何か
2. 分析、行動（現状把握と不足データの洗い出し）
    - 自分の睡眠時間とその他のライフログの実態がどうなっているのかを分析
    - 目標を達成できているか
    - 分析に足りないと思う情報があるかを確認する
    - 必要な行動を起こす
3. 改善
    - 分析、行動を繰り返す

# 目標の設定
目標設定するに当たり、まずは睡眠とは何か、を理解する必要があります。
素人がWebから得られる情報をいくつか見たところは、

- 健康や長寿に関係する最適な睡眠時間は一般的に7時間と言われる
- 1日の成長ホルモン分泌量の約7割が睡眠中に分泌され、そのうち約7割が眠り始めの2、3時間に分泌される
- レム（浅い）/ノンレム（深い）眠りがあり、２種類の睡眠を90分/1サイクルで、1どの睡眠に4〜6サイクル繰り返す。朝方に向かうほどノンレムの時間<レム睡眠の時間が増え、自然と目をさます
- レム睡眠中は心拍数、呼吸数が増加して不規則になり、呼吸は浅くなる。ノンレム睡眠中は呼吸数は安定し、深くゆったりとした呼吸になる。
一方、ノンレム睡眠は脳が休息している状態で、体も休んでいるが、筋肉はある程度働いている
ノンレム睡眠中は心拍数、呼吸数は安定し、深くゆったりとした呼吸になる
- 当然個人差もあるし、年齢、生活状況や季節でも違う
- 朝に太陽の光を浴びることで、目から光の情報が伝わり、体内時計がリセットされる
- 睡眠時の平均心拍数は60～70。

結局、当たり前ですが個人差があります。
睡眠時間は他に当てる時間を無理に削ってまで増やそうとは思わないので、まずは以下のように目標設定します。

- 朝自然と目をさますことができたか
- 日中眠気を感じず、快適だったか

これを達成するために、睡眠時間を確保する以外の手段で何ができるか、また、睡眠の質を評価したり、目的を達成できているかどうかを評価するためになんの情報が必要かを考え、実行し、再度評価を行う、PDCAを回していきたいです。


# データ取得
なにはともあれ、まずはライフログのデータがないと始まりませんので、データを持ってきます。

iPhoneの場合は、[HEALTH CARE](https://www.apple.com/jp/ios/health/)から、XMLで出力できます。

# データ準備
XMLのデータは扱いづらいので、XMLをパースして、必要な情報を取得します。

こちらのJunpyter Notebook、[markwk/qs_ledger](https://github.com/markwk/qs_ledger/blob/master/apple_health/apple_health_extractor.ipynb)を流用させていただきました。

XMLから、以下のようなデータをCSVに出力してくれます。

- HeartRateVariabilitySDNN.csv
- MindfulSession.csv
- AppleExerciseTime.csv
- VO2Max.csv
- RestingHeartRate.csv
- StepCount.csv
- Height.csv
- SleepAnalysis.csv
- AppleStandHour.csv
- BasalEnergyBurned.csv
- FlightsClimbed.csv
- BodyMass.csv
- WalkingHeartRateAverage.csv
- ActiveEnergyBurned.csv
- HeartRate.csv
- DistanceWalkingRunning.csv
- ActivitySummary.csv
- Workout.csv

## 睡眠時間の俯瞰
まずはデータをざっくりと眺めてみます。

睡眠に関する`SleepAnalysis.csv`を見ると、以下のようになっています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/104992/64305197-2b61-3d7a-c145-76a0b7cb724a.png" width=100%>

睡眠時間を日別に可視化すると、なんとなく周期性が見られるような気がします。
なお、月曜日に破線を引いています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/fdc937c9-1639-1b5f-bcc5-238a57ee8475.png)

## 心拍数の俯瞰

心拍数に関する`HeartRate.csv`を見ると、以下のようになっています。
心拍数の計測は通常2分おきに(2分平均で)行われているようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/6e91b997-5177-c126-fd52-c2662dff3331.png)

ある日の睡眠中の心拍数を可視化してみます。
心拍数のベースが大きくかわるような変動と、ノイジーな変動が見られます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/2cbba4be-70ae-e415-7ab9-7372ab26b01f.png)

# データクレンジング
実際には、毎日スマートウォッチを着けて寝られているわけではありません。なのに、睡眠レコードが存在するので、これはノイズとして除外したいです。

心拍数の計測が2分おきに行われていることから、睡眠時間から推定される、あるべき心拍数レコード分の心拍レコードが無い日は除外します。

# データの分析

いろいろな角度で、データを眺めてみます。

曜日ごと、休日/平日の平均睡眠時間を集計します。
月-木の夜は睡眠時間が短く、逆に金-日の夜はそれを取り戻すように理想的な７時間程度の睡眠がとれています。
月-木という平日の睡眠の質についてとくに注目する必要があります。

|曜日ごと|休日/平日|
|---|---|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/823b2813-be3f-c004-c393-970c0998f2e0.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/5900d313-1a25-c484-62e4-96f44b408b44.png)|

就寝/起床時刻のヒストグラムを確認します。
1,2時に就寝、7-8時に起床が多いです。
起床時に7-8時に朝日が当たる場所で起きられているので、体内時計を整えるという意味では、体に良い習慣なのかもしれません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/dff3d7ca-9c20-3607-df61-88a137b03c2b.png)

ランニングを定期的にしているので、就寝前24時間以内にランニングしたかどうかで、平均睡眠時間を比較してます。
なお、集計した期間内に、フルマラソンを1度走っていたので、その日の睡眠は例外として除外します。

平日の夜は運動をした日のほうが平均的に睡眠時間が短いです。休日は逆です。
疲れたときほど長く寝そうですが、平日は逆に短いです。ランニング後に目が覚めて寝られなくなるのは自覚があり、納得です。

一方走っていない日はほぼお酒飲むので、それが、平日の睡眠時間を減らしているという可能性もあります。

1週間で2回以上ランニングするのが習慣で、曜日は決めていないのですが、できるだけ金曜など休日前にするといいのかもしれません。

|平日のみで集計|休日のみで集計|
|---|---|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/40babd35-6d46-c14b-32f7-e75cbae9118e.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/f775e897-9087-37c9-793c-ce0ed2a51bdf.png)|

日別の睡眠時における平均心拍数を可視化します。
日毎に大きく変動しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/2dc8fc86-b976-5b8f-8fba-db7eb3714bc9.png)

就寝前24時間以内にランニングしたかどうかで、睡眠中の平均心拍数の違いを比較してみます。
運動した日は、ほぼ52-53あたりで安定、しない日は平均的にはあまり変わりませんが、分散が大きそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/19aa59ea-7c7d-74df-f7ad-180aa1eaefcf.png)

さらに、ランニングしたかどうかで、日別に心拍数を可視化してみます。
運動していない日の睡眠中の心拍数の変動は激しく、外れ値も多く見られます。こういった大きな変動が睡眠を浅くすることで、悪影響を与えているのではないかということが考えられます。

|運動した|運動してない|
|---|---|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/bebe4a81-8b88-564c-4bd1-2905acf48610.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/d4f0fd5f-032f-18b8-5ea0-8a70dded8694.png)|

運動をした日の、ランニング時間（=duration）と睡眠中の平均心拍数)(=hrate_mean)、睡眠時間(=sleep_time_sec)に相関があるかを見てみます。
睡眠時間とランニング時間には多少相関があります。体が疲れるとじっくり寝られるのでしょうか。
睡眠時間と平均心拍数にも相関があります。睡眠時間が長いほど、心拍数の変動が少ないのでしょうか。

となると、例えば、今日はもう早く寝たい！と思ったときは、ランニング時間を長めにして、体を疲れさせたほうがいいかもしれないです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104992/892085be-e36a-9199-5e82-396da5c036e2.png)

# 目標を達成できているか
そもそもいちばん大事な、心地よい睡眠がとれたか、というデータがありません。
なので、どうにも評価できませんでした...

# これから
まずは毎日目標を達成できたかを数値化していきたいです。
最初は主観的な良かった/普通/悪かったといった、ランク付けになる可能性が高いですが。

他にも、まずは一番睡眠に関係しそうで簡単なデータ、例えば、お酒を飲んだ量や、仕事した（頭を使っていた）時間といったデータを収集して、分析してみたいです。

こういった地道な作業を続けて、データが溜まった頃にまた分析して見たいと思います。

他にも、こういったデータを簡単に毎日記録できる仕組みが欲しくなりますね。探して見つからなかったら、自分で作ってみようかな。

# もっと先の願望

毎日睡眠のことを考えながら行動を変えるのは面倒なので、
過去のライフログと快適な睡眠だったかどうかということをAIで学習して、例えば明日のお酒は少し控えたほうがいいですよ、的なことをレコメンドする仕組みが欲しくなりますね！！


# 最後に

課題から目標を設定し、データを元に考察し、不足があるなら行動し、改善を繰り返すことがデータサイエンティストの仕事であり、面白いところです。

また、自分の考えたこと行動が、目標に対して効果があらわれてくると、より一層楽しくなると思います。


#　参考
以下、参考にさせていただきました。

- 理想的な睡眠
  - [最適な睡眠時間は何時間？](https://sleepdays.jp/articles/88)
  - [知っておきたい睡眠の基礎知識](https://www.yomeishu.co.jp/health/mibyou_prevention/suimin_change/p3.html)
  - [安静時心拍数の平均値はどのくらい？](https://sirabetter.com/398.html)

- データ取得
  - [How to export and import your Health data](https://www.idownloadblog.com/2015/06/10/how-to-export-import-health-data/)

- データ準備
  - [markwk/qs_ledger](https://github.com/markwk/qs_ledger)
  - [How to Export, Parse and Explore Your Apple Health Data With Python](http://www.markwk.com/data-analysis-for-apple-health.html)