Presentación



UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONOMICAS

ESCUELA DE ECONOMIA

Materia: Métodos para el Análisis Económico

Docente: Carlos Ademir Pérez Alas


“Tarea de Investigación parte 2, 2023. Análisis de Clúster (Conglomerados).”

Integrantes:

Argueta Velasco, Rocío Azucena AV14026

Azahar Nieto, Hugo Alejandro AN18012

Cruz Ruiz, Linda Stephanie CR19015

Ciclo: II-2023

Fecha: Sábado 6 de enero de 2024

Ciudad Universitaria, San Salvador, El Salvador

1. Explique en que consiste el análisis de conglomerados.

Según algunos autores el Análisis de Cluster o Conglomerados:

Se ocupan de explorar conjuntos de datos para evaluar si pueden o no resumirse de manera significativa en términos de un pequeño número de grupos o grupos de objetos o individuos que se parecen a cada uno y que son diferentes en algunos aspectos de los individuos de otros grupos. [@everitt2011cluster]

Mientras que, según [@jain2008data] define el análisis de conglomerados como:

“una técnica de clasificación estadística para descubrir si los individuos de una población caen en diferentes grupos haciendo comparaciones cuantitativas de múltiples características”

Finalmente, [@kassambara2017practical] considera que:

La agrupación en clústeres es uno de los métodos de minería de datos importantes para descubrir conocimientos en datos multidimensionales. El objetivo de la agrupación es identificar patrones o grupos de objetos similares dentro de un conjunto de datos de interés.

2. Elabore un cuadro comparativo.

Se presentara un cuadro comparativo para los diferentes tipos de análisis de cluster

# Se creará una función para insertar las viñetas dentro de la tabla 
lista <- function(...) {
  paste0("<ul>", sprintf('<li>%s</li>', substitute(...())), '</ul>', collapse = '')
}




