データ分析エンジニアのMAXです。
最近あまり表に出ていなかったので、今日は色々面白いことに取り組んでいる一例を紹介したいと思います。
テーマは、クックテック(cook tech)です。
包丁に加速度センサーを取り付けて、料理の上手な人・苦手な人の分類問題を解きます。
これを多くのお客様に提供できれば、忙しいママさんの料理時間を可視化したり、購買傾向と料理スキルを紐付けたり、料理スキルに基づいたレコメンドをしたり夢が広がりますね。
食を定量化し、未来の食卓を作る。そんな考えに共感できる方はぜひ気軽に会社に遊びに来てください。
ちなみに今回は、リクルート出身のスーパーデータサイエンティストである藤枝さんがとても良い仕事をしてくれました。取り組み中は、「すでに論文がある!!」とか、「やはり、燕三条に包丁を見に行かねば。。。」とか、楽しかったです。
準備
まずは、加速度センターから取れるデータをどのような特徴量に変換するか検討します。 タイムスタンプ、x軸,y軸,z軸の加速度、状態ビット(moveやstopなど)が使えそうです。
類似度を比較するにはどうしたら良いでしょう。
とりあえず、「玉ねぎのみじん切り」など、ある食材に対する1つの動作を1タスクとします。
そうすると、タスクごとに複数のレコードが取得できますね。
複数のレコードのまま類似度を比較するのは面倒そうなので、情報を圧縮します。
タイムスタンプの差分、xyz軸の加速度値の最大・最小・平均・分散あたりを取ってみます。
足りなそうなら四分位点、歪度、尖度なども良いかもしれないですね。
ここら辺は、絶対にもっと良い比較方法があると思うので、知見がある人に突っ込んでもらえることを期待します。
プログラム
こんな感じです。
moves = [] times = [] accels = [] corrects = [] b_time = datetime.now() cnt = 0 while 1: data = s.readline() data = data[1:] parsed = ss.unpack(binascii.unhexlify(data.rstrip())) # 時刻取得 n_time = datetime.now() # COOKING_END_THRESHOLD(料理終了判定時間)で終了した場合break if n_time - b_time > timedelta(seconds=COOKING_END_THRESHOLD): print(n_time - b_time) print('END COOKING') break # 動きを取得 if (parsed[11]==0): print("stop\n") move = 0 elif (parsed[11]!=0): print("move\n") move = 1 # 加速度と補正値を取得 x_accel = parsed[13] y_accel = parsed[14] z_accel = parsed[15] correct = parsed[17] # データ追加 moves.append([move]) times.append([n_time]) accels.append([x_accel, y_accel, z_accel]) corrects.append([correct]) b_time = n_time cnt+=1 s.close()
なんか設計と全然違っているけど、、、まあ今回は実験なので良しとしましょう。
やってみる
キッチンへGo!
うおお!
うおおお!
なんか取れた!!
最後に
今回はデータを取得するところまでできました。次回、「燃え上がれフーリエ変換!元プロ料理人 vs エンジニア」お楽しみに!