Clustering

Contexto

La segmentación o clusters es un conjunto de técnicas cuyo propósito es formar grupos a partir de un conjunto de elementos.

Más información:

Cluster

Paso 1 - Instalar librerías

#install.packages("cluster")

library(cluster)
#install.packages("ggplot2")

library(ggplot2)
#install.packages("data.table")

library(data.table)
#install.packages("factoextra")

library(factoextra)

Paso 2 - Obtener los datos

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

Paso 3 - Inicializar los grupos

grupos <- 3

Paso 4 - Generar los segmentos

segmentos <- kmeans(df, grupos)
segmentos
## K-means clustering with 3 clusters of sizes 1, 5, 2
## 
## Cluster means:
##     x    y
## 1 2.0 10.0
## 2 4.8  4.0
## 3 4.5  8.5
## 
## Clustering vector:
## [1] 1 2 2 3 2 2 2 3
## 
## Within cluster sum of squares by cluster:
## [1]  0.0 44.8  1.0
##  (between_SS / total_SS =  54.5 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
summary(segmentos)
##              Length Class  Mode   
## cluster      8      -none- numeric
## centers      6      -none- numeric
## totss        1      -none- numeric
## withinss     3      -none- numeric
## tot.withinss 1      -none- numeric
## betweenss    1      -none- numeric
## size         3      -none- numeric
## iter         1      -none- numeric
## ifault       1      -none- numeric

Paso 5 - Asignar el grupo a cada observación

asignación <- cbind(cluster = segmentos$cluster, df)
asignación
##   cluster x  y
## 1       1 2 10
## 2       2 2  5
## 3       2 8  4
## 4       3 5  8
## 5       2 7  5
## 6       2 6  4
## 7       2 1  2
## 8       3 4  9
asignación$cluster <- as.factor(asignación$cluster)
summary(asignación)
##  cluster       x               y         
##  1:1     Min.   :1.000   Min.   : 2.000  
##  2:5     1st Qu.:2.000   1st Qu.: 4.000  
##  3:2     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

Paso 6 - Graficar los clusters

fviz_cluster(segmentos, data = df)

Paso 7 - Optimizar la cantidad de grupos

La cantidad óptima de grupos corresponde al punto más alto

set.seed(123)

optimizacion <- clusGap(df, FUN=kmeans, nstart=1, K.max = 7)

plot(optimizacion, xlab = "Número de clusters k")

Conclusión

El clustering es una valiosa herramienta del análisis de datos que nos permite identificar características que a simple vista no vemos en conjuntos de datos y que con esas características podemos hacer grupos de datos que nos harán posible enfocarnos en las características de cada grupo, lo que es sumamente valioso para distintas disciplinas como por ejemplo el marketing, donde necesitamos agrupar a nuestros clientes en distintos tipos de clientes.

