Objetivo:
Identificar qué atributos de una canasta básica (precio, marca,
productos incluidos y promoción) son más valorados por los consumidores,
para diseñar estrategias de marketing efectivas.
Contexto:
Plaza Vea quiere lanzar una nueva línea de canastas básicas y necesita
entender las preferencias de sus clientes.
Vamos a evaluar 4 atributos con 3 niveles cada uno :
Atributo | Niveles |
---|---|
Precio | S/50, S/70, S/90 |
Marca | “Marca Propia”, “Nestlé”, “Gloria” |
Productos | “Básicos (arroz, azúcar, aceite)”, “Básicos + Lácteos”, “Básicos + Enlatados” |
Promoción | “Sin promoción”, “10% de descuento”, “Producto gratis” |
Total de combinaciones posibles: 3×3×3×3=81.
Usaremos un diseño factorial fraccionado para reducir a 18 perfiles
# Instalar paquete si es necesario
# install.packages("conjoint")
library(conjoint)
# Definir atributos y niveles
atributos <- list(
precio = c("50", "70", "90"),
marca = c("Marca_Propia", "Nestle", "Gloria"),
productos = c("Basicos", "Lacteos", "Enlatados"),
promocion = c("Sin_Promo", "10_Descuento", "Producto_Gratis")
)
# Crear diseño factorial fraccionado
perfiles <- expand.grid(atributos)
design <- caFactorialDesign(data = perfiles, type = "fractional", cards = 18)
print(design)
## precio marca productos promocion
## 2 70 Marca_Propia Basicos Sin_Promo
## 6 90 Nestle Basicos Sin_Promo
## 15 90 Nestle Lacteos Sin_Promo
## 16 50 Gloria Lacteos Sin_Promo
## 19 50 Marca_Propia Enlatados Sin_Promo
## 26 70 Gloria Enlatados Sin_Promo
## 28 50 Marca_Propia Basicos 10_Descuento
## 36 90 Gloria Basicos 10_Descuento
## 39 90 Marca_Propia Lacteos 10_Descuento
## 44 70 Gloria Lacteos 10_Descuento
## 49 50 Nestle Enlatados 10_Descuento
## 50 70 Nestle Enlatados 10_Descuento
## 59 70 Nestle Basicos Producto_Gratis
## 61 50 Gloria Basicos Producto_Gratis
## 65 70 Marca_Propia Lacteos Producto_Gratis
## 67 50 Nestle Lacteos Producto_Gratis
## 75 90 Marca_Propia Enlatados Producto_Gratis
## 81 90 Gloria Enlatados Producto_Gratis
Cargar la base de encuestados realizados para este experimento
preferencias=read.csv("preferencias_plazaVea.csv")
head(preferencias)
## X Perfil_1 Perfil_2 Perfil_3 Perfil_4 Perfil_5 Perfil_6 Perfil_7
## 1 Encuestado_1 17 15 14 7 8 10 4
## 2 Encuestado_2 15 17 16 4 14 12 5
## 3 Encuestado_3 16 8 15 5 13 10 14
## 4 Encuestado_4 18 17 14 4 12 6 8
## 5 Encuestado_5 18 17 16 13 14 11 5
## 6 Encuestado_6 14 18 17 11 12 13 5
## Perfil_8 Perfil_9 Perfil_10 Perfil_11 Perfil_12 Perfil_13 Perfil_14 Perfil_15
## 1 9 16 3 2 1 13 18 6
## 2 13 8 11 1 2 3 7 6
## 3 9 17 4 2 1 11 7 18
## 4 13 5 3 1 2 9 10 16
## 5 15 10 6 1 4 9 8 7
## 6 8 6 1 4 2 10 7 16
## Perfil_16 Perfil_17 Perfil_18
## 1 5 12 11
## 2 9 18 10
## 3 3 6 12
## 4 7 15 11
## 5 3 12 2
## 6 3 15 9
# Nombres de niveles para interpretación
niveles <- data.frame(
precio = c("50", "70", "90"),
marca = c("Marca_Propia", "Nestle", "Gloria"),
productos = c("Basicos", "Lacteos", "Enlatados"),
promocion = c("Sin_Promo", "10_Descuento", "Producto_Gratis")
)
# Ajustar modelo conjoint
resultados <- Conjoint(y = preferencias[,-1], x = design, z = niveles , y.type ="rank")
##
## Call:
## lm(formula = frml)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10,7000 -2,1056 -0,1111 2,1139 8,8500
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9,50000 0,14474 65,636 < 2e-16 ***
## factor(x$precio)1 3,07222 0,20469 15,009 < 2e-16 ***
## factor(x$precio)2 0,02222 0,20469 0,109 0,914
## factor(x$marca)1 -1,78333 0,20469 -8,712 < 2e-16 ***
## factor(x$marca)2 1,32778 0,20469 6,487 2,01e-10 ***
## factor(x$productos)1 -1,48889 0,20469 -7,274 1,26e-12 ***
## factor(x$productos)2 -0,01111 0,20469 -0,054 0,957
## factor(x$promocion)1 -3,13889 0,20469 -15,335 < 2e-16 ***
## factor(x$promocion)2 2,97778 0,20469 14,548 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1
##
## Residual standard error: 3,363 on 531 degrees of freedom
## Multiple R-squared: 0,5867, Adjusted R-squared: 0,5805
## F-statistic: 94,23 on 8 and 531 DF, p-value: < 2,2e-16
## [1] "Part worths (utilities) of levels (model parameters for whole sample):"
## levnms utls
## 1 intercept 9,5
## 2 50 3,0722
## 3 70 0,0222
## 4 90 -3,0944
## 5 Marca_Propia -1,7833
## 6 Nestle 1,3278
## 7 Gloria 0,4556
## 8 Basicos -1,4889
## 9 Lacteos -0,0111
## 10 Enlatados 1,5
## 11 Sin_Promo -3,1389
## 12 10_Descuento 2,9778
## 13 Producto_Gratis 0,1611
## [1] "Average importance of factors (attributes):"
## [1] 32,04 18,92 17,61 31,43
## [1] Sum of average importance: 100
## [1] "Chart of average factors importance"
resultados
## [,1]
## [1,] 0.7
## [2,] 1.9
## [3,] 3.1
## [4,] 4.3
Los coeficientes muestran cómo cada nivel de atributo afecta la preferencia (valor base = intercepto 9.5):
Atributo/Nivel | Estimación | Interpretación |
---|---|---|
Precio1 (S/50) | +3.07*** | El precio más bajo aumenta significativamente la preferencia |
Precio2 (S/70) | +0.02 | No tiene impacto vs. referencia (S/90) |
Marca1 (Marca Propia) | -1.78*** | La marca propia reduce la preferencia vs. referencia |
Marca2 (Nestlé) | +1.33*** | Nestlé es significativamente preferida |
Productos1 (Básicos) | -1.49*** | La opción básica es menos preferida |
Productos2 (+Lácteos) | -0.01 | Similar a la referencia (+Enlatados) |
Promoción1 (Sin promo) | -3.14*** | Ausencia de promoción reduce fuertemente preferencia |
Promoción2 (10% dto) | +2.98*** | El descuento del 10% es muy valorado |
***p < 0.001 (altamente significativo)
Atributo | Importancia (%) | Interpretación |
---|---|---|
Precio | 32.04 | Atributo más influyente |
Promoción | 31.43 | Casi igual de importante que el precio |
Marca | 18.92 | Impacto moderado |
Productos | 17.61 | Menos influyente |
El precio es el factor decisivo:
Los consumidores prefieren claramente la opción de S/50 (utilidad +3.07).
El precio de S/70 no difiere estadísticamente de S/90 (p=0.914).
Las promociones son cruciales:
El 10% de descuento genera casi tanta utilidad (+2.98) como el precio bajo.
No ofrecer promoción reduce drásticamente la preferencia (-3.14).
Preferencia por marcas reconocidas:
Nestlé es significativamente mejor valorada que la marca propia.
La marca Gloria (referencia) se sitúa en el medio.
Composición del producto:
Los consumidores prefieren claramente canastas con enlatados (referencia).
La opción solo con básicos es la menos atractiva.
Estrategia de precios:
Priorizar la opción de S/50 como producto estrella.
Reconsiderar el precio de S/70 (no aporta valor vs. S/90).
Promociones:
Implementar frecuentemente descuentos del 10%.
Evitar periodos sin promociones.
Mix de productos:
Incluir enlatados en las canastas básicas.
Reducir el espacio a canastas solo con productos básicos.
Marcas:
Aumentar presencia de Nestlé en las canastas.
Replantear estrategia para la marca propia.
R² = 0.5867: El modelo explica el 58.67% de la variabilidad en preferencias (buen ajuste).
p-value < 2.2e-16: El modelo es estadísticamente significativo en su conjunto.
Residuales: Distribución simétrica (mediana cerca de 0), sin patrones extraños.
Variables no consideradas:
Contexto del estudio:
Pruebas de implementación:
Nuevos estudios:
Investigar por qué la marca propia tiene baja preferencia.
Evaluar combinaciones con otros productos (ej: lácteos + enlatados).
# Perfil óptimo según el modelo:
perfil_optimo <- data.frame(
precio = "50",
marca = "Nestle",
productos = "Enlatados",
promocion = "10_Descuento"
)
library(plotly)
## Cargando paquete requerido: ggplot2
##
## Adjuntando el paquete: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Crear dataframe con la importancia
importancia_df <- data.frame(
Atributo = c("Precio", "Promoción", "Marca", "Productos"),
Importancia = c(32.04, 31.43, 18.92, 17.61)
)
# Gráfico interactivo de barras
plot_ly(importancia_df,
x = ~Atributo,
y = ~Importancia,
type = 'bar',
color = ~Atributo,
colors = c("#FF6B6B", "#4ECDC4", "#45B7D1", "#FFA07A"),
text = ~paste("Importancia:", round(Importancia, 1), "%"),
hoverinfo = 'text') %>%
layout(title = "IMPORTANCIA RELATIVA DE ATRIBUTOS<br><sup>Análisis Conjoint Plaza Vea</sup>",
yaxis = list(title = "% Importancia"),
xaxis = list(title = ""))
# Preparar datos de utilidades
utilidades <- data.frame(
Nivel = c("Precio50", "Precio70", "Precio90",
"Marca_Propia", "Nestlé", "Gloria",
"Básicos", "Lácteos", "Enlatados",
"Sin_Promo", "10%_Dto", "Prod_Gratis"),
Utilidad = c(3.07, 0.02, 0, -1.78, 1.33, 0, -1.49, -0.01, 0, -3.14, 2.98, 0),
Atributo = rep(c("Precio", "Marca", "Productos", "Promoción"), each = 3)
)
# Heatmap interactivo
plot_ly(utilidades,
x = ~Atributo,
y = ~Nivel,
z = ~Utilidad,
type = "heatmap",
colorscale = "RdYlGn",
hoverinfo = "text",
text = ~paste("Atributo:", Atributo,
"<br>Nivel:", Nivel,
"<br>Utilidad:", round(Utilidad, 2))) %>%
layout(title = "UTILIDADES PARCIALES POR NIVEL<br><sup>Valores más altos = mayor preferencia</sup>",
xaxis = list(title = ""),
yaxis = list(title = ""))
Plaza Vea planea lanzar una nueva línea de canastas navideñas y necesita evaluar cómo competirán 5 posibles configuraciones de producto (1 propuesta propia y 4 de competidores) en el mercado. Basados en un estudio previo de Conjoint con 30 consumidores, se deben simular las preferencias.
Objetivo:
Determinar la participación estimada de mercado para cada producto
usando la función ShowAllSimulations()
y
recomendar la mejor estrategia.
Datos disponibles:
18 perfiles evaluados originalmente (atributos: precio, marca, productos, promoción)
Preferencias de 30 encuestados (rankings del 1 al 9)
5 productos a simular (tabla abajo)
# LIBRERÍAS
library(conjoint)
# PRODUCTOS A SIMULAR
simulacion <- data.frame(
producto = c("PlazaVea_Nav", "SuperSaver", "MercadoFeliz", "AhorroTotal", "PremiumFest"),
precio = c("50", "70", "50", "90", "70"),
marca = c("Nestle", "Gloria", "Marca_Propia", "Nestle", "Gloria"),
productos = c("Enlatados", "Lacteos", "Basicos", "Enlatados", "Enlatados"),
promocion = c("10_Descuento", "Sin_Promo", "10_Descuento", "Producto_Gratis", "10_Descuento")
)
simulacion
## producto precio marca productos promocion
## 1 PlazaVea_Nav 50 Nestle Enlatados 10_Descuento
## 2 SuperSaver 70 Gloria Lacteos Sin_Promo
## 3 MercadoFeliz 50 Marca_Propia Basicos 10_Descuento
## 4 AhorroTotal 90 Nestle Enlatados Producto_Gratis
## 5 PremiumFest 70 Gloria Enlatados 10_Descuento
Corrida de la simulación
# SIMULACIÓN CON ShowAllSimulations()
resultados <- ShowAllSimulations(
sym = simulacion[, -1], # Excluir columna de nombres
y = preferencias[,-1],
x = design
)
## TotalUtility MaxUtility BTLmodel LogitModel
## 1 9,12 3,33 17,36 4,37
## 2 9,60 3,33 18,59 4,33
## 3 9,73 10,00 18,72 9,80
## 4 9,17 6,67 17,69 5,70
## 5 14,41 76,67 27,65 75,80
# 5. RESULTADOS (DATAFRAME + GRÁFICO)
participacion <- data.frame(
Producto = simulacion$producto,
TotalUtility = resultados[, 1],
MaxUtility = resultados[, 2],
BTL = resultados[, 3],
Logit = resultados[, 4]
)
# Gráfico de participación (Modelo Logit)
barplot(participacion$Logit,
names.arg = participacion$Producto,
col = c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"),
main = "Participación de Mercado Estimada (Modelo Logit)",
ylab = "% Participación",
ylim = c(0, 40))
Producto | TotalUtility | MaxUtility (%) | BTL (%) | Logit (%) |
---|---|---|---|---|
PlazaVea_Nav | 9.12 | 3.33 | 17.36 | 4.37 |
SuperSaver | 9.60 | 3.33 | 18.59 | 4.33 |
MercadoFeliz | 9.73 | 10.00 | 18.72 | 9.80 |
AhorroTotal | 9.17 | 6.67 | 17.69 | 5.70 |
PremiumFest | 14.41 | 76.67 | 27.65 | 75.80 |
El producto gratis (AhorroTotal) performa mejor que sin promoción (SuperSaver)
Pero el 10% de descuento es claramente superior cuando se combina con otros atributos clave
El precio más bajo (S/50) no garantiza éxito (PlazaVea_Nav y MercadoFeliz <10%)
El precio medio (S/70) funciona mejor cuando se combina con otros atributos adecuados
Gloria supera a Nestlé y Marca Propia en todas las combinaciones
La marca propia tiene el peor desempeño (MercadoFeliz)
Enlatados claramente preferidos sobre otras opciones
La combinación “Básicos” tiene bajo atractivo incluso con precio bajo
Reformular PlazaVea_Nav:
Cambiar a marca Gloria (en lugar de Nestlé)
Considerar 15% de descuento en lugar de 10%
Mantener enlatados y precio S/50
Potenciar PremiumFest:
Posicionar como producto estrella
Asegurar disponibilidad de stock
Desarrollar versión premium (ej: enlatados gourmet)
Rediseñar o eliminar productos poco competitivos:
SuperSaver: agregar al menos 10% de descuento
MercadoFeliz: evitar combinación “marca propia + básicos”
AhorroTotal: precio S/90 es demasiado alto