メインコンテンツへスキップ
ブログ一覧に戻る
data

コンジョイント分析|属性×水準で“選ばれる理由”を数値化

2025年10月29日
4分で読めます
コンジョイント分析|属性×水準で“選ばれる理由”を数値化

コンジョイント分析|属性 × 水準で“選ばれる理由”を可視化(実務設計ガイド)

ユーザーが製品を選ぶとき、複数の要素(属性)を同時に評価しています。コンジョイント分析は、それぞれの属性水準が選好に与える寄与(部分効用)を推定する手法です。

まずはここだけ(やさしい導入)

  • 何をする?: 属性(価格・デザイン…)の“効き目”を数値化し、どれを上げ下げすると選ばれるかを把握
  • いつ使う?: 新商品の仕様決定、価格改定、プラン設計、競合比較
  • どう読む?: 部分効用の符号と大きさ、属性重要度、WTP(支払意思額)

用語ミニ辞典(1 行で)

  • 属性/水準: 比較する軸と、その具体的な値(例: 価格=¥9,800/12,800/15,800)
  • 部分効用(Part-worth): その水準が選好に与える寄与の量
  • 重要度: 属性ごとの寄与割合(max−min の差を合計で割るのが一般的)
  • CBC(Choice-Based Conjoint): 選択型の設計(最も実務で一般的)
  • WTP: 部分効用を価格軸で割って換算した“価格に置き換えた価値”

設計の基本

  • 属性例: 価格、デザイン、配送速度、保証
  • 水準例: 価格(¥9,800 / ¥12,800 / ¥15,800)など
  • 直交/最適設計で組合せ数を圧縮

推定と読み方

  • 推定: OLS/Logit、個人差を捉えるなら HB(階層ベイズ)
  • 部分効用と重要度(各属性の寄与割合)を算出
  • 価格の換算: 部分効用の差分を価格に換算し、WTP を推定

ミニコード(超簡略・疑似)

# 擬似的な OLS 推定例(実務は専用パッケージ推奨)
import pandas as pd
import statsmodels.api as sm

df = pd.DataFrame({
  'choice':[1,0,0, 0,1,0, 0,0,1],  # 各タスクで選ばれたプロファイルに1
  'price':[9800,12800,15800, 9800,12800,15800, 9800,12800,15800],
  'design_modern':[1,0,0, 0,1,0, 0,0,1],
})

X = sm.add_constant(df[['price','design_modern']])
model = sm.OLS(df['choice'], X).fit()
print(model.params)

実務ケーススタディ(CBC→ 部分効用 → シェアシミュレーション)

目的: 価格 × デザイン × 配送で新商品の仕様を決めたい。

  1. 設計

  • CBC で 8–12 課題、各課題 3–4 選択肢+「選ばない」
  • 非現実な組合せに制約。価格は現実的レンジで水準設定

  1. 推定

  • ロジット(個人差は HB で)。部分効用と属性重要度を算出

  1. シミュレーション

  • 各候補の効用合計をロジットで確率化し、シェアを予測
  • 価格変更や水準入替で“何割伸びるか”を比較

最小コード(多項ロジットで簡易シェア)

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression

# 各課題で 3 商品 + 無回答(0)
df = pd.DataFrame({
  'choice':[1,0,0, 0,1,0, 0,0,1],  # 選ばれた=1
  'price':[9800,12800,15800, 9800,12800,15800, 9800,12800,15800],
  'design_modern':[1,0,0, 0,1,0, 0,0,1]
})

X = df[['price','design_modern']]
y = df['choice']
logit = LogisticRegression(max_iter=1000).fit(X, y)
coef = np.r_[logit.intercept_, logit.coef_.ravel()]
print('coef=', coef)

# 簡易シミュレーション(3 候補の効用→確率化)
cand = pd.DataFrame({
  'price':[10800,12800,14800],
  'design_modern':[1,0,1]
})
u = logit.decision_function(cand)
prob = 1/(1+np.exp(-u))  # 二項の簡略。実務は多項ロジット
print('prob ~ share:', prob/prob.sum())

練習問題(理解を定着)

  1. 属性が 6、各 4 水準。課題数はどの程度が目安?

  • ヒント: 1 人あたり 8–12 課題、選択肢 3–4 + 選ばない

  1. 価格の係数が大きく負。何が言える?

  • ヒント: 価格感度が高い。WTP で換算して意思決定

  1. シミュレーションで“どれも選ばない”確率が高い。どう解釈?

  • ヒント: 競合/実現性/水準設定が現実と乖離。設計の見直し

注意点

  • 課題数・回答負荷の設計、理解しやすい刺激の提示
  • 非現実的な組合せを避ける制約設計
  • 推定後は現実のシェア/収益に落とす検証が必要

関連と次の一歩

判断の土台として押さえておくこと

  • 部分効用・重要度・WTPを押さえる:属性水準の選好への寄与(部分効用)、属性ごとの寄与割合(重要度)、価格軸で換算した支払意思額(WTP)。競合・コストと併せて判断する。
  • 設計で負荷を抑える:属性が多すぎる場合は最適設計で候補を圧縮し、パイロットで課題数を調整。CBC(選択型)が実務で一般的。
  • 目的→設計→推定→解釈の順:何を判断するか(価格・仕様・プラン)を決めてから、属性・水準と設計を決める。

次の一手回帰分析クラスター分析統計の判断ハブ

よくある質問(FAQ)

  • Q: 属性が多すぎて負荷が高い
  • A: 最適設計で候補を圧縮、パイロットで課題数を調整
  • Q: 価格感度はどう読む?
  • A: 価格係数から WTP を算出し、競合・コストと併せて判断


コンジョイント分析についてのご相談はこちら

次の一手

状況に合わせて、選んでください。