Es una técnica de machine learning no supervisado, no tiene etiquetas previas sobre en qué grupo debe ir cada observación, el algoritmo “aprende” cómo agrupar. El objetivo es descubrir patrones o grupos (clusters o conglomerados) de objetos similares dentro de un conjunto de datos multivariado, estos grupos deben tener alta homogeneidad interna (que los elementos en un mismo clúster sean lo más parecidos posible) y gran heterogeneidad externa (que los distintos clústeres sean lo más diferentes posible entre sí)
|
Análisis de Clúster
|
Técnicas disponibles
|
Ventajas |
Desventajas |
|
Jerárquico: Es un método de agrupamiento no supervisado que construye una estructura jerárquica de grupos, representada mediante un dendrograma. El objetivo es ir formando clústeres paso a paso. |
Métodos aglomerativos
Comienzan con cada observación como un clúster y los van fusionando.
Métodos divisivos
Inician con un solo clúster y lo dividen paso a paso. |
|
|
|
No jerárquico: Son métodos de agrupamiento que no construyen una jerarquía, sino que particionan directamente los datos en un número fijo de clústeres. Estos métodos requieren especificar k, el número de clústeres deseado.
El objetivo es encontrar una partición que minimice la distancia dentro del clúster y maximice la distancia entre clústeres.
|
Técnicas de partición
K-means K-medoids (PAM) CLARA
Técnicas de clustering avanzado
Fuzzy clustering Model-based clustering Density-based (DBSCAN)
|
|
|
Fuente: elaboración propia con base en Kassambara, 2017.
Parten de cada observación como clúster y los van uniendo.
Une clústeres midiendo la distancia mínima entre puntos. Puede generar el “efecto cadena”.
Usa la distancia máxima entre puntos. Produce clústeres más compactos.
Usa el promedio de distancias entre puntos de los clústeres.
Usa la distancia entre los centroides de los clústeres.
Minimiza la variación dentro del clúster. Es el preferido por Kassambara para datos cuantitativos.
stats (función hclust) factoextra (visualización, función fviz_dend)
Comienza con todas las observaciones en un solo grupo. Las divide sucesivamente buscando maximizar diferencias.
cluster
r library(cluster) diana_res <- diana(datos) fviz_dend(diana_res)
Método más popular y detallado en el libro. Minimiza la suma de cuadrados dentro de cada clúster. Sensible a valores atípicos.
stats (kmeans) factoextra (visualización)
Sintaxis:
r set.seed(123) km <- kmeans(datos, centers = 3, nstart = 25)
fviz_cluster(km, data = datos)
Similar a k-means, pero usa medoides (menos sensible a outliers). Recomendado si hay valores extremos.
cluster
r library(cluster) pam_res <- pam(datos, k = 3)
fviz_cluster(pam_res)
Versión optimizada de PAM para grandes bases de datos. Muestra pequeñas muestras para reducir costo computacional.
cluster
r clara_res <- clara(datos, k = 3) fviz_cluster(clara_res)
data("USArrests")
df <- scale(USArrests)
head(df, n = 3)## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
x <- scale(USArrests)
kmeans(x, centers=4, iter.max = 10, nstart = 1)## K-means clustering with 4 clusters of sizes 13, 13, 16, 8
##
## Cluster means:
## Murder Assault UrbanPop Rape
## 1 0.6950701 1.0394414 0.7226370 1.27693964
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001 0.5758298 -0.26165379
## 4 1.4118898 0.8743346 -0.8145211 0.01927104
##
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 4 1 1 4 1
## Colorado Connecticut Delaware Florida Georgia
## 1 3 3 1 4
## Hawaii Idaho Illinois Indiana Iowa
## 3 2 1 3 2
## Kansas Kentucky Louisiana Maine Maryland
## 3 2 4 2 1
## Massachusetts Michigan Minnesota Mississippi Missouri
## 3 1 2 4 1
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 1 2 3
## New Mexico New York North Carolina North Dakota Ohio
## 1 1 4 2 3
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 3 3 3 3 4
## South Dakota Tennessee Texas Utah Vermont
## 2 4 1 3 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 3 3 2 2 3
##
## Within cluster sum of squares by cluster:
## [1] 19.922437 11.952463 16.212213 8.316061
## (between_SS / total_SS = 71.2 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
print(km.res)## K-means clustering with 4 clusters of sizes 8, 13, 16, 13
##
## Cluster means:
## Murder Assault UrbanPop Rape
## 1 1.4118898 0.8743346 -0.8145211 0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001 0.5758298 -0.26165379
## 4 0.6950701 1.0394414 0.7226370 1.27693964
##
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 1 4 4 1 4
## Colorado Connecticut Delaware Florida Georgia
## 4 3 3 4 1
## Hawaii Idaho Illinois Indiana Iowa
## 3 2 4 3 2
## Kansas Kentucky Louisiana Maine Maryland
## 3 2 1 2 4
## Massachusetts Michigan Minnesota Mississippi Missouri
## 3 4 2 1 4
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 4 2 3
## New Mexico New York North Carolina North Dakota Ohio
## 4 4 1 2 3
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 3 3 3 3 1
## South Dakota Tennessee Texas Utah Vermont
## 2 1 4 3 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 3 3 2 2 3
##
## Within cluster sum of squares by cluster:
## [1] 8.316061 11.952463 16.212213 19.922437
## (between_SS / total_SS = 71.2 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)## cluster Murder Assault UrbanPop Rape
## 1 1 13.93750 243.62500 53.75000 21.41250
## 2 2 3.60000 78.53846 52.07692 12.17692
## 3 3 5.65625 138.87500 73.87500 18.78125
## 4 4 10.81538 257.38462 76.00000 33.19231
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)## Murder Assault UrbanPop Rape cluster
## Alabama 13.2 236 58 21.2 1
## Alaska 10.0 263 48 44.5 4
## Arizona 8.1 294 80 31.0 4
## Arkansas 8.8 190 50 19.5 1
## California 9.0 276 91 40.6 4
## Colorado 7.9 204 78 38.7 4
km.res$cluster## Alabama Alaska Arizona Arkansas California
## 1 4 4 1 4
## Colorado Connecticut Delaware Florida Georgia
## 4 3 3 4 1
## Hawaii Idaho Illinois Indiana Iowa
## 3 2 4 3 2
## Kansas Kentucky Louisiana Maine Maryland
## 3 2 1 2 4
## Massachusetts Michigan Minnesota Mississippi Missouri
## 3 4 2 1 4
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 4 2 3
## New Mexico New York North Carolina North Dakota Ohio
## 4 4 1 2 3
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 3 3 3 3 1
## South Dakota Tennessee Texas Utah Vermont
## 2 1 4 3 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 3 3 2 2 3
head(km.res$cluster, 4)## Alabama Alaska Arizona Arkansas
## 1 4 4 1
km.res$size## [1] 8 13 16 13
km.res$centers## Murder Assault UrbanPop Rape
## 1 1.4118898 0.8743346 -0.8145211 0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001 0.5758298 -0.26165379
## 4 0.6950701 1.0394414 0.7226370 1.27693964
data("USArrests")
df <- scale(USArrests)
head(df, n = 3)## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
set.seed(1234)
# Genera 500 objetos, divididos en 2 grupos
df <- rbind(cbind(rnorm(200, 0, 8), rnorm(200, 0, 8)), cbind(rnorm(300, 50, 8), rnorm(300, 50, 8)))
# Especificar nombres de filas y columnas
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))
# Vista previa de los datos
head(df, nrow = 6)## x y
## S1 -9.656526 3.881815
## S2 2.219434 5.574150
## S3 8.675529 1.484111
## S4 -18.765582 5.605868
## S5 3.432998 2.493448
## S6 4.048447 6.083699
data("USArrests")
df <- scale(USArrests)
head(df, nrow = 6)## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144 1.7589234 2.067820292
## Colorado 0.02571456 0.3988593 0.8608085 1.864967207
res.dist <- dist(df, method = "euclidean")as.matrix(res.dist)[1:6, 1:6]## Alabama Alaska Arizona Arkansas California Colorado
## Alabama 0.000000 2.703754 2.293520 1.289810 3.263110 2.651067
## Alaska 2.703754 0.000000 2.700643 2.826039 3.012541 2.326519
## Arizona 2.293520 2.700643 0.000000 2.717758 1.310484 1.365031
## Arkansas 1.289810 2.826039 2.717758 0.000000 3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641 0.000000 1.287619
## Colorado 2.651067 2.326519 1.365031 2.831051 1.287619 0.000000
res.hc <- hclust(d = res.dist, method = "ward.D2")res.coph <- cophenetic(res.hc)
# Correlacion entre distancia cofenética y la distancia original
cor(res.dist, res.coph)## [1] 0.6975266
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))## [1] 0.7180382
grp <- cutree(res.hc, k = 4)
head(grp, n=4)## Alabama Alaska Arizona Arkansas
## 1 2 2 3
table(grp)## grp
## 1 2 3 4
## 7 12 19 12
rownames(df)[grp == 1]## [1] "Alabama" "Georgia" "Louisiana" "Mississippi"
## [5] "North Carolina" "South Carolina" "Tennessee"
library("cluster")
# Anidación aglomerativa (agrupacion jerarquica)
res.agnes <- agnes(
x = USArrests,
# Matriz de datos
stand = TRUE,
# Estandarizar los datos
metric = "euclidean",
# Metrica para matriz de distancia
method = "ward" # Metodo de vinculación
)
# Agrupacion de análisis visual
res.diana <-diana(x = USArrests, # Matriz de datos
stand = TRUE, # estandarizar los datos
metric = "euclidean" # Métrica para matruz de distancia
)https://drive.google.com/file/d/1RuTzvWoCQrgslRanEP4dMpEnV-PkaX9F/view Kassambara, A., & Kassambara, A. (n.d.). Practical guide to cluster analysis in R edition 1 sthda.com unsupervised machine learning.