16  Modelos de elección discreta y análisis conjoint: introducción y conjoint tradicional

Published

June 29, 2026

16.1 Introducción: cuando la decisión es elegir entre varias opciones

La regresión logística, desarrollada en capítulos anteriores, enseñó a modelar una elección entre dos opciones: comprar o no comprar, abandonar o permanecer, aprobar o rechazar. Pero buena parte de las decisiones de consumo reales no son binarias: un comprador no decide simplemente “comprar o no comprar un teléfono”, sino que elige entre varias alternativas concretas —un iPhone, un Samsung, un Xiaomi— cada una con su propia combinación de precio, características y marca.

Para modelar este tipo de decisión hace falta una familia de técnicas específicamente diseñada para elecciones entre múltiples alternativas: los modelos de elección discreta (discrete choice models). Su aplicación más extendida e influyente en investigación de mercados es el análisis conjoint, que se desarrolla a lo largo de cuatro capítulos: este, dedicado a la introducción conceptual y a la variante tradicional basada en rankings; el siguiente, dedicado al análisis conjoint basado en elecciones (CBC); un tercero, dedicado al diseño de experimentos y a la estimación avanzada; y un cuarto, dedicado al MaxDiff como caso especial de la misma familia de modelos.

TipUna nota para quien viene de SPSS

SPSS Base no incluye análisis conjoint; IBM ofrece un módulo independiente (SPSS Conjoint) orientado al conjoint tradicional basado en rankings o puntuaciones, que es precisamente la variante desarrollada en este capítulo. El análisis CBC, hoy el estándar de la industria y objeto del capítulo siguiente, no tiene equivalente en SPSS Conjoint.

16.2 El problema que resuelve el análisis conjoint

Imagínese una empresa de electrónica que quiere lanzar un nuevo lector de libros electrónicos. Antes de fabricarlo, necesita responder preguntas muy concretas:

  • ¿Cuánto le importa a un consumidor la capacidad de almacenamiento frente al precio?
  • ¿Preferirían los clientes una pantalla más grande aunque el dispositivo cueste más?
  • ¿Qué color de carcasa resulta más atractivo, y cuánto vale esa preferencia en términos de precio?
  • Si se lanzara una combinación concreta de atributos (almacenamiento, pantalla, color, precio), ¿qué cuota de mercado captaría frente a los productos de la competencia?

Preguntar directamente “¿qué importancia tiene el precio para usted?” produce respuestas poco fiables: las personas tienden a infravalorar el precio y sobrevalorar los atributos “nobles” cuando se les pregunta de forma aislada. El análisis conjoint resuelve este problema de un modo más realista: en lugar de preguntar por la importancia de cada atributo por separado, presenta a los encuestados productos completos que combinan varios atributos a la vez, y observa qué prefieren. La importancia relativa de cada atributo se infiere estadísticamente a partir de esas respuestas, no se pregunta directamente.

16.3 Los componentes de un estudio conjoint

16.3.1 Atributos y niveles

Un atributo es una característica del producto que se quiere testar (precio, marca, almacenamiento…); cada atributo se descompone en niveles, los valores concretos que puede tomar. Por ejemplo:

Atributo Niveles
Almacenamiento 8 GB / 16 GB
Tamaño de pantalla 5” / 6” / 7”
Color Negro / Blanco / Plateado
Precio 99€ / 129€ / 159€

16.3.2 Perfiles

Un perfil es una combinación concreta de niveles, uno por atributo: un producto hipotético completo (por ejemplo, “16 GB, pantalla de 6 pulgadas, color negro, 129€”). A partir de aquí, existen dos grandes familias de diseño experimental, que dan lugar a las dos variantes principales del análisis conjoint:

  • Conjoint tradicional: a cada encuestado se le muestra una secuencia de perfiles individuales completos, y se le pide que los puntúe o los ordene según su preferencia. Es la variante histórica original, desarrollada en este mismo capítulo.
  • Conjoint basado en elecciones (CBC): a cada encuestado se le presentan varios perfiles a la vez, agrupados en una tarea de elección, y se le pide que seleccione cuál compraría. Es la variante que domina la práctica profesional actual, y se desarrolla en el capítulo siguiente.

