ZOZOTOWNにおけるユーザーの性年代に応じた検索サジェストの実現

ZOZOTOWNにおけるユーザーの性年代に応じた検索サジェストの実現

はじめに

こんにちは、データサイエンス部の広渡です。データサイエンス部では、取り組みの一環として検索クエリのサジェスト(以下、サジェスト)の改善に力を入れています。

ここでサジェストは一般的に「Query Auto Completion」と呼ばれる、検索窓にキーワードが入力された際に続きを補完したキーワードを提示する機能を指します。

弊チームではサジェスト改善の取り組みとして、パーソナライズ化を進めています。本記事では、パーソナライズ化の一環として、ユーザーの性年代に適したサジェスト(以下、性年代別サジェスト)を実現した事例について紹介します。

参考として、近年のサジェスト改善事例に関する記事もご覧ください。

techblog.zozo.com

目次

背景・課題

ZOZOTOWNでは、ユーザーログを活用してサジェストを実現しています。なお、本記事ではサジェストに候補として表示された検索クエリをサジェストクエリと呼ぶことにします。

ユーザーログはサジェストクエリの作成と並び順に活用されています。並び順は、過去の検索クエリのクリック数やクリック後の商品の購入数などをベースにしたスコアを算出し、そのスコアに基づいて決定されています。ユーザーログを活用した詳しい改善事例は以下の記事を参照してください。

techblog.zozo.com

以前のサジェストでは、ユーザーログを一括りにしてサジェストクエリを作成しており、どのユーザーにもZOZOTOWNのメインユーザーである20〜30代女性向けのサジェストクエリが多く表示されていました。

サジェストクエリ作成時にユーザーの性別や年代を考慮していないため、例えば、男性ユーザーがキーワードを入力中に「Tシャツワンピース」など女性向けと考えられるサジェストクエリも表示されることになります。以下は実際のサジェストクエリの例です。

old_suggest

そこで、ユーザーログを性別や年代ごとに活用することで、ユーザーの性年代に適したサジェストクエリを提供する性年代別サジェストに取り組みました。

性年代別サジェストとは

性年代別サジェストとは、ユーザーの性別と年代の組み合わせごとにサジェストクエリを作成し、ユーザーの性年代ごとにそれぞれ異なるサジェストクエリを表示するものです。

性別と年代の組み合わせは以下のようなイメージです。

  • 性別:男性、女性
  • 年代:10代、20代、...

男性x10代、男性x20代のような性別と年代の組み合わせごとにサジェストを作成します。それを用いて以下の図に示すようにユーザーの性年代に応じたサジェストクエリを表示します。

architecture

性年代別サジェストの実現方法

ここでは、性年代別サジェストを実現した方法について紹介します。

方針

まず、性年代別サジェストを実現するために、2つの方針を考えました。

  1. 性年代別でサジェストクエリとなるキーワードごと変える。
    • ユーザーログを性年代別にフィルタリングし、サジェストクエリとなるキーワードを作成する。
    • 例えば、20代男性ユーザーが「Tシャツ レディース」を検索したログがなければ、他の性年代のユーザーが検索していたとしてもサジェストクエリとならない。
  2. サジェストクエリとなるキーワードは同じだが性年代別でスコアを変える。
    • 全てのユーザーログでまとめてサジェストクエリとなるキーワードを作成した上で、その性年代が検索したキーワードでないサジェストクエリは削除せず、表示順が下位になるようにスコアを小さくする。
    • 例えば、20代男性ユーザーが「Tシャツ レディース」を検索したログがなくても、他の性年代のユーザーが検索していたらサジェストクエリとなる。

各方針のイメージです。20代男性が検索窓に「Tシャツ」を入力した場合を想定しています。

plan

今回は方針2の「サジェストクエリとなるキーワードは同じだが性年代別でスコアを変える」方針に定めました。

前者は、その性年代でクリックされにくいサジェストクエリを取り除けるかもしれませんが、サジェストクエリの数は少なくなる懸念があります。後者は、前者のデメリットをカバーし、改善前のサジェストクエリの数に保つことができるというメリットがあると考えました。

スコア算出のロジックは既存のものを使用し、性年代ごとのクリック数やクリック後の商品の購入数をもとにそれぞれのスコアを算出しました。これは、性別や年代ごとのクリック数や購入数をスコア算出に活用することで、性年代に適したサジェストクエリが表示されているかどうかを、効果の測定を通じて判断するためです。

Elasticsearchでの実現方法

ZOZOTOWNでは、ユーザーが入力したキーワードからサジェストクエリを抽出する検索エンジンとしてElasticsearchを採用しています。サジェストクエリとしたい文字列をインデクシングし、その文字列に対して前方一致させることで実現しています。

ここではElasticsearchを用いた性年代別サジェストの実現方法について紹介します。

