Teoría

Agrupamiento o Clustering es una técnica de aprendizaje automático no supervisado que agrupa datos en función de su similitud.

Algunos usos típicos de esta técnica son:

  • Segmentación de dclientes
  • Detección de anormalidades
  • Categorización de documentos

1. Instalar paquetes y llamar librerías

# install.packages("cluster") # Analisis de agrupamiento
library(cluster)
# install.packages("ggplot2") # Graficar
library(ggplot2)
# install.packages("data.table") # Manejo de muchos datos
library(data.table)
# install.packages("factoextra") # Grafica optimizacion de numero de clusters
library(factoextra)

2. Obtener los datos

df1 <- data.frame(x = c(2,2,8,5,7,6,1,4), y = c(10,5,4,8,5,3,2,9))

3. Entender los datos los datos

summary(df1)
##        x               y        
##  Min.   :1.000   Min.   : 2.00  
##  1st Qu.:2.000   1st Qu.: 3.75  
##  Median :4.500   Median : 5.00  
##  Mean   :4.375   Mean   : 5.75  
##  3rd Qu.:6.250   3rd Qu.: 8.25  
##  Max.   :8.000   Max.   :10.00
str(df1)
## 'data.frame':    8 obs. of  2 variables:
##  $ x: num  2 2 8 5 7 6 1 4
##  $ y: num  10 5 4 8 5 3 2 9

4. Escalar los datos

# datos_escalados <- scale(df1)

5. Determinar el número de grupos

plot(df1$x,df1$y)

grupos1 <- 3

6. Generar grupos

set.seed(123)
clusters1 <- kmeans(df1, grupos1)
clusters1
## K-means clustering with 3 clusters of sizes 2, 3, 3
## 
## Cluster means:
##          x   y
## 1 1.500000 3.5
## 2 3.666667 9.0
## 3 7.000000 4.0
## 
## Clustering vector:
## [1] 2 1 3 2 3 3 1 2
## 
## Within cluster sum of squares by cluster:
## [1] 5.000000 6.666667 4.000000
##  (between_SS / total_SS =  85.1 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

7. Optimizar el número de grupos

set.seed(123)
optimizacion <- clusGap(df1, FUN = kmeans, nstart = 1, K.max = 7)
plot(optimizacion, xlab = "Número de clusters k", main = "Optimización")

8. Graficar los cluster

fviz_cluster(clusters1, data = df1)

9. Agregar los clusters a la base de datos

df1_cl <- cbind(df1, cluster = clusters1$cluster)
head(df1_cl)
##   x  y cluster
## 1 2 10       2
## 2 2  5       1
## 3 8  4       3
## 4 5  8       2
## 5 7  5       3
## 6 6  3       3

10. Conclusiones

La técnica de clustering permite identificar patrones o grupos naturales en los datos sin necesidad de etiquetas previsas.