16.4 El conjoint tradicional: fundamento y procedimiento

El conjoint tradicional (o conjoint basado en perfiles completos) es la variante original del análisis conjoint, propuesta por Green and Srinivasan (1978). A diferencia del CBC, donde el encuestado elige una alternativa entre varias presentadas en cada tarea, en el conjoint tradicional se le muestra una tarjeta con un único perfil de producto completo, y se le pide que lo puntúe (en una escala, por ejemplo de 0 a 10) o lo ordene en relación con el resto de perfiles presentados.

Esta variante resulta más sencilla de estimar que el CBC: en lugar de un modelo logit condicional basado en la probabilidad de elección entre alternativas, se ajusta una regresión lineal (o un modelo de rangos) sobre las puntuaciones u órdenes otorgados por cada encuestado, tratando los niveles de cada atributo como variables predictoras categóricas. El resultado es, igualmente, un conjunto de utilidades parciales (part-worths) por nivel de atributo, pero obtenido con un procedimiento estadístico mucho más directo que el del CBC.

El paquete conjoint, desarrollado por Andrzej Bąk y Tomasz Bartłomowicz (Universidad de Economía de Wrocław), implementa este enfoque tradicional en R, replicando la lógica del módulo SPSS Conjoint (Bąk and Bartłomowicz 2012).

16.5 Aplicación práctica: valoración de perfiles de lector electrónico

Se desarrolla el caso de la empresa de electrónica que está diseñando un nuevo lector de libros electrónicos, utilizando el enfoque tradicional de valoración de perfiles completos.

16.5.1 Objetivo de la investigación

Objetivo: estimar, mediante el conjoint tradicional, las utilidades parciales de cada nivel de atributo del producto a partir de las puntuaciones otorgadas por un encuestado a un conjunto reducido de perfiles completos, y determinar la importancia relativa de cada atributo en la decisión de compra.

16.5.2 Diseño del experimento: perfiles factoriales

El primer paso es generar el diseño de perfiles a partir de los niveles de cada atributo. Con cuatro atributos (2 × 3 × 3 × 3 = 54 combinaciones posibles), un diseño factorial completo sería excesivo para que un encuestado lo valore en su totalidad; se genera por tanto un diseño factorial fraccional, que reduce el número de perfiles mientras conserva la capacidad de estimar los efectos principales de cada atributo:

Code
trad_attribute_levels <- expand.grid(
  storage = c("8GB", "16GB"),
  screen  = c("5in", "6in", "7in"),
  color   = c("Black", "White", "Silver"),
  price   = c("99", "129", "159")
)

trad_design <- conjoint::caFactorialDesign(
  data = trad_attribute_levels,
  type = "fractional"
)

trad_design
   storage screen  color price
4     16GB    6in  Black    99
7      8GB    5in  White    99
12    16GB    7in  White    99
15     8GB    6in Silver    99
17     8GB    7in Silver    99
23     8GB    7in  Black   129
28    16GB    6in  White   129
29     8GB    7in  White   129
32    16GB    5in Silver   129
33     8GB    6in Silver   129
37     8GB    5in  Black   159
45     8GB    6in  White   159
54    16GB    7in Silver   159

16.5.3 Simulación de las puntuaciones de un encuestado

En un estudio real, cada encuestado puntuaría los perfiles del diseño. Para ilustrar el procedimiento, se simulan las puntuaciones de un único encuestado, siguiendo una estructura de preferencias plausible: preferencia por mayor capacidad de almacenamiento, por pantallas más grandes, por colores distintos del negro, y aversión al precio.

Code
set.seed(11)

# Simulate plausible 0-10 ratings for each profile in the design,
# following a realistic underlying preference structure
trad_ratings <- trad_design |>
  dplyr::mutate(
    rating = 5 +
      dplyr::if_else(storage == "16GB", 1.5, 0) +
      dplyr::case_when(screen == "6in" ~ 0.8, screen == "7in" ~ 0.5, TRUE ~ 0) +
      dplyr::case_when(color == "White" ~ 0.3, color == "Silver" ~ 0.6, TRUE ~ 0) -
      (as.numeric(as.character(price)) - 99) * 0.02 +
      rnorm(dplyr::n(), 0, 0.5)
  ) |>
  dplyr::mutate(rating = round(pmin(10, pmax(0, rating)), 1))