まず、ElasticsearchでMappingと言われるドキュメント設定は以下のようにしました。この設定はインデクシング時に活用されます。

{
  "mappings": {
    "dynamic": "false",
    "properties": {
      "suggest": {
        "type": "keyword"
      },
      ...
      "score": {
        "properties": {
          "mens_gene_20_29": {
            "type": "float",
            "index": false
          },
          ...
          "mens_all": {
            "type": "float",
            "index": false
          },
          ...
          "all_gene_20_29": {
            "type": "float",
            "index": false
          },
          ...
          "all": {
            "type": "float",
            "index": false
          }
        }
      }
    }
  }
}

主なポイントはサジェストの並び順を決定するための「score」フィールドにサブフィールドを追加し、性別と年代に応じたスコアを持たせた点です。

性別と年代に応じたスコアの詳細は以下の通りです。

  • 性年代別でのスコア(上記mens_gene_20_29に該当)
  • 性別でのスコア(上記mens_allに該当)
  • 年代別でのスコア(上記all_gene_20_29に該当)
  • 全体でのスコア(上記allに該当)

性年代別だけでなく、性別、年代別、全体でのスコアを持たせた理由は2つあります。1つ目はユーザーの性別と年代の両方の情報が取得できなかった場合に対応させるためで、2つ目はサジェストクエリのソートに活用するためです(後述)。

次に、Elasticsearchへのリクエストクエリは以下のようにしました。ここでは、検索窓にキーワードが入力された際に、サジェストクエリ候補に前方一致させフィルタリングしソートします。この例では、男性20代ユーザーが「Tシャツ」を入力した場合を想定しています。なお、下記のクエリは実際のクエリを簡略化しています。

{
  "query": {
      "prefix": {
        "suggest": "Tシャツ" 
      }
  },
  "sort": [
    {
      "score.mens_gene_20_29": {
        "order": "DESC"
      },
      "score.mens_all": {
        "order": "DESC"
      },
      "score.all_gene_20_29": {
        "order": "DESC"
      },
      "score.all": {
        "order": "DESC"
      },
    }
  ],
  "size": 10
}

ここで工夫した点は、多段ソートをするようにした点です。上記の例では、20代男性 → 男性 → 20代 → 全ての順にソートしています。

以下はこの時の動作イメージです。

sort_explain1 sort_explain2

複数のサジェストクエリ候補間でユーザーの性年代でのスコアが等しい場合は、ユーザーの性でのスコアの高い方が上位になります。ユーザーの性年代と性でのスコアも等しい場合は、ユーザーの年代でのスコアの高い方が上位になります。こうすることで、なるべくユーザーに好まれやすいサジェストクエリが表示されるようにしました。

スコア算出に用いる性年代別のログは、性年代ごとにデータをフィルタリングするため、全体のログと比べてデータが少なくなるという欠点があります。多段ソートによって、性年代だけでなく、複数のフィルタリング条件を組み合わせたソートが可能になります。これにより、性年代でのスコアではクリックされやすさを十分に反映できなかったサジェストクエリに対しても、より多くのログから算出されたスコアを基に並び替えることができ、この欠点を補うことが可能です。

結果

ここでは定性的な結果とABテストの結果について紹介します。

定性評価

以下が改善前後でのサジェストの比較です。20代男性が検索窓に「Tシャツ」を入力した場合を想定しています。左側が改善前で右側が改善後のサジェストを示しています。

compare_improved_old_suggest

改善前は「Tシャツ レディース」などの女性向きのサジェストクエリが表示されていましたが、改善後では「Tシャツ メンズ」などの男性向きのサジェストクエリがより上位に表示されていることがわかります。

性別や年代を入れ替えて様々な条件でチーム内定性評価をしたところ、既存のサジェストよりも良い評価が得られました。

A/Bテスト

性年代別サジェストを評価するためにZOZOTOWNのユーザーに対して2週間A/Bテストを行いました。

以下が結果のサマリです。計測した指標は他にもありますが抜粋しています。

指標 結果
1ユーザー当たりの受注金額 100.20%
サジェストクリック率 100.21%

GMV相当の1ユーザー当たりの受注金額は有意差なしとなりましたが、サジェスト機能指標であるサジェストクリック率は有意差あり勝ちとなりました。

まとめ

本記事では、性年代別のサジェストを実現した事例を紹介しました。性年代別のサジェストを実現することで、サジェストを改善できました。

今後の展望として、性年代別でスコア算出ロジックを変更すること、さらにはユーザー一人ひとりにパーソナライズ化したサジェストを実現することを考えています。

おわりに

ZOZOでは検索エンジニア・MLエンジニアのメンバーを募集しています。ご興味のある方は、以下のリンクからぜひご応募ください。

corp.zozo.com

カテゴリー