library(kableExtra)
Cuadro <- data.frame(
'Analisis de cluster'= c("**Jerárquico:**  
Es un metodo alternativo a la agrupación en clústeres de particiones para agrupar objetos en función de su similitud. A diferencia de la agrupación en clústeres de particiones (no jerarquico), la agrupación jerárquica no requieren pre-especificar el número de clusters que se producirán. ",

"**No jerárquico:**  
Es una serie de métodos de agrupación utilizados para clasificar las observaciones, dentro de un conjunto de datos, en varios grupos en función de su similitud. Los algoritmos requieren un analista para especificar el número de clusters que se generarán."),
                    
'Tecnicas Disponibles'= c(lista('Aglomerativo', 'Divisivo'),
                    lista('K-means','K-Medoids (PAM)','Clustering Large Applications (CLARA)')),
  
'Ventajas' =  c(lista('La posibilidad de obtener representaciones en árboles de las observaciones,como los dendrogramas','La agrupación jerárquica no requieren pre-especificar el número de clusters que se                         producirán.'),
                
                lista('Son una alternativa robusta para dividir un conjunto de datos en grupos de observación.',
                      
                      'La agrupación en clústeres de K-means es un algoritmo muy simple y rápido.'
                      ,'Puede lidiar de manera eficiente con muy grandes conjuntos de datos.')),

'Desventajas' = c(lista('Su requerimiento para seleccionar de manera previa un determinado número de clústeres',
                        
'La complejidad del tiempo para el clustering puede dar lugar a tiempos de cálculo muy largos, en comparación con algoritmos eficientes, como K-Means.',
                        
'Si tenemos un conjunto de datos grande, puede ser difícil determinar el número correcto de clusteres por el dendrograma.'),
                  
              lista('Se requiere que el usuario conozca los datos e indique el número apropiado de clústeres que se producirán.',
                        
'Los resultados finales obtenidos son sensibles a la selección aleatoria inicial de los clusteres',
                        
                        'Es sensible a los valores atípicos.',
                        
'Si reorganiza sus datos, es muy posible que obtenga una solución diferente cada vez que cambie el orden de sus datos.')))

kbl(Cuadro,escape = F,caption = "Resumen de Análisis de Cluster") %>% 
  kable_paper(full_width = T, font_size = "14") %>% 
  row_spec(0,background = "lightblue",bold = T,align="center") %>% 
  row_spec(1:2,align = "justify") %>% 
  column_spec(1,border_right = T, width = "30cm") %>% 
  column_spec(2,border_right = T,width = "5cm") %>% 
  column_spec(3:4,border_right = T,width = "20cm") %>% 
  add_footnote("Fuente : Elaboración propia en base a [@jain2008data; @kassambara2017practical]")
Resumen de Análisis de Cluster
Analisis.de.cluster Tecnicas.Disponibles Ventajas Desventajas
Jerárquico:
Es un metodo alternativo a la agrupación en clústeres de particiones para agrupar objetos en función de su similitud. A diferencia de la agrupación en clústeres de particiones (no jerarquico), la agrupación jerárquica no requieren pre-especificar el número de clusters que se producirán.
  • Aglomerativo
  • Divisivo
  • La posibilidad de obtener representaciones en árboles de las observaciones,como los dendrogramas
  • La agrupación jerárquica no requieren pre-especificar el número de clusters que se producirán.
  • Su requerimiento para seleccionar de manera previa un determinado número de clústeres
  • La complejidad del tiempo para el clustering puede dar lugar a tiempos de cálculo muy largos, en comparación con algoritmos eficientes, como K-Means.
  • Si tenemos un conjunto de datos grande, puede ser difícil determinar el número correcto de clusteres por el dendrograma.
No jerárquico:
Es una serie de métodos de agrupación utilizados para clasificar las observaciones, dentro de un conjunto de datos, en varios grupos en función de su similitud. Los algoritmos requieren un analista para especificar el número de clusters que se generarán.
  • K-means
  • K-Medoids (PAM)
  • Clustering Large Applications (CLARA)
  • Son una alternativa robusta para dividir un conjunto de datos en grupos de observación.
  • La agrupación en clústeres de K-means es un algoritmo muy simple y rápido.
  • Puede lidiar de manera eficiente con muy grandes conjuntos de datos.
  • Se requiere que el usuario conozca los datos e indique el número apropiado de clústeres que se producirán.
  • Los resultados finales obtenidos son sensibles a la selección aleatoria inicial de los clusteres
  • Es sensible a los valores atípicos.
  • Si reorganiza sus datos, es muy posible que obtenga una solución diferente cada vez que cambie el orden de sus datos.
a Fuente : Elaboración propia en base a [@jain2008data; @kassambara2017practical]

3. Descripción de técnicas disponibles para el análisis de clúster.

Método Jerárquico

Aglomerativo

Trata cada objeto como un clúster único, posteriormente los pares de clústeres se fusionan sucesivamente hasta convertirse en un gran clúster que contiene todos los objetos. El resultado es un árbol (representación de los objetos), denominado dendrograma. Su agrupación funciona “de abajo hacia arriba”. Es decir, cada objeto es inicialmente considerado como un grupo de un solo elemento (hoja). En cada paso del algoritmo, los dos grupos que son los más similares se combinan en un nuevo grupo más grande (nodos), repitiendose hasta que todos los puntos son miembros de un solo gran clúster (raíz). Tenga en cuenta que la agrupación aglomerativa es buena para identificar agrupaciones pequeñas.

Por otro lado la inversa de la agrupación aglomerativa es la agrupación divisiva, que también se conoce como DIANA (Divise Analysis) y funciona de manera “de arriba hacia abajo”. Comienza con el root, en el que todos los objetos se incluyen en un solo clúster. En cada paso de la iteración, el grupo más heterogéneo se divide en dos. El proceso se repite hasta que todos los objetos están en su propio grupo. La agrupación divisiva es buena para identificar grandes agrupaciones.

Sintaxis Aglomerativo

  1. Preparación de los datos que deben ser una matriz numérica con; filas que representan observaciones (individuos) y columnas que representan variables.

  2. Calcular información de (des) similitud entre cada par de objetos en los datos a colocar.

  3. Uso de la función de vinculación para agrupar objetos en un árbol de clúster jerárquico, según la información de distancia generada en el paso 1. Objetos / grupos que están cerca aproximadamente se vinculan entre sí mediante la función de vinculación.

  4. Determinar dónde cortar el árbol jerárquico en grupos. Esto crea un partición de los datos.

Librerías utilizadas en R para el caso del análisis de clúster

  • Métodos jerárquicos aglomeratívos

Para realizar análisis de cluster jerarquico aglomerativo las 2 funciones principales son:

hclust() del paqute stats agnes() del paquete cluster.

  • Métodos jerárquicos divisivos

Para el método jerárquico divisivo se tiene principalmente: diana() del paquete cluster.

Factoextra

Factoextra es un paquete R que facilita la extracción y visualización de la salida de análisis exploratorios de datos multivariados, que incluyen:

Análisis de componentes principales (PCA), que se utiliza para resumir la información contenida en un dato multivariante continuo (es decir, cuantitativo) al reducir la dimensionalidad de los datos sin perder información importante.

Análisis de Correspondencia (AC), que es una extensión del análisis de componentes principales adecuado para analizar una gran tabla de contingencia formada por dos variables cualitativas (o datos categóricos).

Análisis de Correspondencia Múltiple (MCA), que es una adaptación de CA a una tabla de datos que contiene más de dos variables categóricas.

Análisis Factorial Múltiple (MFA) dedicado a conjuntos de datos donde las variables se organizan en grupos (variables cualitativas y/o cuantitativas).

Análisis Factorial Múltiple Jerárquico (HMFA): Una extensión de MFA en una situación en la que los datos están organizados en una estructura jerárquica.

Análisis Factorial de Datos Mixtos (FAMD), un caso particular del MFA, dedicado a analizar un conjunto de datos que contiene variables tanto cuantitativas como cualitativas.

Script del método

# Cargar los datos
data("USArrests")
# Standarizar la data
df <- scale(USArrests)
# Mostar primeras 6 filas
head(df, nrow = 6)

# Calcular matriz de disimilitud
# df = datos estandarizados
res.dist <- dist(df, method = "euclidean")

as.matrix(res.dist)[1:6, 1:6] # muestra primeras 6 filas y columas de matiz de distancia

# Visualizar el dendograma
library("factoextra")
fviz_dend(res.hc, cex = 0.5)

# Calcular la distancia
res.coph <- cophenetic(res.hc)
#Correlación entre distancia Cophenetic y distancia original
cor(res.dist, res.coph)

#Ejecutarla función nuevamente usando el método de vinculación promedio
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))