LS0tCnRpdGxlOiAiUHJhY3RpY2EgMSAtIENsdXN0ZXIiCmF1dGhvcjogIkdhYnJpZWwgTWVkaW5hIgpkYXRlOiAiMjAyNC0wMi0yMSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICB0aGVtZTogYm9vdHN0cmFwCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKLS0tCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+Q2x1c3RlcmluZzwvc3Bhbj4KCiFbXSgvVXNlcnMvZ2FicmllbG1lZGluYS9Eb3dubG9hZHMvTTIvOWI5MmQ0NDg5NjZiOGYxMDYzODZiOGYzM2Q2OTM2OWYuZ2lmKQoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPkNvbnRleHRvPC9zcGFuPgoKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+CgoKTGEgKipzZWdtZW50YWNpw7NuKiogbyBjbHVzdGVycyBlcyB1biBjb25qdW50byBkZSB0w6ljbmljYXMgY3V5byBwcm9ww7NzaXRvIGVzIGZvcm1hciBncnVwb3MgYSBwYXJ0aXIgZGUgdW4gY29uanVudG8gZGUgZWxlbWVudG9zLiA8ZGl2Lz4gIAoKCgpNw6FzIGluZm9ybWFjacOzbjogIAoKW0NsdXN0ZXJdKGh0dHBzOi8vd3d3LmdyYXBoZXZlcnl3aGVyZS5jb20vcXVlLWVzLWVsLWNsdXN0ZXJpbmcvKQoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPlBhc28gMSAtIEluc3RhbGFyIGxpYnJlcsOtYXM8L3NwYW4+CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojaW5zdGFsbC5wYWNrYWdlcygiY2x1c3RlciIpCgpsaWJyYXJ5KGNsdXN0ZXIpCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKCmxpYnJhcnkoZ2dwbG90MikKI2luc3RhbGwucGFja2FnZXMoImRhdGEudGFibGUiKQoKbGlicmFyeShkYXRhLnRhYmxlKQojaW5zdGFsbC5wYWNrYWdlcygiZmFjdG9leHRyYSIpCgpsaWJyYXJ5KGZhY3RvZXh0cmEpCmBgYAoKCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+UGFzbyAyIC0gT2J0ZW5lciBsb3MgZGF0b3M8L3NwYW4+CgpgYGB7ciB9CmRmID0gZGF0YS5mcmFtZSh4PSBjKDIsMiw4LDUsNyw2LDEsNCksIHk9IGMoMTAsNSw0LDgsNSw0LDIsOSkpCmBgYAoKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5QYXNvIDMgLSBJbmljaWFsaXphciBsb3MgZ3J1cG9zPC9zcGFuPgoKYGBge3IgfQpncnVwb3MgPC0gMwpgYGAKCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+UGFzbyA0IC0gR2VuZXJhciBsb3Mgc2VnbWVudG9zPC9zcGFuPgoKYGBge3IgfQpzZWdtZW50b3MgPC0ga21lYW5zKGRmLCBncnVwb3MpCnNlZ21lbnRvcwpzdW1tYXJ5KHNlZ21lbnRvcykKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+UGFzbyA1IC0gQXNpZ25hciBlbCBncnVwbyBhIGNhZGEgb2JzZXJ2YWNpw7NuPC9zcGFuPgoKCmBgYHtyIH0KYXNpZ25hY2nDs24gPC0gY2JpbmQoY2x1c3RlciA9IHNlZ21lbnRvcyRjbHVzdGVyLCBkZikKYXNpZ25hY2nDs24KYXNpZ25hY2nDs24kY2x1c3RlciA8LSBhcy5mYWN0b3IoYXNpZ25hY2nDs24kY2x1c3RlcikKc3VtbWFyeShhc2lnbmFjacOzbikKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+UGFzbyA2IC0gR3JhZmljYXIgbG9zIGNsdXN0ZXJzPC9zcGFuPgoKYGBge3IgfQpmdml6X2NsdXN0ZXIoc2VnbWVudG9zLCBkYXRhID0gZGYpCgpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5QYXNvIDcgLSBPcHRpbWl6YXIgbGEgY2FudGlkYWQgZGUgZ3J1cG9zPC9zcGFuPgoKTGEgY2FudGlkYWQgw7NwdGltYSBkZSBncnVwb3MgY29ycmVzcG9uZGUgYWwgcHVudG8gbcOhcyBhbHRvIAoKYGBge3IgfQpzZXQuc2VlZCgxMjMpCgpvcHRpbWl6YWNpb24gPC0gY2x1c0dhcChkZiwgRlVOPWttZWFucywgbnN0YXJ0PTEsIEsubWF4ID0gNykKCnBsb3Qob3B0aW1pemFjaW9uLCB4bGFiID0gIk7Dum1lcm8gZGUgY2x1c3RlcnMgayIpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPkNvbmNsdXNpw7NuPC9zcGFuPgoKRWwgY2x1c3RlcmluZyBlcyB1bmEgdmFsaW9zYSBoZXJyYW1pZW50YSBkZWwgYW7DoWxpc2lzIGRlIGRhdG9zIHF1ZSBub3MgcGVybWl0ZSBpZGVudGlmaWNhciBjYXJhY3RlcsOtc3RpY2FzIHF1ZSBhIHNpbXBsZSB2aXN0YSBubyB2ZW1vcyBlbiBjb25qdW50b3MgZGUgZGF0b3MgeSBxdWUgY29uIGVzYXMgY2FyYWN0ZXLDrXN0aWNhcyBwb2RlbW9zIGhhY2VyIGdydXBvcyBkZSBkYXRvcyBxdWUgbm9zIGhhcsOhbiBwb3NpYmxlIGVuZm9jYXJub3MgZW4gbGFzIGNhcmFjdGVyw61zdGljYXMgZGUgY2FkYSBncnVwbywgbG8gcXVlIGVzIHN1bWFtZW50ZSB2YWxpb3NvIHBhcmEgZGlzdGludGFzIGRpc2NpcGxpbmFzIGNvbW8gcG9yIGVqZW1wbG8gZWwgbWFya2V0aW5nLCBkb25kZSBuZWNlc2l0YW1vcyBhZ3J1cGFyIGEgbnVlc3Ryb3MgY2xpZW50ZXMgZW4gZGlzdGludG9zIHRpcG9zIGRlIGNsaWVudGVzLgo=