remotes::install_github("vqv/ggbiplot")
## Skipping install of 'ggbiplot' from a github remote, the SHA1 (7325e880) has not changed since last install.
## Use `force = TRUE` to force installation
library(readxl)
library(rgl)
library(corrplot)
## corrplot 0.92 loaded
library(ggbiplot)
## Loading required package: ggplot2
## Loading required package: plyr
## Loading required package: scales
## Loading required package: grid
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
Cargando datos
dfcie = read_excel("C:/Users/daorjuelah/Downloads/Cielab_tueste_cafe.xlsx")
head(dfcie)
## # A tibble: 6 x 4
## L a b tueste
## <dbl> <dbl> <dbl> <chr>
## 1 15.2 23.7 22.0 verde
## 2 12.3 20.8 21.0 verde
## 3 13.5 23.3 23.9 verde
## 4 13.6 21.1 20.4 verde
## 5 13.3 19.5 20.7 verde
## 6 12.4 21.9 20.8 verde
Visualización de datos
plot3d(dfcie$L,
dfcie$a,
dfcie$b,
type='s',
col=rep(1:4,each=30))
legend3d('topright',legend=unique(dfcie$tueste),col=1:4,pch=16,cex=1)
Componentes principales, mediante la funcion scale para estandarizar los datos
dfcie.pca <- prcomp(dfcie[,c(1,2,3)],center = T,scale. = T)
summary(dfcie.pca)
## Importance of components:
## PC1 PC2 PC3
## Standard deviation 1.6040 0.6290 0.17725
## Proportion of Variance 0.8576 0.1319 0.01047
## Cumulative Proportion 0.8576 0.9895 1.00000
Con los dos primeros componentes se explican el 98.95% del comportamiento de los datos.
Se aplica la funcion “str” muestra que cosas se pueden extraer después de hacer componentes principales; sdev, rotation, center, scale, entre otros.
str(dfcie.pca)
## List of 5
## $ sdev : num [1:3] 1.604 0.629 0.177
## $ rotation: num [1:3, 1:3] 0.531 0.588 0.61 -0.832 0.497 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr [1:3] "L" "a" "b"
## .. ..$ : chr [1:3] "PC1" "PC2" "PC3"
## $ center : Named num [1:3] 19.4 20.3 21.2
## ..- attr(*, "names")= chr [1:3] "L" "a" "b"
## $ scale : Named num [1:3] 5.92 4 4.99
## ..- attr(*, "names")= chr [1:3] "L" "a" "b"
## $ x : num [1:120, 1:3] 0.207 -0.591 0.238 -0.507 -0.723 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : NULL
## .. ..$ : chr [1:3] "PC1" "PC2" "PC3"
## - attr(*, "class")= chr "prcomp"
Desviación estandar
dfcie.pca$sdev
## [1] 1.6040326 0.6290170 0.1772488
Extracción de los valores con mayor variabilidad
var_pca<-dfcie.pca$sdev**2
100*var_pca/sum(var_pca)
## [1] 85.764015 13.188748 1.047237
variabilidad acumulada
cumsum(100* var_pca/sum(var_pca))
## [1] 85.76401 98.95276 100.00000
Al utilizar la matriz de rotación, se puede eliminar la elevada correlación, mediante la transformación de los datos sin cambiar su estructura original.
Creamos la matriz de rotación
matriz_rotacion<-dfcie.pca$rotation; matriz_rotacion
## PC1 PC2 PC3
## L 0.5308812 -0.8322630 0.1596982
## a 0.5879159 0.4974223 0.6379075
## b 0.6103443 0.2447640 -0.7533727
Centroides
centroide<-dfcie.pca$center; centroide
## L a b
## 19.42803 20.30929 21.20293
Desviación estándar
desv_est<-dfcie.pca$scale; desv_est
## L a b
## 5.918993 3.999667 4.990121
Extracción de variables rotadas y latentes
ext_var<-dfcie.pca$x; head(ext_var)
## PC1 PC2 PC3
## [1,] 0.2068932 1.0510244 0.30646710
## [2,] -0.5908611 1.0474046 -0.08881768
## [3,] 0.2384999 1.3323015 -0.08684860
## [4,] -0.5066929 0.8767963 0.08465799
## [5,] -0.7229047 0.7330504 -0.21263483
## [6,] -0.4445071 1.1751348 0.11775774
Variables originales
var_orig<-cor(dfcie[,-4]); var_orig
## L a b
## L 1.0000000 0.6424449 0.7492989
## a 0.6424449 1.0000000 0.9563176
## b 0.7492989 0.9563176 1.0000000
Mapa de calor de las variables originales
heatmap(var_orig)
Mapa de calor de las variables rotadas
heatmap(cor(ext_var))
Comparación de las correlaciones entre las variables rotadas y originales
dfcie_join<-cbind(dfcie[,-4],ext_var); head(dfcie_join)
## L a b PC1 PC2 PC3
## 1 15.19033 23.66875 21.96465 0.2068932 1.0510244 0.30646710
## 2 12.32775 20.77712 21.01656 -0.5908611 1.0474046 -0.08881768
## 3 13.53224 23.29917 23.88311 0.2384999 1.3323015 -0.08684860
## 4 13.59665 21.07822 20.41236 -0.5066929 0.8767963 0.08465799
## 5 13.34435 19.52530 20.69592 -0.7229047 0.7330504 -0.21263483
## 6 12.35368 21.90245 20.84171 -0.4445071 1.1751348 0.11775774
La matriz de correlacion de las variables originales y de las variables rotadas. se busca comprobar qué no hay correlaciones entre las variables rotadas o latentes.
cor_var<-cor(dfcie_join); cor_var
## L a b PC1 PC2 PC3
## L 1.00000000 0.6424449 0.7492989 8.515507e-01 -5.235076e-01 2.830631e-02
## a 0.64244487 1.0000000 0.9563176 9.430362e-01 3.128871e-01 1.130683e-01
## b 0.74929894 0.9563176 1.0000000 9.790121e-01 1.539607e-01 -1.335344e-01
## PC1 0.85155068 0.9430362 0.9790121 1.000000e+00 1.370284e-16 -3.003468e-15
## PC2 -0.52350759 0.3128871 0.1539607 1.370284e-16 1.000000e+00 -1.177156e-15
## PC3 0.02830631 0.1130683 -0.1335344 -3.003468e-15 -1.177156e-15 1.000000e+00
Uso de mapas de color para observar las correlaciones entre variables originales y rotadas (PC).
corrplot::corrplot(cor_var)
Es observable la mayor representabilidad en el componente principal 1 y
2.
Gráfico 3D para variables rotadas
plot3d(ext_var,type = "s",col = gl(4,30,120,c("green","orange","pink","purple")))
Gráfico del componente principal Numero 1
plot(ext_var[,1],pch=16,col=as.factor(dfcie$tueste))
Gráfico de relación entre componente principal Numero 1 y Numero 2
plot(ext_var[,c(1,2)],pch=16,col=as.factor(dfcie$tueste))
Se procedera a crear un análisis entre los componentes principales PC1 y PC2.
ggbiplot(dfcie.pca)+
geom_hline(yintercept = 0)+
geom_vline(xintercept = 0)
ggbiplot(dfcie.pca, labels=rownames(dfcie))
ggbiplot(dfcie.pca,ellipse=TRUE,labels=rownames(dfcie[,1:3]),
groups=dfcie$tueste)
ggbiplot(dfcie.pca,ellipse=TRUE,choices=c(1,3),
labels=rownames(dfcie[,1:3]), groups=dfcie$tueste)
ggbiplot(dfcie.pca,ellipse=TRUE,circle=TRUE,
labels=rownames(dfcie[,1:3]), groups=dfcie$tueste)
ggbiplot(dfcie.pca,ellipse=TRUE,labels=rownames(dfcie[,1:3]), groups=dfcie$tueste) +
scale_colour_manual(name="Origin",values=c("forest green","red3","dark blue","orange"))+
ggtitle("PCA tueste de cafe")+ theme_minimal()+
theme(legend.position = "bottom")
Creamos un ANOVA para el componente b
M = dfcie[,-4]
Ms = scale(M)
fviz_nbclust(dfcie[,'b'],
FUNcluster = kmeans,
method = 'gap_stat',
diss = get_dist(Ms, 'euclidean'))
De acuerdo con el análisis de cluster en la variable b, el número optimo de clusters es 3
clus = kmeans(Ms,3)
table(dfcie$tueste,clus$cluster)
##
## 1 2 3
## claro 0 0 30
## medio 2 28 0
## oscuro 5 25 0
## verde 29 1 0
Graficamos los clusters
plot(dfcie.pca$x[,c(1)], pch = 16,
col = as.factor(dfcie$tueste))
Creamos un ANOVA para el componente l
#Análisis de cluster de la variable l
library(factoextra)
M1 = dfcie[,-4]
Ms1 = scale(M1)
fviz_nbclust(dfcie[,'L'],
FUNcluster = kmeans,
method = 'gap_stat',
diss = get_dist(Ms1, 'euclidean'))
De acuerdo con el análisis de cluster en la variable L, el número optimo de clusters es 3
clus = kmeans(Ms,3)
table(dfcie$tueste,clus$cluster)
##
## 1 2 3
## claro 0 0 30
## medio 2 28 0
## oscuro 5 25 0
## verde 29 1 0
Graficamos los clusters
plot(dfcie.pca$x[,c(1)], pch = 16,
col = as.factor(dfcie$tueste))
Como resultado, podemos observar como solo son necesarios los componentes “b” y “L” de los datos, para representar hasta en un 98.95% el conjunto de datos recolectados, adicionalmente, podemos recolectar (mediante el cluster) los datos en 3 conjuntos (verde, medio+oscuro y claro).