見出し画像

コロナワクチン接種後の体温変化を iPhone のヘルスケアアプリで記録して R で可視化してみた

先日コロナワクチン5回目を接種してきました。

自分は2回目以降から毎回、副反応の経過を辿るため以下のような感じで接種後の体温変化を iPhone のヘルスケアアプリで記録しています。

ヘルスケアアプリで記録した体温

しかし、アプリ上では一度に表示できる範囲を自由に設定することができず、接種から数日間の変動をまとめてみることができません。
そのほかにも、何時に接種したかやいつ解熱剤を飲んだかといった情報も合わせて見たいと思っていたので、今回 iPhone からデータを取り出して R を使って可視化してみることにしました。

どうやってヘルスケアアプリからデータを取り出すか?

「ヘルスケア」は、iPhone や iPad にデフォルトで入っている健康状態記録用のアプリです。

このアプリに Apple Watch や他の健康系アプリなどを連携することで、体温・心拍数といったバイタル情報や歩数・歩行速度といった運動情報をはじめとしたさまざまな健康にまつわる情報を記録することができます(なお、今回自分は手入力で体温を記録しました)。

そして、これらの情報は以下のようにして一括で XML ファイルにしてエクスポートすることができます。

1. Topの概要画面右上のアイコンをタップする。
2. 「すべてのヘルスケアデータを書き出す」をタップする。

どうやって体温のデータを R に読み込むか?

上記のようにしてエクスポートした XML ファイルを PC のローカルドライブ等適当な場所に保存し R で読み込みます。
エクスポートされたファイルは export_cda.xml と export.xml の2種類ありますが、使うのは export.xml の方です。

export.xml には「ヘルスケア」に記録してきた全データが含まれており、これを開いてみると以下のように Record 単位でずらっと情報が並んでいます。

export.xml の中身(一部)

したがって、この中から体温データ (type="HKQuantityTypeIdentifierBodyTemperature") だけを取り出したうえで、分析・可視化しやすいように日時 (startDate) と記録値 (value) を data frame にまとめる必要があります。
以下がそのためのコードです:

library(xml2)
library(XML)

health_data <- read_xml("data/export.xml")
parsed_health_data <- xmlParse(health_data)
temperature_nodeset <- getNodeSet(parsed_health_data, "//Record[@type='HKQuantityTypeIdentifierBodyTemperature']")

start_date <- sapply(temperature_nodeset, function(x) xmlGetAttr(x, "startDate"))
value <- sapply(temperature_nodeset, function(x) xmlGetAttr(x, "value"))

df_temperature <- data.frame(time=ymd_hms(start_date), temperature=as.numeric(value))

コード作成にあたり以下のサイトを参考にしました:

可視化

ここまでできればあとは dplyr や ggplot を用いて加工・グラフ作成するだけです。

体温変化と解熱剤

先ほどの体温データには過去接種時の記録も含まれているので、今回接種分だけ抜き出しました。
それに加えて、熱が上がったタイミングで解熱剤を何度か飲んだので、アノテーション用に服用時刻とその時の体温も取り出しています。

library(tidyverse)

# 5回目接種時のデータだけ抜き出す
df_temperature_5th <- df_temperature %>%
  filter(time>="2024-01-01")

# 解熱剤を服用したタイミングとその時の体温を抜き出す
df_antipyretic <- df_temperature_5th %>%
  filter(time %in% c(
    ymd_hms("2024-01-31 11:10:00"),
    ymd_hms("2024-01-31 17:08:00"),
    ymd_hms("2024-02-01 01:12:00"),
    ymd_hms("2024-02-01 07:04:00"),
    ymd_hms("2024-02-01 14:03:00")
  ))

これらを用いて ggplot で時系列グラフを描きます。解熱剤の服用は矢印でアノテーションします。

ggplot(data=df_temperature_5th) +
 geom_line(aes(x=time, y=temperature)) +
  geom_vline(xintercept = ymd_hms("2024-01-31 13:49:00 +0900"), color="red", linetype="dashed") +
  scale_x_datetime(timezone = "Asia/Tokyo")+
  annotate("segment", x=df_antipyretic$time, xend=df_antipyretic$time, y=df_antipyretic$temperature+0.5,yend=df_antipyretic$temperature, arrow=arrow(angle=20),color="red")+
  annotate(geom="text", x=df_antipyretic$time, y=df_antipyretic$temperature+0.6, label="解熱剤", color="red", family="HiraKakuProN-W3")+
  labs(x="日時", y="体温(℃)")+
  theme_gray(base_family = "HiraKakuProN-W3") 

その結果がこちら。

ワクチン接種後の体温変化。赤の点線が接種時刻。

1回目の服用を除くと、解熱剤を飲むと1~2時間後には熱が下がり始めていることがわかります。
1回目については、服用が早すぎて効果がなかった可能性もありますが、一方でもし服用していなかったらもっと早く38℃に達していたかもしれません。
同様に4回目の服用(2/1 16:00頃)では前2回の服用と比べてあまり下がっていませんが、服用していなかった場合はもしかしたら39℃近くまで達していたかもしれません。
この辺りのことを確かめるには、解熱剤を飲みたくなってもわざと服用せずに様子を見てみるとよいかもしれません(しんどいので絶対やりたくない)。

過去接種との比較

せっかく過去の接種時のデータもあるので、各回について接種からの経過時間に応じた体温変化を比較してみました(コードは割愛します)。

過去4回分のワクチン接種後経過時間ごとの体温

ワクチンのメーカーは4回目のみファイザー、それ以外はモデルナだったので、線の種類で描き分けました。
ファイザー(破線)ではモデルナ(実践)より早く熱が下がっているのがよくわかりますね。

次にモデルナ同士で比較して見ます。
それぞれ接種時刻や解熱剤服用タイミングが異なるので単純には比較できないものの、回を経るごとに副反応が酷くなっているように読み取れます。
例えば、5回目(紫)ではそれ以前と比べて早いタイミングで38℃に達しているほか、48時間後〜60時間後についても37℃を上回っている時間が長くなっています。

感想

気まぐれで記録していた体温のデータをRの練習のつもりで可視化して遊んでみたのですが、思いのほか面白い結果が得られました。
とりあえず、流石に今回以上に副反応が酷くなるのは考えものなので、次またワクチンを打つ場合は大人しくファイザーかその他メーカーのワクチンを選ぼうと思います。

注意

本記事で記述した内容は、メーカーごとのワクチンの優劣を主張するものではありません。
ワクチンの副反応には個人差があります。
本記事に掲載した結果はあくまでも筆者個人におけるものであり、一般化できるものではありません。

この記事が気に入ったらサポートをしてみませんか?