# Cortar árbol en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)

# Número de miembros dento del clúster
table(grp)

# Obtener nombres de los miembros de clúster 1
rownames(df)[grp == 1]

# Cortar en 4 grupos y asiganr color por grupos
fviz_dend(res.hc, k = 4, # Cut in four groups
cex = 0.5, # label size
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # color por grupos
rect = TRUE # Agregar rectangulo alrededor de los grupos
)

# Observar el resultado de diagrama de dispersión
fviz_cluster(list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex", # elipse de concentración
repel = TRUE, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_minimal())

library("cluster")
# Anidación aglomerativa (Hierarchical Clustering)
res.agnes <- agnes(x = USArrests, # matriz de datos
stand = TRUE, # estandarizar los datos
metric = "euclidean", # metrica para matriz de distancia
method = "ward" # Método de vinculación
)

# Agrupación de análisis visual
res.diana <- diana(x = USArrests, # matriz de datos
stand = TRUE, # estandarizar los datos
metric = "euclidean" # metrica para matriz de distancia
)

After running agnes() and diana(), you can use the function fviz_dend()[in   factoextra]
to visualize the output:
fviz_dend(res.agnes, cex = 0.6, k = 4)

Métodos No jerárquicos

K-means Clustering

Es el método no jerárquico y no supervisado de aprendizaje automático para particionar en un conjunto de datos, dado en un conjunto de k grupos, donde se tiene (k conglomerados), el cual representa el número de grupos predefinidos por el analista. clasifica los objetos en varios grupos (clústeres), hasta el punto que los objetos dentro del mismo clúster son tan similares como sea posible (alta similitud dentro de la clase) y los objetos de diferentes grupos son lo más diferentes posible (baja similitud entre clases), lo que significa que ninguna observación puede pertenecer a más de un clúster. En la agrupación de k-medias, cada grupo está representado por su centro (centroide) que corresponde a la media de puntos asignados al clúster.

¿Cuál es la idea básica de K-means?

Consiste en definir agrupaciones de modo que el total minimice la variación intra-conglomerado (conocida como variación total dentro del conglomerado). Dentro de la variedad de algoritmos k-medias disponibles el estándar es el Algoritmo de Hartigan-Wong (1979), que define la variación total dentro del conglomerado como la suma de las distancias al cuadrado las distancias euclidianas entre elementos y el correspondiente centroide:

Sintaxis de K-means Clustering

  1. Especifique el número de clústeres (K) que se crearán en la solución final (por el analista).

  2. Seleccionar aleatoriamente k objetos del conjunto de datos como centros o medias del conglomerado inicial. Los objetos seleccionados también se conocen como medios de clúster. O centroide.

  3. Asigna cada observación a su centroide más cercano, basado en el Euclidiana (distancia entre el objeto y el centroide).

  4. Para cada uno de los k conglomerados, actualice el centroide del conglomerado calculando los nuevos valores medios de todos los puntos de datos del conglomerado. El centroide de un grupo es un vector de longitud p que contiene las medias de todas las variables para las observaciones en el k-ésimo grupo; p es el número de variables.

  5. Minimice iterativamente el total dentro de la suma del cuadrado. Es decir, repita los pasos 3 y 4 hasta que las asignaciones del clúster dejen de cambiar o se alcance el número máximo de iteraciones. De forma predeterminada, el software R usa 10 como valor predeterminado para el número máximo de iteraciones.

Script de la tecnica:

data("USArrests") # cargamos el set de datos
df <- scale(USArrests) # normalización de la data
           
# Ver las primeras 3 filas de la data
head(df, n = 3)
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
          
# Calcular k-means con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
          
# Imprimir los resultados
print(km.res)

aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)

# Número de conglomerados para cada una de las observaciones 
km.res$cluster
head(km.res$cluster, 4)

# Tamaño de clúster
km.res$size

# Medias de clúster 
km.res$centers
          
fviz_cluster(km.res, data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid", # Concentration ellipse
star.plot = TRUE, # Add segments from centroids to items
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_minimal()
)

K-Medoids (PAM)

Este algoritmo se basa primero en la búsqueda de k objetos representativos entre las observaciones del conjunto de datos, luego se construyen los grupos asignando cada observación al medio más cercano y cada punto de datos no medoide seleccionado se intercambian y se calcula la función objetivo, la cual corresponde a la suma de las disimilitudes de todos los objetos a su medoide más cercano.

Este paso intenta mejorar la calidad de la agrupación mediante el intercambio objetos seleccionados (medoides) y objetos no seleccionados. Si la función objetivo puede reducirse intercambiando un objeto seleccionado con un objeto no seleccionado, entonces se realiza el canje continuando hasta que la función objetivo ya no puede ser disminuida.

¿Cuál es el objetivo? Es encontrar k objetos representativos que minimicen la suma de diferencias de las observaciones con su objeto representativo más cercano.

