
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