Teoria

Agrupamiento o clustering es una tecnica de aprendizaje no supervisado que agrupa datos en funcion de su similitud.

Algunos usos tipicos de esta tecnica son:

Segementacion de clientes Deteccion de anormalidades *Categorizacion de documentos

P.1 Instalar paquetes y llamar libreiras

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

P.2 Obtener los datos

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

P.3 Entender los datos

summary(df1)
##        x               y         
##  Min.   :1.000   Min.   : 2.000  
##  1st Qu.:2.000   1st Qu.: 4.000  
##  Median :4.500   Median : 5.000  
##  Mean   :4.375   Mean   : 5.875  
##  3rd Qu.:6.250   3rd Qu.: 8.250  
##  Max.   :8.000   Max.   :10.000
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 4 2 9

P.4 Escalar los datos

# Solo si los datos no estan en la misma escala.
# datos_escalados <- scale(datos_originales)

P.5 Determinar el numero de grupos

# Siempre es un valor inicial "cualquiera", luego se optimiza
plot(df1)

grupos1 <- 3

P.6 Generar los grupos

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

P.7 Optimizar el numero de grupos

set.seed(123)
optimizacion <- clusGap(df1, FUN=kmeans, nstart=1, K.max=7)
# El k.max noramlmente es 10, en este ejercicio al ser 8 datos se dejo en 7
plot(optimizacion, xlab="Numero de clusters k")

# Se selecciona como optimo el primer punto mas alto.

P.8 Graficar los grupos

fviz_cluster(clusters1, data=df1)

P.9 Agregar Clusters a la base de datos

df1_clusters <- cbind(df1, cluster = clusters1$cluster)
head(df1_clusters)
##   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  4       3

Conclusiones

La tecnica de clustering permite identificar patrones o grupos naturales en los datos sin necesidad de etiquetas privadas

