iPhoneのHealthデータをエクスポートしてゴニョゴニョしてみる その5

この記事の続きです。

deutschina.hatenablog.com

iPhoneのHealthデータの加工の流れがあらかた出来たので、Nokia Healthから持ってきた歩数(activity)データとぶつけてみるところから。

いざ突合へ

イメージとしては、Nokia Health側のデータにiPhoneのデータをぶっ込む感じにしたいので、Nokia Health側のファイル(activity.csv)にレシピを追加していきます。最終的に追加したのはこんな感じ。

f:id:deutschina:20180523153739p:plain

最初にUnionして、合計しながらいらない列を消していくというイメージになってます。Nokia Health側の分析を省いてしまっていますが、簡単に言うと日ごとの歩数が既にファイルに用意されているので、iPhone側のファイルのように下処理はやっていません。

UnionとJoinは違う!

お恥ずかしい話、これをきちんと理解していなくて、何が起こっているのかに小一時間かかったのは、ここだけの話です。何はともあれ、2つのテーブル(正確にはcsvファイル)を1つに統合するために、Unionを使ったわけです。実際の設定内容はこんな感じ。

f:id:deutschina:20180523153734p:plain

Union Data(2)と書いてあるように、activities(.csvNokia)とexport20180520211840(.csviPhone)をガッチャンコさせています。日付の項目(Date)を共通にして、歩数が入る項目はStepsとmax_sum_valueはそれぞれ独立させて持たせています。後で出てきますが、両方の値が入っている場合は、Nokia Health側の値を優先とする関数を後で仕込むつもりです。

Unionを設定した後にレコードイメージ(画面に出ているのはあくまでサンプリングされた一部データというのは前回書いたとおり)を見てみたのですが、イメージ的には日付1レコードに対して、Stepsとmax_sum_valueの両方にそれぞれ値が入っていることを期待したのですが、実際にはどちらか片方にしか値が入っておらず、同じ日付のエントリが複数ある状態。なんで?と小一時間考え込んで達した結論としては、

・・・あ、UnionとJoinは違う

ということ。Unionはあくまで2つのテーブルをマージするのが目的。だから脳内で勝手にキーだと思っていた日付(Date)が被っても当たり前なんですよね。自分が想像していた結果を期待するなら、むしろキーを指定して同じキーであれば1つのレコードに統合するというJoinの方だったというオチでした。

そこで、この関数をJoinに差し替えることも少しだけ考えたのですが、どうせ後でAggregateするつもりだったので、そのまま行く事にしました。この時点では日付ごとにデータがサマリされているので、件数もせいぜい数千件程度になっているだろうという読みもありました。

最後の集計

ここで、ようやくNokia側とiPhone側の歩数データを1つのレコードに入れるために、Aggregateをします。

f:id:deutschina:20180523153729p:plain

Group byがDateなので、1日につき1レコードになり、同じレコード上のStepsとmax_sum_valueに、Nokia側の歩数とiPhone側の歩数が入ってきます。次のステップでは、Nokia型の歩数がない場合に限り、iPhone側のデータの歩数を採用するように、New FormulaでIF文を仕込んでいます。

f:id:deutschina:20180523153723p:plain

これで新しい項目に、最終的に自分の取り決めに沿って確定した「歩数」が入ってくるので、最後に古い項目(Steps, max_sum_value)をドロップ。

f:id:deutschina:20180523153714p:plain

これで一連の流れが完成します。

データの出力

データのフローはできたので、これに全データを読み込ませて、最終的に1つの完成された日ごとの歩数情報のファイルをcsvとして出力してみます。

f:id:deutschina:20180523161441p:plain

デフォルト設定のまま実行しちゃうのもアレなので、設定をいろいろ見ておくことに。

f:id:deutschina:20180523161436p:plain

ファイルは、BigQueryとしても出力できるのですが、今回は素直にcsvをcloudのバケットに出力しときます。

f:id:deutschina:20180523161430p:plain

詳細な設定をみると、ファイルを小さい単位に分割するかとか、CSVファイルの1行目に列名をインサートするかみたいな設定を行うことが出来ます。隠れてしまっていますが、ファイルを圧縮するための設定もあります。

f:id:deutschina:20180523161423p:plain

設定をして、ジョブを開始して、JOBSというリンクを見ると、ジョブのフローと現在どこを処理しているのかというのが見えたります。並列的に処理できるところは複数のジョブを同時に実行していたりするんですよね。

f:id:deutschina:20180523163835p:plain

できたものは。。。

ジョブが終わると、Cloudのバケットにファイルが吐き出されるので、これを開いて中身を確認してみることができます。で、早速開いてみると・・・。

f:id:deutschina:20180523165028p:plain

分かっていたけど、地味っすね。。。

とボヤきたくもなります。これが30分値とか1時間値だと、一日のうちでどの時間帯に多く歩けば、減量に効果があるかみたいなことも分かるかもしれないので、少し残念ですね。もちろん、今回はNokia Healthを優先するという取り決めをしたため、日単位で合計するしかなかったものの、秒単位でデータの揃っているiPhone側のデータを正にすることで、時間帯ごとのデータも取れそうだと言うことは付け加えておきます。

f:id:deutschina:20180523165036p:plain

最終的に出力されたデータの統計的な情報が見えたりするのもDataprepの素敵なところかなということで、無理矢理締めたいと思います。

(たぶんつづく)

Google Cloud Platform エンタープライズ設計ガイド

Google Cloud Platform エンタープライズ設計ガイド