Analítica de Personas · Semestre otoño 2026 · Semana 6 · Prof. René Gempp
Cuando aplicamos una encuesta de 25 ítems Likert sobre experiencia del empleado, los ítems no son independientes entre sí: las personas que responden alto a "Mi jefatura me da retroalimentación útil" tienden a responder alto también a "Mi jefatura me apoya cuando lo necesito". Esa covariación sistemática entre los ítems sugiere que detrás de ellos hay algo común —una dimensión latente, no medida directamente, pero que explica por qué los ítems se mueven juntos.
El análisis factorial exploratorio (EFA) es la herramienta estadística que estima estos factores latentes a partir de la matriz de correlaciones de los ítems. Responde a la pregunta:
¿Cuántas dimensiones latentes subyacen a este conjunto de ítems, y qué ítems "cargan" en cada dimensión?
Un buen EFA produce una matriz de cargas factoriales donde cada ítem tiene una carga grande en uno (y solo uno) de los factores, y cargas pequeñas en los demás. Cuando eso ocurre, podemos nombrar cada factor en lenguaje sustantivo (liderazgo, desarrollo, etc.) y construir puntajes promedio para usarlos en análisis posteriores —por ejemplo, como predictores en una regresión.
Es muy común confundir el análisis factorial exploratorio (EFA) con el análisis de componentes principales (PCA). Comparten matemáticas similares y a primera vista producen outputs parecidos, pero son conceptualmente distintos:
| PCA (Principal Components Analysis) | EFA (Exploratory Factor Analysis) | |
|---|---|---|
| Pregunta | ¿Cómo reduzco dimensionalidad sin perder varianza? | ¿Qué constructos latentes generan estos ítems? |
| Modelo | Componentes = combinaciones lineales de ítems | Ítems = combinaciones lineales de factores latentes + error |
| Varianza modelada | Toda (común + única + error) | Solo la varianza compartida entre ítems |
| En R | psych::principal() o prcomp() | psych::fa() |
| Cuándo usar | Reducir dimensiones para visualización o ML | Identificar dimensiones psicológicas detrás de una encuesta |
Hacer un EFA en psych::fa() requiere tomar cuatro decisiones. Las tres primeras son los argumentos del comando; la cuarta es interpretativa.
| Decisión | Argumento en fa() | Lo que enseñamos |
|---|---|---|
| Cuántos factores extraer | nfactors | Análisis paralelo de Horn con fa.parallel() |
| Método de extracción | fm | "minres" (default; mínimos residuos) |
| Tipo de rotación | rotate | "oblimin" (oblicua) |
| Umbral de cargas para "saturar" | (decisión interpretativa) | 0,40 |
Esta es la pregunta más debatida del EFA. Históricamente se han propuesto varios criterios:
El consenso de la literatura psicométrica moderna (Zwick & Velicer, 1986; Fabrigar et al., 1999) es que el análisis paralelo es el método más preciso. En psych está disponible como fa.parallel().
# Análisis paralelo: ¿cuántos factores retener?
items_todos <- datos |> select(starts_with("item_"))
psych::fa.parallel(items_todos,
fa = "fa", # para EFA (alternativa: "pc" o "both")
n.iter = 50, # número de simulaciones aleatorias
main = "Análisis paralelo: encuesta engagement")
El output es un gráfico con dos curvas: la línea azul son los eigenvalues observados, y la línea roja son los eigenvalues promedio bajo datos aleatorios. La función imprime también en consola un mensaje del tipo:
Parallel analysis suggests that the number of factors = 5 and the number of components = 5
Ese 5 es la respuesta. La regla operativa: retén tantos factores como eigenvalues observados estén por encima de los simulados.
El argumento fm de fa() controla cómo se estiman las cargas. Las opciones más comunes:
| Opción | Nombre completo | Cuándo usar |
|---|---|---|
"minres" | Mínimos residuos (default) | Robusto, no requiere normalidad multivariada. Es el default y la elección segura. |
"ml" | Máxima verosimilitud | Requiere normalidad multivariada. Permite calcular índices de ajuste tipo SEM (RMSEA, CFI). Útil si vas a hacer comparación de modelos. |
"pa" | Factores principales | Método clásico de la psicometría tradicional. Hoy menos recomendado. |
Para esta clase usamos fm = "minres". Si en una tesis necesitas índices de ajuste, migra a fm = "ml" y reporta CFI > 0,95, RMSEA < 0,06, SRMR < 0,08 como criterios estándar (Hu & Bentler, 1999).
La rotación es un paso de post-procesamiento que reordena los factores para hacerlos más interpretables. Un EFA sin rotar produce típicamente cargas dispersas y difíciles de leer; con rotación, los ítems "se asientan" en sus factores de manera más limpia.
Hay dos grandes familias:
| Tipo | Ejemplos | Supuesto sobre los factores |
|---|---|---|
| Ortogonal | varimax, quartimax | Los factores son independientes (correlación = 0) |
| Oblicua | oblimin, promax | Los factores están correlacionados |
fa_res <- psych::fa(items_todos,
nfactors = 5,
rotate = "oblimin",
fm = "minres")
Cuando usas rotación oblicua, fa() te entrega tres matrices distintas, no una:
fa_res$loadings (o $Structure): la matriz de cargas que típicamente se reporta.fa_res$Phi: la matriz de correlaciones entre los factores. Si todas son cercanas a cero, una rotación ortogonal habría dado lo mismo.fa_res$Structure: la matriz de correlaciones simples ítem-factor (ignorando las correlaciones entre factores).Reportar $Phi en el informe es un signo de rigor: muestra cuán correlacionadas están las dimensiones extraídas y justifica la elección de rotación oblicua.
Después de ajustar el modelo, la matriz de cargas es lo central. Para mostrarla limpia, usa el método print() con un cutoff:
# Mostrar solo cargas |x| >= 0.40, ordenadas por factor
print(fa_res$loadings, cutoff = 0.40, sort = TRUE)
Loadings:
MR1 MR2 MR3 MR4 MR5
item_lid_01 0.78
item_lid_03 0.76
item_lid_02 0.74
item_lid_05 0.72
item_lid_04 0.69
item_des_01 0.75
item_des_03 0.73
item_des_05 0.71
item_des_02 0.69
item_des_04 0.66
item_rec_05 0.74
item_rec_01 0.71
item_rec_03 0.68
item_rec_02 0.67
item_rec_04 0.64
item_car_04 0.74
item_car_02 0.72
item_car_05 0.70
item_car_01 0.69
item_car_03 0.67
item_pro_01 0.76
item_pro_04 0.73
item_pro_02 0.71
item_pro_03 0.69
item_pro_05 0.68
MR1 MR2 MR3 MR4 MR5
SS loadings 2.87 2.65 2.43 2.55 2.52
Proportion Var 0.11 0.11 0.10 0.10 0.10
Cumulative Var 0.11 0.22 0.32 0.42 0.52
Lectura paso a paso:
item_lid_* cargan en MR1, los item_des_* en MR2, etc.SS loadings: es la suma de cuadrados de las cargas de ese factor. Refleja qué tanto del fenómeno "explica" cada factor.Cumulative Var: el porcentaje acumulado de varianza explicada por todos los factores juntos. En encuestas Likert es habitual quedarse entre 40 y 60 %.El mundo real no siempre produce matrices tan limpias como la del ejemplo. Pueden aparecer dos patrones problemáticos:
Un ítem que carga > 0,40 en dos o más factores. Esto significa que el ítem está midiendo dos cosas a la vez, o que los dos factores no están bien diferenciados.
item_amb_07 0.45 0.51 (carga en MR1 y MR2)
Qué hacer:
Un ítem cuya carga máxima en cualquier factor es < 0,40. Está "suelto" — no pertenece claramente a ningún constructo.
Qué hacer: revisa la redacción del ítem. ¿Es ambiguo? ¿Mide algo distinto al resto de la encuesta? Lo más probable es que tengas que eliminarlo antes de construir puntajes de sub-escala.
EFA es la puerta de entrada al modelado de factores latentes, pero hay un universo mucho más amplio que conviene conocer si harás una tesis empírica:
lavaan::cfa(). Referencia: Brown (2015), Confirmatory Factor Analysis for Applied Research.lavaan::measurementInvariance(). Referencia: Vandenberg & Lance (2000).psych de William Revelle (disponible gratuitamente en https://personality-project.org/r/psych) es la mejor introducción técnica a EFA en R. Para el marco conceptual completo: Fabrigar, L. R., Wegener, D. T., MacCallum, R. C., & Strahan, E. J. (1999). Evaluating the use of exploratory factor analysis in psychological research. Psychological Methods, 4(3), 272–299.
fa.parallel() para decidir cuántos factores extraer.fa(items, nfactors = k, rotate = "oblimin", fm = "minres").print(..., cutoff = 0.40, sort = TRUE).$Phi: las correlaciones entre factores justifican (o no) la rotación oblicua.rowMeans() para análisis posteriores (regresión, etc.).