LS0tDQp0aXRsZTogJyJJbnRyb2R1Y2Npb25fQ2xhc2UxX0FncnVwYW1pZW50byAoQ2x1c3RlcnMpIicNCmF1dGhvcjogIkVyaWsgR29uemFsZXoiDQpkYXRlOiAiMjAyNS0wOC0xOCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUcnVlIA0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KDQoNCiFbXShodHRwczovL21pcm8ubWVkaXVtLmNvbS92Mi9yZXNpemU6Zml0OjE0MDAvMSpiMnNPMmYtLXlmWmlKYXpjNXJZU3BnLmdpZikNCg0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOmJsdWU7Ij4gVGVvcsOtYSA8L3NwYW4+DQoqKkFncnVwYW1pZW50byoqIG8gKipDbHVzdGVyaW5nKiogZXMgdW5hIHTDqWNuaWNhIGRlIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvIG5vIHN1cGVydmlzYWRvIHF1ZSBhZ3J1cGEgZGF0b3MgZW4gZnVuY2nDs24gZGUgc3Ugc2ltaWxpdHVkLg0KDQoNCkFsZ3Vub3MgdXNvcyB0w61waWNvcyBkZSBlc3RhIHTDqWNuaWNhIHNvbjoNCg0KKyBTZWdtZW50YWNpw7NuIGRlIGRjbGllbnRlcw0KKyBEZXRlY2Npw7NuIGRlIGFub3JtYWxpZGFkZXMNCisgQ2F0ZWdvcml6YWNpw7NuIGRlIGRvY3VtZW50b3MNCg0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOmJsdWU7Ij4gMS4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcyA8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJjbHVzdGVyIikgIyBBbmFsaXNpcyBkZSBhZ3J1cGFtaWVudG8NCmxpYnJhcnkoY2x1c3RlcikNCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgR3JhZmljYXINCmxpYnJhcnkoZ2dwbG90MikNCiMgaW5zdGFsbC5wYWNrYWdlcygiZGF0YS50YWJsZSIpICMgTWFuZWpvIGRlIG11Y2hvcyBkYXRvcw0KbGlicmFyeShkYXRhLnRhYmxlKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJmYWN0b2V4dHJhIikgIyBHcmFmaWNhIG9wdGltaXphY2lvbiBkZSBudW1lcm8gZGUgY2x1c3RlcnMNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOmJsdWU7Ij4gMi4gT2J0ZW5lciBsb3MgZGF0b3MgPC9zcGFuPg0KYGBge3J9DQpkZjEgPC0gZGF0YS5mcmFtZSh4ID0gYygyLDIsOCw1LDcsNiwxLDQpLCB5ID0gYygxMCw1LDQsOCw1LDMsMiw5KSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOmJsdWU7Ij4gMy4gRW50ZW5kZXIgbG9zIGRhdG9zIGxvcyBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCnN1bW1hcnkoZGYxKQ0Kc3RyKGRmMSkNCmBgYA0KDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6Ymx1ZTsiPiA0LiBFc2NhbGFyIGxvcyBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCiMgZGF0b3NfZXNjYWxhZG9zIDwtIHNjYWxlKGRmMSkNCmBgYA0KDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6Ymx1ZTsiPiA1LiBEZXRlcm1pbmFyIGVsIG7Dum1lcm8gZGUgZ3J1cG9zIDwvc3Bhbj4NCmBgYHtyfQ0KcGxvdChkZjEkeCxkZjEkeSkNCmdydXBvczEgPC0gMw0KYGBgDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6Ymx1ZTsiPiA2LiBHZW5lcmFyIGdydXBvcyA8L3NwYW4+DQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCmNsdXN0ZXJzMSA8LSBrbWVhbnMoZGYxLCBncnVwb3MxKQ0KY2x1c3RlcnMxDQpgYGANCg0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpibHVlOyI+IDcuIE9wdGltaXphciBlbCBuw7ptZXJvIGRlIGdydXBvcyA8L3NwYW4+DQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCm9wdGltaXphY2lvbiA8LSBjbHVzR2FwKGRmMSwgRlVOID0ga21lYW5zLCBuc3RhcnQgPSAxLCBLLm1heCA9IDcpDQpwbG90KG9wdGltaXphY2lvbiwgeGxhYiA9ICJOw7ptZXJvIGRlIGNsdXN0ZXJzIGsiLCBtYWluID0gIk9wdGltaXphY2nDs24iKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6Ymx1ZTsiPiA4LiBHcmFmaWNhciBsb3MgY2x1c3RlciA8L3NwYW4+DQpgYGB7cn0NCmZ2aXpfY2x1c3RlcihjbHVzdGVyczEsIGRhdGEgPSBkZjEpDQpgYGANCg0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpibHVlOyI+IDkuIEFncmVnYXIgbG9zIGNsdXN0ZXJzIGEgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCmRmMV9jbCA8LSBjYmluZChkZjEsIGNsdXN0ZXIgPSBjbHVzdGVyczEkY2x1c3RlcikNCmhlYWQoZGYxX2NsKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6Ymx1ZTsiPiAxMC4gQ29uY2x1c2lvbmVzIDwvc3Bhbj4NCkxhIHTDqWNuaWNhIGRlICpjbHVzdGVyaW5nKiBwZXJtaXRlIGlkZW50aWZpY2FyIHBhdHJvbmVzIG8gZ3J1cG9zIG5hdHVyYWxlcyBlbiBsb3MgZGF0b3Mgc2luIG5lY2VzaWRhZCBkZSBldGlxdWV0YXMgcHJldmlzYXMuIA0KDQoNCg==