見出し画像

Fitbitの心拍数データを取得し、pandasを使ってGoogle Colaboratoryで可視化して遊んでみた

こんにちは、OgaKuzu(Mikenerian)です。

画像はA○○le Watchっぽいですが、Fitbitの記事です。

ここではFitbitとは何かであったり、どのように活用すると便利なのかといった話題については扱いません。
データ分析に興味があり、Fitbitのデータを個人的に取得してカスタマイズし、色々データ分析してみたいという方向けの記事です。ざっくり以下のようなことができるようになります。

  • Google ColaboratoryでFitbitの様々なデータを取得

  • 心拍の時系列データを可視化

そこまで大変ではないので、少しでも興味がある方の参考になれば幸いです。

背景

私は腕時計を身に着ける感覚でFitbitを使っているのですが、心拍数、睡眠時間、運動の記録など様々なデータを記録できることがスマートウォッチの魅力だと思います。

個人的には寝ているときまで着用することには抵抗感があり、睡眠データについては取得していません。

蓄積されたデータはウォッチで確認できるだけでなく、常にBluetoothで同期しているためスマホやPC上でも確認できます。

引用:Fitbit アプリとダッシュボード


これだけで大変魅力的なサービスです。しかし!データ分析に少しでも心得があれば、自分なりにデータを解釈して活用したいと思うのが性。というわけで、私がどのように分析を行ったか紹介したいと思います。

事前準備

Fitbit Developmentの登録

この辺りは以下の記事が大変参考になりました。

まずはFitbitのAppを登録する必要があります。
実際にAppを作るわけではないですが、APIトークンの生成に必要となります。

以下のページでManage -> Register an Appで新規作成ができます。

流れに沿ってアプリを登録すると、OAuth 2.0 Client IDとClient Secretが取得できます。その後トークンを発行し、テキストファイルで保存すれば準備完了です。

Fitbitの公式ドキュメントは以下です。


Google Colaboratoryの準備

Colaboratoryは、ブラウザ上でPythonを記述、実行できるサービスでほとんどの機能が無料で使用できます。

Google Colaboratoryを新規作成するには、ブラウザで個人のGoogle Driveにアクセスし「+新規 -> その他 -> Google Colaboratory」を選択します。

または以下のチュートリアルページにアクセスし、新規ノートブックを作成します。

立ち上がると以下のような画面になります。コード用のセルに記述された内容が実行されます。

ちなみに、猫を出現させるには「設定 -> その他」から、「猫モード」にチェックを入れます。


実装したコード

Python用のFitbit APIライブラリを使用します。

  • 公式ドキュメント

  • GitHub


Colaboratory上でライブラリを使用できるようにするため、まずはコードセルに以下を記述します。

!pip install fitbit

# インストールできていることを確認
!pip show fitbit

無事にインストールできたら以下のコードで基本的な準備は完了です。
CLIENT_ID, CLIENT_SECRET, TOKEN_FILEには、Fitbit Developmentで生成した値を入力してください。
Google Driveにfitbit tokenを保存する場合は、ドライブのマウントも忘れずに行いましょう。

import fitbit
from ast import literal_eval
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import matplotlib
plt.style.use('ggplot')

# fitbit APIに必要な情報の定義
CLIENT_ID = "Your Client ID"
CLIENT_SECRET = "Your Secret Key"
TOKEN_FILE = "Your Token File Path. Example: '/content/drive/MyDrive/fitbit_token.txt'"

tokens = open(TOKEN_FILE).read()
# 文字列を辞書型に変換
token_dict = literal_eval(tokens)
access_token = token_dict['access_token']
refresh_token = token_dict['refresh_token']

def updateToken(token):
    f = open(TOKEN_FILE, 'w')
    f.write(str(token))
    f.close()
    return

client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET,
                       access_token = access_token, refresh_token = refresh_token, refresh_cb = updateToken)


データはJSON形式で返ってきます。取得できるデータは様々ですが、私は睡眠データを蓄積していないので、安静状態の心拍数をとりあえず1年分取得してみることにしました。
効率のいいコードとは言い難いので、もっとPythonのデキる方添削お願いします・・・

yearly_heart_df = pd.DataFrame({'restingHeartRate': []})
dates = []
year = 2021
# 1~12のリスト
months = [i+1 for i in range(12)]
# datesには"2021-01-01"のような日付のフォーマットを格納する
for month in months:
  dates.append(str(year) + '-' + str(month).zfill(2) + '-01')

for date in dates:
  # resource='activities/heart'を指定するのが肝。ここを変えると他にも色々なデータを取得可能
  heart_data = client.time_series(resource='activities/heart', base_date=date, period='1m')
  target_list = []
  date_list = []
  for data in heart_data['activities-heart']:
    # 時々'restingHeartRate'が存在しない日があるので、その場合はスキップし、存在する場合のみ実行
    if 'restingHeartRate' in data['value'].keys():
      target_list.append(data['value']['restingHeartRate'])
      date_list.append(data['dateTime'])
    else:
      pass
  heart_df = pd.DataFrame({'restingHeartRate': target_list}, index=date_list)
  yearly_heart_df = pd.concat([yearly_heart_df, heart_df])

こんな感じで取得できます。

プロットすると以下のようになりました。

ここからは他のデータと結びつけたり、月ごとの傾向を調べたりと自由に検討ができそうです。

結果がまとまり次第、別途記事を書きたいと思います。

最後までご覧いただき、ありがとうございました。

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