Los archivos de datos a menudo tienen muchas variables, muchas dimensiones, y es ventajoso reducirlas a conjuntos más pequeños de variables a considerar. Por ejemplo, es posible que tengamos muchos elementos en una encuesta de consumidores que reflejen un número menor de conceptos, como la satisfacción del cliente con un servicio, el liderazgo de categoría para una marca o el lujo de un producto. Si podemos reducir los datos a sus mínimas dimensiones, podemos identificar más claramente las relaciones entre conceptos.
En este capítulo consideramos dos métodos comunes para reducir la complejidad de los datos al simplificar su estructura o reducir el número de dimensiones en los datos. Primero veremos El análisis de componentes principales (PCA) intenta encontrar dimensiones lineales no correlacionadas que capturan la varianza máxima en los datos. El escalamiento multidimensional (MDS) mapea similitudes entre observaciones en términos de un espacio de baja dimensión, como una gráfica bidimensional. MDS puede trabajar con datos métricos y con datos no métricos, como datos categóricos u ordinales.
Así como en cada una de las clases anteriores, empezaremos haciendo el cargue de datos. El día de hoy estaremos trabajando con una base de datos que traeremos de internet (Cool, ¿no creen?). Esta base de datos viene del libro “R for Marketing and Research”, la cual nos permitirá estudiar la reducción de dimensionalidad utilizando un conjunto de datos simulados que es típico de las encuestas de percepción de marca de los consumidores.
data1 <- read.csv("https://goo.gl/z5P8ce")
head(data1)
## Adaptable BestValue CuttingEdge Delightful Exciting Friendly Generous Helpful
## 1 6 5 4 4 3 4 5 4
## 2 4 3 4 2 4 4 5 2
## 3 3 2 3 6 5 5 6 4
## 4 4 1 4 4 5 4 5 3
## 5 4 1 3 3 3 5 5 4
## 6 4 3 4 4 3 4 6 2
## Intuitive Brand
## 1 3 Sierra
## 2 5 Romeo
## 3 3 Sierra
## 4 3 Sierra
## 5 4 Sierra
## 6 4 Sierra
Estos datos reflejan las calificaciones de los consumidores de las marcas con respecto a los adjetivos de percepción tal como se expresan en los elementos de la encuesta con la siguiente forma:
Figura 1: Adjetivos de percepción
El análisis de componentes principales (PCA) es un método estadístico que permite simplificar la complejidad de espacios muestrales con muchas dimensiones a la vez que conserva su información. Supóngase que existe una muestra con n individuos cada uno con \(p\) variables \((X1, X2, …, Xp)\), es decir, el espacio muestral tiene \(p\) dimensiones. PCA permite encontrar un número de factores subyacentes \((z<p)\) que explican aproximadamente lo mismo que las p variables originales. Donde antes se necesitaban p valores para caracterizar a cada individuo, ahora bastan \(z\) valores. Cada una de estas \(z\) nuevas variables recibe el nombre de componente principal.
El análisis de componentes principales pertenece a la familia de técnicas conocida como unsupervised learning. Los métodos de supervised learning que veremos la próxima semana tienen el objetivo de predecir una variable respuesta \(Y\) a partir de una serie de predictores. Para ello, se dispone de \(p\) características \((X1, X2 … Xp)\) y de la variable respuesta \(Y\) medidas en n observaciones. En el caso de unsupervised learning, la variable respuesta Y no se tiene en cuenta ya que el objetivo no es predecir \(Y\) sino extraer información empleando los predictores, por ejemplo, para identificar subgrupos. El principal problema al que se enfrentan los métodos de unsupervised learning es la dificultad para validar los resultados dado que no se dispone de una variable respuesta que permita contrastarlos.
El análisis de componentes principales (PCA) vuelve a calcular un conjunto de variables en términos de ecuaciones lineales, conocidas como componentes, que capturan relaciones lineales en los datos. El primer componente captura la mayor cantidad posible de la varianza de todas las variables como una única función lineal. El segundo componente captura la mayor variación posible que queda después del primer componente. Esto continúa hasta que haya tantos componentes como variables. Podemos usar este proceso para reducir la complejidad de los datos reteniendo y analizando solo un subconjunto de esos componentes, como el primero o los dos primeros, que explican una gran proporción de la variación. en los datos.
Una forma intuitiva de entender el proceso de PCA consiste en interpretar las componentes principales desde un punto de vista geométrico. Supóngase un conjunto de observaciones para las que se dispone de dos variables \((X1, X2)\). El vector que define la primera componente principal \((Z1)\) sigue la dirección en la que las observaciones varían más (linea roja). La proyección de cada observación sobre esa dirección equivale al valor de la primera componente para dicha observación (principal component scores, \(zi1\)).
Figura 2: Primer componente principal
La segunda componente \((Z2)\) sigue la segunda dirección en la que los datos muestran mayor varianza y que no está correlacionada con la primera componente. La condición de no correlación entre componentes principales equivale a decir que sus direcciones son perpendiculares/ortogonales.
Figura 3: Segundo componente principal
A menudo, es una buena práctica cambiar la escala de los datos sin procesar. Esto hace que los datos sean más comparables entre individuos y muestras. Un procedimiento común es centrar cada variable restando su media de cada observación y luego volver a escalar esos valores centrados como unidades de desviación estándar. Esto se denomina comúnmente estandarización, normalización o valores Z de los datos.
Existen dos formas de hacer la estandarización. La primera es crear una nueva variable normalizada a partir de la media y la desviación estándar:
var1 <- (data1$Adaptable - mean(data1$Adaptable))/ sd(data1$Adaptable)
summary(var1)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -3.3414 -0.2622 -0.2622 0.0000 0.7643 2.8171
La otra opción es utilizar la función scale:
data2 <- data1
data2[,1:9] <- data.frame(scale(data2[,1:9]))
summary(data2)
## Adaptable BestValue CuttingEdge Delightful
## Min. :-3.3414 Min. :-2.7323 Min. :-2.88159 Min. :-3.04151
## 1st Qu.:-0.2622 1st Qu.:-0.8139 1st Qu.:-1.00463 1st Qu.:-1.00202
## Median :-0.2622 Median : 0.1453 Median :-0.06616 Median : 0.01772
## Mean : 0.0000 Mean : 0.0000 Mean : 0.00000 Mean : 0.00000
## 3rd Qu.: 0.7643 3rd Qu.: 1.1045 3rd Qu.: 0.87232 3rd Qu.: 1.03746
## Max. : 2.8171 Max. : 3.0228 Max. : 2.74928 Max. : 3.07695
## Exciting Friendly Generous Helpful
## Min. :-2.8785 Min. :-3.2141 Min. :-3.20078 Min. :-2.67745
## 1st Qu.:-0.8881 1st Qu.:-0.2435 1st Qu.:-1.08908 1st Qu.:-0.82696
## Median : 0.1070 Median :-0.2435 Median :-0.03323 Median : 0.09829
## Mean : 0.0000 Mean : 0.0000 Mean : 0.00000 Mean : 0.00000
## 3rd Qu.: 1.1022 3rd Qu.: 0.7467 3rd Qu.: 1.02262 3rd Qu.: 1.02353
## Max. : 3.0925 Max. : 2.7271 Max. : 3.13431 Max. : 2.87403
## Intuitive Brand
## Min. :-2.8282 Length:3050
## 1st Qu.:-0.7519 Class :character
## Median : 0.2863 Mode :character
## Mean : 0.0000
## 3rd Qu.: 0.2863
## Max. : 3.4007
¿Por qué hacemos este ejercicio? El proceso de PCA identifica aquellas direcciones en las que la varianza es mayor. Como la varianza de una variable se mide en su misma escala elevada al cuadrado, si antes de calcular las componentes no se estandarizan todas las variables para que tengan media 0 y desviación estándar 1, aquellas variables cuya escala sea mayor dominarán al resto. De ahí que sea recomendable estandarizar siempre los datos.
Vamos a explorar la aplicación de los componentes principales a partir del método directo que nos provee R. Sin embargo, tenga en cuenta que el método usando los valores y vectores propios está disponible con la siguiente fórmula:
\[\begin{equation} (datos Originales^T) * (Eigenvectors^T) = PCA \end{equation}\]
Lo primero que se debe hacer es revisar que la varianza esté correcto, lo cual hicimos en el punto anterior con la normalización de los datos.La función prcomp() es una de las múltiples funciones en R que realizan PCA. Por defecto, prcomp() centra las variables para que tengan media cero, pero si se quiere además que su desviación estándar sea de uno, hay que indicar scale = TRUE si no ha realizado el proceso de normalización :
pca <- prcomp(data2[,1:4], scale=TRUE)
names(pca)
## [1] "sdev" "rotation" "center" "scale" "x"
Los elementos center y scale almacenados en el objeto pca contienen la media y desviación típica de las variables previa estandarización (en la escala original). Dado que nuestros datos ya habían sido normalizados, este resultado se espera que sea 0 y 1 respectivamente:
pca$center
## Adaptable BestValue CuttingEdge Delightful
## 3.434047e-16 -5.241709e-18 7.534956e-18 1.465836e-16
pca$scale
## Adaptable BestValue CuttingEdge Delightful
## 1 1 1 1
Los términos en el elemento rotation reciben en el nombre de loadings y son los que definen a la componente. La primera casilla es el loading de la variable X1 de la primera componente principal. Los loadings pueden interpretarse como el peso/importancia que tiene cada variable en cada componente y, por lo tanto, ayudan a conocer que tipo de información recoge cada una de las componentes.
pca$rotation
## PC1 PC2 PC3 PC4
## Adaptable -0.70421361 -0.05891908 -0.12428130 -0.69653851
## BestValue -0.70301997 -0.07770485 0.09251454 0.70083232
## CuttingEdge 0.05241830 -0.70562028 0.69678867 -0.11763454
## Delightful 0.08425224 -0.70184793 -0.70034332 0.09914776
Analizar con detalle el vector de loadings que forma cada componente puede ayudar a interpretar que tipo de información recoge cada una de ellas. Por ejemplo, la primera componente es el resultado de la siguiente combinación lineal de las variables originales:
\[\begin{equation} PC1= -0.704 * Adaptable - 0.703 * BestValue + 0.052 * CuttingEdge - 0.084 * Delightful \end{equation}\]
Los pesos asignados en la primera componente a las variables Adaptable y BestValue son aproximadamente iguales entre ellos y bastante superiores al asignado a las otras variables, esto significa que la primera componente recoge mayoritariamente la información correspondiente a las características físicas del producto (adaptable y de buen valor. En el segundo componente vemos el efecto contrario ya que nos habla de la percepción del producto (innovador y encantador).}
Una característica menos obvia de PCA, pero implícita en la definición, es que los componentes de PCA extraídos no están correlacionados entre sí, porque de lo contrario habría más varianza lineal que podría haber sido capturada. Vemos esto en las puntuaciones devueltas para las observaciones en un modelo PCA, donde las correlaciones fuera de la diagonal son efectivamente cero.
cor(pca$x)
## PC1 PC2 PC3 PC4
## PC1 1.000000e+00 4.358050e-16 2.362762e-15 5.997051e-15
## PC2 4.358050e-16 1.000000e+00 -7.596001e-15 1.446162e-15
## PC3 2.362762e-15 -7.596001e-15 1.000000e+00 6.024365e-16
## PC4 5.997051e-15 1.446162e-15 6.024365e-16 1.000000e+00
Una buena forma de examinar los resultados de PCA es mapear los primeros componentes, lo que nos permite visualizar los datos en un espacio de menor dimensión. Una visualización común es un biplot, un gráfico bidimensional de puntos de datos con respecto a los dos primeros componentes de PCA, superpuesto con una proyección de las variables en los componentes. Usamos biplot() para generar esto. Es recomendable indicar el argumento scale = 0 para que las flechas estén en la misma escala que las componentes:
biplot(pca, scale=0,cex = 0.6)
En la figura anterior hay flechas que muestran el mejor ajuste de cada una de las variables en los componentes principales: una proyección de las variables en el espacio bidimensional de los dos primeros componentes del PCA, que explican gran parte de la variación en los datos. Es útil inspeccionarlos porque la dirección y el ángulo de las flechas reflejan la relación de las variables; un ángulo más cercano indica una asociación positiva más alta, mientras que la dirección relativa indica una asociación positiva o negativa de las variables.
Un biplot de la solución de PCA para las calificaciones medias proporciona un mapa perceptual interpretable, que muestra dónde se ubican las marcas con respecto a los dos primeros componentes principales. Un mapa de posicionamiento es una técnica de análisis de marketing, que permite representar de manera visual la percepción que tienen los clientes respecto a una empresa, marca o producto y/o sus rivales en el mercado.
Pero hay un problema: la trama de las calificaciones de los encuestados individuales es demasiado densa y no nos informa sobre las posiciones de la marca. Una mejor solución es realizar PCA utilizando calificaciones agregadas por marca. Primero, recordamos los datos que compilaron la calificación media de cada adjetivo por marca. Luego extraemos los componentes principales:
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
data3 <- data2 %>% group_by(Brand) %>% summarise(Adaptable=mean(Adaptable), GranValor=mean(BestValue), Innovador=mean(CuttingEdge), Encantador=mean(Delightful))
head(data3)
## # A tibble: 4 x 5
## Brand Adaptable GranValor Innovador Encantador
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Papa 0.148 -0.134 -0.560 -0.463
## 2 Romeo 0.0500 -0.0320 -0.148 -0.0526
## 3 Sierra -0.0851 0.0236 0.221 0.128
## 4 Tango -0.0983 0.233 0.585 0.413
Una vez hemos resumido los datos ya podemos revisar nuestros componentes principales:
pca2=prcomp(data3[2:5])
biplot(pca2, scale=0,cex = 0.6, xlabs=data3$Brand)
Esto nos muestra la importancia de cada una de las marcas que tenemos en la base de datos.
Una de las preguntas más frecuentes que surge tras realizar un PCA es: ¿Cuánta información presente en el set de datos original se pierde al proyectar las observaciones en un espacio de menor dimensión? o lo que es lo mismo ¿Cuanta información es capaz de capturar cada una de las componentes principales obtenidas? Para contestar a estas preguntas se recurre a la proporción de varianza explicada por cada componente principal.
Tanto la proporción de varianza explicada como la proporción de varianza explicada acumulada son dos valores de gran utilidad a la hora de decidir el número de componentes principales a utilizar en los análisis posteriores. Si se calculan todas las componentes principales de un set de datos, entonces, aunque transformada, se está almacenando toda la información presente en los datos originales. El sumatorio de la proporción de varianza explicada acumulada de todas las componentes es siempre 1.
Para obtener estos valores utilizaremos la función summary() sobre el PCA realizado:
summary(pca)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.1767 1.1461 0.8290 0.7839
## Proportion of Variance 0.3462 0.3284 0.1718 0.1536
## Cumulative Proportion 0.3462 0.6745 0.8464 1.0000
Como podrán notar en los datos, cada uno de los componentes tiene un valor entre 1 y 0 que corresponde a la varianza explicada por ese componente. Así, el primer componente explica el 34% de la varianza observada en los datos y la segunda el 32%. Las dos últimas componentes no superan por separado el 20% de varianza explicada. Si se empleasen únicamente las dos primeras componentes se conseguiría explicar el 67% de la varianza observada.
Por lo general, dada una matriz de datos de dimensiones \(n x p\), el número de componentes principales que se pueden calcular es como máximo de \(n-1\) o \(p\) (el menor de los dos valores es el limitante). Sin embargo, siendo el objetivo del PCA reducir la dimensionalidad, suelen ser de interés utilizar el número mínimo de componentes que resultan suficientes para explicar los datos.
No existe una respuesta o método único que permita identificar cual es el número óptimo de componentes principales a utilizar. Una forma de proceder muy extendida consiste en evaluar la proporción de varianza explicada acumulada y seleccionar el número de componentes mínimo a partir del cual el incremento deja de ser sustancial.
Para visualizar la proporción acumulada usaremos un scree plot, la que nos permite ver los saltos de la varianza. Mi consejo es que se queden en el último salto que consideren grande entre los componentes:
plot(pca , type="l")
Y ahora ¿cómo nos aseguramos que los componentes principales estén bien? Para eso nos aseguraremos de tener unas consideraciones especiales.
Al trabajar con varianzas, el método PCA es altamente sensible a outliers, por lo que es altamente recomendable estudiar si los hay. La detección de valores atípicos con respecto a una determinada dimensión es algo relativamente sencillo de hacer mediante comprobaciones gráficas. Sin embargo, cuando se trata con múltiples dimensiones el proceso se complica. Por ejemplo, considérese un hombre que mide 2 metros y pesa 50 kg. Ninguno de los dos valores es atípico de forma individual, pero en conjunto se trataría de un caso muy excepcional.
Figura 4: Distancia de Mahalanobis
La distancia de Mahalanobis es una medida de distancia entre un punto y la media que se ajusta en función de la correlación entre dimensiones y que permite encontrar potenciales outliers en distribuciones multivariante.
m.dist.order <- order(mahalanobis(data2[,1:2], colMeans(data2[,1:2]), cov(data2[,1:2])), decreasing=TRUE)
is.outlier <- rep(FALSE, nrow(data2[,1:2]))
is.outlier[m.dist.order[1:10]] <- TRUE
pch <- is.outlier * 5
plot(data2[,1:2], pch=pch)
En este caso no vemos que existan outliers, por lo que podemos estar tranquilos sobre su uso.
El proceso de PCA genera siempre las mismas componentes principales independientemente del software utilizado, es decir, el valor de los loadings resultantes es el mismo. La única diferencia que puede darse es que el signo de todos los loadings esté invertido. Esto es así porque el vector de loadings determina la dirección de la componente, y dicha dirección es la misma independientemente del signo (la componente sigue una línea que se extiende en ambas direcciones). Del mismo modo, el valor específico de las componentes obtenido para cada observación (principal component scores) es siempre el mismo, a excepción del signo.
Otro método que tenemos para producir estos resultados es el escalamiento multidimensional. El escalamiento multidimensional (MDS) es una familia de procedimientos que también se puede utilizar para encontrar representaciones de datos de dimensiones inferiores. En lugar de extraer componentes subyacentes o factores latentes, MDS trabaja con distancias (también conocidas como similitudes). MDS intenta encontrar un mapa de dimensiones inferiores que mejor conserve todas las similitudes observadas entre los elementos.
Si ya tiene datos de similitud, como calificaciones directas de si un producto es como otro, puede aplicar MDS directamente a los datos. Si tiene otros tipos de datos, como los datos de calificación de la marca que hemos considerado en este capítulo, debe calcular las distancias entre los puntos antes de aplicar MDS. Una vez tenemos las distancias aplicamos el comando cmdscale():
distancia <- dist(data3[2:5])
sc <- cmdscale(distancia)
El resultado de cmdscale () es una lista de dimensiones X e Y que indican coordenadas de parcela estimadas bidimensionales para entidades (en este caso, marcas). Vemos las ubicaciones de parcela para las marcas ayb en el resultado anterior. Dadas esas coordenadas, simplemente podemos realizar un plot() los valores y etiquetarlos:
plot(sc , type="n")
text(sc , levels(data3$Brand) , cex =1)
### Datos no numéricos
Para datos no métricos, como clasificaciones o variables categóricas, usaría un método diferente para calcular la distancia y un algoritmo MDS que no asume distancias métricas. Para eso usaremos el paquete cluster() que nos permitirá calcular la distancia con la función daisy() usando la distancia de gower:
library(cluster)
data3$Brand <- as.factor(data3$Brand)
dist.r <- daisy(data3, metric="gower")
Una vez tenemos las distancias podemos calcular el escalamiento con la función isoMDS() del paquete MASS:
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
sc2 <- isoMDS(dist.r, k=2)
## initial value 0.000000
## final value 0.000000
## converged
Por último revisaremos los resultados con un nuevo plot():
plot(sc2$points , type="n")
text(sc2$points , levels(data3$Brand) , cex =1)
La investigación de la complejidad de los datos de uno tiene varios beneficios. Permite la inspección de las relaciones dimensionales subyacentes entre las variables, la investigación de cómo las observaciones como las marcas o las personas varían en esas dimensiones y la estimación de un número menor de puntuaciones dimensionales más fiables. Los siguientes puntos clave lo ayudarán a investigar las dimensiones subyacentes de sus datos:
El análisis de componentes principales (PCA) encuentra funciones lineales que explican la varianza máxima en los datos observados. Un concepto clave es que dichos componentes son ortogonales (no correlacionados). El comando básico de R es prcomp().
Un uso común de PCA es un biplot de puntajes agregados para que las marcas o las personas visualicen las relaciones. Cuando esto se hace para datos de actitud, como calificaciones de marca, se denomina mapa perceptual. Esto se crea agregando la estadística de interés por entidad y graficando con biplot().
Debido a que los componentes de PCA a menudo se cargan en muchas variables, los resultados deben inspeccionarse con cuidado y en términos de posición relativa. Es particularmente difícil leer el estado de elementos individuales de un biplot de PCA.
dist() para datos métricos o un procedimiento como daisy() para datos no métricos. Luego, el escalamiento de MDS se realiza mediante cmdscale() para datos métricos o isoMDS() (u otras opciones) para datos no métricos