商品画像の背景がCTRに与える影響分析 ── Gemini APIで実現した自動分類と統計検証

商品画像の背景がCTRに与える影響分析 —— Gemini APIで実現した自動分類と統計検証

はじめに

こんにちは、データサイエンス部商品データサイエンスブロックで内定者アルバイト中のしゅがーです。我々のチームでは、AIやデータサイエンスを活用したプロダクト開発のため、研究開発に取り組んでいます。本記事では、Geminiを用いて商品画像を分類する方法と背景がCTRへ与える影響を分析した結果をご紹介します。

目次

背景・課題

ECサイトにおける商品画像の背景はサイトごとや売り手によって異なります。一般的に電子機器などの機能性が重視される商品では商品のディテールが鮮明にわかる白背景が主流です。対して、ZOZOTOWNで扱うようなファッション・コスメ領域では白背景だけでなく、木や階段などのオブジェクトを背景に含むような画像も利用されます。そこで、私たちは「商品画像の背景が、ユーザの購買意欲に影響を与えているのではないか」という仮説を立てました。この仮説を検証する一環として、白背景の画像と背景を持つ画像(例:白以外の色が入った背景や木・人物といった要素を含むもの)でCTRの比較分析をしました。このような分析を積み重ねることで、どのような背景がCTRを高めるのか明らかにすることを目指しています。

次セクションから具体的に分析の手順を説明しますが、前提として今回の分析で扱う商品はZOZOCOSMEのフレグランスカテゴリに該当するものだけに限定しています。

分析手法

分析の流れとしては以下のステップを踏みました。

  1. データセット作成(Geminiによる背景ラベル付与)
  2. 背景以外の要素がCTRに差を生まないことを検証
  3. 背景がCTRに差が生むことを検証

次に、それぞれのステップについて詳細を述べていきます。

データセット作成(Geminiによる背景ラベル付与)

分析のはじめに商品画像を白背景と背景ありのグループに分類し、データセットを作成する必要がありました。従来、このような画像分類タスクは、大量の教師データを用意して専用のモデルを学習させるか、地道な手作業に頼るのが一般的でした。しかし、本記事で紹介するアプローチの興味深い点は、マルチモーダルLLM(Gemini)を活用することで、この工程を劇的に効率化している点です。近年のマルチモーダルLLMは、画像内の背景を人間に近い精度で認識し、自然言語で与えられた柔軟な定義に基づいて高精度で分類する能力を持っています。

今回はGemini APIを用いてフレグランスカテゴリーの商品を以下のグループに分類しました。画像はイメージのため、実際に分析に利用したサンプルとは異なるものです。

2つのグループの比較

プロンプトの工夫と試行錯誤

精度の高い分類を実現するため、プロンプトにはいくつかの工夫を加えています。

1. 「商品の箱」の扱いを明確にし、誤分類を防止

フレグランスカテゴリーの画像では、商品本体とその箱が一緒に写っていることがよくあります。当初の定義では、これを背景あり(ID:1)と誤って分類してしまうケースがありました。そこで、白背景(ID:0)の定義に「商品の箱以外に何もオブジェクトがないもの」という一文を追加しました。これにより、商品パッケージが写っていても、背景が白であれば正しく白背景として分類されるようになり、精度が向上しました。

2. 「その他」ラベルの利用を制限し、分類の一貫性を担保

今回のデータセットはフレグランス商品が中心のため、「その他(ID: 2)」に該当する画像はほとんどないと想定していました。しかし、モデルが判断に迷った場合、安易に「その他」を選んでしまう可能性を排除する必要がありました。これを防ぐため、プロンプトに「基本的に0, 1どちらかのラベルをつけてください。データはフレグランスに関するものがメインなのでそれ以外に該当するようなものを2にしてください」という指示を追加しました。この一文によって、モデルに可能な限り主力カテゴリ(0か1)での分類を促し、ラベルの一貫性を高めることができました。

