2  Análisis de correspondencias simple

Dos simples e intuitivos supuestos

Published

December 14, 2025

2.1 Introducción

Cargamos los paquetes necesarios y los datos.

  • ca: para la realización del análisis de correspondencias
  • factoextra:para la creación de gráficos específicos del análisis
  • ggplot2: básico general de gráficos

3 Cargar librerías

Code
# --- Configuración Inicial ---
source("script.R")

Objetivo: Aplicar el análisis de correspondencias para transformar una tabla de datos en un mapa perceptual estratégico y contar una historia de marketing coherente.

Instrucciones 1. Importamos la tabla, introduciendo la misma como tal. 2. Ejecutamos el análisis de correspondencias. 3. Interpretamos el mapa perceptual respondiendo a las preguntas de negocio planteadas en cada caso.

3.1 Caso práctico 2.1: el mercado de smartphones

3.1.1 Planteamiento del problema

Una consultora de investigación de mercados ha realizado un estudio de asociación de imagen de marca para cuatro fabricantes de smartphones. Se preguntó a una muestra de 500 consumidores qué atributo asociaban más fuertemente con cada marca. Los resultados se resumen en la siguiente tabla de contingencia.

Preguntas de negocio: 1. ¿Cómo se posicionan estas cuatro marcas en la mente del consumidor? 2. ¿Cuáles son los principales ejes de competencia en este mercado? 3. ¿Qué marcas compiten más directamente entre sí?

3.1.2 Datos y código R

Esta tabla está diseñada para ser extremadamente clara. Las asociaciones son muy fuertes y polarizadas.

Code
# --- CASO 1: SMARTPHONES ---

# Crear la tabla de contingencia
# Datos diseñados para tener una estructura muy clara
datos_smartphones <- matrix(
  c(
    # Atributos -> Diseño, Calidad/Precio, Innovación, Precio Bajo
    150,
    10,
    20,
    5, # Apple
    15,
    120,
    10,
    10, # Xiaomi
    30,
    15,
    140,
    20, # Samsung
    5,
    15,
    5,
    160 # Alcatel
  ),
  nrow = 4,
  byrow = TRUE
)

# Asignar nombres a filas y columnas
rownames(datos_smartphones) <- c("Apple", "Xiaomi", "Samsung", "Alcatel")
colnames(datos_smartphones) <- c(
  "Diseño_Premium",
  "Calidad_Precio",
  "Innovacion_Tecnologica",
  "Precio_Bajo"
)

# Convertir a tabla para visualizar
tabla_smartphones <- as.table(datos_smartphones)
knitr::asis_output("#### Tabla de contingencia")

3.1.2.1 Tabla de contingencia

Code
print(tabla_smartphones)
        Diseño_Premium Calidad_Precio Innovacion_Tecnologica Precio_Bajo
Apple              150             10                     20           5
Xiaomi              15            120                     10          10
Samsung             30             15                    140          20
Alcatel              5             15                      5         160
Code
knitr::asis_output("#### Prueba ChiSquare")

3.1.2.2 Prueba ChiSquare

Code
chisq=chisq.test(tabla_smartphones)
chisq

    Pearson's Chi-squared test

data:  tabla_smartphones
X-squared = 1112, df = 9, p-value < 2.2e-16
Code
knitr::asis_output("#### Residuos estandarizados ajustados")

3.1.2.3 Residuos estandarizados ajustados

Code
chisq$stdres
        Diseño_Premium Calidad_Precio Innovacion_Tecnologica Precio_Bajo
Apple        18.947957      -6.283256              -4.853124   -8.542070
Xiaomi       -5.573437      18.820185              -5.757174   -6.423575
Samsung      -4.831537      -5.958801              17.527363   -6.470185
Alcatel      -8.716060      -5.254831              -7.842813   21.266263
Code
knitr::asis_output("#### Análisis de correspondencias")

3.1.2.4 Análisis de correspondencias

Code
# Realizar el análisis de correspondencias
ca_smartphones <- ca(tabla_smartphones)

# Resumen del análisis (clave para interpretar la inercia)
print(summary(ca_smartphones))
$scree
          values  values2   values3
[1,] 1 0.6478187 42.52806  42.52806
[2,] 2 0.4857057 31.88565  74.41371
[3,] 3 0.3897493 25.58629 100.00000

