すっかり寒くなってきました。レアジョブ の 技術本部 では現時点で、週2日は出社、それ以外はリモートという環境で仕事をしておりますが、家で仕事する時にはもっぱら小型犬を膝に乗せて暖を取りながら仕事しています。レアジョブ のプラットフォームチームの塚田です。
レアジョブ では 13年運用してきたモノリシックなアーキテクチャーから、マイクロサービスアーキテクチャーへの移行プロジェクトを行いました。
現在は レアジョブ英会話の要である、レッスン機能や検索機能は新アーキテクチャーから提供しております。
マイクロサービスへの移行は一筋縄に行かず課題は多く長い期間がかかりましたが、その甲斐あって新しいスタート地点に立つことができました。
今回の移行で我々はレアジョブ社 の提供する レアジョブ英会話や SMART Method から、予約情報などを一括りにして共通機能として作り、1つのプロダクトに限定しない形で、汎用的な API を設計・開発しました。
従来より使ってきた DB にはレッスンには直接関係しない情報(たとえばキャンペーン情報とか)も入っていたために、データ分析という観点だと今まではDB 構造を把握している人のみが手を入れることができ、そうでない人からすると保守がしづらいという課題もありました。
今回のマイクロサービスへの移行を経て、 1つの DB の中にレッスンに関連する情報のみが入るようになったことで分析する上でも敷居が下がりました。
今回ご紹介する本記事は、レアジョブ で現在運用しているノウハウではありませんが、今までモノリス時代から使っていた需要予測プログラムの改修するのではなく、あくまでもマイクロサービスに移行された情報のみを使って Amazon Forecast を使った需要予測をしてみることにしました。
今回使用するデータがオンライン英会話の予約数の履歴を元にした将来の予約数(需要)を知りたいため、Forecasting domain で Retail を選択します。
レアジョブ は 30分単位でレッスンを提供しているため、data entries の interval を 30 min にします。
demand は 正数値であるため、Data schema の JSON を編集し integer に変更しました。
Timestamp format はyyyy-MM-dd HH:mm:ss を指定しました。
forecast は Timestamp format を以下の2種類から選ぶことになっています。
秒(ss) 抜きでも受け付けて欲しいところです。
import する csv ファイルを s3 に upload し、そのパスを指定します。
csv ファイルの中身は以下の通りです
ちなみにbook_slot の値は実際サービスで提供している数ではありません。あくまでも本ブログのための仮の数値です。
今回は教師データとして過去3ヶ月分のデータをCSVで入れました。
product,timeslice,book_slot rarejob,2021-09-10 10:00:00,9180 rarejob,2021-09-10 10:30:00,8500 rarejob,2021-09-10 11:00:00,9143 rarejob,2021-09-10 11:30:00,7920 rarejob,2021-09-10 12:00:00,8104 rarejob,2021-09-10 12:30:00,6273 rarejob,2021-09-10 13:00:00,9246
Create in progress の状態は数時間ほどかかります。
Predictor の作成
Forecast horizon は 未来に渡りいくつ予測値を出すかを指定します。今回は10としました。(30分のレッスンが 10個分という意味になるので、5時間分の予測が作成されます)
Input data configuration で 各国の 休日を指定することができます。
祝日かどうかでデータに影響を与える場合設定したほう良いです。
レアジョブ英会話は主に日本の生徒様向けにレッスンを提供しているので Japan を選択します。
しばらくすると、create a forecast を選択できるようになっています。
Forecast の名前を入力し、 Predictor を選択します。
forecast の作成までさらに時間を要します。
完成したら Query forecast を選択できるようになっています。
予測開始日、終了日を選択します。
P10, P50, P90 の説明は AWS の公式ページにある通り、超過確率になります。
P10 (0.1)-真の値は予測値の 10% より低くなることが予想されます。 P50 (0.5)-真の値は予測値の 50% より低くなることが予想されます。 これは、予測値とも呼ばれます。 P90 (0.9)-真の値は予測値の 90% より低くなることが予想されます。
予測データは 未来 10個分表示されています。
これは data horizon が 10 に設定したためで、data horizon の値を大きくすればその分未来の情報を予測することができます。
注意していただきたいのが data horizon の上限は 500ですので、それより先の予測はできません。
数日後確認すると、Amazon forecast で予測された数と 実際の予約数を確認すると P50 にかなり近い実測値になりました。
(お見せできない情報を省いたらとてもシンプルな絵になってしまいました。お見苦しくてすみません)
今回は Amazon forecast を通じたレッスンの予測の話しになりましたが、レアジョブ では 共通基盤であるマイクロサービスを Go で開発しております。
まだまだやりたいことがたくさんあるのですが、とても人手が足りずやりたいことがなかなか進めることができない状況です。 一緒にサービスを成長させてくれるエンジニアを募集しています。まずはカジュアルにランチからいかがでしょう。
Go言語エンジニア | アピール | 未来の教育を作る人のマガジン
それでは!