Contexto

Estos datos son el resultado de un análisis químico de vinos cultivados en la misma región de 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 cultivares.

Importar paquetes y librerias

#install.packages("cluster") #Para agrupamiento de datos 
library(cluster)
#install.packages("ggplot2") #Gráficas
library(ggplot2)
#install.packages("factoextra") #Visualizar clusters
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
#intsall.packages("data.table") #Conjunto de datos grande 
library(data.table)
# install.packages("tidyverse")
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.3.0
## ✔ purrr     1.1.0     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::between()     masks data.table::between()
## ✖ dplyr::filter()      masks stats::filter()
## ✖ dplyr::first()       masks data.table::first()
## ✖ lubridate::hour()    masks data.table::hour()
## ✖ lubridate::isoweek() masks data.table::isoweek()
## ✖ dplyr::lag()         masks stats::lag()
## ✖ dplyr::last()        masks data.table::last()
## ✖ lubridate::mday()    masks data.table::mday()
## ✖ lubridate::minute()  masks data.table::minute()
## ✖ lubridate::month()   masks data.table::month()
## ✖ lubridate::quarter() masks data.table::quarter()
## ✖ lubridate::second()  masks data.table::second()
## ✖ purrr::transpose()   masks data.table::transpose()
## ✖ lubridate::wday()    masks data.table::wday()
## ✖ lubridate::week()    masks data.table::week()
## ✖ lubridate::yday()    masks data.table::yday()
## ✖ lubridate::year()    masks data.table::year()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Importar la base de datos

datos <- read.csv("~/Documents/wine.csv")

Entender la base de datos

summary(datos)
##     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     Flavanoids    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

Escalar la base de datos

datos_escalados <-scale(datos) 

Generar los segmentos

grupos <- 3 #Inicio con cualquier valor, luego verifico
segmentos <- kmeans(datos_escalados,grupos)

Asignar grupos a los datos

asignacion <- cbind(datos, cluster= segmentos$cluster)

Graficar los clusters

fviz_cluster(segmentos,data = datos)

Optimizar la cantidad de grupos

# La cantidad óptima de grupos corresponde al punto mas alto de la gráfica
set.seed(123)
optimizacion <-clusGap(datos_escalados,FUN=kmeans, nstart=1, K.max=10)
plot(optimizacion,xlab="Número de clusters K")

LS0tCnRpdGxlOiAiVmlub3MiCmF1dGhvcjogIkR5YW5uIEVzdGVmYW5pYSBIZXJuYW5kZXogQXlhbGEiCmRhdGU6ICIyMDI1LTA4LTE5IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6IHlldGkKLS0tCgohW10oaHR0cHM6Ly9lc2N1ZWxhdmVyc2FpbGxlcy5jb20vd3AtY29udGVudC91cGxvYWRzL3RpcG9zLWRlLXZpbm8uanBnKQoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPiBDb250ZXh0byA8L3NwYW4+IApFc3RvcyBkYXRvcyBzb24gZWwgcmVzdWx0YWRvIGRlIHVuIGFuw6FsaXNpcyBxdcOtbWljbyBkZSB2aW5vcyBjdWx0aXZhZG9zIGVuIGxhIG1pc21hIHJlZ2nDs24gZGUgaXRhbGlhIHBlcm8gZGVyaXZhZG9zIGRlIHRyZXMgY3VsdGl2YXJlcyBkaWZlcmVudGVzLgoKRWwgYW7DoWxpc2lzIGRldGVybWluw7MgbGFzIGNhbnRpZGFkZXMgZGUgMTMgY29tcG9uZW50ZXMgcXVlIHNlIGVuY3VlbnRyYW4gZW4gY2FkYSB1bm8gZGUgbG9zIHRyZXMgY3VsdGl2YXJlcy4KCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5JbXBvcnRhciBwYXF1ZXRlcyB5IGxpYnJlcmlhcyA8L3NwYW4+CmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygiY2x1c3RlciIpICNQYXJhIGFncnVwYW1pZW50byBkZSBkYXRvcyAKbGlicmFyeShjbHVzdGVyKQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICNHcsOhZmljYXMKbGlicmFyeShnZ3Bsb3QyKQojaW5zdGFsbC5wYWNrYWdlcygiZmFjdG9leHRyYSIpICNWaXN1YWxpemFyIGNsdXN0ZXJzCmxpYnJhcnkoZmFjdG9leHRyYSkKI2ludHNhbGwucGFja2FnZXMoImRhdGEudGFibGUiKSAjQ29uanVudG8gZGUgZGF0b3MgZ3JhbmRlIApsaWJyYXJ5KGRhdGEudGFibGUpCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3MgPC9zcGFuPgpgYGB7cn0KZGF0b3MgPC0gcmVhZC5jc3YoIn4vRG9jdW1lbnRzL3dpbmUuY3N2IikKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+RW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+CmBgYHtyfQpzdW1tYXJ5KGRhdG9zKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5Fc2NhbGFyIGxhIGJhc2UgZGUgZGF0b3MgPC9zcGFuPgpgYGB7cn0KZGF0b3NfZXNjYWxhZG9zIDwtc2NhbGUoZGF0b3MpIApgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5HZW5lcmFyIGxvcyBzZWdtZW50b3MgPC9zcGFuPgpgYGB7cn0KZ3J1cG9zIDwtIDMgI0luaWNpbyBjb24gY3VhbHF1aWVyIHZhbG9yLCBsdWVnbyB2ZXJpZmljbwpzZWdtZW50b3MgPC0ga21lYW5zKGRhdG9zX2VzY2FsYWRvcyxncnVwb3MpCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkFzaWduYXIgZ3J1cG9zIGEgbG9zIGRhdG9zIDwvc3Bhbj4KYGBge3J9CmFzaWduYWNpb24gPC0gY2JpbmQoZGF0b3MsIGNsdXN0ZXI9IHNlZ21lbnRvcyRjbHVzdGVyKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5HcmFmaWNhciBsb3MgY2x1c3RlcnMgPC9zcGFuPgpgYGB7cn0KZnZpel9jbHVzdGVyKHNlZ21lbnRvcyxkYXRhID0gZGF0b3MpCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPk9wdGltaXphciBsYSBjYW50aWRhZCBkZSBncnVwb3MgPC9zcGFuPgpgYGB7cn0KIyBMYSBjYW50aWRhZCDDs3B0aW1hIGRlIGdydXBvcyBjb3JyZXNwb25kZSBhbCBwdW50byBtYXMgYWx0byBkZSBsYSBncsOhZmljYQpzZXQuc2VlZCgxMjMpCm9wdGltaXphY2lvbiA8LWNsdXNHYXAoZGF0b3NfZXNjYWxhZG9zLEZVTj1rbWVhbnMsIG5zdGFydD0xLCBLLm1heD0xMCkKcGxvdChvcHRpbWl6YWNpb24seGxhYj0iTsO6bWVybyBkZSBjbHVzdGVycyBLIikKYGBgCgoKCgo=