【Python】心の健康状態を可視化をしたい

## はじめに
**心身**の健康といったとき、**身**の情報はありふれてるけど、
**心**の健康状態ってよくわからなくないか？と思ったのが、今回の記事の背景です。
まずは**心の状態の可視化したい**と思ったので、その過程でやったことを記事にします。
## やりたかったこと
**身体の状態から心の状態を可視化する** 
ここでは**心の状態＝ストレス状態**とします。
具体的には、Apple watchのヘルスケアデータからストレス状態を可視化し心拍変動からストレス状態を計測たいと思いました。
## 結果
### できたこと
心拍変動からストレス状態を計測
### できなかったこと
Apple watchのヘルスケアデータを使っての自分の生データを測定 

## 今回使用したもの
- Pythonの心拍変動解析用のライブラリ（hrv）
- Pythonの実行環境はGoogle Colaboratory
- Apple watchのヘルスケアデータ
## やったこと
### 方法を調査
今回やりたいことを実現できる且つ技術的に私でもできることを調べたところ、**Pythonに心拍変動解析用のライブラリ（hrv）**  があることがわかりました。参考になる記事もあったので、このライブラリを使用することにしました。

https://qiita.com/yamamoton/items/633bf830628593e24172#-python%E3%81%A7%E5%AE%9F%E8%A3%85

https://hrv.readthedocs.io/en/latest/index.html

## Pythonの実行環境を用意
実行環境はGoogle Colaboratoryを使用しました。少し触れたことはある程度でしたが、GUIで数クリックで実行環境を作れるので構築がとても簡単です。こんな簡単に環境構築ができるなんてすごい。。

https://www.python.jp/train/experience/colab.html

### 心拍変動解析とは

https://qiita.com/yamamoton/items/633bf830628593e24172#-python%E3%81%A7%E5%AE%9F%E8%A3%85

https://zenn.dev/kn1cht/articles/apple-watch-ecg-python#rri%E3%81%A8%E5%BF%83%E9%9B%BB%E6%8C%87%E6%A8%99%E3%81%AE%E8%A8%88%E7%AE%97

こちらの記事が非常に参考になるのでご参照ください。私もこちらを参考に調べましたが、ざっくり紹介すると以下の指標でストレス状態を計測できるそうです。

- Low Frequency（LF）：交感神経の活性化度
- High Frequency（HF）：副交感神経の活性化度

LF/HFの値が**大きいとストレス状態**であること、LF/HFの値が**小さいとリラックス状態**であることがわかります。
* LF/HFの値が大きい
    * ストレス状態
* LF/HFの値が小さい
    * リラックス状態

LF/HFは心臓の収縮/拡大の間隔（RRI）から計測できます。
* RRI：R波から次のR波までの間隔
* R波：心電図のピーク、心臓が血液を送り出すタイミング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2016468/1b62b42a-5d17-1ebf-ff23-82b85d01be56.png)

## 実行
Google Colaboratoryでノートブックを作成し、以下の通り実行します。
```python
# hrvをインストール
pip install hrv

# モジュールをインポート
from hrv.classical import frequency_domain
from hrv.rri import RRi

# ダミーデータをセット
rri = RRi([800, 810, 815, 750, 753, 905,840, 780, 910, 773, 897, 789, 903, 875, 900, 889, 790, 849, 798, 904])

# 実行
results = frequency_domain(
  rri=rri,
  fs=4.0,
  method='welch',
  interp_method='cubic',
  detrend='linear'
)

# 出力
print(results)
```
出力結果
```python
{
'total_power': 338.972039566276, 
'vlf': 0.0, 
# lf: 交感神経の活性化度
'lf': 97.11615672501061, 
# hf:副交感神経の活性化度
'hf': 241.85588284126538, 
# LF/HFの値が比較的小さいことから、リラックス状態とわかる
'lf_hf': 0.40154556335001285, 
'lfnu': 28.650196886230912, 
'hfnu': 71.34980311376908
}
```
ダミーデータでですが、LF/HFの値が比較的小さいことから**リラックス状態**であることがわかりました。
ここまでで心拍変動（身体情報）から、ストレス状態（心の状態）を測定できることがわかりました。
## Appleのヘルスケアデータを使っての自分の生データを測定したい

次に、毎日着けているApple watchで収集しているヘルスケアデータを使って、自分の生データを測定したいと思いました。しかし、冒頭書いたようにこれは実現できませんでしたので、その過程でやったことを書きます。

### 必要なデータは取得できる
ヘルスケアデータの**心拍数**から分析に必要なデータ（**RRI**）を取得できることはわかりました。
以下、Appleのヘルスケアから出力したデータです。
```xml
<Record type="HKQuantityTypeIdentifierHeartRateVariabilitySDNN"
sourceName="----のApple Watch" sourceVersion="----"
device="&lt;&lt;HKDevice: 0x2812149b0&gt;, name:Apple Watch,
manufacturer:Apple Inc., model:Watch, hardware:Watch3,3,
software:8.7.1&gt;" unit="ms" creationDate="----"
startDate="----" endDate="----"
value="----">
  <MetadataEntry key="HKAlgorithmVersion" value="2"/>
  <HeartRateVariabilityMetadataList>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:26.30"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:27.27"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:28.19"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:29.14"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:30.14"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:31.09"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:32.09"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:33.13"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:34.12"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:35.09"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:36.12"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:37.14"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:38.15"/>
   <InstantaneousBeatsPerMinute bpm="--" time="15:12:39.16"/>
```
**time**が**R波**にあたるので、この間隔から**RRI**を測定できます。
（余談ですが、ヘルスケアデータはxml形式で出力されます。加えて、データ総量が多いこともあり、編集できるデータ形式にするのが非常に大変でした。。）
## Apple watchのデータは測定時間が短い
この点が、ヘルスケアデータを使って計測できない原因のようでした。
LF/HFの算出には**最低限2分**必要、しかしApple watchの測定時間は**30秒**のため計測は困難なようです。残念。。
## おわりに
実際の生データを使って計測までは至りませんでしたが、心の状態の可視化できる方法があることがわかったのはよかったです。Appleのヘルスケアデータについても、今後の改善などの動きをウォッチしていこうと思います。体重計に乗るような感覚で手軽に心の健康状態を把握できるようになったらいいなあと思っているので、引き続き考えながら手を動かしていこうと思います。今回の記事で理解の誤りなどあった場合、コメントで教えていただけますと幸いです。
## 参考

https://qiita.com/yamamoton/items/633bf830628593e24172#-python%E3%81%A7%E5%AE%9F%E8%A3%85

https://hrv.readthedocs.io/en/latest/index.html

https://zenn.dev/kn1cht/articles/apple-watch-ecg-python#r-r%E9%96%93%E9%9A%94%EF%BC%88rri%EF%BC%89

https://ishikokkashiken.com/ecg-3/

http://hclab.sakura.ne.jp/stress_novice_LFHF.html