実装前にPMとデータを見ながらランキングアルゴリズムを決定する

こんにちは、クラスター株式会社でサーバーサイドをメインに開発している id:shiba_yu36 です。

僕は今年の2月にclusterというサービスでウィークリーランキングの機能を担当しました。clusterではユーザーが自由にゲームやアート作品などの3Dコンテンツを作りアップロードでき、そのコンテンツを複数人ですぐ遊べます。その中から人気のコンテンツを探しやすくするため、週間ランキングを開発しました。

この機能開発時に、実装をする前にPMとデータを見て試行錯誤しながら、ウィークリーランキングの目的を満たすシンプルなアルゴリズムを決めるという工夫をしました。このやり方によって、最小限の実装工数で目的を満たすランキングアルゴリズム実装を行えました。

そこで今回は実装前にどのような流れでアルゴリズムを決定していったかを書いていきたいと思います。同じような機能開発を行っていてPMとどう連携するか悩んでいる人の参考になれば幸いです。

ランキングなどのアルゴリズムを考える時の課題感

ランキングやレコメンドなどのアルゴリズムを考える系の機能開発を行う時、よくある失敗は机上の空論のままPMとエンジニアで最高のアルゴリズムを考えようとしてしまうことです。このような失敗を踏むと、実装に非常に多くの時間がかかる一方で、いざリリースしてみると想定と違うものになってしまったということがよく起こります。

このような課題感を持っていたため、今回は以下の流れで初期リリースのアルゴリズムを決定していきました。

  • PMと一緒に現在のclusterにおけるウィークリーランキングのありたい姿を明確にする
  • 実装前に本番データを使って、いろんなアルゴリズムで具体的にどのようなランキングになりそうかを可視化する
  • PMと一緒にいくつかのアルゴリズムを比較して、ありたい姿と実装コストのバランスを見ながら、初期リリースのアルゴリズムを決定する

PMと一緒にランキングのありたい姿を明確にする

まず現在のclusterにとってのウィークリーランキングの目的とありたい姿を明確にします。 ここがずれると不要な機能を作ってしまうため、PMとしっかり連携して認識を合わせます。

現在のclusterにとってウィークリーランキングは次のような目的で使われるだろうと話しました。

  • 新規ユーザーが、まず最初に見て遊ぶコンテンツを探す場所
  • 既存ユーザーが、定期的に眺め人気な新コンテンツを探す場所
  • 3Dコンテンツクリエイターにとって、自分の作品が掲載され、より遊ばれるようになる場所

これらの目的から、ありたい姿を決定しました。

  • 新規ユーザーにとっても楽しみやすい人気のコンテンツがランキング上位に載る
  • 新コンテンツもランキングの上位に入れるような新鮮さがある

本番データを使って実装前に具体的なランキングの可視化をする

続いて本番データを使って実装前に具体的なランキングを可視化していきます。

まず新規ユーザーにとっても楽しみやすい人気コンテンツが載っているかについては、単純に「ある日付のウィークリーランキング」を出せれば判断できそうです。そこでSQLを書いてRedashで可視化します。画像のようにdateで日付を指定できるようにし、その日付でのランキング上位100件を見れるようにしました。

次に新鮮さです。こちらはRedashでデータを出した上でGoogleスプレッドシートにcsvインポートし、「3Dコンテンツの公開日」と「ランキング掲載日時」を比較することで、新鮮さの可視化を行いました。

上記のスプレッドシートは、公開日がちょっと昔のコンテンツは黄色、公開日がかなり昔のコンテンツは赤色に塗るようにしています。色付けをすることで新鮮さがパッと判断できますね。

実現方法としては、条件付き書式を使ってA1のランキング掲載日時とE列の公開日を比較し、自動的に色を塗るようにしています。例えば公開からランキング掲載日まで90日以上経っているコンテンツに赤色を塗りたいなら、次のようなカスタム数式を使うと良いでしょう。

=AND(E1<>"", DATEDIF(E1, A$1, "D") > 90)

以上で人気コンテンツが掲載できているか、新鮮になっているかを判断するためのデータを実装前に出せました。今回はSQLで表現できるアルゴリズムで可視化しましたが、もう少し複雑にしたいなら何らかのコードを書いてデータを出せば同じようなことができるでしょう。

PMと複数のアルゴリズムを比較し、初期リリースのアルゴリズムを決定する

可視化手法は整えたので、続いてPMと一緒に複数のアルゴリズムを比較検討し、初期リリースでのアルゴリズムを決定します。

今回は1つのアルゴリズムごとに複数の日付で可視化しました。ランキングのアルゴリズムについてはfladdictさんのランキング設計はどうあるべきか? その2 が非常に参考になりました。また日付については1週間ずつずらして4日ほどピックアップしました。

ここまでで比較検討するデータは全て出せたので、PMと一緒に眺め、ありたい姿とのマッチ度と実装工数のバランスを見ながら初期リリースのアルゴリズムを決定しました。

まとめ

今回はclusterにウィークリーランキングを実装する時のアルゴリズム決定の工夫について書きました。机上の空論で会話しないように本実装に入る前に本番データを使って具体的に可視化することで、PMと一緒にありたい姿と開発工数のバランスを見ながら初期リリースできることを示しました。

さらにリリース後に実際にランキングがどのような表示だったかを振り返ったところ、事前想定と近い結果となったため、今回述べた事前検証の方法が上手く行ったと感じています。

ただし、このようなアルゴリズム系の機能開発では初期リリースしたらそこで終わりではありません。ユーザーフィードバック、データ分析、サービスの成長などを考慮して、どんどん改善を加える必要があります。clusterではこれまでのランキング情報は全てデータとして残しているため、この情報を用いて改善を進めていきたいと考えています。