trad_ratings
   storage screen  color price rating
4     16GB    6in  Black    99    7.0
7      8GB    5in  White    99    5.3
12    16GB    7in  White    99    6.5
15     8GB    6in Silver    99    5.7
17     8GB    7in Silver    99    6.7
23     8GB    7in  Black   129    4.4
28    16GB    6in  White   129    7.7
29     8GB    7in  White   129    5.5
32    16GB    5in Silver   129    6.5
33     8GB    6in Silver   129    5.3
37     8GB    5in  Black   159    3.4
45     8GB    6in  White   159    4.7
54    16GB    7in Silver   159    5.6

16.5.4 Estimación de las utilidades parciales

La función caModel() ajusta el modelo de regresión que descompone la puntuación total de cada perfil en las utilidades parciales aportadas por cada nivel de atributo:

Code
trad_model <- conjoint::caModel(
  y = trad_ratings$rating,
  x = trad_design
)

summary(trad_model)
              Length Class  Mode   
call           2     -none- call   
terms          3     terms  call   
residuals     13     -none- numeric
coefficients  32     -none- numeric
aliased        8     -none- logical
sigma          1     -none- numeric
df             3     -none- numeric
r.squared      1     -none- numeric
adj.r.squared  1     -none- numeric
fstatistic     3     -none- numeric
cov.unscaled  64     -none- numeric

Cada coeficiente representa la utilidad parcial (part-worth) de un nivel de atributo, en relación con su categoría de referencia.

16.5.5 Importancia relativa de los atributos

Code
trad_importance_raw <- conjoint::caImportance(
  y = trad_ratings$rating,
  x = trad_design
)

trad_importance_raw
[1] 33.68 15.75 16.71 33.86
Code
# trad_importance_raw is returned by caImportance() in the same order in
# which attributes were specified in trad_attribute_levels: storage,
# screen, color, price. Names are assigned explicitly here rather than
# relying on any names already attached to the vector, to avoid mismatches.
trad_importance_data <- data.frame(
  attribute  = c("storage", "screen", "color", "price"),
  importance = round(as.numeric(trad_importance_raw), 1)
)

ggplot2::ggplot(trad_importance_data,
                ggplot2::aes(x = reorder(attribute, importance), y = importance)) +
  ggplot2::geom_col(fill = "#076fa2") +
  ggplot2::geom_text(ggplot2::aes(label = paste0(importance, "%")), hjust = -0.1) +
  ggplot2::coord_flip() +
  ggplot2::scale_y_continuous(limits = c(0, max(trad_importance_data$importance) * 1.2)) +
  ggplot2::labs(x = NULL, y = "Importancia relativa (%)") +
  ggplot2::theme_minimal()
Figure 16.1: Importancia relativa de los atributos (conjoint tradicional)

El precio resulta ser el atributo más determinante en la decisión, seguido de la capacidad de almacenamiento; el color es el atributo de menor peso relativo en la valoración de los perfiles.

TipConjoint tradicional frente a CBC

El conjoint tradicional es conceptualmente más simple y computacionalmente más ligero —se basa en una regresión, no en un modelo logit—, pero exige al encuestado una tarea cognitiva menos realista: valorar perfiles de producto de forma aislada, sin la dinámica de comparación directa entre alternativas que sí ofrece el CBC. Por esta razón, el CBC ha desplazado progresivamente al conjoint tradicional como estándar de la industria desde la década de 1990, aunque el conjoint tradicional conserva su utilidad en estudios con un número reducido de atributos y encuestados, o como introducción pedagógica a la lógica del análisis conjoint.

16.5.6 Conclusiones

El conjoint tradicional ha permitido, con un procedimiento estadístico sencillo, estimar las utilidades parciales de cada nivel de atributo y determinar su importancia relativa en la decisión de compra. Esta variante sienta las bases conceptuales —atributos, niveles, perfiles, utilidades parciales, importancia relativa— que reaparecerán, con un fundamento estadístico distinto, en el análisis conjoint basado en elecciones desarrollado en el capítulo siguiente.