El objetivo de este proyecto es utilizar el algoritmo PCA(Análisis de componentes principales) para la reducción de dimensiones en el conjunto de datos del menú de McDonald’s.
El problema de los datos de alta dimensión ocurre cuando la dimensión del conjunto del conjunto de datos (cada variable numérica es una dimensión) es grande en comparación con el numero de observaciones. El objetivo de la reducción de dimensiones es disminuir el tamaño del conjunto de datos preservando tanta información como sea posible.
El conjunto de datos utilizado en este proyecto contiene valores nutricionales de 260 elementos del menú de McDonald’s. El conjunto de datos completo se puede encontrar el se sitio web de kaggle https://www.kaggle.com/mcdonalds/nutrition-facts. Cada elemento se describe mediante 8 variables: grasas saturadas, colesterol, sodio, carbohidratos, fibra dietética, azúcares y proteínas, Trans_Fat.
summary(df)
## Grasas saturadas Colesterol Sodio Carbohidratos
## Min. : 0.000 Min. : 0.00 Min. : 0.0 Min. : 0.00
## 1st Qu.: 1.000 1st Qu.: 5.00 1st Qu.: 107.5 1st Qu.: 30.00
## Median : 5.000 Median : 35.00 Median : 190.0 Median : 44.00
## Mean : 6.008 Mean : 54.94 Mean : 495.8 Mean : 47.35
## 3rd Qu.:10.000 3rd Qu.: 65.00 3rd Qu.: 865.0 3rd Qu.: 60.00
## Max. :20.000 Max. :575.00 Max. :3600.0 Max. :141.00
## Fibra dietetica Azucares Proteinas Trans_Fat
## Min. :0.000 Min. : 0.00 Min. : 0.00 Min. :0.0000
## 1st Qu.:0.000 1st Qu.: 5.75 1st Qu.: 4.00 1st Qu.:0.0000
## Median :1.000 Median : 17.50 Median :12.00 Median :0.0000
## Mean :1.631 Mean : 29.42 Mean :13.34 Mean :0.2038
## 3rd Qu.:3.000 3rd Qu.: 48.00 3rd Qu.:19.00 3rd Qu.:0.0000
## Max. :7.000 Max. :128.00 Max. :87.00 Max. :2.5000
hist(df$`Grasas saturadas`, main = "Grasas Saturadas", xlab = "Grasa saturada", ylab = "Frecuencia")
hist(df$Trans_Fat, main = "Trans Fat", xlab = "Trans Fat", ylab = "Frecuencia")
hist(df$Colesterol,main = "Colesterol", xlab = "Colesterol", ylab = "Frecuencia")
hist(df$Sodio, main = "Sodio", xlab = "Sodio", ylab = "Frecuencia")
hist(df$Carbohidratos, main = "Carbohidratos", xlab = "Carbohidratos", ylab = "Frecuencia")
hist(df$`Fibra dietetica`, main = "Fibra Dietetica", xlab = "Fibra Dietetica", ylab = "Frecuencia")
hist(df$Azucares, main = "Azucares", xlab = "Azucares", ylab = "Frecuencia")
hist(df$Proteinas, main = "Proteinas",xlab = "Proteinas", ylab = "Frecuencia")
ggpairs(df_norm)
cor<-cor(df_norm, method="pearson")
corrplot(cor)
En la matriz de correlación es visible que algunas variables están correlacionadas positivamente con las grasas saturadas. Además, la correlación entre azúcares y carbohidratos, así como proteínas y sodio, se puede detectar fácilmente.
pca <- prcomp(df_norm, center=FALSE, scale=FALSE)
Las proyecciones de PCA se ha calculado utilizando la función prcomp que utiliza la descomposición de valores singulares.
pca$rotation
## PC1 PC2 PC3 PC4 PC5
## Grasas saturadas 0.43015581 -0.20009279 -0.24851949 -0.16854817 0.02562347
## Colesterol 0.38495069 0.09019691 -0.17808516 -0.77036509 -0.22396712
## Sodio 0.43534374 0.29004074 0.04388044 0.07805226 0.38904047
## Carbohidratos 0.28112075 -0.49009859 0.43369106 -0.03968195 0.12560935
## Fibra dietetica 0.34879197 0.26371707 0.52107052 0.23873634 -0.67274191
## Azucares -0.01137713 -0.64401117 0.29283307 -0.08508928 0.05224139
## Proteinas 0.45131975 0.13134138 0.03844621 0.30426344 0.44714426
## Trans_Fat 0.26972412 -0.35490773 -0.59813586 0.46222382 -0.35609428
## PC6 PC7 PC8
## Grasas saturadas 0.754695383 -0.33459351 -0.0508323501
## Colesterol -0.409813854 0.01980159 -0.0001305312
## Sodio 0.120147811 0.53703482 0.5139456870
## Carbohidratos -0.005284034 0.43172477 -0.5375127853
## Fibra dietetica 0.072357358 -0.11878811 0.0914333823
## Azucares -0.160991017 -0.25891590 0.6296380445
## Proteinas -0.405816175 -0.53180480 -0.1938155433
## Trans_Fat -0.228437310 0.22112893 0.0445791009
Hay 3 métodos mas comunes que se utilizan para seleccionar el numero de componentes:
Kaiser rule (Regla de Kaiser)
La regla de Kaiser se centra en los valores propios de los componentes. Un valor propio es un índice que indica qué tan bueno es un componente como un resumen de los datos (si un valor propio es igual a 1, significa que el componente contiene la misma cantidad de información que una sola variable). Este enfoque sugiere que solo se deben elegir componentes con valores propios superiores a 1.
df_norm.cov<-cov(df_norm)
df_norm.eigen<-eigen(df_norm.cov)
df_norm.eigen$values
## [1] 3.84428921 2.19472808 0.74712560 0.56469152 0.31383510 0.22552415 0.08849565
## [8] 0.02131069
Los valores propios que se muestran arriba indican que solo se deben elegir 2 componentes
Scree plot
El segundo enfoque se basa en el diagrama de Scree plot. Esta gráfica visualiza los valores propios de los componentes en orden ascendente. El enfoque del gráfico de pantalla sugiere que el número apropiado de componentes es el número de barras que preceden al pliegue de la línea que conecta los valores propios.
fviz_eig(pca, choice='eigenvalue')
Este enfoque, así como la regla de Kaiser, indica que el número correcto de componentes es 2.
Proporción de varianza (Proportion of variance explained)
El último enfoque sugiere que los componentes elegidos deberían explicar más de 2/3 de la varianza.
summary(pca)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 1.9607 1.4815 0.86436 0.75146 0.56021 0.47489 0.29748
## Proportion of Variance 0.4805 0.2743 0.09339 0.07059 0.03923 0.02819 0.01106
## Cumulative Proportion 0.4805 0.7549 0.84827 0.91885 0.95808 0.98627 0.99734
## PC8
## Standard deviation 0.14598
## Proportion of Variance 0.00266
## Cumulative Proportion 1.00000
fviz_eig(pca)
La proporción acumulada de la varianza explicada que se muestra arriba indica que 4 componentes pueden explicar más del 90% de la varianza. Significa que esta proporción de información se puede conservar después de reducir el número de variables a la mitad. Los primeros dos componentes pueden explicar más de 3/4 de la varianza, por lo que este número de componentes es suficiente. Significa que los resultados dados por los tres métodos son los mismos.
El gráfico de “nube de puntos” muestra la calidad de representación de las observaciones individuales.
fviz_pca_ind(pca, col.ind="cos2", geom = "point", gradient.cols = c("green", "yellow", "red" ))
fviz_pca_var(pca, col.var = "red")
El gráfico que se muestra arriba muestra las relaciones entre las variables, así como la “calidad” de todos los factores. Las variables correlacionadas positivamente están próximas entre sí, mientras que las correlacionadas negativamente están en los sitios opuestos del gráfico. La “calidad” de la variable se presenta mediante la distancia desde el centro; las “mejores” variables son la proteína y el sodio. Con solo mirar este gráfico, es difícil distinguir claramente los componentes.
El porcentaje de la contribución a los dos primeros componentes se muestra en los gráficos que se muestran a continuación.
PC1 <- fviz_contrib(pca, choice = "var", axes = 1)
PC2 <- fviz_contrib(pca, choice = "var", axes = 2)
grid.arrange(PC1, PC2)
En la primera gráfica se puede ver que el primer componente está formado por proteínas, sodio, grasas saturadas y colesterol. El segundo está compuesto por azúcares y carbohidratos
La reducción de dimensiones simplemente se refiere al proceso de reducir el número de dimensiones en un conjunto de datos. El objetivo de este proceso es preservar la mayor cantidad de información posible reduciendo el número de funciones. La investigación realizada muestra que más del 90% de la varianza puede explicarse por solo la mitad de las variables y 2 de cada 8 variables pueden mantener más de 3/4 de la información incluida en el conjunto de datos original. Las técnicas de reducción de dimensiones son muy poderosas cuando se trata de análisis y almacenamiento de grandes conjuntos de datos.