Datos

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).

Introducción

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.

Pasos para el análisis de clúster

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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.

Instalación de librerias

#install.packages("tidyverse") 
#install.packages("corrplot")
#install.packages("gridExtra")
#install.packages("GGally")
#install.packages("cluster")
#install.packages("factoextra")

Cargar librerias

library(tidyverse) 
library(corrplot)
library(gridExtra)
library(GGally)
library(cluster)
library(factoextra)
library(openxlsx)
library(ggplot2)

Cargar datos

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

Resumen de datos

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

Cálculo de K-Means en R

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)

Número óptimo de clúster

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)

Cálculo final del análisis de clúster \(k=3\)

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)