Análisis factorial
Problema gerencial
La empresa deportiva Shoetas desea evaluar el grado de fidelidad de los consumidores hacia las zapatillas Shoetas. Se entrevistaron a 189 consumidores, en los que se midió la fidelidad cognitiva y la fidelidad afectiva.
La fidelidad cognitiva se midió evaluando seis declaraciones en una escala de Likert de 5 puntos, que van desde 1 = completamente en desacuerdo hasta 5 = completamente de acuerdo.
Los enunciados utilizados en el cuestionario son los siguientes:
- Es preferible utilizar zapatillas Shoetas (CLOY1).
- Las características de las zapatillas de Shoetas se corresponden globalmente con mis expectativas (CLOY2).
- Si alguien me propone que use otra marca de zapatillas, seguiré usando Shoetas por su diseño (CLOY3).
- Si alguien me propone que use otra marca de zapatillas, seguiré usando Shoetas por su durabilidad (CLOY4).
- Si alguien me propone que use otra marca de zapatillas, seguiré usando Shoetas por su calidad (CLOY5).
- Si alguien me propone que use otra marca de zapatillas, seguiré usando Shoetas por su precio (CLOY6).
La fidelidad afectiva se midió calificando tres afirmaciones en una escala de Likert de 5 puntos, que van desde = 1 completamente en desacuerdo hasta 5 = completamente de acuerdo.
Las afirmaciones utilizadas en el cuestionario son las siguientes:
- Me gustan más los trianers de Shoetas que otras zapatillas (ALOY1).
- Me gustan las características de mis zapatillas Shoetas (ALOY2).
- Tengo una actitud positiva hacia las zapatillas Shoetas (ALOY3).
Se muestran a continuación las primeras seis filas del conjunto de datos. Se observa que todos son numéricos:
| ALOY1 | ALOY2 | ALOY3 | CLOY1 | CLOY2 | CLOY3 | CLOY4 | CLOY5 | CLOY6 | id |
|---|---|---|---|---|---|---|---|---|---|
| 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 1 |
| 4 | 5 | 3 | 5 | 5 | 5 | 4 | 4 | 4 | 2 |
| 3 | 4 | 3 | 4 | 4 | 4 | 4 | 4 | 3 | 3 |
| 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
| 3 | 3 | 3 | 2 | 3 | 2 | 2 | 2 | 3 | 5 |
| 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 |
En primera instancia, se realiza un análisis exploratorio de los datos:
kable_styling(kable(summary(Datos)))| ALOY1 | ALOY2 | ALOY3 | CLOY1 | CLOY2 | CLOY3 | CLOY4 | CLOY5 | CLOY6 | id | |
|---|---|---|---|---|---|---|---|---|---|---|
| Min. :1.000 | Min. :1.00 | Min. :1.000 | Min. :2.000 | Min. :1.000 | Min. :1.000 | Min. :1.000 | Min. :1.000 | Min. :1.000 | Min. : 1 | |
| 1st Qu.:4.000 | 1st Qu.:4.00 | 1st Qu.:3.000 | 1st Qu.:4.000 | 1st Qu.:4.000 | 1st Qu.:4.000 | 1st Qu.:4.000 | 1st Qu.:4.000 | 1st Qu.:3.000 | 1st Qu.: 48 | |
| Median :4.000 | Median :4.00 | Median :4.000 | Median :4.000 | Median :4.000 | Median :4.000 | Median :4.000 | Median :4.000 | Median :4.000 | Median : 95 | |
| Mean :4.148 | Mean :4.28 | Mean :3.783 | Mean :4.275 | Mean :4.095 | Mean :4.175 | Mean :4.074 | Mean :4.169 | Mean :4.058 | Mean : 95 | |
| 3rd Qu.:5.000 | 3rd Qu.:5.00 | 3rd Qu.:5.000 | 3rd Qu.:5.000 | 3rd Qu.:5.000 | 3rd Qu.:5.000 | 3rd Qu.:5.000 | 3rd Qu.:5.000 | 3rd Qu.:5.000 | 3rd Qu.:142 | |
| Max. :5.000 | Max. :5.00 | Max. :5.000 | Max. :5.000 | Max. :5.000 | Max. :5.000 | Max. :5.000 | Max. :5.000 | Max. :5.000 | Max. :189 |
Si bien todos poseen la misma escala de medición, se estandarizan para facilitar su análisis. Se suprime la columna identificatoria de los casos.
Datos.sc <- data.frame(scale(Datos[, 1:9]))
kable_styling(kable(summary(Datos.sc)))| ALOY1 | ALOY2 | ALOY3 | CLOY1 | CLOY2 | CLOY3 | CLOY4 | CLOY5 | CLOY6 | |
|---|---|---|---|---|---|---|---|---|---|
| Min. :-3.7310 | Min. :-4.0370 | Min. :-3.0941 | Min. :-3.1561 | Min. :-3.9022 | Min. :-4.0201 | Min. :-3.71160 | Min. :-3.8624 | Min. :-3.64474 | |
| 1st Qu.:-0.1756 | 1st Qu.:-0.3451 | 1st Qu.:-0.8706 | 1st Qu.:-0.3817 | 1st Qu.:-0.1201 | 1st Qu.:-0.2211 | 1st Qu.:-0.08944 | 1st Qu.:-0.2063 | 1st Qu.:-1.26116 | |
| Median :-0.1756 | Median :-0.3451 | Median : 0.2412 | Median :-0.3817 | Median :-0.1201 | Median :-0.2211 | Median :-0.08944 | Median :-0.2063 | Median :-0.06936 | |
| Mean : 0.0000 | Mean : 0.0000 | Mean : 0.0000 | Mean : 0.0000 | Mean : 0.0000 | Mean : 0.0000 | Mean : 0.00000 | Mean : 0.0000 | Mean : 0.00000 | |
| 3rd Qu.: 1.0096 | 3rd Qu.: 0.8855 | 3rd Qu.: 1.3529 | 3rd Qu.: 1.0056 | 3rd Qu.: 1.1406 | 3rd Qu.: 1.0452 | 3rd Qu.: 1.11795 | 3rd Qu.: 1.0124 | 3rd Qu.: 1.12243 | |
| Max. : 1.0096 | Max. : 0.8855 | Max. : 1.3529 | Max. : 1.0056 | Max. : 1.1406 | Max. : 1.0452 | Max. : 1.11795 | Max. : 1.0124 | Max. : 1.12243 |
Seguidamente, se analiza la matriz de correlación de las variables.
corrplot(cor(Datos.sc[, 1:9]), order="hclust")Entre las variables vinculadas a la fidelidad afectiva, se observa que existe mayor correlación entre la variable que mide la preferencia por las zapatillas (ALOY1) y aquella que alude a la valoración de las características de las zapatillas(ALOY2).
Entre las variables vinculadas a la fidelidad cognitiva, se aprecia notable correlación entre la valoración del cumplimiento de las expectactivas (CLOY2) y su diseño (CLOY3) por un lado; y entre la valoración de la durabilidad (CLOY4) y la calidad (CLOY5), por otro.
Finalmente, entre los dos tipos de variables se observa significativa correlación entre:
- la valoración de las características de las zapatillas (ALOY2) y la del precio (CLOY6),
- la valoración de la actitud positiva vinculada a las zapatillas (ALOY3) y la del precio (CLOY6).
Se presenta la matriz de correlación de los atributos:
kable_styling(kable((cor(Datos.sc[, 1:9]))))| ALOY1 | ALOY2 | ALOY3 | CLOY1 | CLOY2 | CLOY3 | CLOY4 | CLOY5 | CLOY6 | |
|---|---|---|---|---|---|---|---|---|---|
| ALOY1 | 1.0000000 | 0.8545026 | 0.6522943 | 0.4223472 | 0.4635947 | 0.4559047 | 0.4713330 | 0.4783059 | 0.6939728 |
| ALOY2 | 0.8545026 | 1.0000000 | 0.6949712 | 0.3851824 | 0.4782484 | 0.4869592 | 0.4510812 | 0.4549239 | 0.7560715 |
| ALOY3 | 0.6522943 | 0.6949712 | 1.0000000 | 0.3304373 | 0.4018723 | 0.3681233 | 0.3501215 | 0.3382991 | 0.7920675 |
| CLOY1 | 0.4223472 | 0.3851824 | 0.3304373 | 1.0000000 | 0.6888314 | 0.6626836 | 0.7229597 | 0.7481406 | 0.4482650 |
| CLOY2 | 0.4635947 | 0.4782484 | 0.4018723 | 0.6888314 | 1.0000000 | 0.8309827 | 0.7178963 | 0.6942620 | 0.4631558 |
| CLOY3 | 0.4559047 | 0.4869592 | 0.3681233 | 0.6626836 | 0.8309827 | 1.0000000 | 0.7120604 | 0.6354653 | 0.4421570 |
| CLOY4 | 0.4713330 | 0.4510812 | 0.3501215 | 0.7229597 | 0.7178963 | 0.7120604 | 1.0000000 | 0.8267368 | 0.4453504 |
| CLOY5 | 0.4783059 | 0.4549239 | 0.3382991 | 0.7481406 | 0.6942620 | 0.6354653 | 0.8267368 | 1.0000000 | 0.4259745 |
| CLOY6 | 0.6939728 | 0.7560715 | 0.7920675 | 0.4482650 | 0.4631558 | 0.4421570 | 0.4453504 | 0.4259745 | 1.0000000 |
Seguidamente, se realiza un mapa de calor para observar cómo se relacionan los atributos.
heatmap.2(as.matrix(Datos.sc),
col=brewer.pal(9, "Reds"), trace="none", key=TRUE, dend="none")A los fines de avanzar en el análisis factorial, se verifica si es conveniente aplicar esta técnica mediante el Test de Bartlet.
mat_cor<-data.frame(cor(Datos.sc))
cortest.bartlett(mat_cor,n=189)## $chisq
## [1] 1458.09
##
## $p.value
## [1] 3.203898e-283
##
## $df
## [1] 36
Con el p-value < 0.05 se rechaza la hipótesis nula (varianzas homogéneas) y se procede a realizar la medida de adecuación muestral KMO (Kaiser-Meyer-Olkin).
KMO(Datos.sc)## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = Datos.sc)
## Overall MSA = 0.86
## MSA for each item =
## ALOY1 ALOY2 ALOY3 CLOY1 CLOY2 CLOY3 CLOY4 CLOY5 CLOY6
## 0.85 0.82 0.86 0.92 0.88 0.85 0.89 0.86 0.86
Se obtiene un KMO = 0.86 que evidencia la pertinencia de emplear el análisis factorial para explorar los atributos de las zapatillas.
Habiendo verificado la validez de la técnica, se escoge el método de componentes principales para extrar los factores.
Datos.pc <- prcomp(Datos.sc[, 1:9])
summary(Datos.pc)## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 2.3473 1.2743 0.69432 0.66346 0.53794 0.45382 0.42465
## Proportion of Variance 0.6122 0.1804 0.05357 0.04891 0.03215 0.02288 0.02004
## Cumulative Proportion 0.6122 0.7926 0.84619 0.89510 0.92725 0.95013 0.97017
## PC8 PC9
## Standard deviation 0.38314 0.34880
## Proportion of Variance 0.01631 0.01352
## Cumulative Proportion 0.98648 1.00000
plot(Datos.pc, type="l", main = "Gráfico de sedimentación")La varianza acumulada > 0.80 en 3 componentes, aunque la DS > 1 en sólo 2.
El gráfico de sedimentación indica que sólo son mayores que 1 los autovalores de las dos primeras variables, con lo que estas dos variables resumirán al resto representándolas de forma coherente, es decir, serán las 2 componentes principales que resumen toda la información.
Se procede a realizar un biplot para ver cómo se distribuyen las respuestas.
biplot(Datos.pc) Así, se avanza en realizar el análisis factorial exploratorio.
nScree(data.frame(Datos.sc[, 1:9]))## noc naf nparallel nkaiser
## 1 2 1 2 2
Del Scree plot surge que lo conveniente podría ser extrar 2 factores:
scree(Datos.sc[, 1:9])eigen(cor(Datos.sc[, 1:9]))## eigen() decomposition
## $values
## [1] 5.5098814 1.6237286 0.4820859 0.4401793 0.2893816 0.2059538 0.1803314
## [8] 0.1467983 0.1216596
##
## $vectors
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] -0.3301171 -0.3411057 0.21583769 0.513355328 0.19219336 0.21788717
## [2,] -0.3340774 -0.3779836 0.04280657 0.417532801 0.06241108 -0.12104156
## [3,] -0.2926799 -0.4366218 -0.14587272 -0.510398767 -0.27681348 0.48858802
## [4,] -0.3297481 0.3077233 0.23827156 -0.322523659 0.74877438 0.08425939
## [5,] -0.3504813 0.2619504 -0.48336607 0.053667913 -0.03842030 0.32355544
## [6,] -0.3416527 0.2582582 -0.58471172 0.180573728 0.02338267 -0.22646331
## [7,] -0.3482747 0.3037055 0.26361597 0.004848457 -0.47859480 -0.34402261
## [8,] -0.3422103 0.2970512 0.47747882 -0.010904116 -0.29345544 0.23091770
## [9,] -0.3271891 -0.3736994 -0.02279367 -0.402460846 0.06845323 -0.60366210
## [,7] [,8] [,9]
## [1,] 0.1892345 0.364854324 0.45957427
## [2,] -0.1380196 -0.355396485 -0.63675144
## [3,] 0.3334972 -0.105311462 -0.06526315
## [4,] 0.1842492 -0.005753169 -0.18448331
## [5,] -0.4951535 0.437516093 -0.17105654
## [6,] 0.3379657 -0.422155399 0.31275077
## [7,] 0.3926143 0.385501627 -0.25843532
## [8,] -0.3851210 -0.443506929 0.28651716
## [9,] -0.3716327 0.120439381 0.26285252
Se realiza el análisis factorial con 2 factores.
factanal(Datos.sc[, 1:9], factors=2)##
## Call:
## factanal(x = Datos.sc[, 1:9], factors = 2)
##
## Uniquenesses:
## ALOY1 ALOY2 ALOY3 CLOY1 CLOY2 CLOY3 CLOY4 CLOY5 CLOY6
## 0.211 0.125 0.396 0.316 0.285 0.328 0.203 0.241 0.314
##
## Loadings:
## Factor1 Factor2
## ALOY1 0.308 0.833
## ALOY2 0.278 0.893
## ALOY3 0.208 0.749
## CLOY1 0.801 0.205
## CLOY2 0.795 0.287
## CLOY3 0.767 0.290
## CLOY4 0.861 0.238
## CLOY5 0.836 0.243
## CLOY6 0.305 0.770
##
## Factor1 Factor2
## SS loadings 3.612 2.969
## Proportion Var 0.401 0.330
## Cumulative Var 0.401 0.731
##
## Test of the hypothesis that 2 factors are sufficient.
## The chi square statistic is 135.66 on 19 degrees of freedom.
## The p-value is 1.23e-19
(Datos.fa.ob <- factanal(Datos.sc[, 1:9], factors=2, rotation="varimax"))##
## Call:
## factanal(x = Datos.sc[, 1:9], factors = 2, rotation = "varimax")
##
## Uniquenesses:
## ALOY1 ALOY2 ALOY3 CLOY1 CLOY2 CLOY3 CLOY4 CLOY5 CLOY6
## 0.211 0.125 0.396 0.316 0.285 0.328 0.203 0.241 0.314
##
## Loadings:
## Factor1 Factor2
## ALOY1 0.308 0.833
## ALOY2 0.278 0.893
## ALOY3 0.208 0.749
## CLOY1 0.801 0.205
## CLOY2 0.795 0.287
## CLOY3 0.767 0.290
## CLOY4 0.861 0.238
## CLOY5 0.836 0.243
## CLOY6 0.305 0.770
##
## Factor1 Factor2
## SS loadings 3.612 2.969
## Proportion Var 0.401 0.330
## Cumulative Var 0.401 0.731
##
## Test of the hypothesis that 2 factors are sufficient.
## The chi square statistic is 135.66 on 19 degrees of freedom.
## The p-value is 1.23e-19
heatmap.2(Datos.fa.ob$loadings,
col=brewer.pal(9, "Reds"), trace="none", key=FALSE, dend="none",
Colv=FALSE, cexCol = 1.2,
main="\n\nFactor loadings")Se observa que, con 2 factores, se alcanza un 73% de la varianza acumulada.
Se analiza la estructura de los factores de manera gráfica:
semPaths(Datos.fa.ob, what="est", residuals=FALSE,
cut=0.3, posCol=c("white", "darkred"), negCol=c("white", "red"),
edge.label.cex=0.75, nCharNodes=7)Se calculan las puntuaciones factoriales mediante el método de Bartlett:
Datos.fa.ob.4 <- factanal(Datos.sc[, 1:9], factors=2, rotation="oblimin",
scores="Bartlett")
Datos.scores <- data.frame(Datos.fa.ob.4$scores)
Datos.scores$Datos <- Datos.sc$Datos
head(Datos.scores)## Factor1 Factor2
## 1 1.2450722 1.1416038
## 2 0.5221808 0.3019929
## 3 -0.2386911 -0.9095734
## 4 -0.2214077 -0.2086002
## 5 -2.8948231 -1.5443371
## 6 -1.6878876 -1.5588041
Finalmente, se analizan los factores con distintos tipos de rotación:
rot<-c("none", "varimax", "quartimax","Promax", "oblimin")
bi_mod<-function(tipo){
biplot.psych(fa(Datos.sc, nfactors=2, rotate=tipo, fm="mle"),
cex=c(1.5, 1),cuts=c(0),
main = paste("Biplot con rotación ", tipo),
col=c(2,3,4), pch = c(21,18)
#labels = brand.mean[,"brand"],
)
}
require(graphics)
options(repr.plot.width = 8, repr.plot.height = 10)
sapply(rot,bi_mod)## $none
## NULL
##
## $varimax
## NULL
##
## $quartimax
## NULL
##
## $Promax
## NULL
##
## $oblimin
## NULL
Se decide preservar la última rotación evaluada (oblimin), dado que propone una asociación más nítida de cada una de las variables con el factor correspondiente.
semPaths(Datos.fa.ob.4, what="est", residuals=FALSE,
cut=0.3, posCol=c("white", "darkred"), negCol=c("white", "red"),
edge.label.cex=0.75, nCharNodes=7)El análisis realizado sugiere que existen dos perfiles vinculados a la valoración de las zapatillas: uno que prioriza aspectos vinculados a la fidelidad cognitiva y parece más conservador en su compra, buscando que responda a sus expectativas, sea de calidad y durable (Factor 1); y otro que pone énfasis en el precio de las zapatiillas y en variables vinculadas a la fidelidad afectiva, pudiendo asociarse a un público moderno o jóven que prioriza la actitud asociada al producto y las características que presenta (Factor 2).