RareJob Tech Blog

レアジョブテクノロジーズのエンジニア・デザイナーによる技術ブログです

英会話レッスンの需要を予測をする

すっかり寒くなってきました。レアジョブ の 技術本部 では現時点で、週2日は出社、それ以外はリモートという環境で仕事をしておりますが、家で仕事する時にはもっぱら小型犬を膝に乗せて暖を取りながら仕事しています。レアジョブ のプラットフォームチームの塚田です。

レアジョブ では 13年運用してきたモノリシックなアーキテクチャーから、マイクロサービスアーキテクチャーへの移行プロジェクトを行いました。

現在は レアジョブ英会話の要である、レッスン機能や検索機能は新アーキテクチャーから提供しております。

マイクロサービスへの移行は一筋縄に行かず課題は多く長い期間がかかりましたが、その甲斐あって新しいスタート地点に立つことができました。

今回の移行で我々はレアジョブ社 の提供する レアジョブ英会話や SMART Method から、予約情報などを一括りにして共通機能として作り、1つのプロダクトに限定しない形で、汎用的な API を設計・開発しました。

従来より使ってきた DB にはレッスンには直接関係しない情報(たとえばキャンペーン情報とか)も入っていたために、データ分析という観点だと今まではDB 構造を把握している人のみが手を入れることができ、そうでない人からすると保守がしづらいという課題もありました。

今回のマイクロサービスへの移行を経て、 1つの DB の中にレッスンに関連する情報のみが入るようになったことで分析する上でも敷居が下がりました。

今回ご紹介する本記事は、レアジョブ で現在運用しているノウハウではありませんが、今までモノリス時代から使っていた需要予測プログラムの改修するのではなく、あくまでもマイクロサービスに移行された情報のみを使って Amazon Forecast を使った需要予測をしてみることにしました。

f:id:sumito1984:20211221012639p:plain

今回使用するデータがオンライン英会話の予約数の履歴を元にした将来の予約数(需要)を知りたいため、Forecasting domain で Retail を選択します。

f:id:sumito1984:20211221012715p:plain

レアジョブ は 30分単位でレッスンを提供しているため、data entries の interval を 30 min にします。

demand は 正数値であるため、Data schema の JSON を編集し integer に変更しました。

f:id:sumito1984:20211221012813p:plain

Timestamp format はyyyy-MM-dd HH:mm:ss を指定しました。

forecast は Timestamp format を以下の2種類から選ぶことになっています。

秒(ss) 抜きでも受け付けて欲しいところです。

f:id:sumito1984:20211221012840p:plain

import する csv ファイルを s3 に upload し、そのパスを指定します。

f:id:sumito1984:20211221012906p:plain

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時間分の予測が作成されます)

f:id:sumito1984:20211221012940p:plain

Input data configuration で 各国の 休日を指定することができます。

祝日かどうかでデータに影響を与える場合設定したほう良いです。

レアジョブ英会話は主に日本の生徒様向けにレッスンを提供しているので Japan を選択します。

f:id:sumito1984:20211221013006p:plain

しばらくすると、create a forecast を選択できるようになっています。

f:id:sumito1984:20211221013035p:plain

Forecast の名前を入力し、 Predictor を選択します。

f:id:sumito1984:20211221013108p:plain

forecast の作成までさらに時間を要します。

完成したら Query forecast を選択できるようになっています。

f:id:sumito1984:20211221013141p:plain

予測開始日、終了日を選択します。

f:id:sumito1984:20211221013222p:plain

f:id:sumito1984:20211221224708p:plain

P10, P50, P90 の説明は AWS の公式ページにある通り、超過確率になります。

P10 (0.1)-真の値は予測値の 10% より低くなることが予想されます。 P50 (0.5)-真の値は予測値の 50% より低くなることが予想されます。 これは、予測値とも呼ばれます。 P90 (0.9)-真の値は予測値の 90% より低くなることが予想されます。

予測精度の評価 - Amazon Forecast

予測データは 未来 10個分表示されています。

これは data horizon が 10 に設定したためで、data horizon の値を大きくすればその分未来の情報を予測することができます。

注意していただきたいのが data horizon の上限は 500ですので、それより先の予測はできません。

数日後確認すると、Amazon forecast で予測された数と 実際の予約数を確認すると P50 にかなり近い実測値になりました。

f:id:sumito1984:20211221225447p:plain

(お見せできない情報を省いたらとてもシンプルな絵になってしまいました。お見苦しくてすみません)

今回は Amazon forecast を通じたレッスンの予測の話しになりましたが、レアジョブ では 共通基盤であるマイクロサービスを Go で開発しております。

まだまだやりたいことがたくさんあるのですが、とても人手が足りずやりたいことがなかなか進めることができない状況です。 一緒にサービスを成長させてくれるエンジニアを募集しています。まずはカジュアルにランチからいかがでしょう。

Go言語エンジニア | アピール | 未来の教育を作る人のマガジン

それでは!