💓

Fitbitの脈拍データからCVRRとLF/HFを可視化してみた

4 min read

概要

TechDoctorではウェアラブルデバイスから取れるデータを元に個人の体調を可視化することに取り組んでいます。
近年発売されているApple WatchやFitbitの様なデバイスは脈拍を計測し、それを分析することで時間毎のストレス状態を可視化することができます。
こちらの記事にも詳しくまとめてあります。

https://note.com/techdoctor/n/ndd43cb02d82f

私たちが取り組んでいることは簡単に言うと、分析されたストレス状態や睡眠状況を客観的なデータとして可視化することで体調管理を促すサービスです。
以前、日本経済新聞さんにも取り上げてもらいました。https://www.nikkei.com/article/DGXZQOUC0735O0X00C21A5000000/
その過程を少し公開します。

本記事で使用しているデータは全てTechDoctor社員のものです。

分析手法

私たちの取り組む脈拍分析は大きくFrequency Domain(周波数領域)とTime Domain(時間領域)に分けられ、LFHFがFrequency Domain、CVRRがTime Domainに当たります。
LFHF分析ベースとなるのは*パワースペクトル分析です。

これを適応する対象が心電図のRRI(R-R Interval)と呼ばれる数値になります。。心電図とは以下の様な波の連続から成り立っているのですが、その連続する波の中にあるR波同士の間隔がRRIに当たります。

今回求めるLHHFとはLF成分(0.05Hz~0.15Hz)とHF値(0.15Hz~0.40Hz)の比率を表したもので、高いほど緊張状態であることを示しています。
一方CVRRとはRRIの標準偏差を平均で割ったもので、交感神経の興奮度合によってその値が小さくなるものです。

Fitbitからの情報取得

今回はFitbitを例に挙げて具体的な過程を記します。
弊社はFitbitさんとの契約で、一般的に得られる情報よりも広い範囲の情報をAPI経由で得ることが可能になっています。その中でも主要な情報が以下のデータカラムになります。

API 詳細
active_heart_intraday.dataset.time 脈拍数測定時刻
active_heart_intraday.dataset.value 脈拍数
sleep.efficiency 睡眠効率
sleep.endTime 起床時間
sleep.levels.data.dataTime 睡眠日時
sleep.levels.data.level 睡眠段階判定(覚醒, 深い睡眠, 浅い睡眠, REM睡眠)
sleep.levels.data.seconds それぞれの段階時間
activities_steps.dataTime 日にち
activities_steps.value 1日の合計歩数
activities_steps_intraday.dataset.time 分刻み時刻
activities_steps_intraday.dataset.value 歩数毎分
activities_calories_intraday.dataset.level 活動レベルから予想される消費カロリー
activities_calories_intraday.dataset.mets 運動強度毎分
activities_calories_intraday.dataset.time 分刻み時刻
ctivities_calories_intraday.dataset.value 消費カロリー毎分

LFHF, CVRRの分析と出力

そこでこれらの情報をPyhrvというライブラリを用いてパワースペクトル分析にかけます

https://github.com/PGomes92/pyhrv/tree/master/pyhrv
こちらは弊社のデータサイエンティストの方が書かれたコードになります。
  • サンプルデータ(heartrate_df)
    timestamp heartrate
    2021-06-04 00:00:10+00:00 60
    2021-06-04 00:00:20+00:00 59
    2021-06-04 00:00:35+00:00 60
    2021-06-04 00:00:40+00:00 60
    2021-06-04 00:00:45+00:00 61
import pyhrv
import pyhrv.frequency_domain as fd
import pyhrv.time_domain as td

# 心拍数 -> rri(ミリsec)への変換
heartrate_df = heartrate_df.assign(
    mrri=lambda df: 60 / df['heartrate'] * 1000
)

# LF/HF
lfhf_res = heartrate_df.assign(
        timestamp=lambda df: pd.to_datetime(df['timestamp'])
    ).set_index('timestamp')['mrri'].resample('15min').apply(
        lambda x: fd.ar_psd(nni=x, mode='dev')[0]['ar_ratio']
    )

# CVRR
cvrr_res = heartrate_df.assign(
        timestamp=lambda df: pd.to_datetime(df['timestamp'])
    ).set_index('timestamp')['mrri'].resample('15min').apply(
        lambda x: td.sdnn(x)['sdnn'] / x.mean() * 100
    )

結果

この結果に歩数と平均値、標準偏差を加えて加工したものが以下の図になります。

CVRR

LFHF

双方とも医療用機器と合わせてその値の正確さの検証に取り組んでおり、CVRRにはある程度の実用性が認められおります。LFHFは現在検証中であり、現状では論文等で示されている様な値との若干のずれが確認されています。

最近の取り組み

この様な心拍変動分析や他APIから得られる情報を応用してTechDoctorでは組織内での相対的な生活習慣を可視化する為にストレスや睡眠を数値化して5種類の匿名ランキング形式で公開しています。この取り組みが始まって数ヶ月ですが、自分の生活を客観視出来ることで個人にとっての適度な生活習慣や環境を探す手がかりになる為非常に助かっています。

この内容については別の機会にちゃんとまとめておきます。

最後に

今回初めて書かせてもらうZennでTechDoctorの取り組みの根幹となる心拍変動分析と、そこから派生する生活習慣の可視化についてまとめてみました。これらを元に日々社内で検証に取り組み、昨今問題となっている社会のストレスやそれによる気分障害問題の解決を目指しています。

こちらにも詳しくまとめてあるので是非ご覧ください。

https://note.com/techdoctor/n/n33fbe61d04fa

読んでいただきありがとうございました。
弊社ではウェアラブルデバイスのデータを活用した研究のデータ取得から解析までのサポートをしております。ご興味ある方は是非お気軽にご連絡下さい。
TechDoctor株式会社:

https://www.technology-doctor.com/

*)パワースペクトル分析とは、なみを複数の波に分解して、それぞれの波の強さで表される関数です。あらゆる周期関数は正弦波の足し合わせで表現できるという特性を利用し、時間の周期関数を振幅と周期の角周波数に分解するフーリエ変換の基準となる周波数に依存しないように、単位周波数幅(1Hz幅)あたりのパワー値として表現するスペクトル関数で、不規則信号(ラムダ信号)の評価によく使われます。単位は[msec^2/Hz]です

Discussion

ログインするとコメントできます