iOS 'ヘルスケア App'で振り返る2019


この記事は,ドコモアドベントカレンダー9日目の記事です。

ドコモの山本です。業務ではヘルスケア関連の研究開発に取り組んでいます。
本記事では,iPhoneのヘルスケアAppで取得したデータの活用方法に関して紹介します.

■ はじめに

□ 対象とする人

・モバイル・ウェアラブル端末を使用したヘルスケアに興味がある
・iOSのヘルスケアAppのデータを見てみたい
・この記事までたどり着いた方

□ やること

・iOS "ヘルスケア App"で収集されたログの抜き出し方法
・抜き出したログの紹介
・ヘルスケア Appのログで振り返る2019年

■ iOS ”ヘルスケア App”とは

ヘルスケア App は、歩数や歩行距離、走行距離を自動的に数えてくれます。さらに、Apple Watch を持っていれば、Apple Watch がアクティビティデータを自動的に記録してくれます。ヘルスケアのカテゴリに関して情報を入力したり、ヘルスケア App に対応した普段使う App やデバイスからデータを取り込むこともできます
参考:公式HP(https://www.apple.com/jp/ios/health/)

 要するに,いろんなヘルスケアデータを収集・集約して確認・セルフケアに利用できるAppです.iPhoneを使っている人なら,下図に示す様にヘルスケアAppアイコンをタップして,初期設定をささっと済ませれば使い始めることができます.ヘルスケアAppを起動して,例えば睡眠分析をタップすると"時計App>ベッドタイム"にて取得した睡眠時間を週・月単位で表示してくれます.”すべてのヘルスケアデータを表示”をタップすると,ヘッドフォン音量やアクティビティ,心拍数といったデータも確認できます.

※なお,アクティビティや心拍数などのデータはApple Watchにて取得しているデータです.

■ ”ヘルスケア App”で収集したデータを出力

 ヘルスケアApp画面の右上に人型のアイコンがあります.ここをタップすると,左図の様なページに遷移するので,一番下まで画面をスクロールします.すると,”すべてのヘルスケアデータを書き出す”とありますので,ここをタップします.データ量に依りますが,書き出しには少々時間(私は数分~数十分程度でした.)が必要です.書き出したzipファイルをPCに移して中身を確認すると,

  • export_cda.xml
  • export.xml

の2種類の.xmlファイルがあり,”export.xml”の中に各種ヘルスケアデータが格納されています.

■ ”ヘルスケア App”のデータを確認

 export.xmlをエディタで開くと,下記の様なデータとなっています.

type= 'hoge' が取得したデータの種類(例えば,歩数データや心拍数データ),startDate= 'hoge' が取得開始日時(UTC),endDate = ' hoge' が取得終了日時(UTC),value = 'hoge' に測定値(例えば,歩いた歩数や計測した心拍数)が格納されているようです.

<HealthData locale="ja_JP">
 <ExportDate value="2019-11-15 12:51:14 +0900"/>
 <Me HKCharacteristicTypeIdentifierDateOfBirth="***" HKCharacteristicTypeIdentifierBiologicalSex="HKBiologicalSexMale" HKCharacteristicTypeIdentifierBloodType="HKBloodTypeNotSet" HKCharacteristicTypeIdentifierFitzpatrickSkinType="HKFitzpatrickSkinTypeNotSet"/>
 <Record type="HKQuantityTypeIdentifierHeight" sourceName="ヘルスケア" sourceVersion="10.0.1" unit="cm" creationDate="2016-09-22 09:57:08 +0900" startDate="2016-09-22 09:57:08 +0900" endDate="2016-09-22 09:57:08 +0900" value="***"/>
 <Record type="HKQuantityTypeIdentifierBodyMass" sourceName="ヘルスケア" sourceVersion="10.0.1" unit="kg" creationDate="2016-09-22 09:57:08 +0900" startDate="2016-09-22 09:57:08 +0900" endDate="2016-09-22 09:57:08 +0900" value="***"/>

このままでは扱いにくいので,DataFrameを作成します.

import pandas as pd
from dateutil.parser import parse
import argparse
import datetime as dt

parser = argparse.ArgumentParser()
columns = ['type', 'unit', 'startDate', 'endDate', 'value']
parsed = objectify.parse(open('export.xml'))
root = parsed.getroot()
data = []
for r in root.Record:
    data.append({c: t for c, t in r.attrib.items() if c in columns})
health_df = pd.DataFrame(data)

### 協定世界時(UTC)➡︎日本標準時(JST)に変換
health_df.index = pd.to_datetime(health_df['startDate'], utc=True)
health_df['startDate'] = health_df.index.tz_convert('Asia/Tokyo')
health_df.index = pd.to_datetime(health_df['endDate'], utc=True)
health_df['endDate'] = health_df.index.tz_convert('Asia/Tokyo')

### 日単位で集計したいので,年月日のcolumnを作成しておきます
health_df['startDate_date'] = health_df['startDate'].dt.date
health_df['endDate_date'] = health_df['endDate'].dt.date

health_df = health_df.reset_index(drop=True)

作成したDataFrameがこちら.valueは実際に測定された値が格納されています.

typeに着目することで,自分が見たいライフログに限定できます.それぞれ何のデータかは公式(https://developer.apple.com/documentation/healthkit/data_types?language=objc)を参照ください.

■ ライフログを基に振り返る〜2019年

 ヘルスケアAppでも様々な分析結果を提示してくれますが,自分のライフログは自分で分析して確認してみましょう.本記事では歩数データと移動距離データに限定して取り扱います.

(2016年3月16日〜2019年11月15日の1339日分のデータがありました...!!!)

### 歩数 ###
df_StepCount = health_df.loc[health_df['type']=='HKQuantityTypeIdentifierStepCount',:].reset_index(drop=True)
df_StepCount = df_StepCount.sort_values(['startDate_date'])

### 歩行・走行移動距離 ###
df_DistanceWalkingRunning = health_df.loc[health_df['type']=='HKQuantityTypeIdentifierDistanceWalkingRunning',:].reset_index(drop=True)
df_DistanceWalkingRunning = df_DistanceWalkingRunning.sort_values(['startDate_date'])


### 日単位で集計 ###
df_StepCount_date = df_StepCount.loc[:,['startDate_date', 'value']].groupby(['startDate_date']).sum()
df_StepCount_date = df_StepCount_date.rename(columns={'value': 'StepCount'}) 

df_DistanceWalkingRunning_date = df_DistanceWalkingRunning.loc[:,['startDate_date', 'value']].groupby(['startDate_date']).sum()
df_DistanceWalkingRunning_date = df_DistanceWalkingRunning_date.rename(columns={'value': 'DistanceWalkingRunning'}) 

まずは可視化してみます.

【上段】左図:移動距離 (x軸:日付,y軸:km),右図:歩数(x軸:日付,y軸:歩)
【中段】左図:移動距離 (x軸:km,y軸:頻度),右図:歩数(x軸:歩,y軸:頻度)
【下段】左表:移動距離の統計量,右図:歩数の統計量

可視化して見ると意外な気づきがありますよね.

・年末年始の歩数(移動距離)が毎年少ない ➡︎ 家でダラけきった生活しているせい?2020年の正月は2年参り行ってアクティブに過ごそうかな.

・7月〜10月は歩数(移動距離)の日次変化が激しい ➡︎ 旅行したり,音楽フェス行ったりとアクティブな時期ですからね‼︎

・2019年は歩数が0に近い日が数日ある ➡︎ 疲れていれば,もちろん自宅でのんびり過ごします.むしろ昔の自分はそんなにアクティブだったんでしょうか.

・2017年→2018年→2019年と月日が経つにつれて,歩数(移動距離)が減少傾向 ➡︎これは驚き.2年前よりも1,600歩も減少している….生活環境の変化の影響でしょうか.2018年序盤に職場が都内に移ったのも影響しているのかも.後ほどもう少し掘り下げてみます.

・2019年11月15日時点での総移動移動距離 (2019年に限定) 1603kmは,本州縦断 青森〜下関 1521kmフットレースとほぼ同程度の距離です.この大会の歴代1位記録は2017年の18日5時間38分ですので,私が10ヶ月かけて歩いた道のりは3週間あれば走り切れてしまう鉄人がいる,ということですね…

・4年間の総移動距離7081kmは,アメリカ大陸を横断(サンフランシスコ〜ロサンゼルス〜ラスベガス〜マイアミ〜ニューヨーク〜ボストン,総移動距離約7533km)できる距離です.卒業旅行でアメリカ横断を考えている学生さん,ご参考にどうぞ笑 ちなみに太平洋を横断すると,東京〜サンフランシスコの距離が約8800kmですので,私の移動距離ではアメリカまで未だ到達できていません.

歩数(移動距離)が年々減っていることが驚きだったので,もう少し深掘りしてみます.曜日単位で各年の歩数[歩/日]をプロットした結果が下記の通りです.
【左上:2016年,右上:2017年,左下:2018年,右下:2019年】

2017年〜2019年にかけて,特に土・日曜日の歩数の減少が確認できます.

【上段】左図:土曜日の歩数,右図:日曜日の歩数
【下段】左表:土曜日の歩数比較(p-value),右表:日曜日の歩数比較(p-value)

 歩数減少の大きな要因は土日の過ごし方のようです.仕事をしていると,平日はある程度規則的な生活となり,時が経過してもあまり大きな変化は見られないようです.一方で,土日の様に自由に1日過ごすことができる日は,全く外出しないといった極端な生活をすることも可能です.(個人的にはずっと家にいることはむしろストレスなので,土日は外出する派です.)こういう自由に過ごせる日こそ,ヘルスケアの観点からは自分の生活を見直すことが重要なのかもしれませんね.

こうしてライフログを可視化して客観的に見ると,以前はできていたのに今はできていないことがわかります.健康管理におけるセルフケアって,まずは自分の現状を客観的に見つめ直して,どうして歩数が毎年減ったんだろうとか,昔の土日の過ごし方ってどんな感じだったんだろうとか,自分の生活を振り返ることが大事だと思います.少しだけ自分の健康状態に意識を向けることによって,"今日は駅から遠回りして歩いて帰ろうかな",とか,"寝る前にストレッチしてリラックスしようかな"と,ふと思うことにつながり,それが行動変容を起こすことに繋がるのだろうと思います.

■ まとめ

 多様なヘルスケアアプリがGoogle StoreやApp Storeで提供され,個々が簡単にライフログを記録しセルフケアに役立てることができる世の中になっています.ぜひ,ただライフログを記録するたけでなく,自分の健康状態に目を向ける第一歩として自分のライフログを分析してみてはいかがでしょうか.予想外な発見があるかもしれませんよ.

最後までお付き合頂きありがとうございました.
2020年も健康的な1年になりますように.