# Loading necessary libraries
pacman::p_load(
tidyverse,
expss,
psych,
factoextra,
corrplot,
Hmisc
)
# Loading dataset
# Usamos el objeto 'hbat' (HBAT.sav) habitual en nuestras sesiones
hbat <- read_spss("data/hbat.sav")
# Selección de variables métricas para el análisis (X6 a X18)
# Estas variables representan percepciones de los clientes sobre la empresa
data_pca <- hbat %>%
select(x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18)Sesión 4
Análisis de componentes principales (ACP)
El Análisis de componentes principales (ACP) se sitúa dentro de las técnicas multivariantes de interdependencia, lo que significa que no distinguimos entre variables dependientes e independientes; nuestro objetivo es entender la estructura de relaciones de todo el conjunto de datos simultáneamente.
En el ámbito de la investigación de mercados, nos enfrentamos habitualmente a cuestionarios con decenas de atributos (por ejemplo, valoraciones de marca, hábitos de consumo o estilos de vida). Trabajar con tantas variables de forma aislada dificulta la toma de decisiones. El ACP actúa como una herramienta de reducción de la dimensionalidad, permitiéndonos:
- Simplificar la complejidad: Transformamos un conjunto amplio de variables métricas que suelen estar altamente correlacionadas entre sí en un número menor de variables ficticias llamadas componentes.
- Garantizar la independencia: A diferencia de las variables originales, los componentes resultantes son ortogonales (no están correlacionados), lo que elimina la redundancia de información.
- Identificar dimensiones latentes: El ACP nos ayuda a descubrir conceptos no observados directamente. Por ejemplo, a partir de variables como “limpieza”, “amabilidad del personal” y “rapidez de respuesta”, el ACP puede revelar una dimensión única de “Calidad de Servicio”.
- Optimizar análisis posteriores: Estas nuevas dimensiones (puntuaciones factoriales) sirven como input perfecto para técnicas de segmentación (Cluster Analysis) o modelos de regresión, evitando problemas de multicolinealidad.
Un ejemplo real: La escala E-S-QUAL
Para entender cómo el ACP se aplica en la vanguardia de la investigación de mercados, podemos observar el proceso de creación de escalas de medida profesionales, como la E-S-QUAL. En marketing, conceptos como la “calidad de servicio electrónico” no pueden medirse con una sola pregunta; son fenómenos multidimensionales.
Este flujo de trabajo, basado en (Parasuraman et al. 2005) resume perfectamente el camino que seguiremos en esta sesión:
- Generación de ítems: Se parte de una batería amplia de preguntas (a veces más de 100) que intentan cubrir todos los ángulos del fenómeno.
- Refinamiento y purificación: Aquí es donde el ACP es el protagonista. Mediante el análisis de las correlaciones y la eliminación de variables que no aportan valor (bajo MSA o bajas comunalidades), “limpiamos” la escala.
- Identificación de dimensiones: El ACP nos permite agrupar los ítems finales en dimensiones críticas. En el caso de E-S-QUAL, lo que empezó como una masa de datos terminó definiendo cuatro pilares: Eficiencia, Cumplimiento, Disponibilidad del Sistema y Privacidad.
- Validación: Una vez reducida la dimensionalidad, las puntuaciones de estos componentes se convierten en las variables que realmente explican la satisfacción y lealtad del cliente.
Reflexión para el analista: El ACP no es solo un algoritmo matemático; es el filtro que permite separar el ruido de la encuesta de las señales estratégicas del mercado. Sin esta reducción, sería imposible construir modelos de gestión accionables.
Caso de ejemplo: HBAT
¿La gran pregunta?
La adecucación de los datos a la técnica
Preparación del entorno y datos
Como hemos visto en el ejemplo anterior, trabajaremos con el dataset hbat, que contiene 13 variables de percepción (X6 a X18) que intentaremos reducir a dimensiones de gestión.
# Cargamos librerías y datos (objeto 'hbat' ya conocido)
pacman::p_load(tidyverse, expss, psych, factoextra, corrplot, Hmisc)
# Seleccionamos el bloque de variables de percepción para el análisis
# Este será nuestro "pool" de ítems a purificar
data_pca <- hbat %>%
select(x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18)
# Inspección previa: Matriz de correlaciones
# Si no hay correlaciones significativas (>0.30), el ACP no tiene sentido
cor(data_pca) x6 x7 x8 x9 x10 x11
x6 1.00000000 -0.1371632174 0.0956004542 0.10637000 -0.05347313 0.47749341
x7 -0.13716322 1.0000000000 0.0008667887 0.14017926 0.42989071 -0.05268784
x8 0.09560045 0.0008667887 1.0000000000 0.09665660 -0.06287007 0.19262546
x9 0.10637000 0.1401792611 0.0966565978 1.00000000 0.19691685 0.56141695
x10 -0.05347313 0.4298907110 -0.0628700668 0.19691685 1.00000000 -0.01155082
x11 0.47749341 -0.0526878383 0.1926254565 0.56141695 -0.01155082 1.00000000
x12 -0.15181287 0.7915437115 0.0169905395 0.22975176 0.54220366 -0.06131553
x13 -0.40128188 0.2294624014 -0.2707866821 -0.12795425 0.13421689 -0.49494840
x14 0.08831231 0.0518981915 0.7971679258 0.14040830 0.01079207 0.27307753
x15 0.02698820 -0.0274278083 -0.0735789868 0.05940111 0.08416610 0.04616424
x16 0.10430307 0.1561473316 0.0801018246 0.75686859 0.18423559 0.42440825
x17 -0.49313812 0.2706674197 -0.1860963881 0.39450634 0.33355482 -0.37796681
x18 0.02771800 0.1916360683 0.0254406935 0.86509170 0.27586308 0.60185021
x12 x13 x14 x15 x16 x17
x6 -0.15181287 -0.40128188 0.08831231 0.02698820 0.10430307 -0.49313812
x7 0.79154371 0.22946240 0.05189819 -0.02742781 0.15614733 0.27066742
x8 0.01699054 -0.27078668 0.79716793 -0.07357899 0.08010182 -0.18609639
x9 0.22975176 -0.12795425 0.14040830 0.05940111 0.75686859 0.39450634
x10 0.54220366 0.13421689 0.01079207 0.08416610 0.18423559 0.33355482
x11 -0.06131553 -0.49494840 0.27307753 0.04616424 0.42440825 -0.37796681
x12 1.00000000 0.26459655 0.10745534 0.03164009 0.19512741 0.35224073
x13 0.26459655 1.00000000 -0.24498605 0.02316342 -0.11456703 0.47110961
x14 0.10745534 -0.24498605 1.00000000 0.03519937 0.19706512 -0.17025280
x15 0.03164009 0.02316342 0.03519937 1.00000000 0.06853933 0.09413139
x16 0.19512741 -0.11456703 0.19706512 0.06853933 1.00000000 0.40696774
x17 0.35224073 0.47110961 -0.17025280 0.09413139 0.40696774 1.00000000
x18 0.27155126 -0.07287173 0.10939460 0.10574950 0.75100307 0.49669481
x18
x6 0.02771800
x7 0.19163607
x8 0.02544069
x9 0.86509170
x10 0.27586308
x11 0.60185021
x12 0.27155126
x13 -0.07287173
x14 0.10939460
x15 0.10574950
x16 0.75100307
x17 0.49669481
x18 1.00000000
Diagnóstico de la matriz de correlaciones
En una matriz de \(k \times k\) variables, el número de correlaciones únicas (la diagonal superior o inferior, sin contar la diagonal principal de 1s) viene dado por la fórmula: \[\frac{k^2 - k}{2}\] Para revelar cuántas de estas son significativas (por ejemplo, con un \(|r| > 0.30\) según los criterios de Hair), podemos usar una lógica de filtrado sobre la matriz. Si el número de correlaciones significativas es bajo, el ACP no conseguirá reducir la información de forma eficiente.
# 1. Generate the correlation matrix
# We use the final set of variables from the previous step
cor_matrix <- cor(data_pca)
# 2. Extract only the unique coefficients (upper triangle)
# and convert them to a vector to count
unique_cors <- cor_matrix[upper.tri(cor_matrix)]
# 3. Calculate metrics for the instructor's explanation
total_unique <- length(unique_cors)
significant <- sum(abs(unique_cors) >= 0.30)
pct_significant <- (significant / total_unique) * 100
# Printing results for class discussion
cat("Total unique correlations:", total_unique, "\n")Total unique correlations: 78
Correlations with |r| > 0.30: 21
Percentage of significant correlations: 26.92 %
Tras ejecutar el conteo, observamos que 21 de las 78 correlaciones únicas (26.92) superan el umbral de 0.30. Aunque no es una matriz extremadamente densa, este ~30% justifica proceder con el análisis. Sin embargo, este dato “tibio” ya nos anticipa que probablemente algunas variables no encajarán bien en la estructura común y deberán ser eliminadas en el proceso de depuración de la escala.
¿Es suficiente? Esa es la pregunta clave que todo analista debe hacerse antes de seguir. La respuesta corta es sí, es un punto de partida suficiente, pero requiere matices técnicos que son los que tus alumnos deben aprender a diagnosticar.
En investigación de mercados, bajo los criterios de Hair et al., un 30% de correlaciones significativas (con \(|r| > 0.30\)) suele ser el umbral mínimo aceptable para que el ACP tenga sentido. Si fuera menor, estaríamos intentando resumir variables que no tienen nada en común, lo que daría lugar a una solución factorial muy pobre donde cada variable “va por libre”.
Adecuación a los requisitos del análisis
Una vez que la inspección visual nos sugiere que existe relación entre las variables, debemos formalizar estadísticamente si el banco de datos es apto para un ACP. No basta con que existan correlaciones significativas; estas deben ser lo suficientemente fuertes y el conjunto de datos lo suficientemente consistente. Nos apoyaremos en dos indicadores clásicos que actúan como “llave de paso” antes de proceder a la extracción de componentes:
El índice de Kaiser-Meyer-Olkin (KMO)
El KMO es una medida de la adecuación muestral. Compara los coeficientes de correlación observados con los coeficientes de correlación parcial. Si las correlaciones parciales son pequeñas en comparación con las correlaciones originales, el índice será alto, lo cual es la señal que buscamos.
Siguiendo la clasificación de Kaiser y Rice (1974), interpretamos el valor obtenido:
- KMO > 0.90: Maravilloso.
- 0.80 - 0.90: Meritorio.
- 0.70 - 0.80: Medio.
- 0.60 - 0.70: Mediocre (aceptado como límite inferior en investigación de mercados).
- < 0.50: Inaceptable. En este punto, el análisis no debe continuar sin antes depurar las variables.
La prueba de esfericidad de Bartlett
Esta prueba evalúa la aplicabilidad del análisis desde una perspectiva global de la matriz. Contrasta la hipótesis nula (\(H_0\)) de que nuestra matriz de correlaciones es, en realidad, una matriz identidad (una matriz donde no hay correlación entre ninguna variable, solo de cada variable consigo misma).
- Si el p-value \(\leq\) 0.05: Rechazamos la \(H_0\). Tenemos evidencia de que existe una estructura de correlación significativa y podemos aplicar el ACP con garantías.
- Si el p-value > 0.05: No podemos asegurar que las variables estén relacionadas. En este escenario, el ACP no conseguirá reducir la dimensionalidad de forma efectiva porque no hay “patrones comunes” que agrupar.
El KMO nos habla de la calidad de la relación entre las variables para ser reducidas, mientras que Bartlett nos confirma la existencia de dicha relación.
[1] 0.6087046
Bartlett's p-value: 8.81589e-150
Proceso iterativo de purificación (MSA individual)
Siguiendo el flujo de trabajo de “purificación” que veíamos en el esquema de Parasuraman, no basta con el KMO global. Debemos mirar los MSA individuales (la diagonal de la matriz KMO). Aquellas variables que no alcancen un mínimo (habitualmente 0.50) están “ensuciando” el modelo.
x6 x7 x8 x9 x10 x11 x12 x13
0.8733349 0.6201707 0.5270181 0.8895112 0.8066328 0.4478469 0.5862796 0.8791773
x14 x15 x16 x17 x18
0.5293082 0.3144405 0.8588912 0.4423739 0.5331944
- Observamos que X15 tiene el MSA más bajo (por debajo de 0.50).
- Procedemos a eliminarla y recalculamos.
- Tras eliminar X15, evaluamos X17, que será la siguiente en caer según la secuencia lógica de tus diapositivas.
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = data_step1)
Overall MSA = 0.61
MSA for each item =
x6 x7 x8 x9 x10 x11 x12 x13 x14 x16 x17 x18
0.88 0.62 0.53 0.89 0.80 0.45 0.59 0.88 0.53 0.86 0.44 0.53
Nuevamente, vemos que x11 y x17 están por debajo de 0.5, pero ésta última (x17) es menor, por lo que reiteramos el mismo proceso y optamos por su eliminación.
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = data_step2)
Overall MSA = 0.65
MSA for each item =
x6 x7 x8 x9 x10 x11 x12 x13 x14 x16 x18
0.51 0.63 0.52 0.79 0.78 0.62 0.62 0.75 0.51 0.76 0.67
Nótese, y este es el motivo por el que eliminamos de una en una, x11 se ha recuperado. No obstante, hay que controlar esta variable que nos da señales de incoherencia con el resto del conjunto de datos.
Determinación del número de componentes
Una de las decisiones más críticas en el ACP es determinar cuántos componentes debemos retener. No se trata de una decisión arbitraria, sino que debe estar respaldada por criterios estadísticos que equilibren la parsimonia (quedarnos con pocos componentes) y la capacidad explicativa (no perder demasiada información).
Para tomar esta decisión, nos basamos en tres criterios fundamentales:
Criterio de los Autovalores (Eigenvalues) > 1
El autovalor asociado a un componente principal mide la cantidad total de varianza que dicho componente es capaz de recoger. Dado que en el ACP trabajamos con variables estandarizadas (donde cada variable original tiene una varianza de 1), solo tiene sentido retener aquellos componentes que expliquen, al menos, la varianza de una sola variable.
Lógica: Si un componente tiene un autovalor menor que 1, significa que aporta menos información que una variable original aislada, por lo que no cumple su función de síntesis.
Porcentaje de la varianza explicada
Aunque el objetivo principal sea la reducción de datos (explicar con menos elementos lo que antes explicaban muchas variables), este proceso conlleva inevitablemente una pérdida de información (varianza).
Umbral recomendado: En el ámbito del marketing y la investigación de mercados, se suele aceptar una solución que sea capaz de recoger al menos el 60% de la varianza original (Hair et al. 2006). Ganar interpretabilidad no debe costarnos una pérdida excesiva de precisión.
Gráfico de sedimentación (Scree plot)
Es la representación visual de los autovalores de cada componente ordenados de mayor a menor. Al analizar esta gráfica, buscamos la regla del codo (Elbow rule):
Interpretación: Debemos detenernos en el punto en que la curva se aplana significativamente. A partir de ese “codo”, añadir nuevos componentes no incrementa de forma relevante la varianza explicada, y la varianza de los factores únicos empieza a dominar sobre la de los factores comunes. Debemos quedarnos con el número de componentes anterior al codo.
Determinar el número de componentes es un ejercicio de compromiso. Un modelo con demasiados componentes no reduce la complejidad, mientras que uno con muy pocos puede estar ignorando dimensiones estratégicas del mercado que son vitales para la toma de decisiones.
Extracción y rotación de componentes
Utilizaremos el método de Componentes Principales con rotación Varimax. La rotación ortogonal Varimax simplifica la interpretación al minimizar el número de variables con cargas altas en un solo factor.
# Calculate the eigenvalues from the correlation matrix
# We use the 'data_step2' which is already purified (without X15 and X17)
eigen_values <- eigen(cor(data_step2))$values
# Determine the number of factors (Eigenvalues >= 1)
# This mimics the default behavior of SPSS
n_factors_auto <- sum(eigen_values >= 1)
# Run the Principal Component Analysis with the automated number
pca_final <- principal(data_step2,nfactors = n_factors_auto, rotate = "varimax")
# Displaying the decision for the students
cat("The number of components retained (Eigenvalues >= 1) is:", n_factors_auto, "\n")The number of components retained (Eigenvalues >= 1) is: 4
Principal Components Analysis
Call: principal(r = data_step2, nfactors = n_factors_auto, rotate = "varimax")
Standardized loadings (pattern matrix) based upon correlation matrix
RC1 RC2 RC3 RC4 h2 u2 com
x6 0.00 -0.01 -0.03 0.88 0.77 0.232 1.0
x7 0.06 0.87 0.05 -0.12 0.78 0.223 1.1
x8 0.02 -0.02 0.94 0.10 0.89 0.107 1.0
x9 0.93 0.12 0.05 0.09 0.88 0.119 1.1
x10 0.14 0.74 -0.08 0.01 0.58 0.424 1.1
x11 0.59 -0.06 0.15 0.64 0.79 0.213 2.1
x12 0.13 0.90 0.08 -0.16 0.86 0.141 1.1
x13 -0.09 0.23 -0.25 -0.72 0.64 0.359 1.5
x14 0.11 0.05 0.93 0.10 0.89 0.108 1.1
x16 0.86 0.11 0.08 0.04 0.77 0.234 1.1
x18 0.94 0.18 0.00 0.05 0.91 0.086 1.1
RC1 RC2 RC3 RC4
SS loadings 2.89 2.23 1.86 1.77
Proportion Var 0.26 0.20 0.17 0.16
Cumulative Var 0.26 0.47 0.63 0.80
Proportion Explained 0.33 0.26 0.21 0.20
Cumulative Proportion 0.33 0.59 0.80 1.00
Mean item complexity = 1.2
Test of the hypothesis that 4 components are sufficient.
The root mean square of the residuals (RMSR) is 0.04
with the empirical chi square 19.51 with prob < 0.3
Fit based upon off diagonal values = 0.98
Observación sobre x11 y sus cargas cruzadas en componente RC1 y RC4. Luego veremos que hay un indicador com que nos está dando la explicación.
# Run the Principal Component Analysis with the automated number
data_step3 <- data_step2 %>% select(-x11)
pca_final <- principal(data_step3,nfactors = n_factors_auto, rotate = "varimax")
# Displaying the decision for the students
cat("The number of components retained (Eigenvalues >= 1) is:", n_factors_auto, "\n")The number of components retained (Eigenvalues >= 1) is: 4
Principal Components Analysis
Call: principal(r = data_step3, nfactors = n_factors_auto, rotate = "varimax")
Standardized loadings (pattern matrix) based upon correlation matrix
RC1 RC2 RC3 RC4 h2 u2 com
x6 0.03 -0.01 -0.02 0.89 0.80 0.20 1.0
x7 0.06 0.87 0.05 -0.14 0.78 0.22 1.1
x8 0.02 -0.02 0.94 0.10 0.89 0.11 1.0
x9 0.93 0.10 0.06 0.08 0.89 0.11 1.0
x10 0.16 0.74 -0.08 0.04 0.58 0.42 1.1
x12 0.14 0.90 0.08 -0.17 0.86 0.14 1.1
x13 -0.10 0.23 -0.26 -0.73 0.66 0.34 1.5
x14 0.10 0.05 0.93 0.08 0.89 0.11 1.0
x16 0.89 0.10 0.09 0.07 0.81 0.19 1.1
x18 0.93 0.17 0.00 0.01 0.89 0.11 1.1
RC1 RC2 RC3 RC4
SS loadings 2.59 2.22 1.85 1.41
Proportion Var 0.26 0.22 0.18 0.14
Cumulative Var 0.26 0.48 0.67 0.81
Proportion Explained 0.32 0.28 0.23 0.17
Cumulative Proportion 0.32 0.60 0.83 1.00
Mean item complexity = 1.1
Test of the hypothesis that 4 components are sufficient.
The root mean square of the residuals (RMSR) is 0.04
with the empirical chi square 17.86 with prob < 0.085
Fit based upon off diagonal values = 0.98
Interpretación de la salida de principal() en R
Al ejecutar el análisis en R, obtenemos una matriz que combina las cargas factoriales con indicadores de calidad del ajuste. R lo integra todo en una sola vista.
Las nuevas dimensiones: RC1, RC2, RC3…
- ¿Qué significan?: Son los Componentes Rotados (del inglés Rotated Components). El número que los acompaña indica el orden de extracción.
- Equivalencia en SPSS: Corresponden a las columnas de la “Matriz de componentes rotados”.
- Interpretación: Los valores que vemos son las cargas factoriales (correlación entre la variable original y el componente). Recordad que buscamos cargas \(> 0.50\) para asignar una variable a un componente, siguiendo a Hair et al. (2006).
Los indicadores de calidad: h2, u2 y com
Estas tres columnas finales son el “chequeo médico” de cada variable en nuestro modelo:
- h2 (Comunalidad):
- Es la proporción de la varianza de la variable que es explicada por los componentes retenidos.
- Equivalencia en SPSS: Es la columna “Extracción” de la tabla de Comunalidades.
- Umbral: Deseamos valores superiores a 0.50. Una \(h^2\) baja indica que la variable no tiene nada que ver con las demás y “ensucia” el análisis.
- u2 (Unicidad):
- Es simplemente el inverso de la comunalidad (\(1 - h^2\)).
- Representa la varianza específica de la variable que no ha podido ser capturada por los componentes comunes. Cuanto más alto sea el \(u^2\), menos útil es esa variable para definir conceptos generales.
- com (Complexity):
- Este índice es un “regalo” de R que no aparece de forma directa en SPSS. Mide la Complejidad de Hoffman.
- Interpretación: Nos dice si una variable carga de forma limpia en un solo componente (valor cercano a 1) o si es una variable “conflictiva” que carga en varios componentes a la vez (valor cercano a 2 o superior).
- Utilidad: Es vital para detectar cargas cruzadas. Si una variable tiene una complejidad alta, es candidata a ser eliminada para mejorar la interpretabilidad del modelo (como ocurrió con X11 en nuestro ejemplo).
R te permite ver de un vistazo si una variable es importante para un componente (RC), si el modelo la explica bien (h2) y si es una variable limpia o compleja (com).
Comunalidades SPSS / Unicidad R
SPSS muestra la comunalidad, inverso de la unicidad. R también la calcula y aque vemos con este simple script su relación
Comunalidad:
x6 x7 x8 x9 x10 x12 x13 x14
0.7979811 0.7796785 0.8937300 0.8895521 0.5848385 0.8595670 0.6609157 0.8907841
x16 x18
0.8060437 0.8940676
Unicidad:
x6 x7 x8 x9 x10 x12 x13 x14
0.2020189 0.2203215 0.1062700 0.1104479 0.4151615 0.1404330 0.3390843 0.1092159
x16 x18
0.1939563 0.1059324
Relación:
x6 x7 x8 x9 x10 x12 x13 x14 x16 x18
1 1 1 1 1 1 1 1 1 1
No olvidemos, aunque sería raro que no fuera bien, el testar finalmente los indicadores básicos de adecuación.
KMO: 0.6087046
Bartlett's p-value: 8.81589e-150
Para quedarnos con una vista más limpia de la matriz de cargas podemos usar el argumento cutoff = ... y hacer lo mismo que SPSS (valor 0.3).
Loadings:
RC1 RC2 RC3 RC4
x9 0.933
x16 0.886
x18 0.931
x7 0.868
x10 0.743
x12 0.898
x8 0.940
x14 0.933
x6 0.892
x13 -0.730
RC1 RC2 RC3 RC4
SS loadings 2.589 2.216 1.846 1.406
Proportion Var 0.259 0.222 0.185 0.141
Cumulative Var 0.259 0.481 0.665 0.806
Criterios de significación de las cargas factoriales
En la práctica habitual, solemos aceptar cargas factoriales superiores a 0.50 como indicador de una relación sólida. Sin embargo, la evidencia científica (Hair et al. 2006; Stevens 1992) nos indica que la “importancia” de una carga no es un valor absoluto, sino que depende directamente del rigor estadístico que nos imponga el tamaño de nuestra muestra (\(n\)).
Relación entre carga factorial y tamaño muestral
Como se observa en la primera tabla, a medida que aumenta el tamaño de la muestra, el error estándar disminuye, lo que nos permite aceptar como significativas cargas factoriales más pequeñas:
- Para muestras pequeñas (\(n=50\)), necesitamos cargas muy potentes (0.75) para asegurar que la relación no es fruto del azar.
- En nuestro caso (
hbat.sav), con \(n=100\), el umbral de significación estadística se sitúa en 0.55. - Si trabajáramos con muestras grandes (\(n > 350\)), una carga de 0.30 ya podría considerarse significativa.
Relación entre carga factorial y el número de variables
La segunda tabla introduce un matiz crucial basado en el número de variables analizadas (\(p\)). (Stevens 1992) sugiere que el punto de corte debe ajustarse para mantener un nivel de significación estable (generalmente \(\alpha = 0.01\)).
| Variables (\(p\)) | Carga mínima (\(n=50\)) | Carga mínima (\(n=100\)) |
|---|---|---|
| 10 | 0.722 | 0.512 |
| 20 | 0.754 | 0.534 |
| 30 | 0.780 | 0.552 |
Implicación estratégica: Dado que nuestra escala original tiene 13 variables y 100 casos, el criterio de Stevens (1992) sitúa nuestro punto de corte ideal ligeramente por encima de 0.51. Esto refuerza nuestra decisión de haber sido estrictos en la purificación inicial de la escala.
Interpretación de los nuevos componentes
Basándonos en la matriz rotada, identificamos las dimensiones subyacentes:
- C1: Servicio postventa: (X9: Resolución de quejas, X18: Rapidez de entrega, X16: Pedidos).
- C2: Actividad comercial: (X12: Imagen vendedores, X7: e-Commerce, X10: Publicidad).
- C3: Soporte técnico y postventa: (X8: Apoyo técnico, X14: Garantía).
- C4: Valor de producto: (X6: Calidad producto, X13: Competitividad precios).
Las puntuaciones factoriales
Tras identificar las dimensiones latentes (como “Servicio postventa” o “Calidad de producto”), el siguiente paso es cuantificar cómo puntúa cada cliente en cada una de esas nuevas dimensiones. Aquí es donde entran en juego los scores o puntuaciones factoriales, un cálculo que se ha realizado de forma interna en nuestro análisis.
¿Qué son exactamente las puntuaciones?
Si el ACP es un modelo donde cada componente se explica mediante una combinación lineal de las variables originales, la puntuación factorial es el valor numérico que obtiene cada individuo (encuestado) en ese nuevo eje o dimensión.
- Cada cliente de la base de datos deja de tener solo sus respuestas originales (X6, X7…) para tener 4 nuevos valores correspondientes a los 4 componentes extraídos.
- Estas puntuaciones están estandarizadas: tienen media 0 y varianza 1. Por tanto, un cliente con un score de +1.5 en “Servicio postventa” está muy por encima de la media de satisfacción en esa área, mientras que uno con -2.0 representa un punto de fricción crítico para la empresa.
Utilidad estratégica, puente hacia la segmentación (Cluster)
La creación de estas variables no es un fin en sí mismo, sino el combustible para análisis avanzados que veremos en las próximas sesiones:
- Segmentación de mercado (Análisis Cluster): Esta es la aplicación reina. En lugar de segmentar clientes por variables aisladas (que suelen estar correlacionadas y “pesan” doble en el algoritmo), utilizamos los scores. Al ser ortogonales (independientes entre sí), garantizamos que cada dimensión de segmentación sea única, permitiendo identificar grupos de clientes con necesidades claramente diferenciadas (ej. “Los sensibles al precio” vs. “Los que valoran el soporte técnico”).
- Modelos de Regresión: Si quisiéramos predecir la “Intención de compra” (X19) utilizando las percepciones, usar las 13 variables originales causaría problemas de multicolinealidad. Al usar los scores, resolvemos este problema técnico de raíz, obteniendo coeficientes mucho más estables y fiables.
- Mapas de Posicionamiento: Podemos cruzar dos componentes (ej. Eje X: Calidad vs. Eje Y: Precio) y situar a cada cliente (o la media de un segmento) en un mapa bidimensional para visualizar la ventaja competitiva de la marca.
RC1 RC2 RC3 RC4
[1,] 0.29462834 0.76695298 -1.893546629 0.701150099
[2,] 1.13877155 -1.66242309 -0.575796984 0.575534324
[3,] 0.66657689 0.58054221 0.017132131 1.610980329
[4,] -0.91822907 -0.24575648 1.229367774 -1.257671062
[5,] -0.31996010 -0.83374908 -0.001359746 0.440602680
[6,] -0.66792332 -1.05337993 -1.329738840 -0.983677310
[7,] -2.57511375 -0.22662161 -0.590328429 -1.022039138
[8,] -0.13114244 -0.15564480 -0.788595321 -0.618810164
[9,] 0.91656239 -0.18321978 -0.091219985 -1.902697327
[10,] 0.35280590 0.75789051 -0.446448990 -1.056714929
[11,] -0.23058929 -0.76845895 -0.437298939 0.365620573
[12,] -1.47009058 1.37122979 0.420629492 -1.080671934
[13,] 0.64447711 2.10023568 -0.141866502 0.783516171
[14,] 0.21264382 -0.40780812 0.481051327 0.366684993
[15,] 1.28983384 0.64740110 -0.248369849 -1.389454237
[16,] 0.87000239 -1.07268996 -0.518096471 0.974932533
[17,] 0.50410778 -0.33463543 1.106074201 -1.060676915
[18,] 1.61453830 -0.18121994 0.255586307 -1.657281415
[19,] 1.05198170 -0.42712610 -0.386025106 -1.917389589
[20,] 0.41379674 1.76537826 -0.949006219 0.419327057
[21,] -0.68210353 -0.17160064 1.500108064 -1.868414283
[22,] -0.18210609 2.83183785 0.688587212 1.889801810
[23,] 0.07810679 -0.35179191 1.160822149 1.275889987
[24,] 2.01879938 -1.69277585 -0.851772322 0.637894769
[25,] 0.03832370 -0.01636666 0.462086335 -1.359422203
[26,] 0.76263265 -0.25325906 0.576784678 -0.860468362
[27,] 0.80600103 -0.98700542 1.054380524 0.865384769
[28,] 0.10151708 -1.11143498 0.362030450 -1.311133195
[29,] 1.13257199 -1.61800969 -0.035875732 0.717670519
[30,] -0.39400390 0.17401188 -1.584064560 0.001414401
[31,] -0.91354525 -0.15993539 2.255229746 0.040943415
[32,] -1.07053765 -1.59294546 1.177997196 -0.004993882
[33,] -0.58433992 0.32223703 0.138095330 -1.066249604
[34,] 0.40394954 0.07280647 -0.066204251 -0.323453856
[35,] -1.38685312 0.62053015 0.291816302 -1.073221891
[36,] -1.42368887 -1.03738633 0.281848260 0.950995185
[37,] -0.62507684 -0.23456213 0.314036082 0.655732289
[38,] 1.31334147 0.01317071 0.146632210 0.375478824
[39,] 0.71632843 0.46608161 -1.312181265 -0.179137720
[40,] -0.53398462 1.49115031 -1.213652320 -0.882802599
[41,] 0.27253594 -0.39659293 -1.996263720 -0.398130826
[42,] -0.01004191 0.09009130 -1.146944110 0.379104969
[43,] 0.44749802 1.95244075 -1.075631836 0.958157813
[44,] 0.79438915 1.59505298 1.508666380 -1.139646960
[45,] 1.20702956 -1.78660468 -0.954934496 0.572671986
[46,] 0.93799233 0.67938881 0.318818592 -1.316561378
[47,] 0.15548626 -0.10659469 0.992725985 1.928783638
[48,] 2.13801314 0.44766295 0.809948289 -1.520407160
[49,] 0.15531311 0.88014654 -0.810774185 1.202065117
[50,] 0.21305992 0.49757643 -0.850176792 0.911191980
[51,] -0.96426462 -0.35992509 0.171690902 -0.614939788
[52,] 1.49340604 -1.93034359 -1.138165644 0.515145077
[53,] 0.84786431 -1.09975108 -0.219149495 0.801573550
[54,] -0.94606578 -0.51795274 0.555837389 0.059503840
[55,] 0.65062250 -0.69177790 -1.079915434 -0.543078829
[56,] -0.39458374 0.28853810 0.925695259 0.525701069
[57,] 1.86404144 1.40713237 -0.060367914 -1.155368210
[58,] 0.23684410 0.52107745 0.351184938 0.895588211
[59,] -1.15067914 0.55582060 0.334687709 2.246953564
[60,] 1.07887964 -1.59448830 0.552962867 1.220813852
[61,] 0.95502861 -1.27463200 1.720058391 0.684220175
[62,] -1.01156416 0.71263568 -0.155866462 0.558500022
[63,] -0.58681134 0.26729960 -1.206317159 1.143048926
[64,] -1.05595930 -1.93751762 0.405163886 0.029807334
[65,] -1.23748079 0.17592275 0.552633550 -0.488562215
[66,] 1.30743072 0.52233448 -1.041684248 -1.315487828
[67,] 0.91212279 -0.60747405 2.054117723 -1.265952463
[68,] 0.42182066 -0.25279459 -0.311412111 -0.811961702
[69,] -0.80896873 -0.59866917 -1.017255498 -0.337989851
[70,] 0.28433183 -0.15895720 -1.305049146 -0.652272879
[71,] 0.48928427 2.05456506 0.667678768 0.377427759
[72,] -1.29771593 -0.16084409 -1.191970333 0.430006998
[73,] 0.83030290 1.31599046 -1.865572808 -0.768846132
[74,] -0.59808677 1.41512123 1.240410339 1.224369624
[75,] -0.15637326 0.87349668 -0.310623858 0.595001923
[76,] -0.75748737 0.24025760 1.041739383 1.840039125
[77,] -0.25413550 0.14755494 2.027100481 -0.355553289
[78,] 0.19397647 0.34222666 1.079488553 0.254282159
[79,] 1.21822790 0.62966713 0.457451065 1.564501755
[80,] -1.62963212 0.30900832 0.027333032 -0.477285841
[81,] -0.73436345 -0.24553584 0.461672987 1.716153002
[82,] -0.05233507 -0.91801768 0.512305025 0.216589809
[83,] -1.42734324 -0.97123188 0.214357210 0.559582673
[84,] -2.49169966 -0.71250824 1.595398236 -1.323068092
[85,] 0.92319503 -1.79556229 0.815793184 -0.179811773
[86,] -0.75033666 -0.41638092 -1.097556715 -0.248366631
[87,] -1.57660226 -0.28128270 -2.160786714 -1.521539898
[88,] 1.02064694 -1.30322921 1.404097378 -0.033425177
[89,] 0.07444996 -0.05577547 0.135302928 0.209393838
[90,] 1.11124190 2.35966707 1.886374912 -0.977992574
[91,] -0.83138406 0.48074760 1.390649930 0.525516200
[92,] -2.41740414 -0.24747989 -0.547453437 -1.273230249
[93,] 0.09403189 0.21220124 -0.327729320 0.697109960
[94,] 1.18015636 0.35331430 0.080214711 1.486631336
[95,] -0.85520747 0.72630134 -1.071523429 0.891613154
[96,] -0.10292813 0.38858573 0.061515964 0.311259787
[97,] -0.10242101 -0.25279813 -1.899521103 -0.065754997
[98,] -1.66575542 -1.09947972 -1.324702775 1.075025488
[99,] -0.30494015 1.90466881 0.136754022 -0.105928511
[100,] -0.56966296 0.22605699 -0.781328538 -0.489345573
id Post_Sale_Service Commercial_Activity Technical_Support Product_Value
1 1 0.2946283 0.7669530 -1.893546629 0.7011501
2 2 1.1387716 -1.6624231 -0.575796984 0.5755343
3 3 0.6665769 0.5805422 0.017132131 1.6109803
4 4 -0.9182291 -0.2457565 1.229367774 -1.2576711
5 5 -0.3199601 -0.8337491 -0.001359746 0.4406027
6 6 -0.6679233 -1.0533799 -1.329738840 -0.9836773
Comporbación de cálculo de los scores
Error:
! objeto 'acp_res' no encontrado
# 2. Estandarizamos los datos originales (muy importante)
# scale() resta la media y divide por la desviación típica
data_scaled <- scale(data_step3)
# 3. Cálculo manual para el primer registro (Fila 1)
# Multiplicamos la fila 1 de datos estandarizados por los pesos del RC1
score_manual_1 <- sum(data_scaled[1, ] * weights[, "RC1"])Error in `weights[, "RC1"]`:
! objeto de tipo 'closure' no es subconjunto
Error:
! objeto 'acp_res' no encontrado
Error:
! objeto 'score_manual_1' no encontrado
Representación gráfica
El mapa de individuos
Cuando visualizamos un mapa cartesiano (biplot o gráfico de individuos) tras un ACP, estamos proyectando a los encuestados sobre el nuevo espacio vectorial definido por los componentes.
- El eje X (horizontal) representa las puntuaciones del Componente 1.
- El eje Y (vertical) representa las puntuaciones del Componente 2.
Por lo tanto, la posición exacta de un cliente en ese mapa es el reflejo directo de sus scores. Si un individuo aparece en el extremo derecho del mapa, significa que tiene un score muy alto (positivo) en el primer componente.
¿Por qué es útil esta visualización?
- Detección de outliers: Aquellos puntos que quedan muy aislados en los márgenes del mapa son individuos con perfiles extremos (puntuaciones factoriales muy altas o muy bajas), lo que permite identificar casos atípicos que podrían distorsionar el análisis.
- Identificación visual de clústeres: Si vemos que los puntos forman nubes o grupos naturales en el mapa, estamos ante la evidencia visual de que existen segmentos de mercado con percepciones similares. El análisis de conglomerados (Cluster) simplemente pondrá nombre y límites matemáticos a esas agrupaciones que ya intuimos mediante los scores.
- Relación con las variables (Vectores): Si superponemos las variables originales (vectores), podemos ver hacia dónde “tira” cada componente. Si un individuo está situado en la misma dirección que el vector “Calidad de Producto”, sabemos de inmediato que ese cliente puntúa alto en esa percepción sin necesidad de mirar la base de datos original.
# Cargamos ggrepel para una mejor gestión de etiquetas
pacman::p_load(ggrepel)
# 1. Preparar los datos
scores_df <- as.data.frame(pca_final$scores)
scores_df$id_cliente <- row.names(scores_df) # Creamos la etiqueta con el número de fila
# 2. Crear el scatter plot con etiquetas
ggplot(scores_df, aes(x = RC1, y = RC2, label = id_cliente)) +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey70") +
geom_vline(xintercept = 0, linetype = "dashed", color = "grey70") +
# Dibujamos los puntos
geom_point(color = "#2E5077", size = 2, alpha = 0.6) +
# Añadimos las etiquetas de texto
# 'box.padding' y 'point.padding' ayudan a separar el número del punto
geom_text_repel(size = 3, color = "grey30", max.overlaps = 20,segment.color = 'grey80') +
theme_minimal() +
labs(
title = "Mapa de individuos",
subtitle = "Posicionamiento de cada encuestado en el espacio factorial",
x = "Puntuaciones Componente 1 (RC1)",
y = "Puntuaciones Componente 2 (RC2)"
) El cierre metodológico: ¿ACP o AFP?
Al finalizar este bloque, es vital que el analista de mercados sepa distinguir entre estas dos aproximaciones. Aunque ambas buscan reducir datos, su punto de partida es diferente:
Análisis de componentes principales (ACP)
Es un enfoque matemático. Su objetivo es explicar la máxima varianza total posible. * Filosofía: Asume que la varianza de una variable es “pura” (comunalidad inicial = 1). * Uso en Marketing: Es la técnica estándar para reducir cuestionarios largos a unos pocos índices operativos (puntuaciones) que luego usaremos para segmentar. Buscamos síntesis.
Análisis factorial (AFP o Factores Principales)
Es un enfoque estadístico y causal. Su objetivo es explicar la covarianza (la varianza compartida). * Filosofía: Asume que las variables observadas son solo indicadores de un factor latente no observado (ej. “La Inteligencia” o “La Personalidad”). La varianza se divide en varianza común y varianza única (error). Las comunalidades iniciales son menores a 1. * Uso en Investigación: Es típico en psicología o sociología, donde el interés no es reducir datos, sino identificar la estructura teórica subyacente que causa las respuestas.
Ejemplo práctico en R: Comparativa de resultados
Para que los alumnos vean la diferencia, podemos ejecutar ambos modelos sobre el mismo set de datos purificado (data_model). Observa cómo cambian las cargas factoriales y las comunalidades (\(h^2\)).
# 1. Ejecución del ACP (Principal Components)
# Usa 1s en la diagonal de la matriz de correlación
acp_res <- psych::principal(data_step3, nfactors = 4, rotate = "varimax")
# 2. Ejecución del AFP (Principal Axis Factoring)
# Estima las comunalidades inicialmente (método 'pa')
afp_res <- psych::fa(data_step3, nfactors = 4, rotate = "varimax", fm = "pa")
# Comparativa rápida de cargas de la primera variable
print(acp_res)Principal Components Analysis
Call: psych::principal(r = data_step3, nfactors = 4, rotate = "varimax")
Standardized loadings (pattern matrix) based upon correlation matrix
RC1 RC2 RC3 RC4 h2 u2 com
x6 0.03 -0.01 -0.02 0.89 0.80 0.20 1.0
x7 0.06 0.87 0.05 -0.14 0.78 0.22 1.1
x8 0.02 -0.02 0.94 0.10 0.89 0.11 1.0
x9 0.93 0.10 0.06 0.08 0.89 0.11 1.0
x10 0.16 0.74 -0.08 0.04 0.58 0.42 1.1
x12 0.14 0.90 0.08 -0.17 0.86 0.14 1.1
x13 -0.10 0.23 -0.26 -0.73 0.66 0.34 1.5
x14 0.10 0.05 0.93 0.08 0.89 0.11 1.0
x16 0.89 0.10 0.09 0.07 0.81 0.19 1.1
x18 0.93 0.17 0.00 0.01 0.89 0.11 1.1
RC1 RC2 RC3 RC4
SS loadings 2.59 2.22 1.85 1.41
Proportion Var 0.26 0.22 0.18 0.14
Cumulative Var 0.26 0.48 0.67 0.81
Proportion Explained 0.32 0.28 0.23 0.17
Cumulative Proportion 0.32 0.60 0.83 1.00
Mean item complexity = 1.1
Test of the hypothesis that 4 components are sufficient.
The root mean square of the residuals (RMSR) is 0.04
with the empirical chi square 17.86 with prob < 0.085
Fit based upon off diagonal values = 0.98
Factor Analysis using method = pa
Call: psych::fa(r = data_step3, nfactors = 4, rotate = "varimax", fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
PA1 PA2 PA3 PA4 h2 u2 com
x6 0.05 -0.06 0.02 0.65 0.43 0.575 1.0
x7 0.07 0.78 0.03 -0.14 0.63 0.367 1.1
x8 0.02 -0.02 0.89 0.12 0.81 0.191 1.0
x9 0.91 0.12 0.06 0.10 0.86 0.140 1.1
x10 0.17 0.53 -0.05 -0.05 0.32 0.683 1.2
x12 0.12 0.97 0.06 -0.15 0.99 0.011 1.1
x13 -0.10 0.21 -0.21 -0.58 0.44 0.559 1.6
x14 0.10 0.05 0.88 0.10 0.80 0.201 1.1
x16 0.79 0.12 0.09 0.10 0.66 0.340 1.1
x18 0.92 0.17 0.01 0.01 0.88 0.115 1.1
PA1 PA2 PA3 PA4
SS loadings 2.39 1.95 1.63 0.85
Proportion Var 0.24 0.19 0.16 0.08
Cumulative Var 0.24 0.43 0.60 0.68
Proportion Explained 0.35 0.29 0.24 0.12
Cumulative Proportion 0.35 0.64 0.88 1.00
Mean item complexity = 1.1
Test of the hypothesis that 4 factors are sufficient.
df null model = 45 with the objective function = 5.3 with Chi Square = 502.97
df of the model are 11 and the objective function was 0.08
The root mean square of the residuals (RMSR) is 0.01
The df corrected root mean square of the residuals is 0.02
The harmonic n.obs is 100 with the empirical chi square 0.44 with prob < 1
The total n.obs was 100 with Likelihood Chi Square = 7.45 with prob < 0.76
Tucker Lewis Index of factoring reliability = 1.033
RMSEA index = 0 and the 90 % confidence intervals are 0 0.074
BIC = -43.21
Fit based upon off diagonal values = 1
Measures of factor score adequacy
PA1 PA2 PA3 PA4
Correlation of (regression) scores with factors 0.97 0.99 0.94 0.74
Multiple R square of scores with factors 0.93 0.97 0.88 0.55
Minimum correlation of possible factor scores 0.86 0.95 0.76 0.11