3. 「その他」ラベルの利用を制限し、分類の一貫性を担保 Few-shotプロンプトを利用

モデルの推論時に分類例となるサンプルを渡すことで精度を向上させるFew-shotプロンプトという手法を用いました。白背景と背景ありの画像の代表的な画像を数枚、ラベルを付与してプロンプトとして渡すことで精度向上を狙いました。

具体的にプロンプトは以下を利用しました(Few-shotプロンプトは一部省略しています)。

あなたはECサイトの商品画像を分類するエキスパートです。
以下の分類定義に基づいて、与えられた複数の画像をそれぞれ最も適切なカテゴリIDに分類してください。
全ての画像に対する分類結果を、JSONの配列形式で一度に返してください。
各JSONオブジェクトには、画像の識別のために `filename` と `id` を含めてください。
例:
[
  {"filename": "image_001.jpg", "id": 0},
  {"filename": "image_002.png", "id": 1}
]
--- 分類定義 ---
- ID: 0, ラベル名: 白背景
  - 説明: 白背景に商品が写っているものと商品の箱以外に何もオブジェクトがないものを指す。
- ID: 1, ラベル名: 背景あり
  - 説明: 白以外の単色やグラデーションの背景のもの。木や葉のようなオブジェクトがあったり、体の一部が写っているなど何かしらのオブジェクトが背景に写っているものを指す。
- ID: 2, ラベル名: その他
  - 説明: 0, 1に当てはまらないもの。商品が明確に写っていない、カテゴリ判断が不能なものを指す。
--- 注意点 ---
少しでも背景に色がついていたり、何かしらのオブジェクトがある場合は1を選択してください。
基本的に0, 1どちらかのラベルをつけてください。データはフレグランスに関するものがメインなのでそれ以外に該当するようなものを2にしてください。

--- 分類例 ---
入力画像 "image_001.jpg":(画像が埋め込まれる)
...
出力: 
[
  {"filename": "image_001.jpg", "id": 0},
  ...
]

分類精度の検証方法

マルチモーダルLLMによる自動分類は便利ですが、その精度を検証する工程は不可欠です。今回の分析では以下のような手順で定性的な評価をしました。

1. ランダムサンプリングによる目視確認

全データの中からランダムに抽出した100件のサンプルに対してGeminiでラベルを付与し、画像とラベルを目視で確認しました。

2. 誤分類傾向の分析とプロンプト修正

目視確認中に、上記で説明したような誤分類が発生した場合はプロンプト修正や注意点を追加しました。

3. 改善後の再評価

プロンプト修正後、再度ラベルを付与して1と同様のサンプリングと目視確認をして意図通り分類できていることを確認しました。

1〜3の検証サイクルを繰り返し、今回の分析目的(背景の有無によるCTRの比較)においては、十分精度が担保できていると判断してから全データへの適用を進めました。

バッチ処理を利用した推論速度の向上

Gemini APIのTipsとして以下のように一度のリクエストで複数の画像のラベルを推論することで、実行時間の短縮が可能です(以下、バッチ処理と呼び、後述するバッチAPIとは別物です)。

def classify_image_batch(model: GenerativeModel, image_paths: list[Path], prompt: list[Path]):
    """指定された画像のバッチを一度に分類します。"""

    # バッチ内の各画像をプロンプトに追加
    for image_path in image_paths:
        with open(image_path, "rb") as f:
            image_part = Part.from_data(f.read(), mime_type="image/jpeg")
        
        prompt.append(f"\n入力画像 ({image_path.name}):")
        prompt.append(image_part)

    prompt.append("\n出力:")

    # モデルの設定
    generation_config = GenerationConfig(
        temperature=0.1,
        response_mime_type="application/json",
    )

    # API呼び出し
    response = model.generate_content(
        contents=prompt,
        generation_config=generation_config,
    )

    # 結果をJSONとしてパース
    return json.loads(response.text)