$rows
  name mass  qlt  inr  k=1 cor ctr  k=2  cor ctr
1 Appl  253  590  244 -851 495 284 -373   95  73
2 Xiam  212 1000  251   -5   0   0 1342 1000 788
3 Smsn  281  256  200 -391 141  66 -353  115  72
4 Alct  253  976  305 1289 905 650 -361   71  68

$columns
  name mass  qlt  inr  k=1 cor ctr  k=2 cor ctr
1 Dñ_P  274  604  239 -827 514 289 -346  90  67
2 Cl_P  219 1000  249   34   1   0 1315 999 780
3 In_T  240  262  212 -465 160  80 -371 102  68
4 Pr_B  267  985  300 1237 895 631 -392  90  84

attr(,"class")
[1] "summary.ca"
Code
# Visualización del mapa perceptual
# Usamos factoextra para un gráfico más estético y claro
knitr::asis_output("#### Mapa perceptual")

3.1.2.5 Mapa perceptual

Code
fviz_ca_biplot(
  ca_smartphones,
  repel = TRUE, # Evita que las etiquetas se solapen
  title = "Mapa perceptual del mercado de smartphones"
) +
  labs(subtitle = "Basado en asociaciones de imagen de marca") +
  ggthemes::theme_economist() +
  coord_cartesian(ylim = c(-0.6, 0.8)) # Ajusta los límites del eje Y

3.1.3 Guía de interpretación (solución)

  1. Análisis de la inercia: El resumen del análisis mostrará que las dos primeras dimensiones explican un porcentaje altísimo de la inercia total (probablemente >95%). Esto significa que nuestro mapa 2D es una representación casi perfecta y muy fiable de la realidad de los datos.

  2. Interpretación de los ejes (dimensiones):

    • Dimensión 1 (eje horizontal): Al observar los puntos de los atributos, veremos que en un extremo se sitúan Precio_Bajo y en el otro Diseño_Premium e Innovacion_Tecnologica. Este eje representa claramente la principal tensión del mercado: “Eje de valor vs. premium”. A la izquierda están las marcas de bajo coste y a la derecha las de alto valor añadido.
    • Dimensión 2 (eje vertical): Este eje diferencia los dos cuadrantes premium. En la parte superior podríamos encontrar Innovacion_Tecnologica (Samsung) y en la inferior Diseño_Premium (Apple). Este eje podría interpretarse como “Eje de diferenciación premium: tecnología vs. estatus/diseño”.
  3. Posicionamiento y competencia (contando la historia):

    • Cuadrantes claramente definidos: El mapa muestra cuatro posiciones de mercado muy nítidas, una para cada marca.
    • Apple: Se posiciona de forma aislada y fuerte en el cuadrante premium-diseño. Su asociación con Diseño_Premium es casi exclusiva. No compite directamente con nadie en su nicho.
    • Samsung: Ocupa el cuadrante premium-tecnología. Es el principal competidor de Apple en la gama alta, pero su propuesta de valor se basa en la Innovacion_Tecnologica.
    • Xiaomi: Es el rey indiscutible del segmento de “valor por dinero”, fuertemente asociado a Calidad_Precio. Ocupa un espacio intermedio en el eje premium.
    • Alcatel: Se posiciona en el extremo opuesto a Apple, dominando el territorio del bajo coste (Precio_Bajo). Su propuesta es puramente funcional y económica.

Conclusión del caso 1: El mercado está muy estructurado y cada marca tiene un posicionamiento muy claro y bien defendido. La competencia directa es limitada, ya que cada una opera en un cuadrante bien definido.

3.2 Caso práctico 2.2: el universo de las marcas de automóviles

3.2.1 Planteamiento del problema

Una agencia de branding quiere entender las personalidades de marca en el sector automotriz. En lugar de atributos funcionales, han medido la asociación de seis marcas con arquetipos de consumidor o valores de estilo de vida.

Preguntas de negocio: 1. ¿Qué personalidades de marca (arquetipos) dominan el sector? 2. ¿Existen “océanos azules” o espacios de posicionamiento desocupados? 3. ¿Cómo se diferencian marcas que, a priori, podrían parecer similares (ej. BMW y Mercedes)?

