【fitbit】スマートウォッチを使って自分の運動記録を解析してみよう

# はじめに
こんにちは。この記事は、[AMBL株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ambl-rd)  1日目の記事です。


この記事では、スマートウォッチ (fitbit)より取得できる運動記録をファイルで出力し、それを活用することにより、自分の運動記録を解析することを目指します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378704/6e5f1dcb-ba98-6796-9c49-fc57fa47b9fd.png" width="50%">


<a id="anchor1"></a>
# 1. 背景

+ 登山をやっており、そのときのログを使ってPythonで解析したい
+ fitbitには運動記録をTCXファイルで出力できる機能がある
+ Rには、TCXファイルをデータフレームに変換してくれるライブラリが存在しているが、Pythonにはなさそう
    (集計して統計量などを出力してくれるものなどはいくつかありそう：[python-tcxparser](https://github.com/vkurup/python-tcxparser#python-tcxparser))

Rの場合以下のようにtrackRを使えば簡単にデータフレーム形式に変換でき、解析を行いやすくなります。

```php:R サンプルコード
library("trackeR")
file_path <- "xxx.tcx"
data <- readContainer(file_path, timezone = "japan")
DF <- as.data.frame(data)
```
https://cran.r-project.org/web/packages/trackeR/vignettes/TourDetrackeR.html

<a id="anchor2"></a>
# 2. PythonでTCXファイルを変換

　そもそも、TCXファイルとは、Garminが運動記録をデータとして管理するために使用しているXMLファイルになります。
　ただし、いくつか追加情報が付与されており、Pythonの`xml`を使うだけではエラーを吐いてしまいます。
　そこで、以下の`tcx2df.py`を用いることで、一度、tcxファイルをxml形式に変換し、それを読み込むことでデータフレームとして利用できるようにしました。
```php:Python サンプルコード
import tcx2df
path_tcx_file = 'xxx.tcx'
#tcxファイルに対する前処理と読み込み
xml_data = tcx2df.tcx_file_convert(path_tcx_file)
df = tcx2df.xml2df(xml_data)
df = tcx2df.pp_data(df)
```
https://github.com/senya-koku/fitbit_demo

<a id="anchor3"></a>
# 3. データ概要
ランニングや歩行の場合、以下のデータが1秒ごとに記録されます。
+ 時刻
+ 緯度
+ 経度
+ 高度
+ 距離
+ 心拍数

```php:raw data
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2">
    <Activities>
        <Activity Sport="Other">
            <Id>xxxx</Id>
            <Lap StartTime="xxxx">
                <TotalTimeSeconds>8391.0</TotalTimeSeconds>
                <DistanceMeters>11953.780000000002</DistanceMeters>
                <Calories>1101</Calories>
                <Intensity>Active</Intensity>
                <TriggerMethod>Manual</TriggerMethod>
                <Track>
                    <Trackpoint>
                        <Time>xxxx</Time>
                        <Position>
                            <LatitudeDegrees>34.80131995677948</LatitudeDegrees>
                            <LongitudeDegrees>135.69762325286865</LongitudeDegrees>
                        </Position>
                        <AltitudeMeters>49.74079962750949</AltitudeMeters>
                        <DistanceMeters>0.0</DistanceMeters>
                        <HeartRateBpm>
                            <Value>104</Value>
                        </HeartRateBpm>
                    </Trackpoint>
```
また、距離や高度から、・歩く速度の推定値や、・勾配の推定値を算出することも可能です。

<a id="anchor4"></a>
# 4. 解析

## 4.1 マッピング
　緯度、経度があるので、自分が歩いた道のりを描画することができます。
```php:描画コード
import folium
# 地図オブジェクトを作成
m = folium.Map(location=[df["Latitude"].min(), df["Longitude"].min()], zoom_start=13)
df_lat_lon = df[['Latitude', 'Longitude']]
locs = df_lat_lon.values
folium.PolyLine(locs,color='red').add_to(m)
m
```
[全体]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378704/42cd8f57-5d8a-67fb-8944-f73b53a8c446.png)
[スタート周辺拡大]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378704/59169224-3640-e088-d431-60fda37b320f.png)
　スタート周辺の拡大図を見ると、免除川あたりで道を間違え引き返していたり、登山道から一時的に車道に出ていることがわかります。


## 4.2 分析
ここからはいくつかのデータを可視化してみようと思います。

#### 相関
まず、今回有用そうである4つの特徴量(経過時間,心拍数,歩く速度,勾配)の相関を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378704/d5dd2013-89d3-1baf-b0f3-8c71e1edb573.png)


　　これを見ると、心拍数と勾配が正の相関が最も強く、登山で一番しんどいのは登りであるという感覚とも一致します。
　一方、負の相関は経過時間と心拍数で最も強くなっていますが、こちらも登山の前半は登りが多く、後半は下りが多くなるため同様のことを示しています。

#### 標高と心拍数
次に相関の高かった、心拍数と標高の関係を時系列に描画します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378704/2445106a-47e4-3e9a-03ea-462d3be2f2a1.png)
　これを見ると、右側のy軸から、標高350m程の山を登っており、x軸から、山頂までは1時間程度で登っていることがわかります。また、心拍数が最も高くなっているのは、山頂の手前あたりで160bpm程度まで上がっており、その後、山頂で休息をしている間に90bpm程度まで低下していることがわかります。
　このように登りにおいては心拍数を見ることで疲労度あいや負荷を確認することができそうです。

　　一方で下りは心肺機能の疲労についてはほとんど心配がいらないことが5,000秒以降の心拍数の推移から確認できます。こちらについては何度も段差を降りていく動作により、心肺機能というより足への負担が大きくなるので、別の指標が必要になります。

<a id="anchor5"></a>
# 5. 今後
　以上のように、後から自分自身の登山を分析することにより、振り返りを行うことができます。
また、fitbitAPIを使うことでリアルタイムのデータを取得できる方法や、睡眠などのデータも取得できるようです。
追加で調査を行いつつ、スマートウォッチを独自に利用してより快適な登山のためのツール作成やQOLの向上に努めようと思います。