サイクリングデータの分析 ~Strava APIを用いて~

今日のお昼から嵐山までサイクリングに行ってきました。「天気も良くて最高でした」、で終わるのは勿体無いと思ったので、Stravaで計測したデータを分析したいと思います。

Rには便利なことに、rStravaというStravaデータの分析ライブラリーが公開されているので、データの取得の部分はそのライブラリーに頼って行いました。

github.com

developers.strava.com

APIの登録は上記より簡単にできます。

準備編

app_name <- 'app_name' # アプリの名前
app_client_id  <- 'client_id' # クライアントID
app_secret <- 'secret' # シークレット

# create the authentication token
stoken <- httr::config(token = strava_oauth(app_name, app_client_id, app_secret))
stoken <- httr::config(token = readRDS('.httr-oauth')[[1]])

ユーザープロフィールデータ

myinfo <- get_athlete(stoken, id = '12825272')

get_athlete()関数で簡単に取得できます。

> str(myinfo)
List of 29
 $ id                    : int 12825272
 $ username              : NULL
 $ resource_state        : int 3
 $ firstname             : chr "Koki"
 $ lastname              : chr "Ando"
 $ city                  : NULL
 $ state                 : NULL
 $ country               : NULL
 $ sex                   : chr "M"
 $ premium               : logi FALSE
 $ summit                : logi FALSE
 $ created_at            : chr "2016-01-08T05:30:54Z"
 $ updated_at            : chr "2019-05-21T06:41:26Z"
 $ badge_type_id         : int 0
 $ profile_medium        : chr "https://graph.facebook.com/763014893801370/picture?height=256&width=256"
 $ profile               : chr "https://graph.facebook.com/763014893801370/picture?height=256&width=256"
 $ friend                : NULL
 $ follower              : NULL
 $ follower_count        : int 1
 $ friend_count          : int 2
 $ mutual_friend_count   : int 0
 $ athlete_type          : int 1
 $ date_preference       : chr "%m/%d/%Y"
 $ measurement_preference: chr "feet"
 $ clubs                 : list()
 $ ftp                   : int 0
 $ weight                : num 0
 $ bikes                 : list()
 $ shoes                 : list()

分析編

アクテビティーデータを取得

my_acts <- get_activity_list(stoken)

get_activity_list()関数で過去に計測したアクティビティーデータをリスト形式で取得できます。

> map_chr(my_acts, "name")
 [1] "嵐山サイクリング 復路"   "嵐山サイクリング 往路"   "Morning Walk"           
 [4] "Night Run"               "Night run"               "Night Ride"             
 [7] "Summer running session2" "Summer run session 1"    "琵琶湖ライド"           
[10] "大文字山ハイク"          "琵琶湖ライド"            "洛北&宝ヶ池ライド"      
[13] "Morning Run"             "Morning Run"             "Takao Autumn cycling"   
[16] "狸谷山サイクリング"      "Evening Ride"            "Lake Biwa"              
[19] "Night cycling"           "Evening Run"             "詩仙堂サイクリング"     
[22] "御所 running "           "Morning Run"   

今回のサイクリングは往路と復路で別々に計測しました。この記事ではアップダウンの激しかった往路のデータを使います。

strms_data <- get_activity_streams(my_acts, stoken, acts = 2) # 上で取得したアクティビティリストの二つ目の要素をゲットする
> str(strms_data)
Classes ‘strframe’ and 'data.frame':    1701 obs. of  9 variables:
 $ altitude       : num  74.5 73.8 73.4 73.3 73.1 73.1 73 72.9 72.8 72.7 ...
 $ distance       : num  0 0.0382 0.0512 0.0563 0.0613 0.0645 0.0677 0.0715 0.0748 0.0787 ...
 $ grade_smooth   : num  -2.1 -2.1 -2.3 -2.7 -2.4 -2.6 -2.2 -2.8 -6 -5.4 ...
 $ moving         : logi  FALSE TRUE TRUE TRUE TRUE TRUE ...
 $ time           : int  0 21 26 29 37 38 39 41 44 47 ...
 $ velocity_smooth: num  0 6.48 7.2 8.28 3.24 3.24 3.96 4.68 5.04 4.32 ...
 $ lat            : num  35 35 35 35 35 ...
 $ lng            : num  136 136 136 136 136 ...
 $ id             : num  2.41e+09 2.41e+09 2.41e+09 2.41e+09 2.41e+09 ...
 - attr(*, "unit_type")= chr "metric"
 - attr(*, "unit_vals")= Named chr  "km" "km/hr" "m" "°C"
  ..- attr(*, "names")= chr  "distance" "speed" "elevation" "temperature"

標高や走行距離、速度、位置情報など興味深いデータがたくさんあります。

可視化編

標高データ

altitude変数を用いたら良さそうです。

strms_data %>% 
  ggplot(aes(distance, altitude)) +
  geom_area(fill = "lightblue") +
  theme_classic() +
  labs(y = "Altitude (m)", x = "Distance (km)")

f:id:kokiando:20190530175527p:plain
標高データ

位置データ

位置を表すデータはlnglatの二つの変数が含まれているのでこれらを使い、地図の描画にはleafletを用いてみます。

library(leaflet)
leaflet(data = strms_data) %>%
  addTiles() %>% 
  setView(lng = mean(strms_data$lng), lat = mean(strms_data$lat), 
          # 便宜上、緯度経度の平均を地図の中心点に設定
          zoom = 13) %>% 
  addCircleMarkers(~lng, ~lat, radius = .5,
                   color = "blue", opacity = .1)

f:id:kokiando:20190530180942p:plain

まとめ

なければ自分で作ろうと思ってましたが、案の定すでにStravaのAPIのRインターフェースを作っていてコミュニティの広さを思い知りました。 最後に嵐山で訪れたとこでとった写真を載せて終わりにします。

祇王寺

前日が雨だったこともあり、苔のコンディションが完璧。

常寂光寺

嵐山でもトップに好きなスポット。苔と青紅葉が美しかった。

上からは京都を一望できる。彼方には京都タワーが。