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).