今日のお昼から嵐山までサイクリングに行ってきました。「天気も良くて最高でした」、で終わるのは勿体無いと思ったので、Stravaで計測したデータを分析したいと思います。
Rには便利なことに、rStravaというStravaデータの分析ライブラリーが公開されているので、データの取得の部分はそのライブラリーに頼って行いました。
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)")
位置データ
位置を表すデータはlng
とlat
の二つの変数が含まれているのでこれらを使い、地図の描画には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)
まとめ
なければ自分で作ろうと思ってましたが、案の定すでにStravaのAPIのRインターフェースを作っていてコミュニティの広さを思い知りました。 最後に嵐山で訪れたとこでとった写真を載せて終わりにします。
祇王寺
前日が雨だったこともあり、苔のコンディションが完璧。
常寂光寺
嵐山でもトップに好きなスポット。苔と青紅葉が美しかった。
上からは京都を一望できる。彼方には京都タワーが。