今回は高々数千枚のデータに対しての推論であったため、上のような簡易的なバッチ処理を導入することにしました。バッチ処理によって、1時間程度かかった推論を数分程度まで短縮することが可能となりました。

また、数万、数十万規模のデータに対して推論する場合にはバッチAPIを利用することをオススメします。

背景以外の要素がCTRに差を生まないことを検証

本分析で重要になるのが、比較するグループ間に背景以外の差がないことを示すことです。一般的に、CTRに影響のある要素として値段や表示位置などが挙げられます。表示位置の場合、サイト上で先に表示される商品ほどCTRが高くなると知られています。これらがグループ間で偏りがあると背景以外の要素がCTRへ影響を与えてしまうかもしれません。

この偏りがないことを確認するため、私たちはTOST(Two One-Sided Test)という統計手法を用いました。一般的な統計検定(t検定など)の2群比較では、2群間に差がないことを帰無仮説として設定し、帰無仮説を棄却して差があることを示します。もし帰無仮説が棄却できない場合は2群間に「差があるとは言えない」と表現できますが、これでは2群の分布が一致することは示せません。そこで同等性を示す検定法の1つとしてTOSTがあります。同等性マージンと呼ばれる許容される誤差を設定し、片側検定を2回行うことで分布の差がマージンの範囲内に収まることを証明する手法です。

TOSTの手順は以下の通りです。

  1. 同等とみなせる差の範囲(同等性マージン)を定義する。
  2. 2つの片側検定を設定する。1つは「グループ間の差が同等性マージンの下限以上である」という仮説、もう1つは「グループ間の差が同等性マージンの上限以下である」という仮説である。
  3. 両方の検定が統計的に有意である場合(つまり、両方の仮説が棄却された場合)、2つのグループは実質的に同等であると結論付ける。

そして、本分析ではCTRへの影響が大きいと予想される表示位置に対してTOSTで検定した結果、データセットの2つのグループには背景以外に統計的差異がないと判断しました。

背景がCTRに差が生むことを検証

ここでは、背景の有無によって分けたグループ間のCTR分布を比較します。以下のグラフは商品ごとのCTR分布をグループ間で比較しています。このグラフから、背景ありグループの方がCTRの中央値が高く、全体的にCTRが高い傾向にあることが読み取れます。

2グループのCTR分布比較

以下の表は白背景グループを基準とした背景ありグループの各指標の差分になります。max/min/mean/median/std. CTRに関しては、商品ごとにCTRを算出して最大値/最小値/平均/中央値/標準偏差を計算しました。group CTRに関してはそれぞれのグループ全体でインプレッション数とクリック数を算出しCTRを計算しました。

商品ごとの平均値で比較すると0.2%ほどCTRが高くなり、group CTRでは0.6%近く差が生まれました。数値で見える差は小さいように感じますが、ZOZOTOWNのようなユーザ数の多いサービスにおいては大きな売り上げの違いにつながります。

指標 差分 (白背景を基準)
max CTR -4.6%
min CTR -0.06%
mean CTR +0.23%
median CTR +0.36%
std. CTR -0.19%
group CTR +0.56%

まとめ

本記事ではGemini APIを用いて商品画像を分類する方法と背景画像の差異によるCTRへの影響分析の結果を紹介しました。 マルチモーダルLLMを活用することで、従来は手間のかかった商品画像の分類工程を効率化し、迅速な分析が可能になりました。また、分析からフレグランスカテゴリーの商品は、白背景にするよりも何かしらの色やオブジェクトを配置した方がCTRは高くなる傾向にあることが分かりました。

商品画像の背景分析を検討している方がいれば、ぜひ参考にしてみてください。今後は、別カテゴリの商品に関する分析や相関だけでなく因果関係を考慮した分析に取り組んでいきたいと考えています。

最後に

ZOZOでは、一緒にサービスを作り上げてくれる方を募集中です。ご興味のある方は、以下のリンクからぜひご応募ください。

corp.zozo.com

カテゴリー