El análisis de componentes principales (ACP) es una herramienta estadística en el análisis de datos multivariados. Su propósito principal es examinar conjuntos de datos multidimensionales que contienen variables cuantitativas, permitiendo extraer información significativa de grandes volúmenes de datos de manera eficiente para reducir la dimensionalidad del conjunto de variables. El ACP actúa como un método de proyección, transformando observaciones de un espacio p-dimensional (p es el número de variables) a un espacio k-dimensional (k < p). Esta transformación maximiza la retención de la información original, medida a través de la varianza total del conjunto de datos. Las nuevas dimensiones resultantes del ACP se conocen como ejes o factores.
Una de las principales ventajas del ACP es su capacidad para simplificar la complejidad de los datos sin disminuir una cantidad significativa de información. Si los primeros dos o tres ejes generados explican un porcentaje considerable de la variabilidad total de los datos (alrededor del 80%), es posible representar las observaciones en gráficos de dos o tres dimensiones, facilitando así su interpretación y análisis. Los factores derivados del ACP son combinaciones lineales no correlacionadas de las variables originales, lo cual es especialmente beneficioso en métodos de modelización como la regresión lineal o la regresión logística.
En este taller, se utilizará la librería MASS de R, que incluye la base de datos Boston. Esta base de datos proporciona información sobre el precio mediano de la vivienda y diversas características de 506 vecindarios en el distrito de Boston en Estados Unidos. Las 14 variables disponibles en este conjunto de datos son:
Para este análisis, se eliminó la variables CHAS por ser cualitativa y la variable MEDV se filtró hasta el valor 50 debido a su comportamiento atípico. A continuación, se realizó un análisis exploratorio de datos tanto univariado como bivariado. En el análisis bidimensional, se utilizó la matriz del coeficiente de correlación de Pearson para definir los pares de variables a modificar, eliminando datos atípicos cuando fue necesario. Además, se emplearon gráficos de dispersión y boxplots para la visualización de las variables.
En la segunda parte del análisis, se aplicó el método de componentes principales para reducir la dimensionalidad del conjunto de datos. Se identificaron las componentes principales y se analizó su contexto. Estas componentes fueron proyectadas en un plano para estudiar la relación entre las variables en este nuevo espacio. Todo el análisis se llevó a cabo utilizando el software R y se documentó en un archivo de R Markdown.
El objetivo de este taller es proporcionar una comprensión integral del ACP, desde la teoría hasta la aplicación práctica, utilizando un conjunto de datos reales y herramientas estadísticas.
Realizar un análisis de componentes principales (ACP) donde se reduzca la dimensionalidad del conjunto de datos Boston y se identifiquen sus componentes principales en un plano cartesiano.
Determinar el número óptimo de componentes principales que se retendrán para el análisis.
Generar una interpretación contextual para las componentes principales, identificando qué variables originales influyen más a cada componente.
Proyectar las variables del conjunto de datos en el plano definido por las componentes principales.
Analizar la relación entre las variables del conjunto de datos desde la perspectiva del plano de componentes principales.
Previo a realizar el Análisis de Componentes Principales (ACP), se procedió a preparar la base de datos. Primero, se eliminaron los valores de 50 en la variable medv, ya que presentaban una alta y anormal frecuencia en ese valor, este valor corresponde a un umbral de máximo avalúo de un bien, lo que representa una inconsistencia para esta variable. Además, se eliminó la variable chas, ya que es una variable cualitativa y no es adecuada para el ACP.
# Base de datos
data("Boston")
#Filtrar datos
Boston <- subset(Boston, medv < 50)
Boston <- Boston %>% dplyr::select(-chas)
datos <- Boston
Para comenzar el análisis, se llevó a cabo un análisis univariado de los datos con el fin de identificar la presencia de valores atípicos y entender el comportamiento de cada variable en términos de su media y dispersión. Se utilizó la función apply para calcular las medidas de tendencia central y dispersión (media y desviación estándar) de cada variable. A continuación, se generaron diagramas de caja (boxplots) para cada variable utilizando la función boxplot, permitiendo una visualización gráfica de los datos.
## Medidas de Tendencia y Boxplots.
Resumen= rbind(apply(datos, 2, "mean"),
apply(datos, 2, "sd"))
rownames(Resumen)=c("Promedio", "Desviación")
print(Resumen,2)
## crim zn indus nox rm age dis rad tax ptratio black lstat medv
## Promedio 3.6 11 11.1 0.55 6.25 68 3.8 9.5 408 18.5 356 12.9 21.6
## Desviación 8.7 23 6.8 0.12 0.65 28 2.1 8.7 168 2.1 93 7.1 7.9
par(mfrow=c(2,4))
invisible(lapply(colnames(datos),function(y){
boxplot(datos[,y],ylab=y,cex=1.5,pch=20,col="#FFEDED")
}))
Respecto a los diagramas de caja, se observó que algunas variables presentan datos atípicos de manera univariada. En particular, las variables rm, dis y crim son las que muestran más valores atípicos. Sin embargo, la presencia de datos atípicos en el análisis univariado no necesariamente implica que estos sean significativos en el ACP. La existencia de valores atípicos univariados no refleja directamente la eficacia del ACP, por ello, se procedió a examinar las variables de manera bivariada para entender mejor las relaciones entre ellas y determinar si estos datos atípicos afectan significativamente dichas relaciones.
Con el objetivo de examinar el comportamiento de las variables en relación con las demás, se utilizó la función pairs para generar una matriz de gráficos de dispersión (scatter plots). Este paso permitió visualizar las relaciones y posibles correlaciones entre pares de variables.
pairs(datos,pch=20,cex=0.5,lower.panel = NULL)
A partir de los gráficos de dispersión, se observó que algunos pares de variables muestran una fuerte correlación y una tendencia marcada, ya sea positiva o negativa. Por ejemplo, las variables lstat y medv, así como nox y dis, presentan relaciones claras. Sin embargo, en algunos casos se identificaron datos que podrían afectar la correlación, como es el caso de rad e indus. Para una evaluación más precisa de estas relaciones, se elaboró una matriz de correlación.
Para complementar el análisis anterior y cuantificar la relación entre las variables, se calculó la matriz de correlación utilizando el coeficiente de Pearson con la función cor. Además, se empleó la función cor.mtest del paquete corrplot para obtener los valores p asociados a cada coeficiente de correlación. Finalmente, se utilizó la función corrplot para visualizar la matriz de correlación, destacando las correlaciones significativas.
# Matriz de correlación
M.cor = cor(datos,method="pearson")
#round(M.cor,2)
p.cor=corrplot::cor.mtest(datos)$p
#round(p.cor,3)
corrplot::corrplot(M.cor,
method = "ellipse",
addCoef.col = "#26456E",
type="upper",
col=c("#FFE2E3","#CCDEF5"),
diag=FALSE,
p.mat = p.cor,
sig.level = 0.05,
insig = "blank",
tl.col = "black",
number.cex = 0.8
)
A partir de la matriz de correlación, se decidió seleccionar y analizar las variables que presentan una alta correlación entre ellas, con el objetivo de verificar que dichas correlaciones fueran reales y no estuvieran afectadas por datos atípicos. Según el gráfico, las variables con mayor correlación entre ellas fueron las siguientes:
Para ello, se procedió a verificar cada par de variables altamente correlacionadas mediante gráficos de dispersión individuales. Esta verificación ayudó a identificar posibles puntos alejados de la nube de puntos principal que pudieran alterar la correlación. Primeramente se creó una copia a la base de datos, la cual se actualizará con las modificaciones con el fin de tener la mejor base de datos y así realizar un buen análisis de componentes principales.
datos_actualizado <- datos
Seguidamente se generaron los gráficos de dispersión para cada par de variables altamente correlacionadas utilizando la función ggplot del paquete ggplot2, que permitió una visualización clara de los puntos de datos y facilitó la identificación de valores atípicos.
ggplot(datos_actualizado, aes(x=medv ,y=lstat)) +
geom_point() +
labs (x = "medv", y = "lstat")
Para identificar los valores atípicos en las variables seleccionadas, se utilizó la función which en combinación con boxplot.stats. Se identificaron y eliminaron los puntos de datos que representaban valores atípicos extremos. Este proceso se repitió para todas las variables que mostraban una alta correlación. Además, se utilizó la función subset para recortar los datos y eliminar observaciones no deseadas, asegurando que los puntos alejados de la nube de puntos no afectaran la correlación.
x=datos_actualizado$medv
which(x == boxplot.stats(x)$out)
## integer(0)
Para verificar los cambios realizados, después de cada ajuste, se volvió a calcular la matriz de correlación para observar cómo variaban las correlaciones entre las variables. Además, se eliminaron o ocultaron aquellas correlaciones con un nivel de significancia por debajo del 5%.
# Matriz de correlación Actualizada
M.cor = cor(datos_actualizado,method="pearson")
#round(M.cor,2)
p.cor=corrplot::cor.mtest(datos_actualizado)$p
#round(p.cor,3)
corrplot::corrplot(M.cor,
method = "ellipse",
addCoef.col = "#26456E",
type="upper",
col=c("#FFE2E3","#CCDEF5"),
diag=FALSE,
p.mat = p.cor,
sig.level = 0.05,
insig = "blank",
tl.col = "black",
number.cex = 0.8
)
Tras realizar la limpieza de los datos y eliminar aquellos datos atípicos que realmente afectaban la correlación, se observó en la nueva matriz de correlación que muchas variables no presentaban correlaciones relevantes. Por el contrario, se mantuvieron altas correlaciones entre variables como lstat y medv, age y dis, rm y lstat, indus y nox, entre otras. Esto confirmó que la eliminación de datos atípicos mejoró la precisión de las correlaciones significativas entre las variables restantes.
Para realizar el ACP con los datos previamente filtrados y depurados, se utilizó la función prcomp. Los argumentos incluidos en esta función indican que, antes de iniciar el análisis, los datos deben ser centrados, es decir, se debe restar la media para que cada variable tenga una media cero. Además, los datos deben ser escalados, lo que implica dividir cada variable por su desviación estándar para que todas tengan una desviación estándar igual a uno. Esto es importante porque asegura que todas las variables sean tratadas de manera equitativa durante el análisis, independientemente de su escala original. Utilizando la función sumarry se obtuvo un resumen de los resultados del ACP. Este muestra la desviación estándar de cada componente principal, la porción de la varianza explicada por cada componente y la proporción acumulada de la varianza explicada por todas las componentes.
# Aplicar el ACP, centrando y escalando los datos.
acp = prcomp(datos_actualizado,center=TRUE,scale=TRUE)
summary(acp)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 2.2934 1.4128 1.1722 0.99428 0.91079 0.78007 0.74775
## Proportion of Variance 0.4046 0.1535 0.1057 0.07605 0.06381 0.04681 0.04301
## Cumulative Proportion 0.4046 0.5581 0.6638 0.73986 0.80367 0.85048 0.89349
## PC8 PC9 PC10 PC11 PC12 PC13
## Standard deviation 0.67464 0.53414 0.50795 0.42850 0.3587 0.27186
## Proportion of Variance 0.03501 0.02195 0.01985 0.01412 0.0099 0.00569
## Cumulative Proportion 0.92850 0.95045 0.97030 0.98442 0.9943 1.00000
Del resumen de resultados se puede observar que la primera componente principal (PC1) tiene la mayor desviación estándar y explica el 40.46% de la varianza. Las siguientes componentes principales (PC2 y PC3) explican un 15.35% y un 10.57% de la varianza, respectivamente. Esto indica que PC1 es la combinación lineal de las variables originales que captura la mayor cantidad de información en los datos, seguida de PC2 y PC3.
Por otro lado, para tomar la decisión sobre cuántas componentes retener, se procedió a utilizar la desviación estándar de las componentes principales obtenida anteriormente para calcular la varianza acumulada explicada por estas componentes. En general, se elige un umbral y se retienen tantas componentes como sea necesario para explicar esa cantidad de varianza.
# ¿Cuántas componentes retener?
acp$sdev
## [1] 2.2933803 1.4128021 1.1721728 0.9942847 0.9107892 0.7800663 0.7477541
## [8] 0.6746444 0.5341420 0.5079533 0.4285025 0.3586579 0.2718640
varianza = cumsum(acp$sdev^2)*100/sum(acp$sdev^2)
varianza
## [1] 40.45841 55.81233 66.38148 73.98611 80.36716 85.04796 89.34901
## [8] 92.85012 95.04480 97.02954 98.44196 99.43146 100.00000
De acuerdo con los resultados, parece que nueve componentes son suficientes para explicar más del 95% de la varianza. Sin embargo, en este caso, el umbral utilizado será valores mayores al 54%.
Para obtener una visualización útil de los resultados del ACP, se crearon los siguientes gráficos. El primer gráfico muestra los valores propios de cada componente, lo cual es útil para visualizar cuánta varianza explica cada componente. El segundo gráfico muestra la varianza acumulada, lo cual es útil para determinar cuántas componentes retener.
par(mfrow = c(1,2))
# P1. Valores propios de cada componente
coord = barplot(acp$sdev^2, xlab = "Componente", ylab = "Valor Propio", col = "#FFD7D9")
lines(coord, acp$sdev^2, col = "blue",lwd = 2)
abline(h = 1,col = "red", lty=2)
# P2. Varianza acumulada
coord = barplot(varianza, xlab="Componente", ylab = "Varianza Acumulada", col = "#C8DBF4")
lines(coord, varianza, col = "blue",lwd=2)
text(coord, varianza, round(varianza, 2), pos = 3, cex = 0.6)
Observando el gráfico 2 (P2), se seleccionaron las dos principales componentes, ya que estas recogen el 55.8% de la varianza explicada. Posteriormente, se obtuvieron los coeficientes de las dos principales componentes seleccionadas. Estos coeficientes, también conocidos como cargas de las componentes principales, indican cómo cada variable original contribuye a cada componente principal. Un coeficiente alto en valor absoluto para una variable en una componente principal específica indica que esa variable tiene una fuerte influencia en dicha componente.
Se crearon gráficos de barras de los coeficientes estimados con el fin de visualizar qué variables tienen mayor influencia en cada componente. Cada barra representa una variable original, y la altura de la barra indica el coeficiente de esa variable para la componente principal correspondiente. Por un lado las barras de color claro representan coeficientes positivos, mientras que las de color oscuro representan los negativos.
# Componentes retenidas.
print(acp$rotation[,1:2],3)
## PC1 PC2
## crim -0.2589 -0.20190
## zn 0.3103 0.11854
## indus -0.3406 -0.10035
## nox -0.3816 -0.21381
## rm 0.2546 -0.49091
## age -0.3325 -0.18484
## dis 0.3019 0.35088
## rad -0.0815 -0.30105
## tax -0.2016 -0.00695
## ptratio -0.2194 0.27543
## black 0.1349 0.12286
## lstat -0.3382 0.26966
## medv 0.2839 -0.48659
par(mfrow = c(2,1))
barplot(acp$rotation[,1],ylim = c (-0.6,0.6),col = ifelse(acp$rotation[,1]>0,"antiquewhite","#189AAF"),
main = "Coeficientes estimados PC1")
barplot(acp$rotation[,2],ylim = c(-0.6,0.6),col = ifelse(acp$rotation[,2]>0,"antiquewhite","#189AAF"),
main = "Coeficientes estimados PC2")
Analizando los resultados obtenidos de la componente principal (PC1), se observa que las variables zn, rm, dis, black y medv tienen coeficientes positivos, lo que significa que están primitivamente correlacionadas con esta componente. Es decir, a medida que estas variables aumentan, también lo hace el valor de PC1. Por otro lado, las variables crim, indux, nox, age, tax, ptratio, lstat y rad tienen coeficientes negativos, lo que indica que están negativamente correlacionadas con la componente PC1. Es decir, a medida que estas variables aumentan, el valor de PC1 disminuye. La variable nox por su parte posee el coeficiente más alto en valor absoluto para PC1, lo que indica que tiene la mayor influencia en esta componente.
De manera similar, las variables zn, dis, ptratio, lstat y black tienen coeficientes positivos, lo que significa que están positivamente correlacionadas con PC2. Es decir, a medida que estas variables aumentan, también lo hace el valor de PC2. Por otro lado, las variables crim, indus, nox, rm, age, rad, tax y medv tienen coeficientes negativos, lo que indica que están negativamente correlacionadas con PC2. Es decir, a medida que estas variables aumentan, el valor de PC2 disminuye. La variable rm tienen el coeficiente más alto en valor absoluto para PC2, lo que indica que tiene la mayor influencia en esta componente.
Basándose en los coeficientes principales y el contexto de las variables, se puede realizar una interpretación y asignar nombres a las componentes de la siguiente manera:
Componente Principal 1 (PC1): Las variables con coeficientes altos en valor absoluto para PC1 incluyen a indus (Proporción de acres de negocios no minoristas por ciudad), nox (concentración de óxidos nítricos), age (proporción de unidades ocupadas por sus propietarios construidas antes de 1940), y lstat (porcentaje de estatus más bajo de la población). De acuerdo a lo que representas estas variables, las cuales son las mas significativas en la componente, parecen estar asociadas con características que describen la antiguedad de las viviendas y la industrialización de la zona.
Componente Principal 2 (PC2): Las variables con coeficientes altos en valor absoluto para PC1 incluyen a rm (número de habitantes por vivienda), dis (distancias ponderadas a cinco centros de empleo de Boston), rad (índice de accesibilidad a carreteras radiales) y medv (valor medio de las viviendas ocupadas por sus propiertarios en miles de dolares). Estas variables parecen estar relacionadas con características que describen la calidad de las viviendas y la accesibilidad a las carreteras y centros poblados.
F_acp = predict(acp)[,1:2]
industrializacion = predict(acp)[,1]
calidadvivi = predict(acp)[,2]
par(mfrow=c(1,2))
dotchart(industrializacion,labels=rownames(datos_actualizado),pch=22,cex.lab=0.5, main= "PC1 : Antiguedad e Industrialización",
cex.lab=0.8)
abline(v=0,col="red",lty=2)
dotchart(calidadvivi,pch=22,labels=rownames(datos_actualizado), main= "PC2 : Calidad de las viviendas y Accesibilidad",
cex.lab=0.8)
abline(v=0,col="red",lty=2)
El anterior gráfico muestra los resultados del ACP aplicado al conjunto de datos de ambas componentes, tanto de la urbanización como de la accesibilidad de las vías, en donde:
PC1: Antiguedad e Industrialización: Este gráfico de puntos muestra la distribución de las observaciones en el primer componente principal, que parece estar asociado con factores de antiguedad de las viviendas e industrialización. Los puntos a la derecha del eje vertical rojo indican valores altos en este componente, mientras que los puntos a la izquierda indican valores bajos.
PC2: Calidad de las viviendas y Accesibilidad: El segundo gráfico de puntos representa el segundo componente principal, relacionado con la calidad de las viviendas y accesibilidad. De manera similar, los puntos por encima del eje horizontal rojo sugieren una mayor accesibilidad, mientras que los puntos por debajo sugieren una menor accesibilidad.
plot(industrializacion, calidadvivi,pch=22,xlab="PC1 : Antiguedad e Industrialización",ylab="PC2 : Calidad de las viviendas y Accesibilidad")
abline(h=0,v=0,lty=2, col="red")
text(industrializacion, calidadvivi,rownames(datos_actualizado),cex=0.8,col="gray",pos=3)
El gráfico anterior proporciona la combinación visual de ambas componentes donde los puntos en el cuadrante superior derecho indicarían observaciones con altos valores tanto en urbanización como en accesibilidad, mientras que los puntos en el cuadrante inferior izquierdo indicarían lo contrario. Este gráfico ayuda a visualizar la relación entre los dos componentes y a identificar posibles agrupaciones o datos atípicos.
Con el fin de proporcionar una visión mas detallada de los patrones subyacentes de los datos individualmente, se construyó el siguiente gráfico del tipo biplot
biplot(acp,col=c("gray","blue"),cex=0.8,xlim=c(-0.4,0.4), ylim=c(-0.4,0.4))
Este gráfico fue generado a partir del ACP anterior. Los ejes, etiquetados como PC1 y PC2, representan los componentes principales que capturan la mayor variabilidad en los datos, cada punto en el gráfico corresponde a una observación individual en el conjunto de datos, y su posición en el plano refleja sus valores en los componentes PC1 y PC2.
La mayoría de las observaciones se concentran en el centro, lo que indica que tienen valores similares en ambos componentes, esto sugiere que estas observaciones comparten características comunes en términos de urbanización, industrialización y accesibilidad a vías. Sin embargo, hay algunas observaciones que se alejan del centro, lo que podría indicar características únicas o atípicas en estos aspectos.
El análisis desarrollado con el método ACP sobre los datos de las viviendas en Boston, enfocado en el precio mediano y características relacionadas, logró explicar un 55% de la variabilidad total. En el contexto del estudio, que abarca aspectos económicos, culturales, sociales y medioambientales, este porcentaje es considerado adecuado. Los datos analizados incluyen factores como impuestos, contaminación del aire, proporción de personas afroamericanas y otros indicadores, con una prioridad en los datos económicos.
El ACP se llevó a cabo utilizando dos componentes principales, lo cual es significativo dado que permitió reducir la dimensionalidad de los datos de manera efectiva. Este nivel de variabilidad explicada es suficiente para el propósito de simplificación, facilitando una mejor interpretación y visualización de las relaciones entre variables.
La preparación de los datos fue extensa y rigurosa, implicando un total de 13 modificaciones en la base de datos. Estas modificaciones incluyeron la depuración y eliminación de filas correspondientes a datos atípicos por pares de variables, lo que contribuyó a la calidad y coherencia del análisis.
El ACP no solo permitió una simplificación de los datos, sino que también ha proporcionado una comprensión clara y manejable de los factores más influyentes en el precio mediano de las viviendas en Boston. Esto subraya la utilidad del ACP en estudios donde la reducción de dimensionalidad y la extracción de información clave son cruciales para el análisis y la toma de decisiones.
Finalmente, el ACP indicó que el primer componente principal (PC1) está estrechamente asociado con factores de urbanización e industrialización, mientras que el segundo componente principal (PC2) se relaciona principalmente con la accesibilidad a vías y carreteras, además se muestran que las observaciones se distribuyen de manera que las áreas con alta urbanización e industrialización se distinguen claramente en el primer componente, mientras que la accesibilidad a vías se destaca en el segundo componente. Este análisis proporciona una visión clara de cómo diferentes factores contribuyen a la variabilidad en los datos de viviendas en Boston y permite una mejor comprensión de las características subyacentes que afectan los precios y otras variables relevantes de las viviendas.
Análisis de Componentes Principales (ACP). (s.f.). XLSTAT, Your Data Analysis Solution. https://www.xlstat.com/es/soluciones/funciones/analisis-de-componentes-principales-acp