# Análisis de componentes principales
```{r}
#| echo: false
#| message: false
#| warning: false
source("script.R")
```
## Introducción
Si el análisis de correspondencias proporcionó un mapa para navegar el mundo de
las variables cualitativas, el **análisis de componentes principales (ACP)**
ofrece un instrumento equivalente para observar la estructura oculta en las
relaciones entre variables cuantitativas. Es habitual enfrentarse a conjuntos de
datos con docenas o cientos de variables: un estudio de satisfacción puede
incluir 50 preguntas distintas; un análisis financiero puede basarse en 30
ratios diferentes. Esta abundancia de información, lejos de ser una ventaja,
suele convertirse en un obstáculo: las variables tienden a estar correlacionadas
entre sí (multicolinealidad), midiendo conceptos redundantes y dificultando la
identificación de los patrones verdaderamente subyacentes.
El ACP es la técnica de interdependencia de referencia para abordar este
problema. Su objetivo es la **reducción de la dimensionalidad**: transformar un
conjunto grande de variables originales, posiblemente correlacionadas, en un
conjunto mucho más pequeño de nuevas variables no correlacionadas que capturan
la mayor parte de la información de los datos originales [@Jolliffe2016]. Estas
nuevas variables se denominan **componentes principales**.
No se trata de seleccionar las "mejores" variables y descartar el resto, sino de
crear nuevas variables compuestas —combinaciones lineales de las originales—
optimizadas para representar la máxima varianza posible del conjunto
[@Hair2019]. Es un ejercicio de síntesis, no de eliminación.
::: callout-tip
## Equivalencia con SPSS
El ACP sí tiene un equivalente directo en SPSS: el procedimiento *Análisis
Factorial* (`Analizar > Reducción de dimensiones > Análisis factorial`),
seleccionando "Componentes principales" como método de extracción. Los
estadísticos de este capítulo —KMO, test de Bartlett, varianza explicada, cargas
factoriales rotadas— se corresponden exactamente con la salida que produce SPSS
en ese procedimiento.
:::
## ¿Son los datos adecuados para un ACP? Requisitos y comprobaciones previas
El ACP es una técnica potente, pero no es aplicable a cualquier conjunto de
datos. Antes de ejecutar el análisis es necesario realizar una serie de
comprobaciones conceptuales y estadísticas. Ignorar estos pasos es la receta más
segura para obtener resultados sin sentido [@Field2018].
### Requisitos de los datos
1. **Naturaleza de las variables**: deben ser **cuantitativas** (de intervalo o
de razón). Existen variantes para datos categóricos, relacionadas con el
ACM, pero el ACP clásico está diseñado para variables numéricas.
2. **Relación lineal**: el ACP asume que las relaciones subyacentes entre
variables son lineales.
3. **Conceptualización**: debe existir una base conceptual razonable para
pensar que las variables miden, en realidad, constructos subyacentes
comunes. No tiene sentido aplicar un ACP a un conjunto de variables
totalmente inconexas.
### Estadísticos a contemplar
1. **Matriz de correlaciones**: el primer paso es inspeccionar las
correlaciones entre variables. Para que el ACP tenga sentido debe existir un
número sustancial de correlaciones significativas (en general, \|r\| \>
0,30). Si la mayoría son cercanas a cero, las variables no comparten
información suficiente para agruparse en componentes [@Tabachnick2013].
2. **Test de esfericidad de Bartlett**: contrasta la hipótesis nula de que la
matriz de correlaciones es una matriz identidad (todas las correlaciones son
cero). Para que el ACP sea apropiado interesa **rechazar esta hipótesis
nula**, es decir, obtener un resultado estadísticamente significativo (p \<
0,05). Un resultado no significativo indica que las variables no están
suficientemente correlacionadas para justificar el análisis [@Bartlett1950].
3. **Medida de adecuación muestral de Kaiser-Meyer-Olkin (KMO)**: posiblemente
la prueba más importante. Compara la magnitud de las correlaciones
observadas con la de las correlaciones parciales. Un valor cercano a 1
indica que los patrones de correlación son compactos y que el ACP debería
producir componentes fiables; un valor cercano a 0 indica correlaciones
difusas, poco adecuadas para el análisis. @Kaiser1974 propuso la siguiente
guía de interpretación:
| Valor de KMO | Interpretación |
|:-------------|:---------------|
| \> 0,90 | Sobresaliente |
| 0,80 - 0,89 | Meritorio |
| 0,70 - 0,79 | Mediano |
| 0,60 - 0,69 | Mediocre |
| 0,50 - 0,59 | Miserable |
| \< 0,50 | Inaceptable |
4. **Medida de adecuación muestral (MSA) por variable**: además del KMO global,
se calcula un MSA para cada variable individual, que en SPSS aparece en la
diagonal de la matriz anti-imagen de correlaciones. La regla general es
eliminar, una a una, las variables con un **MSA inferior a 0,50**, ya que no
comparten suficiente varianza con el resto para formar parte de un
componente coherente.
## ACP frente a análisis factorial exploratorio (AFE)
ACP y AFE se utilizan a menudo de forma indistinta, pero son conceptualmente
diferentes. La elección entre uno y otro depende del objetivo de la
investigación.
- **Análisis de componentes principales (ACP)**: su objetivo es la **reducción
de datos**. Los componentes son combinaciones lineales que buscan explicar la
máxima **varianza total** de las variables originales. Es un modelo formativo:
las variables *forman* el componente, sin asumir una estructura latente
subyacente.
- **Análisis factorial exploratorio (AFE)**: su objetivo es identificar
**constructos latentes** que *causan* las respuestas observadas. Es un modelo
reflectivo: el factor se *refleja* en las variables. Analiza únicamente la
varianza compartida (comunalidad) entre variables, ignorando la varianza única
de cada una.
¿Por qué en marketing e investigación aplicada se utiliza más el ACP? Aunque el
AFE es teóricamente más adecuado para identificar constructos, el ACP se
prefiere en la práctica por varias razones [@Uriel2018]:
1. **Simplicidad y robustez**: el ACP es matemáticamente más simple y siempre
proporciona una solución.
2. **Objetivo práctico**: a menudo el propósito no es validar una teoría
psicológica, sino reducir un gran número de atributos de un producto a unas
pocas dimensiones manejables (por ejemplo, "Calidad-precio", "Innovación",
"Servicio") que puedan utilizarse en análisis posteriores como una regresión
o un análisis clúster.
3. **Resultados similares**: cuando el número de variables es grande (\>30) y
las comunalidades son altas, ACP y AFE tienden a producir resultados muy
parecidos.
## Haciendo los componentes interpretables: la rotación
El ACP extrae los componentes en orden de importancia, maximizando la varianza
explicada en cada paso. Sin embargo, la solución inicial (sin rotar) suele ser
difícil de interpretar, porque muchas variables presentan cargas moderadas en
varios componentes a la vez. Para simplificar la estructura se aplica una
**rotación**, cuyo objetivo es alcanzar una **estructura simple**: una solución
en la que cada variable cargue fuertemente en un solo componente y débilmente en
los demás.
Existen dos tipos principales de rotación:
1. **Rotación ortogonal** (por ejemplo, VARIMAX): mantiene un ángulo de 90
grados entre los ejes. Los componentes resultantes **no están
correlacionados entre sí**.
2. **Rotación oblicua** (por ejemplo, PROMAX, OBLIMIN): permite que los ejes
roten libremente, por lo que los componentes resultantes **pueden estar
correlacionados**.
¿Por qué en marketing se utiliza más VARIMAX? Porque produce componentes
independientes, lo que resulta conceptualmente más simple y muy útil en la
práctica: si los componentes resultantes (por ejemplo, "Dimensión precio" y
"Dimensión calidad") no están correlacionados, pueden incorporarse como
variables independientes en una regresión posterior sin preocuparse por la
multicolinealidad. La rotación oblicua es teóricamente más realista —raramente
los constructos sociales o de marketing son completamente independientes—, pero
la simplicidad de la solución ortogonal suele prevalecer en la práctica.
## Interpretando la solución final: cargas y nominación de componentes
Una vez rotada la solución, el paso final es la interpretación:
- **Cargas de los componentes (*loadings*)**: la tabla de cargas factoriales es
el resultado principal. Cada carga representa la correlación entre una
variable original y un componente.
- **Reglas para retener ítems**: para que una variable se considere parte de un
componente, su carga debe ser "significativa". Una regla habitual es
considerar significativas las **cargas con valor absoluto superior a 0,50**.
Las variables que no alcanzan ese umbral en ningún componente, o que presentan
cargas altas en más de uno (*cross-loadings*), suelen ser candidatas a
eliminarse para depurar la solución.
- **Nombrar los componentes**: el paso final, el más cualitativo. Se examinan
las variables que cargan alto en cada componente y se busca un hilo conceptual
común que resuma su esencia.
## Aplicación práctica: dimensiones de la percepción de una marca
Se desarrolla a continuación un caso práctico de investigación de mercados:
simplificar la forma en que los consumidores perciben una marca de teléfonos
inteligentes.
### Objetivo de la investigación
Un fabricante ha encuestado a 300 consumidores sobre la percepción de su marca
principal, mediante 12 preguntas en escala Likert de 1 a 10.
> **Objetivo**: reducir las 12 variables de percepción a un número más pequeño
> de dimensiones subyacentes no correlacionadas (componentes principales), que
> permitan entender la estructura fundamental de la percepción de marca y crear
> perfiles de consumidor para análisis posteriores, como la segmentación.
### Preparación de los datos y comprobaciones preliminares
El punto de partida es un dataframe con las respuestas de los 300 encuestados.
Para una estructura de datos realista, se simulan a partir de tres constructos
latentes (rendimiento, diseño, valor) y una variable de ruido:
```{r}
#| echo: true
set.seed(456)
n <- 300
# Underlying latent constructs
latent_performance <- rnorm(n, 0, 1)
latent_design <- rnorm(n, 0, 1)
latent_value <- rnorm(n, 0, 1)
# Observed variables built from latent constructs + noise
smartphone_data <- data.frame(
# Performance factor
battery = 7 + 0.80 * latent_performance + rnorm(n, 0, 0.5),
camera = 7 + 0.85 * latent_performance + rnorm(n, 0, 0.5),
performance = 7 + 0.90 * latent_performance + rnorm(n, 0, 0.4),
screen = 7 + 0.75 * latent_performance + rnorm(n, 0, 0.6),
# Design factor
design = 8 + 0.90 * latent_design + rnorm(n, 0, 0.4),
materials = 8 + 0.85 * latent_design + rnorm(n, 0, 0.5),
exclusivity = 8 + 0.75 * latent_design + rnorm(n, 0, 0.6),
# Value factor
low_price = 4 + 0.90 * latent_value + rnorm(n, 0, 0.4),
affordable = 4 + 0.95 * latent_value + rnorm(n, 0, 0.3), # Redundant on purpose
promotions = 5 + 0.70 * latent_value + rnorm(n, 0, 0.7),
# Noise variable, unrelated to any factor
tech_support = 5 + rnorm(n, 0, 2.5)
)
# Keep all ratings within the 1-10 scale
smartphone_data <- as.data.frame(lapply(smartphone_data,
function(x) round(pmin(10, pmax(1, x)))))
head(smartphone_data)
```
#### Paso 1: inspección de la matriz de correlaciones
```{r}
#| label: fig-corrplot-pca
#| fig-cap: Matriz de correlaciones de las variables de percepción de marca
#| echo: true
cor_matrix <- cor(smartphone_data)
corrplot::corrplot(cor_matrix, method = "color", type = "upper", order = "hclust",
addCoef.col = "black", tl.col = "black", tl.srt = 45,
sig.level = 0.01, insig = "blank")
```
El gráfico muestra tres bloques claros de correlaciones altas, como cabía
esperar. Sin embargo, la correlación entre `low_price` y `affordable` es de
0,96: un valor extremadamente alto que delata redundancia.
**Decisión**: se elimina `affordable` para evitar problemas de
multicolinealidad.
```{r}
#| echo: true
clean_data <- smartphone_data[, !(names(smartphone_data) %in% "affordable")]
```
#### Paso 2: test de KMO y esfericidad de Bartlett
```{r}
#| echo: true
psych::KMO(cor(clean_data))
```
**Interpretación**:
1. **Test de esfericidad de Bartlett**: el p-valor es prácticamente cero, lo
que confirma que las variables están suficientemente intercorrelacionadas.
2. **KMO global (Overall MSA)**: 0,84, "Meritorio". Un resultado excelente.
3. **MSA individuales**: todas las variables presentan un MSA alto, excepto
`tech_support`, cuyo MSA es 0,32, por debajo del umbral de 0,50.
**Decisión**: `tech_support` no comparte suficiente varianza con el resto de
variables. Se elimina para depurar el análisis.
```{r}
#| echo: true
final_data <- clean_data[, !(names(clean_data) %in% "tech_support")]
psych::KMO(cor(final_data))
```
El KMO global sube a 0,87 ("Meritorio") y todos los MSA individuales mejoran,
salvo dos que quedan justo en torno a 0,5. Se opta por **no eliminarlos**: la
decisión se apoya en que la teoría que sustenta la estructura subyacente
respalda su pertenencia a sus respectivos componentes, y en que un valor tan
cercano al umbral puede deberse a la variabilidad propia del muestreo. Los datos
están listos para el análisis.
### Ejecución del análisis de componentes principales
#### Paso 3: determinar el número de componentes a retener
```{r}
#| label: fig-scree-pca
#| fig-cap: Scree plot con análisis paralelo
#| echo: true
psych::fa.parallel(final_data, fa = "pc", n.iter = 100,
show.legend = FALSE, main = "Scree plot con análisis paralelo")
```
Tanto el criterio de Kaiser (autovalor superior a 1) como el análisis paralelo
(línea de los datos reales por encima de la línea de datos simulados) coinciden
en sugerir una solución de **3 componentes**.
#### Paso 4: ejecutar el ACP final y aplicar rotación
```{r}
#| echo: true
pca_model <- psych::principal(final_data, nfactors = 3, rotate = "varimax", scores = TRUE)
print(pca_model$loadings)
```
### Interpretación de la solución final
#### Paso 5: interpretar las cargas y nombrar los componentes
- **Componente 1 (RC1)**: cargan alto `battery` (0,86), `camera` (0,88),
`performance` (0,92) y `screen` (0,82). **Nombre: "Rendimiento y
funcionalidad"**.
- **Componente 2 (RC2)**: cargan alto `design` (0,92), `materials` (0,90) y
`exclusivity` (0,82). **Nombre: "Diseño y estatus"**.
- **Componente 3 (RC3)**: cargan alto `low_price` (0,93) y `promotions` (0,78).
**Nombre: "Valor económico"**.
#### Paso 6: evaluar las comunalidades
Todas las comunalidades (`h2`) son altas (la mayoría superan 0,70), lo que
indica que la solución de 3 componentes explica una parte sustancial de la
varianza de cada variable original.
### Visualización avanzada con `FactoMineR` y `factoextra`
Para gráficos de mayor calidad se puede replicar el análisis con este
ecosistema:
```{r}
#| label: fig-pca-var
#| fig-cap: Gráfico de variables del ACP (círculo de correlaciones)
#| echo: true
pca_factominer <- FactoMineR::PCA(final_data, graph = FALSE)
factoextra::fviz_pca_var(pca_factominer, col.var = "contrib",
gradient.cols = c("#076fa2", "#f0a202", "#c40000"),
repel = TRUE, title = "Gráfico de variables del ACP") +
ggplot2::theme_minimal()
```
Este gráfico circular confirma visualmente la estructura: se aprecian tres
grupos de variables claramente definidos. Las variables que apuntan en la misma
dirección están correlacionadas positivamente; las que apuntan en direcciones
opuestas, negativamente. La longitud de la flecha indica cuán bien representada
está cada variable en el mapa 2D.
### Creación y uso de las puntuaciones de los componentes
Se calculan las puntuaciones de cada consumidor en las 3 nuevas dimensiones:
```{r}
#| echo: true
component_scores <- as.data.frame(pca_model$scores)
head(component_scores)
```
### Conclusiones y puente hacia el análisis clúster
El análisis ha reducido 12 variables a **3 dimensiones clave e independientes**,
que explican el 77% de la varianza total. En lugar de afirmar que el análisis
"sugiere" segmentos de consumidores, se puede demostrar su existencia aplicando
un breve **análisis k-medias** (que se desarrollará en detalle en el capítulo
siguiente), agrupando a los 300 consumidores en 4 segmentos según sus
puntuaciones en los componentes:
```{r}
#| echo: true
set.seed(123)
# Quick k-means preview: 4 clusters based on component scores
kmeans_result <- kmeans(component_scores, centers = 4, nstart = 25)
component_scores$cluster <- as.factor(kmeans_result$cluster)
```
Se vuelve a construir el mapa de consumidores, coloreando cada punto según el
segmento al que pertenece:
```{r}
#| label: fig-pca-segments
#| fig-cap: Mapa perceptual de consumidores segmentados
#| echo: true
ggplot2::ggplot(component_scores, ggplot2::aes(x = RC1, y = RC2, color = cluster)) +
ggplot2::geom_point(alpha = 0.8) +
ggplot2::scale_color_manual(values = c("#076fa2", "#c40000", "#f0a202", "#2ca02c")) +
ggplot2::labs(
title = "Mapa perceptual de consumidores segmentados",
subtitle = "Basado en las puntuaciones de los dos primeros componentes",
x = "Rendimiento y funcionalidad",
y = "Diseño y estatus",
color = "Segmento"
) +
ggplot2::theme_minimal() +
ggplot2::theme(legend.position = "bottom")
```
El mapa hace visible la existencia de cuatro segmentos:
- **Segmento 1**: consumidores que no valoran especialmente ni el rendimiento ni
el diseño (puntuaciones bajas en ambos componentes), probablemente el segmento
sensible al precio (visible en el componente 3).
- **Segmento 2**: valora mucho el **diseño y estatus** (RC2 alto), pero no tanto
el rendimiento.
- **Segmento 3**: valora mucho el **rendimiento y funcionalidad** (RC1 alto),
pero no tanto el diseño.
- **Segmento 4**: el segmento "premium", que valora ambas dimensiones
(puntuaciones altas en RC1 y RC2).
Este resultado ilustra el papel del ACP como paso previo a la segmentación: un
mapa claro y accionable del mercado, listo para explorarse en profundidad con el
**análisis clúster**.