Sintaxis de K-Medoids (PAM)

  1. Seleccione k objetos para convertirlos en medoides, o en caso de que se proporcionen estos objetos utilícelos como medoides;

  2. Calcule la matriz de disimilitud si no se proporcionó;

  3. Asigne cada objeto a su medoide más cercano;

  4. Para cada búsqueda de clúster, si alguno de los objetos del clúster disminuye el coeficiente de disimilitud promedio; si es así, seleccione la entidad que disminuye este coeficiente más como el medoide para este grupo;

  5. Si al menos un medoide ha cambiado, vaya a (3), de lo contrario finalice el algoritmo.

Como se mencionó anteriormente, el algoritmo PAM funciona con una matriz de disimilitud y para calcular esta matriz, el algoritmo puede utilizar dos métricas:

  1. Las distancias euclidianas, que son la raíz de la suma de cuadrados de las diferencias;

  2. Y la distancia de Manhattan que es la suma de distancias absolutas. Tenga en cuenta que, en la práctica, debería obtener resultados similares la mayor parte del tiempo, utilizando distancia euclidiana o de Manhattan. Si sus datos contienen valores atípicos, distancia de Manhattan debería dar resultados más sólidos, mientras que euclidiana se vería influenciada por inusuales valores.

Script del método

data("USArrests") # cargamos el set de datos
df <- scale(USArrests) # normalización de los datos
head(df, n = 3) # vemos las primeras 3 filas de los datos
library(cluster)
library(factoextra)

# La función R fviz_nbclust () [paquete factoextra] proporciona una solución conveniente para estimar el número optimo de conglomerados
fviz_nbclust(df, pam, method = "silhouette")+ #colocamos objeto y el metodo
theme_classic()
pam.res <- pam(df, 2)
print(pam.res)

# Apartir de la grafica obtenida obtendremos la cantidad sugerida de grupo
pam.res <- pam(df, 2) # en este caso la cantidad es 2
print(pam.res)

dd <- cbind(USArrests, cluster = pam.res$cluster) # agregar las     clasificaciones de punto a los datos originales
head(dd, n = 3)

# Medias de clúster: New Mexico, Nebraska
pam.res$medoids

# Número de clúster
head(pam.res$clustering)

#Visualización de Clúster de PAM
fviz_cluster(pam.res,
palette = c("#00AFBB", "#FC4E07"), # color de paleta
ellipse.type = "t", # elipse de concetración 
repel = TRUE, # evitar la superposición de etiquetas
ggtheme = theme_classic()
)

CLARA - Clustering Large Applications

Es una extensión a los métodos k-medoides para tratar datos que contienen una gran número de objetos (más de varios miles de observaciones) con el fin de reducir tiempo de cómputo y problema de almacenamiento de RAM.

CLARA considera una pequeña muestra de los datos con tamaño fijo (tamaño de muestra) y aplica el algoritmo PAM para generar un conjunto óptimo de medoides para la muestra. La calidad de los medoides resultantes. se mide por la disimilitud promedio entre cada objeto en todo el conjunto de datos y el medoide de su clúster, definido como la función de costo. Repite los procesos de muestreo y agrupamiento un número preestablecido de veces para minimizar el sesgo de muestreo. Los resultados finales de la agrupación corresponden a la conjunto de medoides con el mínimo costo.

Sintaxis de Clara-Clustering Large Applications

  1. Divida aleatoriamente los conjuntos de datos en varios subconjuntos con tamaño fijo (tamaño de muestra)

  2. Calcule el algoritmo PAM en cada subconjunto y elija el k correspondiente objetos representativos (medoides). Asignar cada observación de los datos completos ajustado al medoide más cercano.

  3. Calcule la media (o la suma) de las diferencias de las observaciones a su medoide más cercano. Esto se usa como una medida de la bondad de la agrupación.

  4. Conserve el subconjunto de datos para el que la media (o la suma) es mínima. Un más el análisis se lleva a cabo en la partición final.

Librerías utilizadas en R para el caso del análisis de clúster

  • Herramientas de cluster no jerárquicos en R

Cálculo del número óptimo de clusters en R

Paquete NbClust implementa 30 índices para evaluar la estructura de los clusters y ayudar a determinar el número de clusters óptimo.

Paquete factoextra proporciona la función fviz_nbclust()

Paquete stats posee la función kmeans(). El método de Elbow calcula como de buenos son los clusters generados de 1 hasta N y se queda con el que mejor relacción ofrezca.

Creación de clusters en R

Paquete stats posee la función kmeans() que proporciona particiones con respecto a la distancia Euclidea.

Paquete cluster posee la función pam() que proporciona particionas alrededor de los medioides y la función clara() es un contanedora de pam puede trabajar con distancias arbitrarias para conjunto de datos grandes.

Script del método

set.seed(1234)
# Generando 500 objetos, divididos dentro de 2 clusters.
df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))

# Especificar nombres de columnas y filas
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))

# Previsualización de la data
head(df, nrow = 6)

# La función fviz_nbclust () [paquete factoextra] proporciona una  solución
library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+ #especificar objeto y método
theme_classic()