3.2.2 Datos y código R

Esta tabla es más compleja. Las asociaciones son más sutiles y hay más “solapamiento” entre marcas.

Code
# --- CASO 2: MARCAS DE COCHES (COMPLEJO) ---

# Crear la tabla de contingencia
# Datos diseñados con más matices y solapamientos
datos_coches <- matrix(
  c(
    # Atributos -> Seguridad, Aventura, Lujo, Rendimiento, Fiabilidad, Innovación
    140,
    10,
    40,
    20,
    50,
    30, # Volvo
    10,
    150,
    15,
    30,
    10,
    10, # Jeep
    40,
    10,
    130,
    110,
    20,
    50, # BMW
    50,
    5,
    140,
    60,
    40,
    70, # Mercedes
    20,
    10,
    10,
    10,
    160,
    20, # Toyota
    30,
    10,
    60,
    80,
    30,
    150 # Tesla
  ),
  nrow = 6,
  byrow = TRUE
)

# Asignar nombres
rownames(datos_coches) <- c(
  "Volvo",
  "Jeep",
  "BMW",
  "Mercedes",
  "Toyota",
  "Tesla"
)
colnames(datos_coches) <- c(
  "Seguridad_Familiar",
  "Espiritu_Aventurero",
  "Lujo_Clasico",
  "Rendimiento_Deportivo",
  "Fiabilidad_Practica",
  "Innovacion_Sostenible"
)

# Convertir a tabla
tabla_coches <- as.table(datos_coches)
knitr::asis_output("#### Tabla de contingencia")

3.2.2.1 Tabla de contingencia

Code
print(tabla_smartphones)
        Diseño_Premium Calidad_Precio Innovacion_Tecnologica Precio_Bajo
Apple              150             10                     20           5
Xiaomi              15            120                     10          10
Samsung             30             15                    140          20
Alcatel              5             15                      5         160
Code
knitr::asis_output("#### Prueba ChiSquare")

3.2.2.2 Prueba ChiSquare

Code
chisq=chisq.test(tabla_coches)
chisq

    Pearson's Chi-squared test

data:  tabla_coches
X-squared = 1836.3, df = 25, p-value < 2.2e-16
Code
knitr::asis_output("#### Residuos estandarizados ajustados")

3.2.2.3 Residuos estandarizados ajustados

Code
chisq$stdres
         Seguridad_Familiar Espiritu_Aventurero Lujo_Clasico
Volvo            16.4849524          -4.3363212   -3.5157437
Jeep             -5.0011860          29.0754849   -5.8078773
BMW              -2.7454331          -5.4051382    7.4748601
Mercedes         -1.2561828          -6.4261504    8.7046388
Toyota           -3.1762068          -3.3158126   -6.7953926
Tesla            -4.3557352          -5.4051382   -2.5306736
         Rendimiento_Deportivo Fiabilidad_Practica Innovacion_Sostenible
Volvo               -4.9703933           0.1492051            -3.7121349
Jeep                -1.5399995          -5.3355538            -5.6610144
BMW                  7.6843198          -6.4250165            -2.2817900
Mercedes            -0.2854976          -3.4046654             0.6360908
Toyota              -5.4447114          22.7547844            -3.9390508
Tesla                2.9812077          -4.8573125            13.0137255
Code
knitr::asis_output("#### Análisis de correspondencias")

3.2.2.4 Análisis de correspondencias

Code
# Realizar el análisis de correspondencias
# Realizar el análisis de correspondencias
ca_coches <- ca(tabla_coches)

# Resumen del análisis
print(summary(ca_coches))
$scree
           values   values2   values3
[1,] 1 0.46785260 46.624981  46.62498
[2,] 2 0.30905460 30.799583  77.42456
[3,] 3 0.14610802 14.560747  91.98531
[4,] 4 0.06967519  6.943649  98.92896
[5,] 5 0.01074722  1.071040 100.00000

$rows
  name mass  qlt  inr  k=1  cor ctr   k=2 cor ctr
1 Volv  158  163  132 -270   88  25  -251  76  32
2 Jeep  123 1000  408 1825 1000 875    -6   0   0
3  BMW  197  665   72 -213  124  19   444 540 126
4 Mrcd  199  692   47 -302  387  39   268 305  46
5 Toyt  126  926  249 -249   31  17 -1332 895 722
6 Tesl  197  370   93 -244  126  25   340 244  74

