あと20回しかない

Cyclemeterのデータを読む

 わたしはサイクルコンピュータとしてiPhoneのアプリCyclemeterを使っていることは以前に書きました。アプリ内でもグラフや数値で統計情報がみられるのですが、生データがあればもう少しいろんなことがわかるかもしれないということで考えてみました。今回の大まかな見取り図はこんな感じです。

  • 終了時にEメール共有で送られてくるメールデータを利用
  • Gmailから特定のラベルのついたものをダウンロード
  • rubyスクリプトでタブ区切りテキストに加工する
  • Rで解析

 おいおい、kmlにアクセスしてもっと詳しいデータで解析できればもっといいでしょう。のちのち。

メールデータを読む

 Cyclemeterには走行データをメールで共有する機能があります。項目は少ないのですが、受信したメールから直接数値を取れるので比較的簡単なのではないかと考えました。

f:id:seuzo:20150830170031p:plain

 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を読むライブラリを導入してもよかったのですが、ちょっとコストが高すぎるので。

 こんな感じのタブ区切りテキストになりました。

f:id:seuzo:20150830174415p:plain

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"])

f:id:seuzo:20150831175328p:plain

 データはほぼ時系列に並んでいるので、そのまま平均速度を散布図に落とし込んでみました。

> plot(data[,"Date"], data[,"Average"])

f:id:seuzo:20150831182135p:plain

 ん〜、まあ、わずかに右肩上がりと言えなくもないって感じでしょうか… 右肩下がりでないだけで及第点です!


関連記事:

ato20.hatenablog.jp