# Calcular CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Imprimir componentes de clara.res
print(clara.res)

# Para agregar las clasificaciones de puntos a los datos originales
dd <- cbind(df, cluster = clara.res$cluster)
head(dd, n = 4)

# Medoids
clara.res$medoids # para acceder a los resultados devueltos por clara

# Clustering
head(clara.res$clustering, 10)

# Visualizando Clúster de Clara
fviz_cluster(clara.res,
palette = c("#00AFBB", "#FC4E07"), # color de paleta
ellipse.type = "t", # elipse de concentración
geom = "point", pointsize = 1,
ggtheme = theme_classic()
)

4. Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA, desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.

Ejemplo Capitulo 4 Agrupación de K-Means

# Especificacion del número de agrupaciones a ser generado.
library(ggplot2)
library(factoextra)
data("USArrests")
df <- scale(USArrests)
fviz_nbclust(df, kmeans, method = "wss") +
  geom_vline(xintercept = 4, linetype = 2)

El gráfico representa la varianza dentro de los grupos. Disminuye a medida que aumenta k. Esta curva indica que los grupos adicionales despues del cuarto su valor disminuye.

Cálculo de clústeres de k-medias

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"
library(kableExtra)
# Calcular la media de cada variable por conglomerados

aggregate(USArrests, by = list(cluster = km.res$cluster), mean) %>%
  kable(caption = "Media de cada variable por conglomerados",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "black",
           background = "purple")
Media de cada variable por conglomerados
cluster Murder Assault UrbanPop Rape
1 13.93750 243.62500 53.75000 21.41250
2 3.60000 78.53846 52.07692 12.17692
3 5.65625 138.87500 73.87500 18.78125
4 10.81538 257.38461 76.00000 33.19231
# clasificaciones de puntos a los datos originales
library(factoextra)
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd) %>% 
   kable(caption = "Clasificaciones de Puntuaciones",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "black",
           background = "purple")
Clasificaciones de Puntuaciones
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
# Número de conglomerado para cada una de las observaciones
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
# Tamaño de cluster
km.res$size
## [1]  8 13 16 13
# Medios de clúster
library(factoextra)
km.res$centers %>% 
   kable(caption = "Medios de cluster",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "black",
           background = "orange")
Medios de cluster
Murder Assault UrbanPop Rape
1.411890 0.874335 -0.814521 0.019271
-0.961541 -1.106601 -0.930107 -0.966763
-0.489438 -0.382600 0.575830 -0.261654
0.695070 1.039441 0.722637 1.276940
# Visualización de clústeres de k-medias

library(factoextra)
library(ggrepel)
fviz_cluster(
  km.res,
  data = df,
  palette = c("black", "orange", "purple", "lightblue"),
  ellipse.type = "euclid",
  # Elipse de concentración
  star.plot = TRUE,
  # Agregar segmentos de centroides a elementos
  repel = TRUE,
  # Evite el sobretrazado de etiquetas (lento)
  ggtheme = theme_minimal()
)

fuente: en base a los ejempos del capitulo 4 [@kassambara2017practical]

Ejemplo capitulo 5 K-medoides

library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+ # La idea es calcular el algoritmo PAM usando diferentes valores de grupos k.
theme_minimal()

El siguiente código R calcula el algoritmo PAM con k = 2

pam.res <- pam(df, 2)
print(pam.res)
## Medoids:
##            ID     Murder    Assault   UrbanPop       Rape
## New Mexico 31  0.8292944  1.3708088  0.3081225  1.1603196
## Nebraska   27 -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              1              1              2              1 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              1              2              2              1              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              2              2              1              2              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              2              2              1              2              1 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              2              1              2              1              1 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              1              2              2 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              1              1              1              2              2 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              2              2              2              2              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              1              2              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              2              2              2              2              2 
## Objective function:
##    build     swap 
## 1.441358 1.368969 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

Agregacion de las clasificaciones de puntos a los datos originales

library(factoextra)
dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd) %>%
kable(caption = "Clasificaciones de Puntos",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "black",
           background = "skyblue")
Clasificaciones de Puntos
Murder Assault UrbanPop Rape cluster
Alabama 13.2 236 58 21.2 1
Alaska 10.0 263 48 44.5 1
Arizona 8.1 294 80 31.0 1
Arkansas 8.8 190 50 19.5 2
California 9.0 276 91 40.6 1
Colorado 7.9 204 78 38.7 1

Accediendo a los resultados de la función pam()

# Medoides de clúster
pam.res$medoids %>%
kable(caption = "Medoides de clúster",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "black",
           background = "skyblue")
Medoides de clúster
Murder Assault UrbanPop Rape
New Mexico 0.829294 1.370809 0.308122 1.160320
Nebraska -0.800825 -0.825077 -0.244564 -0.505211
# Números de clúster
head(pam.res$clustering) 
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1
fviz_cluster(pam.res,
palette = c("purple","gold"), # Paleta de colores
ellipse.type = "t", # Elipse de concentracion
repel = TRUE, # Evitar el exceso de etiqueta (lento)
ggtheme = theme_light() 
)

fuente: en base a los ejempos del capitulo 5 [@kassambara2017practical]

