Analisis de componentes principales. El presente traller tiene como objetivo evaluar un set de datos obtenidos en relación al perfil ó grado de tostión del café.

library(readxl)
#Cargamos los datos
dfcie_data = read_excel("Cielabch_tueste_cafe.xlsx")
head(dfcie_data)
## # A tibble: 6 × 6
##       L     a     b tueste     c     h
##   <dbl> <dbl> <dbl> <chr>  <dbl> <dbl>
## 1  15.2  23.7  22.0 verde   32.3  42.9
## 2  12.3  20.8  21.0 verde   29.6  45.3
## 3  13.5  23.3  23.9 verde   33.4  45.7
## 4  13.6  21.1  20.4 verde   29.3  44.1
## 5  13.3  19.5  20.7 verde   28.5  46.7
## 6  12.4  21.9  20.8 verde   30.2  43.6
#Ordenamos las columnas del dataframa
names(dfcie_data)
## [1] "L"      "a"      "b"      "tueste" "c"      "h"
dfcie_sorted =dfcie_data [,c(1,2,3,5,6,4)]
names (dfcie_sorted)
## [1] "L"      "a"      "b"      "c"      "h"      "tueste"
library(ggbiplot)
## Loading required package: ggplot2
## Loading required package: plyr
## Loading required package: scales
## Loading required package: grid
# Remuevo la columna 6, porque es una etiqueta relaciona a la tostión y se usa la función de prcomp(Principal components Analysis)  
dfcie_sorted.pca = prcomp(dfcie_sorted[,c(1:5)], center = TRUE, scale=TRUE) 
#Se genera un resumen del análsis PCA
summary(dfcie_sorted.pca)
## Importance of components:
##                           PC1    PC2     PC3     PC4      PC5
## Standard deviation     1.9631 0.8961 0.58485 0.03379 0.002343
## Proportion of Variance 0.7708 0.1606 0.06841 0.00023 0.000000
## Cumulative Proportion  0.7708 0.9314 0.99977 1.00000 1.000000
#Representación de la variables latentes 
plot(dfcie_sorted.pca$x[,1], pch = 16,
     col=as.factor(dfcie_sorted$tueste))
legend("topright", legend= unique(dfcie_sorted$tueste),col=1:4, pch=16, cex =1)

#En el presente gŕafico se observan tres cluster, el primero agrupa la tostión oscura. EL segundo representa la tostión verde, e interesantemente la tostión clara y media se agrupan en un solo cluster. 
#Ahora hacemos la gráfica de los dos variables latentes PC1 y PC2. En este se observa que la tostión verde tiene una agrupación mientras que las otras tostiones se agrupan en otro cluster.  
plot(dfcie_sorted.pca$x[,c(1,2)], pch = 16,
     col=as.factor(dfcie_sorted$tueste))
legend("topright", legend= unique(dfcie_sorted$tueste),col=1:4, pch=16, cex =1)

PCA con ggbiplot: Los biplots ayudan en la visualización del resultado del PCA. Para la interpretación de este biplot se deben considerar algunos elementos como:

  1. El coseno del ángulo entre un vector y un eje indica la importancia de la contribución de la variable correspondiente a la componente principal.
  2. El coseno del ángulo entre pares de vectores indica correlación entre las variables correspondientes. Las variables altamente correlacionadas apuntan en direcciones similares; las variables no correlacionadas son casi perpendiculares entre sí.
  3. Los puntos que están cerca uno del otro en el biplot representan observaciones con valores similares.

En el presente ejemplo se observa que la variable b y c tienen la mayor contribución al componente 1. Además las variables a, b y c son variables altamente correlacionadas. Mientras que la variable h esta más distante y es casi perpendicular a la varaible a por lo tnato no estan correlacionadas.
En cuanto a la varianza el componente 1 (PC1) explica el 77.1% de la varianza, mientras que el componente 2 (PC2) explica el 16.1%. Por lo tanto se esta explicando el 93.2% de la varianza en el conjunto de datos.

library(ggbiplot)
ggbiplot(dfcie_sorted.pca)+
  geom_hline(yintercept = 0)+
  geom_vline(xintercept = 0)

#Ahora incluimos las etiquetas de cada uno de los datos con la función labels
ggbiplot(dfcie_sorted.pca, labels=rownames(dfcie_sorted))

#En este caso activamos la función ellipse para dibujar un elipse para cada grupo 
ggbiplot(dfcie_sorted.pca,ellipse=TRUE,
         groups=dfcie_sorted$tueste)

#En este caso con la función choices para elegir los componentes a gráficar.Aqui se gráficaron el compoente 1 y 5.
#Se destaca que el componente 5 no explica la varianza en el conjunto de datos.
ggbiplot(dfcie_sorted.pca,ellipse=TRUE,choices=c(1,5),
         labels=rownames(dfcie_sorted[,1:5]), groups=dfcie_sorted$tueste)

