Estos datos son el resultado de un análisis químico de vinos cultivados en la misma región en Italia pero derivados de tres cultivares diferentes. El análisis determinó las cantidades de 13 componentes que se encuentran en cada uno de los tres tipos de vinos. Los atributos: \(X_1=\) alcohol, \(X_2=\) ácido málico, \(X_3=\) ceniza, \(X_4=\) Alcalinidad de la ceniza, \(X_5=\) magnesio, \(X_6=\) fenoles totales, \(X_7=\) Flavonoides, \(X_8=\) fenoles no flavonoides, \(X_9=\) Proantocianinas, \(X_{10}=\) Intensidad del color, \(X_{11}=\) Tono, \(X_{12}=\) OD280 / OD315 de vinos diluidos y \(X_{13}=\) Prolina.
Referencia: S. Aeberhard, D. Coomans and O. de Vel, Comparison of Classifiers in High Dimensional Settings, Tech. Rep. no. 92-02, (1992), Dept. of Computer Science and Dept. of Mathematics and Statistics, James Cook University of North Queensland. (Also submitted to Technometrics).
K-means es un algoritmo de aprendizaje automático no supervisado que se utiliza para encontrar grupos de observaciones (clústeres) que comparten características similares. Un grupo se define como un grupo de observaciones que son más similares entre sí que a las observaciones de otros grupos. El análisis de conglomerados se utiliza ampliamente en las ciencias biológicas. Los dos enfoques de agrupación en clústeres más populares son la agrupación en clúster aglomerativa jerárquica y la agrupación en clúster de partición. El método de K-Means es un método de agrupamiento de particiones.
Elija los atributos apropiados El primer paso (y quizás el más importante) es seleccionar las variables que crea que pueden ser importantes para identificar y comprender las diferencias entre grupos de observaciones dentro de los datos.
Escale los datos Si las variables en el análisis varían en rango, las variables con el rango más grande tendrán el mayor impacto en los resultados. Esto a menudo no es deseable y los analistas escalan los datos antes de continuar. El enfoque más popular es estandarizar cada variable a una media de 0 y una desviación estándar de 1.
Detectar valores atípicos Muchas técnicas de agrupamiento son sensibles a valores atípicos, distorsionando las soluciones de agrupamiento obtenidas. Puede detectar (y eliminar) valores atípicos univariados utilizando funciones del paquete de valores atípicos. El paquete mvoutlier contiene funciones que se pueden usar para identificar valores atípicos multivariados.
Calcular distancias La medida más popular de la distancia entre dos observaciones es la distancia euclidiana, pero también están disponibles las medidas de distancia de Manhattan, Canberra, binaria asimétrica, máxima y de Minkowski.
Seleccione un algoritmo de agrupación. La agrupación jerárquica es útil para problemas más pequeños (entre 100 y 200 observaciones) y donde se desea una jerarquía anidada de agrupaciones. El método de partición puede manejar problemas mucho mayores, pero requiere que el número de clústeres se especifique de antemano.
Determine la cantidad de clústeres presentes Para obtener una solución de clúster final, debe decidir cuántos clústeres están presentes en los datos.
Obtenga una solución de agrupamiento final. Una vez que se ha determinado el número de agrupaciones, se realiza una agrupación final para extraer esa cantidad de subgrupos.
Visualiza los resultados. La visualización puede ayudarlo a determinar el significado y la utilidad de la solución de clúster. Los resultados de una agrupación jerárquica generalmente se presentan como un dendrograma. Los resultados de la partición se visualizan normalmente mediante un diagrama de conglomerado bivariado.
Interpretar los grupos. Una vez que se ha obtenido una solución de clúster, debe interpretar (y posiblemente nombrar) los clústeres. ¿Qué tienen en común las observaciones de un grupo? ¿En qué se diferencian de las observaciones de otros grupos? Este paso generalmente se logra mediante la obtención de un resumen de estadísticas descriptivas (promedio, mediana, coeficiente de variación,, etc). Para datos mixtos (datos que contienen variables cualitativas), las estadísticas de resumen también incluirán distribuciones de categorías o modas.
Validar los resultados. “¿Son estos agrupamientos en cierto sentido reales y no una manifestación de aspectos únicos de este conjunto de datos o técnica estadística?” Si se emplea un método de conglomerado diferente o una muestra diferente, ¿se obtendrían los mismos conglomerados? Los paquetes fpc, clv y clValid contienen cada uno funciones para evaluar la estabilidad de una solución de agrupamiento.
#install.packages("tidyverse")
#install.packages("corrplot")
#install.packages("gridExtra")
#install.packages("GGally")
#install.packages("cluster")
#install.packages("factoextra")library(tidyverse)
library(corrplot)
library(gridExtra)
library(GGally)
library(cluster)
library(factoextra)
library(openxlsx)
library(ggplot2)setwd("D:/Users/jaospina.UAO/Dropbox/ACTIVIDADES/ACTIVIDADES_2021-03/Analisis_Multivariado_Biologia_Univalle/Clase_6")
#setwd("~/Dropbox/ACTIVIDADES/ACTIVIDADES_2021-03/Analisis_Multivariado_Biologia_Univalle/Clase_6")
Vinos <- read.xlsx("Vinos.xlsx")
head(Vinos)## Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols Flavanoid
## 1 14.23 1.71 2.43 15.6 127 2.80 3.06
## 2 13.20 1.78 2.14 11.2 100 2.65 2.76
## 3 13.16 2.36 2.67 18.6 101 2.80 3.24
## 4 14.37 1.95 2.50 16.8 113 3.85 3.49
## 5 13.24 2.59 2.87 21.0 118 2.80 2.69
## 6 14.20 1.76 2.45 15.2 112 3.27 3.39
## Nonflavanoid_Phenols Proanthocyanins Color_Intensity Hue OD280 Proline
## 1 0.28 2.29 5.64 1.04 3.92 1065
## 2 0.26 1.28 4.38 1.05 3.40 1050
## 3 0.30 2.81 5.68 1.03 3.17 1185
## 4 0.24 2.18 7.80 0.86 3.45 1480
## 5 0.39 1.82 4.32 1.04 2.93 735
## 6 0.34 1.97 6.75 1.05 2.85 1450
summary(Vinos)## Alcohol Malic_Acid Ash Ash_Alcanity
## Min. :11.03 Min. :0.740 Min. :1.360 Min. :10.60
## 1st Qu.:12.36 1st Qu.:1.603 1st Qu.:2.210 1st Qu.:17.20
## Median :13.05 Median :1.865 Median :2.360 Median :19.50
## Mean :13.00 Mean :2.336 Mean :2.367 Mean :19.49
## 3rd Qu.:13.68 3rd Qu.:3.083 3rd Qu.:2.558 3rd Qu.:21.50
## Max. :14.83 Max. :5.800 Max. :3.230 Max. :30.00
## Magnesium Total_Phenols Flavanoid Nonflavanoid_Phenols
## Min. : 70.00 Min. :0.980 Min. :0.340 Min. :0.1300
## 1st Qu.: 88.00 1st Qu.:1.742 1st Qu.:1.205 1st Qu.:0.2700
## Median : 98.00 Median :2.355 Median :2.135 Median :0.3400
## Mean : 99.74 Mean :2.295 Mean :2.029 Mean :0.3619
## 3rd Qu.:107.00 3rd Qu.:2.800 3rd Qu.:2.875 3rd Qu.:0.4375
## Max. :162.00 Max. :3.880 Max. :5.080 Max. :0.6600
## Proanthocyanins Color_Intensity Hue OD280
## Min. :0.410 Min. : 1.280 Min. :0.4800 Min. :1.270
## 1st Qu.:1.250 1st Qu.: 3.220 1st Qu.:0.7825 1st Qu.:1.938
## Median :1.555 Median : 4.690 Median :0.9650 Median :2.780
## Mean :1.591 Mean : 5.058 Mean :0.9574 Mean :2.612
## 3rd Qu.:1.950 3rd Qu.: 6.200 3rd Qu.:1.1200 3rd Qu.:3.170
## Max. :3.580 Max. :13.000 Max. :1.7100 Max. :4.000
## Proline
## Min. : 278.0
## 1st Qu.: 500.5
## Median : 673.5
## Mean : 746.9
## 3rd Qu.: 985.0
## Max. :1680.0
Construyamos una matriz de correlación para comprender la relación entre cada variable:
corrplot(cor(Vinos), type = 'upper', method = 'number', tl.cex = 0.9)Existe una fuerte correlación lineal entre los Fenoles Totales y los Flavonoides. Podemos modelar la relación entre estas dos variables ajustando una ecuación lineal:
ggplot(Vinos, aes(x = Total_Phenols, y = Flavanoid)) +
geom_point() +
geom_smooth(method = 'lm', se = FALSE) +
theme_bw()Dado que las variables están en escalas diferentes, necesitamos escalar los datos o normalizarlos. Podemos normalizar los datos usando la media y la desviación estándar, también podemos usar la función de escala para normalizar nuestros datos.
VinosNorm <- as.data.frame(scale(Vinos))
head(VinosNorm)## Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols
## 1 1.5143408 -0.56066822 0.2313998 -1.1663032 1.90852151 0.8067217
## 2 0.2455968 -0.49800856 -0.8256672 -2.4838405 0.01809398 0.5670481
## 3 0.1963252 0.02117152 1.1062139 -0.2679823 0.08810981 0.8067217
## 4 1.6867914 -0.34583508 0.4865539 -0.8069748 0.92829983 2.4844372
## 5 0.2948684 0.22705328 1.8352256 0.4506745 1.27837900 0.8067217
## 6 1.4773871 -0.51591132 0.3043010 -1.2860793 0.85828399 1.5576991
## Flavanoid Nonflavanoid_Phenols Proanthocyanins Color_Intensity Hue
## 1 1.0319081 -0.6577078 1.2214385 0.2510088 0.3611585
## 2 0.7315653 -0.8184106 -0.5431887 -0.2924962 0.4049085
## 3 1.2121137 -0.4970050 2.1299594 0.2682629 0.3174085
## 4 1.4623994 -0.9791134 1.0292513 1.1827317 -0.4263410
## 5 0.6614853 0.2261576 0.4002753 -0.3183774 0.3611585
## 6 1.3622851 -0.1755994 0.6623487 0.7298108 0.4049085
## OD280 Proline
## 1 1.8427215 1.01015939
## 2 1.1103172 0.96252635
## 3 0.7863692 1.39122370
## 4 1.1807407 2.32800680
## 5 0.4483365 -0.03776747
## 6 0.3356589 2.23274072
summary(VinosNorm)## Alcohol Malic_Acid Ash Ash_Alcanity
## Min. :-2.42739 Min. :-1.4290 Min. :-3.66881 Min. :-2.663505
## 1st Qu.:-0.78603 1st Qu.:-0.6569 1st Qu.:-0.57051 1st Qu.:-0.687199
## Median : 0.06083 Median :-0.4219 Median :-0.02375 Median : 0.001514
## Mean : 0.00000 Mean : 0.0000 Mean : 0.00000 Mean : 0.000000
## 3rd Qu.: 0.83378 3rd Qu.: 0.6679 3rd Qu.: 0.69615 3rd Qu.: 0.600395
## Max. : 2.25341 Max. : 3.1004 Max. : 3.14745 Max. : 3.145637
## Magnesium Total_Phenols Flavanoid Nonflavanoid_Phenols
## Min. :-2.0824 Min. :-2.10132 Min. :-1.6912 Min. :-1.8630
## 1st Qu.:-0.8221 1st Qu.:-0.88298 1st Qu.:-0.8252 1st Qu.:-0.7381
## Median :-0.1219 Median : 0.09569 Median : 0.1059 Median :-0.1756
## Mean : 0.0000 Mean : 0.00000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.5082 3rd Qu.: 0.80672 3rd Qu.: 0.8467 3rd Qu.: 0.6078
## Max. : 4.3591 Max. : 2.53237 Max. : 3.0542 Max. : 2.3956
## Proanthocyanins Color_Intensity Hue OD280
## Min. :-2.06321 Min. :-1.6297 Min. :-2.08884 Min. :-1.8897
## 1st Qu.:-0.59560 1st Qu.:-0.7929 1st Qu.:-0.76540 1st Qu.:-0.9496
## Median :-0.06272 Median :-0.1588 Median : 0.03303 Median : 0.2371
## Mean : 0.00000 Mean : 0.0000 Mean : 0.00000 Mean : 0.0000
## 3rd Qu.: 0.62741 3rd Qu.: 0.4926 3rd Qu.: 0.71116 3rd Qu.: 0.7864
## Max. : 3.47527 Max. : 3.4258 Max. : 3.29241 Max. : 1.9554
## Proline
## Min. :-1.4890
## 1st Qu.:-0.7824
## Median :-0.2331
## Mean : 0.0000
## 3rd Qu.: 0.7561
## Max. : 2.9631
Se agruparán los datos en dos grupos (centros = 2). La función kmeans también tiene una opción nstart que intenta múltiples configuraciones iniciales e informa sobre la mejor. Por ejemplo, agregar nstart = 25 generará 25 configuraciones e informes iniciales sobre la mejor.
Vinos_Kmedias <- kmeans(VinosNorm, centers = 2, nstart = 25)
print(Vinos_Kmedias)## K-means clustering with 2 clusters of sizes 87, 91
##
## Cluster means:
## Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols
## 1 0.3248845 -0.3529345 0.05207966 -0.4899811 0.3206911 0.7826625
## 2 -0.3106038 0.3374209 -0.04979045 0.4684435 -0.3065948 -0.7482598
## Flavanoid Nonflavanoid_Phenols Proanthocyanins Color_Intensity Hue
## 1 0.8235093 -0.5921337 0.6378483 -0.1024529 0.5633135
## 2 -0.7873111 0.5661058 -0.6098110 0.0979495 -0.5385525
## OD280 Proline
## 1 0.7146506 0.6051873
## 2 -0.6832374 -0.5785857
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 2 2 2 1 2 1 1 2 2 1 2 1 2 1 1 2 1 2 1 1
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 1 1 2 2 1 1 2 2 2 2 2 2 2 1 1 1 2 1 1 1
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 1 2 2 2 1 2 2 2 2 1 1 2 2 2 2 1 2 2 2 2
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 1 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
## 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##
## Within cluster sum of squares by cluster:
## [1] 765.0965 884.3435
## (between_SS / total_SS = 28.3 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Visualización de los clúster
fviz_cluster(Vinos_Kmedias, data = VinosNorm)Cuando vemos los resultados de (Vinos_k2), muestra información como, número de conglomerados, centros de los conglomerados, tamaño de los conglomerados y suma del cuadrado. Veamos cómo obtener estos atributos de nuestro modelo.
names(Vinos_Kmedias)## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Debido a que el número de conglomerados (k) debe establecerse antes de iniciar el algoritmo, a menudo es ventajoso usar varios valores diferentes de k y examinar las diferencias en los resultados. Podemos ejecutar el mismo proceso para 3, 4 y 5 clústeres, y los resultados se muestran en la figura:
Vinos_K2 <- kmeans(VinosNorm, centers = 2, nstart = 25)
Vinos_K3 <- kmeans(VinosNorm, centers = 3, nstart = 25)
Vinos_K4 <- kmeans(VinosNorm, centers = 4, nstart = 25)
Vinos_K5 <- kmeans(VinosNorm, centers = 5, nstart = 25)p1 <- fviz_cluster(Vinos_K2, geom = "point", data = VinosNorm) + ggtitle(" K = 2")
p2 <- fviz_cluster(Vinos_K3, geom = "point", data = VinosNorm) + ggtitle(" K = 3")
p3 <- fviz_cluster(Vinos_K4, geom = "point", data = VinosNorm) + ggtitle(" K = 4")
p4 <- fviz_cluster(Vinos_K5, geom = "point", data = VinosNorm) + ggtitle(" K = 5")
grid.arrange(p1, p2, p3, p4, nrow = 2)La agrupación en clústeres requiere que especifique de antemano la cantidad de clústeres que se extraerán. Puede resultar útil una gráfica de las sumas de cuadrados totales dentro de los grupos frente al número de conglomerados en una solución de k-medias. Una curva en el gráfico puede sugerir el número apropiado de grupos.
fviz_nbclust(x = VinosNorm,FUNcluster = kmeans, method = 'wss' )Determinando el número óptimo de clúster usando Average Silhouette Method:
fviz_nbclust(x = VinosNorm, FUNcluster = kmeans, method = 'silhouette' )Número óptimo, a partir del estadístico GAP:
gap_stat <- clusGap(x = VinosNorm, FUN = kmeans, K.max = 15, nstart = 25, B = 50 )
fviz_gap_stat(gap_stat)Cluster_final <- kmeans(VinosNorm, centers = 3, nstart = 25)
print(Cluster_final)## K-means clustering with 3 clusters of sizes 51, 62, 65
##
## Cluster means:
## Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols
## 1 0.1644436 0.8690954 0.1863726 0.5228924 -0.07526047 -0.97657548
## 2 0.8328826 -0.3029551 0.3636801 -0.6084749 0.57596208 0.88274724
## 3 -0.9234669 -0.3929331 -0.4931257 0.1701220 -0.49032869 -0.07576891
## Flavanoid Nonflavanoid_Phenols Proanthocyanins Color_Intensity Hue
## 1 -1.21182921 0.72402116 -0.77751312 0.9388902 -1.1615122
## 2 0.97506900 -0.56050853 0.57865427 0.1705823 0.4726504
## 3 0.02075402 -0.03343924 0.05810161 -0.8993770 0.4605046
## OD280 Proline
## 1 -1.2887761 -0.4059428
## 2 0.7770551 1.1220202
## 3 0.2700025 -0.7517257
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 3 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##
## Within cluster sum of squares by cluster:
## [1] 326.3537 385.6983 558.6971
## (between_SS / total_SS = 44.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(Cluster_final, data = VinosNorm)