Ejemplo Capitulo 6: CLARA - Agrupamiento grande Aplicaciones

# Reproduccion del resultado usando la función set.seed().
set.seed(1234)
# Genera 500 objetos, divididos en 2 grupos..
df_CLARA <- rbind(cbind(rnorm(200, 0, 8), rnorm(200, 0, 8)),
                  cbind(rnorm(300, 50, 8), rnorm(300, 50, 8)))
# Especificar nombres de columnas y filas
colnames(df_CLARA) <- c("x", "y")
rownames(df_CLARA) <- paste0("S", 1:nrow(df_CLARA))
# Vista previa de los datos
head(df_CLARA, nrow = 10) %>% 
kable(caption = "Datos Aleatorios",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "black",
           background = "limegreen")
Datos Aleatorios
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
library(cluster)
library(factoextra)
fviz_nbclust(df_CLARA, clara, method = "silhouette")+
theme_classic()

# Calcular CLARA 
clara.res <- clara(df_CLARA, 2, samples = 50, pamLike = TRUE)
# Imprimir componentes de clara.res
print(clara.res)
## Call:     clara(x = df_CLARA, k = 2, samples = 50, pamLike = TRUE) 
## Medoids:
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
## Objective function:   9.87862
## Clustering vector:    Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes:            200 300 
## Best sample:
##  [1] S37  S49  S54  S63  S68  S71  S76  S80  S82  S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"
# Agregacion de las clasificaciones de puntos a los datos originales
library(factoextra)
dd_CLARA <- cbind(df_CLARA, cluster = clara.res$cluster)
head(dd_CLARA, n = 4) %>% 
kable(caption = "Clasificaciones de Puntos",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "black",
           background = "limegreen")
Clasificaciones de Puntos
x y cluster
S1 -9.656526 3.881815 1
S2 2.219434 5.574150 1
S3 8.675529 1.484111 1
S4 -18.765582 5.605868 1
# Medoides
clara.res$medoids %>% 
kable(caption = "Medoides",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "black",
           background = "grey")
Medoides
x y
S121 -1.531137 1.145057
S455 48.357304 50.233499
# Agrupación
head(clara.res$clustering, 10)
##  S1  S2  S3  S4  S5  S6  S7  S8  S9 S10 
##   1   1   1   1   1   1   1   1   1   1

Visualización de clústeres CLARA

fviz_cluster(clara.res,
palette = c("gold", "turquoise"), # color palette
ellipse.type = "t", # Concentration ellipse
geom = "point", pointsize = 1,
ggtheme = theme_linedraw()
)

fuente: en base a los ejempos del capitulo 6 [@kassambara2017practical]

Ejercicio Capitulo 7: Agrupación aglomerativa.

7.1 Pasos para el agrupamiento jerárquico aglomerativo

7.1.1 Estructura y preparación de datos

#Cargar los datos
data("USArrests")
#Estandarizar los datos
df <- scale(USArrests)
#Mostrar las primeras 6 filas
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

7.1.2 medidas de similitud

# Calcular la matriz de disimilitud
# df = los datos estandarizados
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

7.1.3 Enlace

res.hc <- hclust(d = res.dist, method = "ward.D2")

7.1.4 Dendograma

#cex= tamaño de la etiqueta
library("factoextra")
fviz_dend(res.hc, cex = 0.5)

7.2 Verificar el arbol cluster

 # Calcular la distancia cofenética
res.coph <- cophenetic(res.hc)
#Correlación entre la 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

7.3 Cortar el dendrograma en diferentes grupos

# Cortar el arbol en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Numero de mienbros en cada grupo
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Obtener los nombres de los miembros del grupo 1.
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cortar en 4 grupos y colorear por grupos.

fviz_dend(res.hc, k = 4,
cex = 0.5, 
k_colors = c("#8B0000", "#006400", "#8B008B", "#E7B800"),
color_labels_by_k = TRUE, 
rect = TRUE 
)

fviz_cluster(list(data = df, cluster = grp),

palette = c("#8B0000", "#006400", "#8B008B", "#E7B800"),
ellipse.type = "convex", 
repel = TRUE, 
show.clust.cent = FALSE, ggtheme = theme_minimal())

7.4 Paquetes de Cluster R

library("cluster")
res.agnes <- agnes(x = USArrests,
stand = TRUE, 
metric = "euclidean", 
method = "ward" 
)

res.diana <- diana(x = USArrests, 
stand = TRUE, 
metric = "euclidean" 
)

fviz_dend(res.agnes, cex = 0.6, k = 4)

fuente: en base a los ejempos del capitulo 6 [@kassambara2017practical]

Ejercicio Capitulo 8: Comparacion de Dendrogramas.

8.1 Preparación de datos

df <- scale(USArrests)
# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]

8.2 Comparacion de dendrogramas

library(dendextend)
# Calcular matriz de distancia
res.dist <- dist(df, method = "euclidean")
# Calcular 2 agrupaciones jerárquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Crea dos dendrogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Crea una lista para contener dendrogramas
dend_list <- dendlist(dend1, dend2)

8.2.1 Comparación visual de dos dendrogramas

