タダです.
みなさん,元気に脳筋してますか? 僕はというとコロナウイルスの影響で思うような脳筋生活を送れていなくて悶々としておりましたが,契約しているエニタイムが営業を6/1から開始すると聞いて圧倒的大歓喜でございます.そうはいってもルールがあるため守りつつ気をつけて身体をシバイていきたいそんな想いです.
さて,緊急事態宣言の中思うようなトレーニングができていない人が多く,太っちまったよ...と嘆くそんな皆さんに捧ぐダイエット支援のための仕組みを作りました.ダイエットが楽しいのって体への変化や数値の変化だと思います.そんな楽しみを Forecast の予測する力を使って実現を考えてみたので,この記事で作ったものの簡単な紹介と今後どうカイゼンしていきたいかを整理しておきます.
作った仕組み
作ったのは前回 Forecast で体重推移を予測したモデルを使ってユーザーが1日ごとに体重を記録したらそのデータを AWS にアップロードして定期的に Forecast の予測を行うワークフローです.
フローは次のように回ります.
①ユーザーがアプリケーションで体重をスプレッドシートに記録する
②スプレッドシートのデータが S3 に CSV でエクスポートされる
③月に1度 CloudWatch Events をトリガーに Lambda が起動
④Lambda から Forecast のモデルを呼び出して体重予測
⑤Forecast の予測結果を S3 バケットに出力
仕組みの概要図
各プロセスの概要
それでは,各プロセスごとにどんな実装をしているかを簡単に紹介します.
①ユーザーがアプリケーションで体重をスプレッドシートに記録する
スプレッドシートに体重を記録するため,アプリケーションは Glide を使って作りました.Glide はスプレッドシートを使った PWA アプリケーションを開発できます.そんな Glide で簡単な体重を記録するための画面を作りました.これでユーザーは1日ごとの体重を記録できます.
スプレッドシート側にこんな感じで記録されます.
関連リンク
公式サイト www.glideapps.com
関連記事 sadayoshi-tada.hatenablog.com
②スプレッドシートのデータが S3 に CSV でエクスポートされる
スプレッドシートに記録したデータを Forecast で扱える CSV ファイルでエクスポートします.エクスポート処理部分は Google App Script と Amazon S3 API Binding for Google Apps Scrip
というライブラリを使って,指定のバケットにファイル名を指定して S3 アップロードします.これで S3 にデータを貯めるフローができました.
関連リンク
使ったライブラリ engetc.com
③月に1度 CloudWatch Events をトリガーに Lambda が起動
一ヶ月間貯め続けた体重データを予測分析にかけたいので月に1度の結果を予測する処理を回す Lambda を発火します.そのための CloudWatch Events を設定しました.日毎に予測処理を回してもいいかなと思ったもののこれは個人的な経験則ですが,目材したい体重にもよるものの3ヶ月ほどは継続してダイエット生活しないと体への変化って出て来にくいので継続して体重を記録して長ーくゆっくり取り組んでいけるものにしたいと思って月1で予測する処理を回すようにしました.月の始めに前月の進捗からどんな体重推移になっていくかを参考データとして見れたら計画もたてなおしたりもしやすいかなと思ってます.
関連リンク
CloudWatch ドキュメント docs.aws.amazon.com
④Lambda から Forecast のモデルを呼び出して体重予測
CloudWatch Events から Lambda が発火して Forecast の既に構築済みのモデルを呼び出して予測を行います.先のブログで作ったモデルを流用して分析を回せるコードを書いて結果を S3バケットに出力するようにしました.
⑤Forecast の予測結果を S3 バケットに出力
S3 バケットには後々更に分析を回せるよう Athena で扱える JSON ファイルで出力しています.次のデータが出力されたファイルの中身の一例です.
{ "Forecast": { "Predictions": { "p10": [ { "Timestamp": "2019-09-01T00:00:00", "Value": 64.94144439697266 } ], "p50": [ { "Timestamp": "2019-09-01T00:00:00", "Value": 65.59163665771484 } ], "p90": [ { "Timestamp": "2019-09-01T00:00:00", "Value": 66.24183654785156 } ] } }, ~~~中略~~~ }
今後カイゼンしたいこと
ユーザーが体重を記録して S3 バケットにアップロードし,予測処理を定期的に回すフローができたのですが,今後カイゼンしたいと思っていることを整理しておきます.
Glide を選択したが他のユーザーにも使ってもらえるようにする
現状,自分しか使ってないからいいのですが,他の人にも使ってもらえるようにするためには認証だったり,ユーザー個別のスプレッドシートを用意して記録と S3 へのエクスポートできるようにする処理ができないとなと思っています.
Forecast の予測モデルを最適化
Forecast の予測モデルには AutoML を使っています.使い始めて間もないので予測モデルの最適化もしていいモデルで予測処理を回したいです.
予測結果のデータから Athena などで更に分析
予測の結果を利用者の手元で可視化したりできてないので,どうにかしたいと思っています.先に触れてますがゆくゆく Athena にデータを食わせてデータを抽出したりなどできたらと考えてます.
まとめ
ユーザーの体重を予測するダイエット支援のアプリケーションで作った概要と今後やりたいカイゼンをまとめました.まだまだ粗いので継続的に改修していけたらと思いますが,自分が構想したものが手元で動いているとほんと嬉しいですね! もっと質を高めて興味ある方に使ってもらえるようなものにしていきたいので,その時はよければチェックしてくだサイドチェスト!(お決まり)💪