$columns
  name mass  qlt  inr  k=1 cor ctr   k=2 cor ctr
1 Sg_F  158  115  129 -280  96  27  -127  20   8
2 Es_A  107  999  412 1968 998 882   -69   1   2
3 Lj_C  216  646   82 -261 180  32   420 466 123
4 Rn_D  169  676   47  -67  16   2   428 660 100
5 Fb_P  169  948  244 -277  53  28 -1137 895 708
6 In_S  180  370   87 -280 163  30   315 206  58

attr(,"class")
[1] "summary.ca"
Code
# Visualización del mapa perceptual
fviz_ca_biplot(
  ca_coches,
  repel = TRUE,
  ggtheme = ggthemes::theme_economist(),
  title = "Mapa del sector automóvil"
) +
  labs(subtitle = "Basado en asociaciones de estilo de vida y valores")

3.2.3 Guía de interpretación (solución)

  1. Análisis de la inercia: Aquí, las dos primeras dimensiones explicarán un porcentaje menor que en el caso 1 (quizás entre 70-85%). Esto es una lección importante: en mercados más complejos, un mapa 2D es una simplificación útil, pero no cuenta toda la historia. Hay más matices.

  2. Interpretación de los ejes (aquí se necesita la “literatura”):

    • Dimensión 1 (eje horizontal): En un extremo veremos Fiabilidad_Practica (Toyota) y en el otro un cúmulo de atributos como Lujo_Clasico, Rendimiento_Deportivo (BMW, Mercedes). Este eje puede interpretarse usando la teoría de la motivación del consumidor: “Eje utilitario vs. hedonista/simbólico”. A la izquierda está la compra racional y funcional; a la derecha, la compra emocional, aspiracional y de autoexpresión.
    • Dimensión 2 (eje vertical): En un polo podríamos tener Seguridad_Familiar (Volvo) y en el otro Espiritu_Aventurero (Jeep). Este eje habla de valores más profundos: “Eje de responsabilidad/comunidad vs. libertad/individualismo”. Representa la tensión entre el arquetipo del “Cuidador” (Volvo) y el del “Explorador” (Jeep).
  3. Posicionamiento y competencia (contando la historia):

    • El territorio racional y utilitarista: Toyota es el dueño absoluto del posicionamiento basado en la racionalidad y la fiabilidad. Está aislado, lo que indica una propuesta de valor muy fuerte y diferenciada.
    • La batalla por el lujo tradicional: BMW y Mercedes aparecen muy cerca, confirmando que son competidores directos en el espacio del lujo. Sin embargo, el mapa revela su sutil diferenciación. BMW está ligeramente más proyectado hacia Rendimiento_Deportivo, mientras que Mercedes se asocia más con Lujo_Clasico. Compiten por el arquetipo del “Gobernante”, pero con matices.
    • Los arquetipos de estilo de vida: Volvo y Jeep definen los polos del eje vertical. No compiten entre sí; apelan a valores y estilos de vida completamente opuestos. Volvo es el “Cuidador”, Jeep es el “Explorador”.
    • El disruptor (océano azul): Tesla ocupa un espacio único. Está en el lado “hedonista/simbólico”, pero no compite directamente con el lujo tradicional de BMW/Mercedes. Crea un nuevo eje de valor con Innovacion_Sostenible. Atrae al arquetipo del “Mago” o el “Creador”. Tesla ha creado un nuevo sub-segmento de lujo basado en la tecnología y la conciencia ecológica, un verdadero océano azul.

Conclusión del caso 2: El mercado automotriz no se define por un solo eje de competencia, sino por múltiples tensiones de valores. Mientras algunas marcas compiten ferozmente en territorios establecidos (lujo tradicional), otras han logrado crear y dominar nichos basados en arquetipos de estilo de vida (Volvo, Jeep) o han redefinido el mercado por completo (Tesla).

Introducimos ahora una fila “Ideal”, con un perfil promedio.