tanglegram(dend1, dend2)

tanglegram(dend1, dend2,
highlight_distinct_edges = FALSE, 
common_subtrees_color_lines = FALSE, 
common_subtrees_color_branches = TRUE, 
main = paste("entanglement =", round(entanglement(dend_list), 2))
)

8.2.2 Matriz de correlación entre una lista de dendogramas

# Matriz de correlación cofenética
cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Matriz de correlación de Baker
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000

La correlación entre dos árboles también se puede calcular de la siguiente manera:

# Coeficiente de correlación cofenética
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Matriz de correlación de Baker
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528

8.2. COMPARING DENDROGRAMS

# Crea múltiples dendrogramas encadenando
dend1 <- df %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- df %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- df %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- df %>% dist %>% hclust("centroid") %>% as.dendrogram
# Calcular la matriz de correlación
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)
# Imprimir matriz de correlación
round(cors, 2)
##          Complete Single Average Centroid
## Complete     1.00   0.46    0.45     0.30
## Single       0.46   1.00    0.23     0.17
## Average      0.45   0.23    1.00     0.31
## Centroid     0.30   0.17    0.31     1.00
# Visualizar la matriz de correlación usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")

Ejercicio Capitulo 9: Visualizando Dendrogramas

9.1 Cargar datos y visualizando dendrogramas

# Load data
data(USArrests)
# Compute distances and hierarchical clustering
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
#visualizando dendrogramas
library(factoextra)
fviz_dend(hc, cex = 0.5)

#Puede utilizar los argumentos main, sub, xlab, ylab para cambiar los títulos de las tramas de la siguiente manera:
fviz_dend(hc, cex = 0.5,
main = "Dendrogram - ward.D2",
xlab = "Objects", ylab = "Distance", sub = "")

# Para mostrar un dendograma horizontal
fviz_dend(hc, cex = 0.5, horiz = TRUE)

#colorear ramas por grupos y agregar un rectángulo alrededor de cada grupo.

fviz_dend(hc, k = 4, 
cex = 0.5, 
k_colors = c("#8B0000", "#006400", "#8B008B", "#00008B"),
color_labels_by_k = TRUE, 
rect = TRUE, 
rect_fill = TRUE)

#Para cambiar el tema de la trama
fviz_dend(hc, k = 4, 
cex = 0.5, 
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, 
ggtheme = theme_gray() # Cambiar tema
)

# cambiar los colores del grupo usando “jco”
fviz_dend(hc, cex = 0.5, k = 4, 
k_colors = "jco")

#dibujar un dendrograma horizontal con un rectángulo alrededor de los grupos
fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)

#Forma circular
fviz_dend(hc, cex = 0.5, k = 4,
k_colors = "jco", type = "circular")

#Forma Phylogenic-like tree 
require("igraph")
library(igraph)
fviz_dend(hc, k = 4, k_colors = "jco",
type = "phylogenic", repel = TRUE)

#Forma Phylogenic trees 
require("igraph")
fviz_dend(hc, k = 4, # Cut in four groups

k_colors = "lancet",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")

9.2 Caso de dendrograma con grandes conjuntos de datos

9.2.1 Ampliando el dendrograma

fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

9.2.2 Trazar un subárbol de dendrogramas

# Crea un gráfico de todo el dendrograma, y extrae los datos del dendrograma
dend_plot <- fviz_dend(hc, k = 4, 
cex = 0.5, 
k_colors = "jco"
)
dend_data <- attr(dend_plot, "dendrogram") 
#Cortar el dendrograma a la altura h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualiza la versión truncada que contiene
# dos ramas
fviz_dend(dend_cuts$upper)

# Trazar todo el dendrograma
print(dend_plot)

# Trazar subárbol 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")

# Trazar subárbol 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

#Trazar de forma circular
fviz_dend(dend_cuts$lower[[2]], type = "circular")

9.2.3 Guardar dendrograma en una página PDF grande

pdf("dendrogram.pdf", width=30, height=15) 
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "lancet" )
print(p)
dev.off()
## png 
##   2

9.3 Manipulación de dendrogramas usando dendextend

data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

library(dendextend)
dend <- USArrests[1:5,] %>% 
scale %>% 
dist %>% 
hclust(method = "ward.D2") %>% 
as.dendrogram 
plot(dend)

library(dendextend)
mycols <- c("#8B0000", "#006400", "#8B008B", "#00008B")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>% # 
set("branches_k_color", mycols, k = 4) %>% 
set("labels_colors", mycols, k = 4) %>% 
set("labels_cex", 0.5) 

fviz_dend(dend)

fuente: en base a los ejempos del capitulo 6 [@kassambara2017practical]

5. Presente un ejemplo de aplicación de Análisis de Cluster, con datos de un caso de los disponibles en

https://www.kaggle.com/datasets.

Ejemplo tomado de @tharakinfinity (noviembre, 2023) K-means Clustering in R, Mall Customer Segmentation Data, Market Basket Analysis.

Análisis de la cesta de mercado de datos de segmentación de clientes de centros comerciales

#Cargar librerias
library(tidyverse)
list.files(path = "../input")
## character(0)
#Cargar la Data