LS0tDQp0aXRsZTogIlNlZ21lbnRhY2lvbiAoY2x1c3RlcnMpIg0KYXV0aG9yOiAiTWF4IFZpZGFsIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgDQotLS0NCg0KIVtdKGh0dHBzOi8vbWlyby5tZWRpdW0uY29tLzEqYnZCalV6QVNnMEFpanZlc2JtYlBnQS5naWYpDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOm9yYW5nZTsiPiBUZW9yaWEgPC9zcGFuPg0KDQoqKkFncnVwYW1pZW50byoqIG8gKmNsdXN0ZXJpbmcqIGVzIHVuYSB0ZWNuaWNhIGRlIGFwcmVuZGl6YWplIG5vIHN1cGVydmlzYWRvIHF1ZSBhZ3J1cGEgZGF0b3MgZW4gZnVuY2lvbiBkZSBzdSBzaW1pbGl0dWQuDQoNCkFsZ3Vub3MgdXNvcyB0aXBpY29zIGRlIGVzdGEgdGVjbmljYSBzb246DQoNCipTZWdlbWVudGFjaW9uICBkZSBjbGllbnRlcw0KKkRldGVjY2lvbiBkZSBhbm9ybWFsaWRhZGVzDQoqQ2F0ZWdvcml6YWNpb24gZGUgZG9jdW1lbnRvcw0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpvcmFuZ2U7Ij4gUC4xIEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlaXJhcyA8L3NwYW4+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojaW5zdGFsbC5wYWNrYWdlcygiY2x1c3RlciIpICMgQW5hbGlzaXMgZGUgYWdydXBhbWllbnRvDQpsaWJyYXJ5KGNsdXN0ZXIpDQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgR3JhZmljYXINCmxpYnJhcnkoZ2dwbG90MikNCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhLnRhYmxlIikgIyBNYW5qZW8gZGUgbXVjaG9zIGRhdG9zDQpsaWJyYXJ5KGRhdGEudGFibGUpDQojaW5zdGFsbC5wYWNrYWdlcygiZmFjdG9leHRyYSIpICMgR3JhZmljYSBvcHRpbWl6YWNpb24gZGUgbnVtZXJvIGRlIGNsdXN0ZXJzDQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpgYGANCg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpvcmFuZ2U7Ij4gUC4yIE9idGVuZXIgbG9zIGRhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0KZGYxIDwtIGRhdGEuZnJhbWUoeD1jKDIsMiw4LDUsNyw2LDEsNCksIHk9YygxMCw1LDQsOCw1LDQsMiw5KSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpvcmFuZ2U7Ij4gUC4zIEVudGVuZGVyIGxvcyBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCnN1bW1hcnkoZGYxKQ0Kc3RyKGRmMSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpvcmFuZ2U7Ij4gUC40IEVzY2FsYXIgbG9zIGRhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0KIyBTb2xvIHNpIGxvcyBkYXRvcyBubyBlc3RhbiBlbiBsYSBtaXNtYSBlc2NhbGEuDQojIGRhdG9zX2VzY2FsYWRvcyA8LSBzY2FsZShkYXRvc19vcmlnaW5hbGVzKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOm9yYW5nZTsiPiBQLjUgRGV0ZXJtaW5hciBlbCBudW1lcm8gZGUgZ3J1cG9zIDwvc3Bhbj4NCmBgYHtyfQ0KIyBTaWVtcHJlIGVzIHVuIHZhbG9yIGluaWNpYWwgImN1YWxxdWllcmEiLCBsdWVnbyBzZSBvcHRpbWl6YQ0KcGxvdChkZjEpDQpncnVwb3MxIDwtIDMNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpvcmFuZ2U7Ij4gUC42IEdlbmVyYXIgbG9zIGdydXBvcyA8L3NwYW4+DQpgYGB7cn0NCmNsdXN0ZXJzMSA8LSBrbWVhbnMoZGYxLGdydXBvczEpDQpjbHVzdGVyczENCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpvcmFuZ2U7Ij4gUC43IE9wdGltaXphciBlbCBudW1lcm8gZGUgZ3J1cG9zIDwvc3Bhbj4NCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0Kb3B0aW1pemFjaW9uIDwtIGNsdXNHYXAoZGYxLCBGVU49a21lYW5zLCBuc3RhcnQ9MSwgSy5tYXg9NykNCiMgRWwgay5tYXggbm9yYW1sbWVudGUgZXMgMTAsIGVuIGVzdGUgZWplcmNpY2lvIGFsIHNlciA4IGRhdG9zIHNlIGRlam8gZW4gNw0KcGxvdChvcHRpbWl6YWNpb24sIHhsYWI9Ik51bWVybyBkZSBjbHVzdGVycyBrIikNCiMgU2Ugc2VsZWNjaW9uYSBjb21vIG9wdGltbyBlbCBwcmltZXIgcHVudG8gbWFzIGFsdG8uDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6b3JhbmdlOyI+IFAuOCBHcmFmaWNhciBsb3MgZ3J1cG9zIDwvc3Bhbj4NCmBgYHtyfQ0KZnZpel9jbHVzdGVyKGNsdXN0ZXJzMSwgZGF0YT1kZjEpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6b3JhbmdlOyI+IFAuOSBBZ3JlZ2FyIENsdXN0ZXJzIGEgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCmRmMV9jbHVzdGVycyA8LSBjYmluZChkZjEsIGNsdXN0ZXIgPSBjbHVzdGVyczEkY2x1c3RlcikNCmhlYWQoZGYxX2NsdXN0ZXJzKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOm9yYW5nZTsiPiBDb25jbHVzaW9uZXMgPC9zcGFuPg0KTGEgdGVjbmljYSBkZSAqY2x1c3RlcmluZyogcGVybWl0ZSBpZGVudGlmaWNhciBwYXRyb25lcyBvIGdydXBvcyBuYXR1cmFsZXMgZW4gbG9zIGRhdG9zIHNpbiBuZWNlc2lkYWQgZGUgZXRpcXVldGFzIHByaXZhZGFzDQoNCg0K