#Al activar la función circle se grafica un circulo color verde el cual indica la correlación 
ggbiplot(dfcie_sorted.pca,ellipse=TRUE,circle=TRUE,
         labels=rownames(dfcie_sorted[,1:5]), groups=dfcie_sorted$tueste)

Clustering Para complementar el análisis de componentes principales, ahora aplicaremos el análisis de clustering. Inicialmente se emplea la libreria factoextra para estimar el número óptimo de cluster en el conjunto de datos. Posteriomente se presenta el analisis de clúster para cada variable empleando el método de K-means, y luego entre las dos mejores variables.

library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
M = dfcie_sorted[,c(1:5)]
Ms=scale(M)
fviz_nbclust(Ms,
             FUNcluster = kmeans,
             method = 'gap_stat',
             diss = get_dist(Ms,
                             'euclidean'))

Cluster para cada variables

#Cluster para la variables a 
M = dfcie_sorted[ , c('a')]
Ms = scale(M)
clus_a = kmeans(Ms, 3)

#Matriz de confusión 
table(dfcie_sorted$tueste,
      clus_a$cluster)
##         
##           1  2  3
##   claro   2  0 28
##   medio   3 27  0
##   oscuro  9 21  0
##   verde  23  1  6
#Cluster para la variables b
M = dfcie_sorted[ , c('b')]
Ms = scale(M)
clus_b = kmeans(Ms, 3)

#Matriz de confusión 
table(dfcie_sorted$tueste,
      clus_b$cluster)
##         
##           1  2  3
##   claro   0  0 30
##   medio   1 29  0
##   oscuro  6 24  0
##   verde  27  3  0
#Cluster para la variables c
M = dfcie_sorted[ , c('c')]
Ms = scale(M)
clus_c = kmeans(Ms, 3)
#Matriz de confusión 
table(dfcie_sorted$tueste,
      clus_c$cluster)
##         
##           1  2  3
##   claro  29  0  1
##   medio   0 28  2
##   oscuro  0 25  5
##   verde   0  2 28
#Cluster para la variables h 
M = dfcie_sorted[ , c('h')]
Ms = scale(M)
clus_h = kmeans(Ms, 3)
#Matriz de confusión 
table(dfcie_sorted$tueste,
      clus_h$cluster)
##         
##           1  2  3
##   claro   0  3 27
##   medio  13  7 10
##   oscuro 10 13  7
##   verde  10 17  3
#Cluster para la variables L
M = dfcie_sorted[ , c('L')]
Ms = scale(M)
clus_L = kmeans(Ms, 3)
#Matriz de confusión 
table(dfcie_sorted$tueste,
      clus_L$cluster)
##         
##           1  2  3
##   claro  30  0  0
##   medio   0 10 20
##   oscuro  0  2 28
##   verde   0 29  1

Evaluando dos variables

#Cluster para las variables L y b(b es la mejor variable)
M = dfcie_sorted[ , c('L', 'b')]
Ms = scale(M)
clus_L_b = kmeans(Ms, 3)
#Matriz de confusión 
table(dfcie_sorted$tueste,
      clus_L_b$cluster)
##         
##           1  2  3
##   claro  30  0  0
##   medio   0 30  0
##   oscuro  0 30  0
##   verde   0  0 30
#Cluster para las variables L y c (es la segunda mejor variable)
M = dfcie_sorted[ , c('L', 'c')]
Ms = scale(M)
clus_L_c = kmeans(Ms, 3)
#Matriz de confusión 
table(dfcie_sorted$tueste,
      clus_L_c$cluster)
##         
##           1  2  3
##   claro   0 30  0
##   medio   0  0 30
##   oscuro  0  0 30
##   verde  30  0  0
#Cluster para las variables b y c
M = dfcie_sorted[ , c('b', 'c')]
Ms = scale(M)
clus_a_b = kmeans(Ms, 3)
#Matriz de confusión 
table(dfcie_sorted$tueste,
      clus_a_b$cluster)
##         
##           1  2  3
##   claro  30  0  0
##   medio   0 28  2
##   oscuro  0 24  6
##   verde   0  2 28

Conclusión: De acuerdo a los análisis realizados de PCA las variable b y c tienen la mayor contribución al componente 1. Además las variables a, b y c son variables altamente correlacionadas. Mientras que la variable h esta más distante y es casi perpendicular a la variable a por lo tanto no hay alta correlación. Al complementar estos análisis con clustering se encuentra que al emplear la variables con mayor contribución al componente como lo es la varible c junto con la L la clasificación de cada uno de los cluster asigna 30 elementos en cada caso.