customer <- read.csv("D:/Universidad/3° año/Metodos/Tareainvestigacion/Mall_Customers.csv",
                    stringsAsFactors = T)
head(customer)
customer <- customer[,4:5]
plot(customer)

K-means es un algoritmo de agrupación popular que agrupa puntos de datos en grupos en función de su similitud.

#componentes de k-medias
kmeans(customer,3)
## K-means clustering with 3 clusters of sizes 39, 123, 38
## 
## Cluster means:
##   Annual.Income..k.. Spending.Score..1.100.
## 1           86.53846               82.12821
## 2           44.15447               49.82927
## 3           87.00000               18.63158
## 
## Clustering vector:
##   [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [112] 2 2 2 2 2 2 2 2 2 2 2 2 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1
## [149] 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3
## [186] 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1
## 
## Within cluster sum of squares by cluster:
## [1] 13444.05 78699.48 14204.84
##  (between_SS / total_SS =  60.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Método del codo Trazar la suma de cuadrados dentro del grupo (WCSS) para diferentes valores de K y buscar el punto “codo” donde la tasa de disminución de WCSS comienza a disminuir

set.seed(123)
wcss <- vector()

for(i in 1:10){
    x<-(sum(kmeans(customer,i)$withinss))
    wcss[i]=x
    print(x)
}
## [1] 269981.3
## [1] 186206.8
## [1] 106348.4
## [1] 73679.79
## [1] 66733.44
## [1] 37233.81
## [1] 33610.53
## [1] 29420.64
## [1] 28378.97
## [1] 25798.02
plot(x=1:10, y=wcss, type='o')

Se puede observar una caida abrubta hasta 6, luego la tasa de disminución se está desacelerando. k=6

# Se ejecuta el modelo con k=6
model <- kmeans(customer,6)
model
## K-means clustering with 6 clusters of sizes 22, 12, 15, 35, 39, 77
## 
## Cluster means:
##   Annual.Income..k.. Spending.Score..1.100.
## 1           25.72727              79.363636
## 2           24.58333               9.583333
## 3           31.53333              35.866667
## 4           88.20000              17.114286
## 5           86.53846              82.128205
## 6           56.05195              49.857143
## 
## Clustering vector:
##   [1] 3 1 2 1 3 1 2 1 2 1 2 1 2 1 2 1 3 1 3 1 3 1 2 1 2 1 3 1 3 1 2 1 2 1 2 1 2
##  [38] 1 3 1 3 1 3 6 3 1 6 3 3 3 6 6 6 6 6 3 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
##  [75] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
## [112] 6 6 6 6 6 6 6 6 6 6 6 6 5 4 5 6 5 4 5 4 5 6 5 4 5 4 5 4 5 4 5 6 5 4 5 4 5
## [149] 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4
## [186] 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5
## 
## Within cluster sum of squares by cluster:
## [1]  3519.4545   799.8333  1773.4667 12511.1429 13444.0513  8777.2208
##  (between_SS / total_SS =  84.9 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
# Visualización de los datos
library(cluster)

clusplot(customer,model$cluster,lines=0, shade=T,color=T)

fuente: en base al ejemplo de @tharakinfinity, K-means Clustering in R, Mall Customer Segmentation Data, Market Basket Analysis

Bibliografía

Everitt, Brian S, Sabine Landau, Morven Leese, and Daniel Stahl. 2011. “Cluster Analysis 5th Ed.” John Wiley. Galili, Tal. 2015. “Dendextend: An r Package for Visualizing, Adjusting, and Comparing Trees of Hierarchical Clustering.” Bioinformatics. https://doi.org/10.1093/bioinformatics/btv428.

Galili, Tal, and Gregory Jefferis. 2021. Dendextend: Extending Dendrogram Functionality in r. https://CRAN.R-project.org/package=dendextend.

Jain, Anil K. 2008. “Data Clustering: 50 Years Beyond k-Means.” In Joint European Conference on Machine Learning and Knowledge Discovery in Databases, 3–4. Springer.

Kassambara, Alboukadel. 2017. Practical Guide to Cluster Analysis in r: Unsupervised Machine Learning. Vol. 1. Sthda.

Kassambara, Alboukadel, and Fabian Mundt. 2020. Factoextra: Extract and Visualize the Results of Multivariate Data Analyses. http://www.sthda.com/english/rpkgs/factoextra.

Maechler, Martin, Peter Rousseeuw, Anja Struyf, and Mia Hubert. 2021. Cluster: “Finding Groups in Data”: Cluster Analysis Extended Rousseeuw Et Al. https://svn.r-project.org/R-packages/trunk/ cluster/.

R Core Team. 2021. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.

Zhu, Hao. 2021. kableExtra: Construct Complex Table with Kable and Pipe Syntax. https://CRAN.R-project.org/package=kableExtra.

Kassambara, A. (2017). Practical guide to cluster analysis in r: Unsupervised machine learning. STHDA.

@tharakinfinity (noviembre, 2023) K-means Clustering in R, Mall Customer Segmentation Data, Market Basket Analysis. https://www.kaggle.com/datasets/vjchoudhary7/customer-segmentation-tutorial-in-python