
【身近なデータ分析】Apple Watchの心拍数データをR言語で分析してみた~前編~
「身近なデータ分析」シリーズ。このシリーズは、データサイエンスに関心を持ちプログラミング言語をある程度学習した方が、実際にデータを分析してみようと思った際の参考例となることを目指したものです。実務経験のない方にもわかりやすいよう、比較的とっつきやすくまた簡単にアクセスできるデータを使用して、データの読み込み→加工→結果→考察というデータ分析の一連のフローを説明していきます。
今回はわたくしT.K.が、自身が所有するApple WatchのヘルスケアデータをR言語で分析する例をご紹介します。
この前編では、データの取得から読み込み・簡単なデータの可視化までを説明します。
発表者について
●学生時代
・心理学系の専攻(文系)
・行動実験データの分析では主にR言語を使用
●入社後
・小売やメディアなどマーケティング系の分析案件を中心に担当
・使用言語はPython・Rなど
著者とApple Watch
近年はスマートウオッチ市場が急速に拡大してきており、私の身の回りでも着用している方が徐々に増えてきているように感じます。私は2020年1月ごろにApple Watchを購入し、約3年間使用してきました。Apple Watchでは、心拍数や歩数、睡眠時間などのデータを取得することができます。
就寝中はApple Watchを充電するために取り外しているという方もいますが、私は睡眠時間のデータを取得するため、充電は就寝前に行い寝ている間もずっと身に着けています。(Apple Watch の振動アラーム機能が優秀で、周囲に大きな音を出すことなく起きられるというメリットもあります......)。
今回は、そんな私が購入以降蓄積してきたApple Watch のデータを題材に、ある仮説の検証をおこなってみたいと思います。
仮説を立てる
私は寝るのがあまり得意ではなく、理由の有無に関わらずなかなか寝つけないということがよくあります。そして、睡眠時間が短くなった次の日は疲れやすくなり、胸のドキドキもいつもより強く感じてしまいます。しかし、それは心拍数の増加という形で数値に現れているのでしょうか?
そこで今回は、 「睡眠時間が短い日の翌日は心拍数が高い傾向にある」=「睡眠時間と翌日の心拍数には負の相関関係がある」という仮説を立て、これをApple Watchのデータを使って検証してみたいと思います。
ちなみにこの検証は、日頃から睡眠時間がある程度ばらついている人でなければ、有用な結果を出すことができないと考えられます。毎日規則正しい生活を送れている場合、「睡眠時間が長い日」「睡眠時間が短い日」のデータがそもそも存在しない、あるいは少なくなってしまうからです。
iPhoneからデータを取り出す(エクスポート)
ここからは、Apple Watchのデータを実際に取り出し、分析の俎上(そじょう)にのせる流れについて説明していきます。以下に私の画面上での案内を掲載しますが、ブラウザ検索で「Apple Watch データ取得」などのキーワードで検索すると参考になる記事が出てくるため、それらも合わせてご活用ください。
Apple WatchとペアリングしているiPhoneで「ヘルスケア」アプリを開き、右上のアイコンをタップします。※スクリーンショットは2023/08/21に撮影したものですが、2024年8月時点でも同様の操作ができることを確認しています(iOS 17.5.1)。

すると画面下部に「すべてのヘルスケアデータを書き出す」があるため、これをタップしデータを書き出します。(2023年1月現在は、特定の種類のデータだけを選択して書き出すことはできないようです。)

データの書き出しが終わると、「書き出したデータ.zip」というzipファイルができあがり、メインのデータは「export.xml」という名称のxmlファイルに含まれています。
xmlファイルは普段あまり見かけない種類のファイルだと思いますが、htmlなどと同様で、タグを付与して、文章の構造やタイトル・文字の修飾情報などを記述するファイル形式となっています。xmlファイルは、直接Excelのアプリケーションから読み込むことで、あるいは外部ツールを用いることで、csvファイルに変換することも可能のようですが、今回はxmlファイルをそのまま読み込む方針で進めます。
分析環境にデータを読み込む(インポート)
今回はR言語でxmlファイルを読み込んでいきますが、データが非常に大きい場合は読み込みのパフォーマンスが著しく低下するなどの問題を発生させてしまいます。私の場合もデータが大きくこの問題に突き当たったため、今回は「export.xml」をテキストエディタで事前に編集し、使用するデータ項目の部分だけを切り取る・いくつかのファイルに分割する、などの処理を施しました。
export.xml のデータのメイン部分は下記のような形で構成されています。

このtype=にあたる部分が、データの種類を表現している部分です。今回は分析に使用する、
・HKQuantityTypeIdentifierHeartRate(心拍数)
・HKCategoryTypeIdentifierSleepAnalysis(睡眠時間)
・HKQuantityIdentifierAppleExerciseTime(エクササイズ時間)
の3種類のデータを抽出しました。すべての項目については、リンク先のページをご参照ください。
※分析は、2023年1月時点の構成に基づいて実施したもので、現在とはデータの構成が異なっている可能性があります。
Rでxmlファイルを読み込むために、Hadley Wickham氏が提供するパッケージ”xml2”を使用しました。具体的には、ノードの探索をおこなうxml_find_all() や、ノードの属性と属性値をベクトルの形で取得することができるxml_attrs() などの関数を使用しています。詳しくは公式のDocumentをご参照ください。
# 睡眠時間データの例(事前にエディタで睡眠時間データの部分のみを抽出している)
sleep_data <- xml2::read_xml(paste0(“<folderpath>”, “<filename>.xml”)) %>%
xml2::xml_find_all(“//Record") %>%
## “//” を使用すると階層の位置にかかわらず直接アクセスすることができる
xml2::xml_attrs() %>%
dplyr::bind_rows()
心拍数のデータを見てみる
データを扱う際、読み込みなどの処理を行ったあとは、まず初めにデータの中身をざっと見て、データが正しく読みこめているか・想定外の異常が起こっていないかを確認することが重要です。これは実務においても大切なことです。今回は読みこんだ心拍数のデータを散布図にプロットしてみます。

Rでは標準パッケージのplot()ではなくggplot2パッケージを用いることで、上の図のような見た目も鮮やかなグラフを描画することができます(散布図はgeom_point())。概ね以下のような想定通りのデータとなっており、問題なさそうです(※本来散布図では、横軸として1日24時間分を設定していますが、この紙面上ではプライバシーの都合上、20時~22時のみを切り出して表示しています)。
睡眠時の心拍数は低く、起床時に急激に上昇する傾向がみられた
通勤の時間帯である7時~8時には身体を動かすため、高い値のデータ点が多くなっていた
12時ごろや19時ごろなどの食後に心拍数が上昇し、その後緩やかな下降に転じる傾向がみられた
就寝前の時間帯は、充電をおこなっているためデータ点自体が少なかった
この前編では、データの取得から読み込み・簡単なデータの可視化までを説明しました。いかがだったでしょうか。
後編では、特徴的なデータの加工に関する手順、そして分析結果を記事にしていきます。
(書き手:T.K.)
少しでもお役に立てましたら「スキ♡」を押していただけると励みになります!
▼コーポレートサイトはこちら
▼リクルートサイトはこちら