DMMグループの一番深くておもしろいトコロ。
テクノロジー

購買済み商品の並び替えによる検索結果のパーソナライズ

DMMグループの一番深くておもしろいトコロ。

はじめに

 

こんにちは、データサイエンスグループ検索Growthチームの植田です。

DMMでは60以上のサービスを提供しており、デジタル・アナログともに多様なコンテンツを扱っています。

私たち検索Growthチームでは横断的に各事業に対して「並び順」「検索UI」の改善など検索にまつわる施策の提案・実装・効果検証を一貫して行っています。

本記事では、これまでに行った並び順の改善やパーソナライズ施策の一例として、デジタルコンテンツを扱う買い切り形式(pay per view形式)のサービスでの検索結果で「購入済み」となる商品の扱いに関する施策を紹介します。

背景・課題

検索結果の中に「購入済み」の商品が含まれることが望ましいかどうかは、扱うサイトのコンテンツの性質やUIによって異なります。

消耗品・日用品などを扱うサービスであれば再購買が見込めるため、過去に買ったものを表示することは有意義です。

一方で買い切り形式のサービスでは基本的に再購買はないため、購買済みの商品が検索結果に表示されてしまうと「まだ見ぬ商品との接点を減らしている」という観点では機会損失の要因となります。

一般には検索の並び順で上位のものほど、ユーザーの目に留まりやすく、クリックされやすいことが知られています。このため並び順で上位にミスマッチしたものが表示されてしまうと機会損失になり得ます。

現在、私たちは「おすすめ順」などで検索結果のパーソナライズを行っており、ユーザーニーズに合う商品が見つかりやすくなるような並びを作っています(構成は後述の図を参照)。しかし、並びのパーソナライズに関してはA/Bテストによって売上貢献が確認されたものの、モデルの学習には購買を含めた行動ログを用いているため、経験的に「購入済み」の商品も並び順の上位に出やすいという課題がありました。
購買・カート追加・クリックといったユーザー行動に対して、購買に近い行動に大きな関連度スコアを紐づけてnDCGを求め、並びの評価を行うシチュエーションでも、仕様上買われない商品が並び順の上位にあることは望ましくありません。
このような経緯から買い切り形式のサービスでは、購入済みの商品を除外もしくは、比較的クリックされにくいページ内の末尾に並び替えるといった後処理を追加することでさらなる並びの改善に繋がると考えました。

施策

購買済み商品の扱いの方針

サービスによっては、施策の適用状況は異なりますが、おすすめ順などのパーソナライズ対象となるリクエストはSearchプロキシAPI内部で、以下の流れで処理されます。

  1. ranking:日次バッチで推定したユーザー属性を取得し、SolrのFunction Queryを活用する形で検索クエリを書き換えてからsearch-api(検索エンジン)へ投げ、パーソナライズされた順序付けを行う
  2. Re-ranking:機械学習アプローチを活用して得られた、user、 query、 itemのembeddingをもとにuser-itemやquery-itemの関連度に基づき、検索エンジンからのレスポンスを並び替え
  3. Post-Process:購入済みの商品をページ内の末尾に表示されるように並び替え(今回の内容)

SearchプロキシAPIに関してはML基盤チームの記事でより詳しく紹介されています。

購入済み商品の除外ではなく、検索結果のページ内の末尾に並び替える方針を採用している理由としては、必要な工数の多さや処理の複雑さが関係しています。

購入済み商品を暗黙に除外すると、ヒットするはずの商品がヒットしないままユーザーの混乱や不信感を生む可能性があります。

この問題を避けるには、絞り込みのオプションとして「購入済みを除外」のようなボタンをUI上に追加することが考えられますが、これはフロント側での追加開発が必要となります。

また除外処理の実装時に、検索クエリに購入済み商品を除外する条件を組み込む方法を選んでしまうと、ユーザーの数だけ検索クエリの種類が増大し、キャッシュがうまく機能せず、レスポンスタイムの悪化に繋がります。

そのため、検索エンジンからのレスポンスをバックエンドで取り扱い、購買ログを参照して商品の購入済み判定・除外処理を行う必要があります。ただし、除外処理によって検索結果が削られてしまうため、極端な場合は2ページ目以降に商品があるのに1ページ目の検索結果が0件になることも起こりえます。

表示件数の不足を避けるには「検索エンジンに対して過剰な件数を要求した上で除外処理を行い、必要な件数だけ返す」というアプローチで実現できそうですが、2ページ目以降への遷移も考えると処理の複雑さが増すことになります。

 

上記を考慮した結果、最初の取り組みとしては「購入済みアイテムを検索結果の末尾に移動する」という方針を採用しました。バックエンドで処理が完結する形をとり、A/Bテスト実施のサイクルを早めて施策のフィードバックを得ること、設計の簡潔さと複数事業への横展開のしやすさを優先しました。

 

施策の結果

この施策については、メインのKPIとして購買単価(ARPU)を設定、サブのKPIとして商品のクリック数を設定し、デジタルコンテンツを扱う複数の買い切り形式のサービスでそれぞれ独立してA/Bテストを実施しました。

A/Bテストの考え方に関しては弊チーム過去の記事で詳細に触れています。

 

A/Bテストの結果、異なるサービスでも共通してクリック数の低下、ARPUの増加が見られました。ARPUの有意差が確認できたサービスもありました。

クリック数が減ったことは一見ネガティブな反応にも見えますが、ほかにも購入済み商品のクリック数の減少も確認できたことから、未購買の商品へのアクセスが容易になり、回遊の質が上がったことでARPU増加につながったと考えています。
使いやすさやビジネス面の両方で利点が見られるため、さらなる改善に向けてページ内の表示数を維持したまま購入済み商品を除去する方針も検討しています。

おわりに

今回はパーソナライズ施策の一例として、買い切り形式のサービスで購買済み商品をページ内末尾に並び替える施策について紹介しました。MLを用いないシンプルなアプローチですが、説明も容易で汎用性がある点に良さを感じています。

DMMではさまざまな事業がある分、サービスが異なればビジネスモデルや取り扱っている商品も違うため、単純な施策の横展開だけでなくサービス特性に合わせた施策を考える必要もある点が面白いポイントだと私は思います。

今回紹介した購買済み商品の取り扱いだけで見てもまだ改善の途中ですし、今回は簡単な紹介に留めましたがRe-rankingモデルの改善のほか、検索のファセットUI改善 などにも日々チームで取り組んでおり、まだまだ改善できるポイントはあります。

DMM Groupでは一緒に働いてくれる仲間を募集しています。ご興味のある方はぜひ募集ページをご確認ください!!

 

一緒に働く仲間を募集しています!