Code
# --- CASO 2: MARCAS DE COCHES (COMPLEJO) ---
# Crear la tabla de contingencia
# Datos diseñados con más matices y solapamientos
datos_coches <- matrix(
  c(
    # Atributos -> Seguridad, Aventura, Lujo, Rendimiento, Fiabilidad, Innovación
    140,
    10,
    40,
    20,
    50,
    30, # Volvo
    10,
    150,
    15,
    30,
    10,
    10, # Jeep
    40,
    10,
    130,
    110,
    20,
    50, # BMW
    50,
    5,
    140,
    60,
    40,
    70, # Mercedes
    20,
    10,
    10,
    10,
    160,
    20, # Toyota
    30,
    10,
    60,
    80,
    30,
    150, # Tesla
    100,
    5,
    5,
    100,
    100,
    75 # Ideal
  ),
  nrow = 7,
  byrow = TRUE
)

# Asignar nombres
rownames(datos_coches) <- c(
  "Volvo",
  "Jeep",
  "BMW",
  "Mercedes",
  "Toyota",
  "Tesla",
  "Ideal"
)
colnames(datos_coches) <- c(
  "Seguridad_Familiar",
  "Espiritu_Aventurero",
  "Lujo_Clasico",
  "Rendimiento_Deportivo",
  "Fiabilidad_Practica",
  "Innovacion_Sostenible"
)

# Convertir a tabla
tabla_coches <- as.table(datos_coches)
knitr::asis_output("#### Tabla de contingencia: Marcas de coches")

3.2.3.1 Tabla de contingencia: Marcas de coches

Y lanzamos de nuevo el análisis. Este no se ve modificado, pero sí se calculan las nuevas coordenadas en el mapa para el punto “Ideal”.

Code
print(tabla_coches)
         Seguridad_Familiar Espiritu_Aventurero Lujo_Clasico
Volvo                   140                  10           40
Jeep                     10                 150           15
BMW                      40                  10          130
Mercedes                 50                   5          140
Toyota                   20                  10           10
Tesla                    30                  10           60
Ideal                   100                   5            5
         Rendimiento_Deportivo Fiabilidad_Practica Innovacion_Sostenible
Volvo                       20                  50                    30
Jeep                        30                  10                    10
BMW                        110                  20                    50
Mercedes                    60                  40                    70
Toyota                      10                 160                    20
Tesla                       80                  30                   150
Ideal                      100                 100                    75
Code
# Realizar el análisis de correspondencias
ca_coches <- ca(tabla_coches, suprow = 7)

# Resumen del análisis
print(summary(ca_coches))
$scree
           values   values2   values3
[1,] 1 0.46785260 46.624981  46.62498
[2,] 2 0.30905460 30.799583  77.42456
[3,] 3 0.14610802 14.560747  91.98531
[4,] 4 0.06967519  6.943649  98.92896
[5,] 5 0.01074722  1.071040 100.00000

$rows
     name mass  qlt  inr  k=1  cor ctr   k=2 cor ctr
1    Volv  158  163  132 -270   88  25  -251  76  32
2    Jeep  123 1000  408 1825 1000 875    -6   0   0
3     BMW  197  665   72 -213  124  19   444 540 126
4    Mrcd  199  692   47 -302  387  39   268 305  46
5    Toyt  126  926  249 -249   31  17 -1332 895 722
6    Tesl  197  370   93 -244  126  25   340 244  74
7 (*)Idel   NA  356   NA -285  186  NA  -272 170  NA

$columns
  name mass  qlt  inr  k=1 cor ctr   k=2 cor ctr
1 Sg_F  158  115  129 -280  96  27  -127  20   8
2 Es_A  107  999  412 1968 998 882   -69   1   2
3 Lj_C  216  646   82 -261 180  32   420 466 123
4 Rn_D  169  676   47  -67  16   2   428 660 100
5 Fb_P  169  948  244 -277  53  28 -1137 895 708
6 In_S  180  370   87 -280 163  30   315 206  58

attr(,"class")
[1] "summary.ca"

El mapa ahora ya muestra el resultado de la inclusión del perfil “Ideal”.

Code
# Visualización del mapa perceptual
fviz_ca_biplot(
  ca_coches,
  repel = TRUE,
  ggtheme = ggthemes::theme_economist(),
  title = "Mapa del sector automotriz"
) +
  labs(subtitle = "Basado en asociaciones de estilo de vida y valores")