わたしはサイクルコンピュータとしてiPhoneのアプリCyclemeterを使っていることは以前に書きました。アプリ内でもグラフや数値で統計情報がみられるのですが、生データがあればもう少しいろんなことがわかるかもしれないということで考えてみました。今回の大まかな見取り図はこんな感じです。
- 終了時にEメール共有で送られてくるメールデータを利用
- Gmailから特定のラベルのついたものをダウンロード
- rubyスクリプトでタブ区切りテキストに加工する
- Rで解析
おいおい、kmlにアクセスしてもっと詳しいデータで解析できればもっといいでしょう。のちのち。
メールデータを読む
Cyclemeterには走行データをメールで共有する機能があります。項目は少ないのですが、受信したメールから直接数値を取れるので比較的簡単なのではないかと考えました。
Gmailの特定のラベルをダウンロードする方法はこちらを参考にさせていただきました。ダウンロードしたデータはmbox形式になります。
タブ区切りテキストに加工
データを解析しやすいようにタブ区切りテキストに加工したいと思います。mbox形式のテキストをrubyスクリプトでタブ区切りのデータにします。
Cyclemeterから送られてくるメールはロードバイクの時だけではありません。クロスバイクやランニングの時も同様の書式で送られてきてしまいます。こうしたラベル種別やデータ期間などをGmail側で細かくフィルタを作成してもいいのですが、スクリプト上の変数で変更できれば使い勝手がいいんじゃないでしょうか。
#!/usr/bin/env ruby # coding: utf-8 require "time" =begin cyclemeterのメールログからデータのtsvを書き出す データはGmailのmbox形式を想定 Gmailの特定のラベルをダウンロードする方法(参照:http://p--q.blogspot.jp/2014/05/gmail1pc.html) ●以下変更して楽しむ項目 →日時によるフィルタ設定 →完了日時のラベル名を適宜変更 →ヘッダや出力項目を好みに合わせて変更 2015-08-31 ひとまず =end #日時によるフィルタ設定 start_time = Time.parse("2014-09-12 00:00:00 +0900")#開始日時 end_time = Time.now#終了日時 #完了日時のラベル名 my_label = "自転車完了" #ヘッダの出力 print "Date\tBikeTime\tDistance\tAverage\tCal\tkml\n" while line = ARGF.gets if line =~ /^From \d.+@.+\d$/ then my_data = Hash.new #メールの先頭でデータ初期化 #ハッシュの生成 elsif line =~ /^([^\n:]+): ?(.+)/ then my_data[$1] = $2.gsub(/\t+/,'') end #メールの最後にあるcyclemeterのURLに出会ったら出力 if line =~ /^http:\/\/www\.cyclemeter\.com$/ then if my_data.key?(my_label) then tmp_time = Time.parse(my_data[my_label]) if (start_time .. end_time).cover?(tmp_time) then print "#{my_data[my_label]}\t" print "#{my_data["バイクタイム"]}\t" print "#{my_data["距離"].gsub(/[^\d\.]+/,'')}\t" print "#{my_data["平均"].gsub(/[^\d\.]+/,'')}\t" print "#{my_data["カロリー"].gsub(/[^\d\.]+/,'')}\t" print "#{my_data["インポートリンク"]}" print "\n" end end end end
ちなみに、このスクリプトはmbox形式を汎用的に読めるわけではありません。メール本文の最後にある「http://www.cyclemeter.com」という行を目印にしています。mboxを読むライブラリを導入してもよかったのですが、ちょっとコストが高すぎるので。
こんな感じのタブ区切りテキストになりました。
Rでデータ解析
実はデータ解析などと大げさなものじゃありません。ここからはExcelを使ってもいいのですが、Excelを持っていないのです。ここでは統計のデータ解析に使われるR言語を使ってデータの集計などをしてみたいと思います。ちなみに、Rでタブ区切りファイルを読むのはこんな感じです。
> data = read.delim("my.tsv", sep="\t", header=TRUE)
距離の合計は8936.43kmでした。距離に関して平均値求めて箱ひげ図を書いてみました。そんなにハードに走ってるわけじゃないことが分かっちゃいますね。とほほ。
> sum(data[,"Distance"]) [1] 8936.43 > summary(data[,"Distance"]) Min. 1st Qu. Median Mean 3rd Qu. Max. 21.36 33.98 35.10 62.93 87.01 218.70 > boxplot(data[,"Distance"])
データはほぼ時系列に並んでいるので、そのまま平均速度を散布図に落とし込んでみました。
> plot(data[,"Date"], data[,"Average"])
ん〜、まあ、わずかに右肩上がりと言えなくもないって感じでしょうか… 右肩下がりでないだけで及第点です!
関連記事: