Tarea de Investigación (parte 2): Análisis de Clúster (Conglomerados)

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMIA

“Tarea de investigación (parte 2) :Análisis de Clúster (Conglomerados)”

Asignatura:

Métodos para el Analisis Económico.

Ciclo Académico:

II/2023.

Docente:

Carlos Ademir Peréz Alas.

Grupo Teórico:

GT_02

Integrantes:

Pablo José Flores Parra FP21011.

Brittany Nallely Hernández Villegas HV21002

Gracia María Lemus Mejía LM21017

Elmer Nahum Martínez Méndez MM21092

Ciudad Universitaria, 07 de enero de 2024

Indicaciones Generales.

Presente en un reporte de Rmardown todas las operaciones que se indican en la tarea, debe incluir el archivo rmd, la correspondiente versión html y el informe publicado en una cuenta de Rpubs (incluir el enlace en los comentarios de entrega de las tareas, y en un archivo txt dentro de la entrega), incluyendo los nombres y apellidos de cada uno de los integrantes del grupo.

Literal 1.

Explique en que consiste el análisis de conglomerados.

También conocido como análisis de cluster, es un método utilizado para agrupar variables o elementos buscando la máxima homogeneidad entre ellos, es decir agrupando los datos que tengan relación o semejanza entre sí, diferenciando cada grupo de otros ya formados, a pesar de ser una técnica para clasificar datos utilizada en estadísticas carece de características de mayor interés para el investigador, el análisis de conglomerados es una técnica explicativa, exploratoria mas no es explicativa, su resultado depende totalmente de las variables utilizadas y la manera en como sean ubicadas.

Los conglomerados son uniones, se puede definir como “juntar o reunir” para llevar a cabo esta acción son necesarios algoritmos los cuales son los encargados de agrupar según sus criterios, iniciando a formar conglomerados por variables y uniendolos según sus similitudes.

Literal 2.

Elabore un cuadro comparativo, que incluya los siguientes elementos:

analisis_de_cluster Tecnica_Disponible Ventajas desventajas
Jerárquico: crea una estructura de árbol o dendrograma que muestra cómo los objetos o datos se agrupan a diferentes niveles de similitud

•Aglomerativo:

Cada observación comienza como un clúster independiente y se fusionan sucesivamente los clústeres más similares hasta que queda un único clúster grande.Método de enlace (linkage) puede ser ward.D, ward.D2, single, complete, average, mcquitty, median o centroid.

Divisivo:

Inicia con un único clúster que contiene todas las observaciones y se dividen sucesivamente los clústeres más heterogéneos hasta que cada observación tiene su propio clúster. También conocido como DIANA (Divisive Analysis).

1.No se requiere especificar el número de clústeres de antemano: A diferencia de otros métodos de agrupación, el análisis jerárquico no requiere la especificación previa del número de clústeres, lo que lo hace más flexible.

2.Representación gráfica: La representación visual a través de dendrogramas facilita la interpretación de las relaciones entre las observaciones y la estructura de los clústeres.

3.Captura de estructuras anidadas: Puede identificar estructuras anidadas en los datos, lo que significa que puede encontrar clústeres dentro de clústeres.

1.Sensibilidad a ruido y outliers: Puede ser sensible a valores atípicos y ruido en los datos, lo que puede afectar la formación de clústeres.

2.No siempre escalable: Para conjuntos de datos grandes, el análisis jerárquico puede volverse computacionalmente costoso y poco práctico.

3.Fijación de clústeres tempranos: La elección de cortar el dendrograma para formar clústeres puede ser subjetiva y afectar los resultados finales.
No jerárquico: dividen el conjunto de datos en un número predeterminado de clústeres sin formar una estructura jerárquica

K-Means:

Asigna cada observación a uno de K clústeres predefinidos. Requiere especificar el número de clústeres (K) de antemano. Iterativamente asigna puntos a los clústeres más cercanos y recalcula los centroides hasta converger.

K-Medoids:

Similar a K-Means, pero utiliza observaciones reales como medoides en lugar de centroides, lo que lo hace más robusto ante valores atípicos.

Partitional Clustering:

Método general para dividir el conjunto de datos en un número predeterminado de clústeres. Incluye métodos como el algoritmo de Lloyd, que es utilizado en K-Means.

DBSCAN (Density-Based Spatial Clustering of Applications with Noise):

Identifica clústeres basados en la densidad de las observaciones en el espacio de características. Puede manejar clústeres de formas y tamaños irregulares y detectar puntos ruido.

1. Eficiencia computacional: Suelen ser más eficientes computacionalmente, especialmente para conjuntos de datos grandes.

2. Escalabilidad: Pueden manejar grandes conjuntos de datos sin sacrificar el rendimiento.

3. Adecuados para formas y tamaños irregulares: Métodos como DBSCAN son robustos con respecto a la forma y tamaño de los clústeres.

4. Menos sensibles a outliers: K-Medoids, al utilizar medoides, es menos sensible a valores atípicos en comparación con K-Means.

1.Sensibilidad a la inicialización: K-Means puede producir resultados diferentes dependiendo de la inicialización de los centroides.

2.Necesidad de especificar el número de clústeres: En métodos como K-Means, se requiere conocer o adivinar el número de clústeres de antemano.

3.Menos interpretables: En general, los resultados pueden ser menos interpretables que los dendrogramas jerárquicos.

4.Requieren conocimiento previo del número de clústeres: Algunos métodos, como K-Means, necesitan que el usuario especifique el número de clústeres de antemano, lo cual puede ser un desafío.

Literal 3.

Describa las técnicas disponibles para realizar el análisis de clúster. Tanto jerárquicas como no jerárquicas, presentadas en el cuadro anterior, incluya una explicación de la librería y sintaxis para implementarla en R.

Análisis Jerárquico en R: Aglomerativos y Desagregativos

Aglomerativos:

En el análisis jerárquico aglomerativo, se comienza considerando cada observación como un grupo individual y, paso a paso, se fusionan los grupos más similares hasta que todos los elementos pertenecen a un solo grupo. Existen varios métodos aglomerativos, entre ellos:

Vinculación Máxima o Completa:

Definición: La distancia entre dos clústeres es el valor máximo de todas las distancias por pares entre sus elementos. Propósito: Produce clústeres más compactos.

Sintaxis en R: hclust(dist(data))

Vinculación Mínima o Única:

Definición: La distancia entre dos clústeres es el valor mínimo de todas las distancias por pares entre sus elementos. Propósito: Tiende a generar clústeres más dispersos.

Sintaxis en R: hclust(dist(data), method = “single”)

Vinculación Promedio:

Definición: La distancia entre dos clústeres es la distancia promedio entre sus elementos.

Propósito: Encuentra grupos con distancias promedio entre sus puntos.

Sintaxis en R: hclust(dist(data), method = “average”)

Método de Varianza Mínima de Ward:

Definición: Minimiza la varianza total dentro del grupo en cada paso.

Propósito: Forma clústeres con varianza mínima. Sintaxis en R: hclust(dist(data), method = “ward.D2”)

Desagregativos:

En el análisis jerárquico desagregativo, se parte de un solo grupo que contiene todas las observaciones y, paso a paso, se dividen en grupos más pequeños. Todos los individuos forman un solo grupo inicialmente, y se dividen sucesivamente hasta que cada caso forma un grupo único.

Pasos para Aglomerativos en R:

1.Estructura y Preparación de la Data:

La data debe ser una matriz numérica, representando observaciones y variables.

Cargar y estandarizar la data con scale().

2.Medidas de Similitud:

Utilizar dist() para calcular la matriz de distancia o disimilitud entre objetos.

3.Uso de la Función Linkage:

La función hclust() crea el árbol jerárquico usando la matriz de distancia generada.

4.Dendrograma:

Visualizar el árbol jerárquico con un dendrograma usando plot() o fviz_dend().

Mapas de Calor:

Los mapas de calor proporcionan una visualización gráfica de la agrupación jerárquica. Se pueden dibujar en R con diferentes paquetes y funciones:

1.heatmap():

Función base de R para un mapa de calor simple. heatmap(x, scale = “row”, col = brewer.pal(n, “Reds”))

2.heatmap.2() (paquete gplots):

Mejora del heatmap base. heatmap.2(x, scale = “row”, trace = “none”, density.info = “density”)

3.pheatmap() (paquete pheatmap):

Crea mapas de calor atractivos y permite un mayor control. pheatmap(x, clustering_method = “complete”)

4.d3heatmap() (paquete d3heatmap):

Produce mapas de calor interactivos. d3heatmap(x, scale = “row”, colors = “Blues”, k_row = 3, k_col = 3)

5.Heatmap() (paquete ComplexHeatmap):

Ideal para mapas de calor complejos, especialmente para datos genómicos.

Heatmap(mat, cluster_rows = TRUE, cluster_columns = TRUE)

Análisis No Jerárquico en R: K-medias, PAM y CLARA

K-medias:

La agrupación k-medias es un algoritmo de aprendizaje automático sin supervisión ampliamente utilizado para particionar un conjunto de datos en un número predefinido de grupos (k). Su propósito es clasificar objetos en grupos de manera que los objetos dentro de un mismo grupo sean lo más similares posible, mientras que los de diferentes grupos sean lo menos similares posible. En este método, cada clúster está representado por su centro, que es la media de los puntos asignados al clúster.

Explicación de la Función K-medias:

La idea básica es minimizar la variación total intra-cluster, es decir, la variación total dentro de cada cluster. Se inicia eligiendo aleatoriamente k objetos como los centros iniciales de los clústeres. Luego, se asigna cada observación al centroide más cercano y se actualizan los valores medios de cada clúster. Este proceso se repite hasta que las asignaciones convergen.

Pasos para Implementar K-medias en R:

1.Preparar la Data:

Escalar los datos con scale() ya que k-medias es sensible a la escala.

2.Paquetes y Funciones de R Requeridos:

Usar la función kmeans() del paquete base de R. La librería “factorextra” para visualización estética con fviz_cluster().

3.Estimación del Número Óptimo de Clústeres:

Utilizar fviz_nbclust() para evaluar diferentes valores de k.

4.Computación de Agrupación K-medias:

Usar kmeans() con parámetros como la matriz numérica X, el número de clústeres centers, el número máximo de iteraciones, y el número de particiones iniciales aleatorias.

5.Acceder a los Resultados de la Función K-medias:

La función devuelve una lista con componentes como “cluster”, “centers”, “tot.withinss”, “withinss”, “totss”, y “betweenss”.

6.Visualización de Clústeres K-medias:

Utilizar fviz_cluster() para visualizar fácilmente los resultados.

PAM (Partitioning Around Medoids):

El algoritmo PAM es una variante robusta de k-medias que utiliza medoides (puntos más centrales de un clúster) en lugar de medios. Esto lo hace menos sensible a valores atípicos y ruido.

Pasos para Implementar PAM en R:

1.Preparar la Data:

Cargar y escalar los datos con scale().

2.Paquetes y Funciones de R Requeridos:

Usar pam() del paquete “cluster” para calcular PAM. Librería “factorextra” para visualización.

3.Estimación del Número Óptimo de Clústeres:

Utilizar fviz_nbclust().

4.Computación de Agrupación PAM:

Utilizar pam() con parámetros como la matriz numérica X, el número de clústeres k, y la distancia métrica.

5.Acceder a los Resultados de PAM:

La función devuelve un objeto con componentes como “medoids” y “clustering”.

6.Visualización de Clústeres PAM:

Utilizar fviz_cluster().

CLARA (Clustering Large Applications)

CLARA es una extensión de PAM que maneja grandes conjuntos de datos al realizar muestreo y aplicar PAM a las muestras.

Pasos para Implementar CLARA en R:

1.Preparar la Data:

Cargar y escalar los datos.

2.Paquetes y Funciones de R Requeridos:

Usar clara() del paquete “cluster” para calcular CLARA. Librería “factorextra” para visualización.

3.Estimación del Número Óptimo de Clústeres:

Utilizar fviz_nbclust().

4.Computación de Agrupación CLARA:

Utilizar clara() con parámetros como la matriz numérica X, el número de clústeres k, el tamaño de la muestra sampsize, y la distancia métrica.

5.Acceder a los Resultados de CLARA:

La función devuelve un objeto con componentes como “medoids”, “clustering”, y “sample”.

6.Visualización de Clústeres CLARA:

Utilizar fviz_cluster().

Literal 4.

Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA, disponible en: https://xsliulab.github.io/Workshop/week10/r-cluster-book.pdf, desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.

Ejercicio Cap.4.

Carga de datos.

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

Estimar el número óptimo de conglomerados.

library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)

Cálculo de K-medias clúster.

# Compute k-means with k = 4
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

Accediendo a los resultados de la función.

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

Visualización de clúster de k-medias

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()
)

Ejercicio Cap.5.

Carga de Datos.

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

Estimar el número óptimo de conglomerados.

library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()

Cálculo del 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"

Agregar las clasificaciones de puntos a los datos originales.

dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd, n = 3)
##         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

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

pam.res$medoids
##                Murder    Assault   UrbanPop       Rape
## New Mexico  0.8292944  1.3708088  0.3081225  1.1603196
## Nebraska   -0.8008247 -0.8250772 -0.2445636 -0.5052109
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

Visualización de clústeres PAM.

fviz_cluster(pam.res,

palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_classic()
)

Ejercicio Cap. 6.

Carga de Datos.

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 columnas y filas
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

Estimar el número óptimo de conglomerados.

library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()

Cálculo del algoritmo PAM con k = 2:

# Compute CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Print components of clara.res
print(clara.res)
## Call:     clara(x = df, 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"

Agregar las clasificaciones de puntos a los datos originales.

dd <- cbind(df, cluster = clara.res$cluster)
head(dd, n = 4)
##             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

Acceso a los resultados devueltos por clara().

clara.res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
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

Visualizando CLARA clusters.

fviz_cluster(clara.res,

palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
geom = "point", pointsize = 1,
ggtheme = theme_classic()
)

Ejercicio Cap. 7.

Carga 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

calcular la distancia matriz

# 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

Árbol jerárquico. hclust()

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

Visualizar el dendrograma.

# cex: label size
library("factoextra")
fviz_dend(res.hc, cex = 0.5)

Verificar el árbol del clúster.

# Compute cophentic distance
res.coph <- cophenetic(res.hc)
# Correlation between cophenetic distance and
# the original distance
cor(res.dist, res.coph)
## [1] 0.6975266
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

Cortar el dendrograma en diferentes grupos.

# Cut tree into 4 groups
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Number of members in each cluster
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Get the names for the members of cluster 1
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"

Resultado de los cortes.

# Cut in 4 groups and color by groups
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 labels by groups
rect = TRUE # Add rectangle around groups
)

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

palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_minimal())

El grupo de paquetes R facilita la realización de análisis de conglomerados en R.

library("cluster")
# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(x = USArrests, # data matrix
stand = TRUE, # Standardize the data
metric = "euclidean", # metric for distance matrix
method = "ward" # Linkage method
)

# DIvisive ANAlysis Clustering
res.diana <- diana(x = USArrests, # data matrix
stand = TRUE, # standardize the data
metric = "euclidean" # metric for distance matrix
)
fviz_dend(res.agnes,
          cex = 0.6,
          k = 4)

Ejercicio Cap. 8.

Carga de Datos.

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

Comparando 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)
# Crear una lista para contener dendrogramas
dend_list <- dendlist(dend1, dend2)

Dibuja un tanglegrama.

tanglegram(dend1, dend2)

Personalización del tanglegram.

tanglegram(dend1, dend2,
highlight_distinct_edges = FALSE, # Turn-off dashed lines
common_subtrees_color_lines = FALSE, # Turn-off line colors
common_subtrees_color_branches = TRUE, # Color common branches
main = paste("entanglement =", round(entanglement(dend_list), 2))
)

Matriz de correlación entre una lista de dendrogramas.

# 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
# Coeficiente de correlación cofenética
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Coeficiente de correlación de Baker
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528

COMPARACIÓN DE DENDROGRAMAS

# 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 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
# Visualice la matriz de correlación usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")

Ejercicio Cap 9.

Cálculo de la agrupación jerárquica.

# Cargar datos

data(USArrests)

# Calcular distancias y agrupaciones jerárquicas.

dd <- dist(scale(USArrests), 
           method = "euclidean")
hc <- hclust(dd, 
             method = "ward.D2")

Para crear dendrogramas básicos.

library(factoextra)
fviz_dend(hc, 
          cex = 0.5)

Puede utilizar los argumentos main, sub, xlab, ylab para cambiar los títulos.

fviz_dend(hc, 
          cex = 0.5,
          main = "Dendrogram - ward.D2",
          xlab = "Objects", 
          ylab = "Distance", 
          sub = "")

Para dibujar un dendograma horizontal.

fviz_dend(hc,
          cex = 0.5, 
          horiz = 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 los colores del grupo usando “jco”.

fviz_dend(hc, 
          cex = 0.5, 
          k = 4, 
          k_colors = "jco")

Para 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)

Para trazar un dendrograma circular usando la opción tipo = “circular”.

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

Para trazar un árbol de tipo filogénico.

require("igraph")
fviz_dend(hc, k = 4, 
          k_colors = "jco",
          type = "phylogenic", repel = TRUE)

require("igraph")
fviz_dend(hc, k = 4, 
          k_colors = "jco",
          type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")

Si desea ampliar los primeros grupos, es posible utilizar la opción xlim e ylim para limitar el área de la parcela.

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

Corta el dendrograma y visualiza la versión truncada:

# Crea un gráfico de todo el dendrograma,
# y extrae los datos del dendrograma
dend_plot <- fviz_dend(hc, k = 4, # Cortar en cuatro grupos
                       cex = 0.5, # Tamaño de la etiqueta
                       k_colors = "jco"
)

dend_data <- attr(dend_plot, "dendrogram") # Extraer datos de dendrograma

# 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 subárboles de dendrogramas.

# 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 árboles circulares

fviz_dend(dend_cuts$lower[[2]], type = "circular") 

Código R estándar para crear un dendrograma.

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

Código R para crear un dendrograma usando el operador de encadenamiento.

library(dendextend)
dend <- USArrests[1:5,] %>% # datos
  scale %>% # Escalar los datos
  dist %>% # calcular una matriz de distancias,
  hclust(method = "ward.D2") %>% # Agrupación jerárquica
  as.dendrogram # Convierte el objeto en un dendograma.
plot(dend)

Funciones para personalizar dendrogramas.

library(dendextend)
# 1.Crea un dendrograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>% # Ancho de línea de ramas
set("branches_k_color", mycols, k = 4) %>% # Ramas de colores por grupos.
set("labels_colors", mycols, k = 4) %>% # Etiquetas de colores por grupos
set("labels_cex", 0.5) # Cambiar tamaño de etiqueta
# 2. Crear trama
fviz_dend(dend)

Literal 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.

La base de datos fue tomada de la carpeta “Customer Clustering”, datos obtebidos de un centro comercial de supermercado, que a través de las tarjetas de membresía, tiene algunos datos básicos sobre sus clientes, como la identificación del cliente, la edad, el sexo, los ingresos anuales y el puntaje de gastos.

Carga de Datos.

library(readr)
datos <- read_csv("segmentation data.csv")

Normalizar los Datos.

datos_n <- scale(datos)
head(datos_n)
##             ID        Sex Marital status         Age   Education      Income
## [1,] -1.730752 -0.9171695      -0.992776  2.65295099  1.60392184  0.09749923
## [2,] -1.729021  1.0897659       1.006773 -1.18683527 -0.06335658  0.78245869
## [3,] -1.727289 -0.9171695      -0.992776  1.11703649 -0.06335658 -0.83299391
## [4,] -1.725557 -0.9171695      -0.992776  0.77572215 -0.06335658  1.32805410
## [5,] -1.723826 -0.9171695      -0.992776  1.45835082 -0.06335658  0.73674749
## [6,] -1.722094 -0.9171695      -0.992776 -0.07756368 -0.06335658  0.62698289
##      Occupation Settlement size
## [1,]  0.2967488       1.5519379
## [2,]  0.2967488       1.5519379
## [3,] -1.2692080      -0.9095021
## [4,]  0.2967488       0.3212179
## [5,]  0.2967488       0.3212179
## [6,] -1.2692080      -0.9095021

Calcular la Matriz de Distancias.

library(cluster)
library(tidyverse)
library(factoextra)
m_distancia <- get_dist(datos_n, method = "euclidean")
fviz_dist(m_distancia, gradient = list(low = "blue", mid = "white", high = "red"))

En la grafica se muesta con mayor claridad la distancia que toma cada variable segun sus similitudes, el color azul con intervalo de 0.0 a 2.5 nos indica una distancia corta, el color blanco de 2.5 a 5.0 nos indican una distancia media y el rojo no indica mayor distancia en un intervalo de 5.0 a 10.0

Estimar el numero de cluster.

library(NbClust)
library(cluster)
fviz_nbclust(datos_n, kmeans, method = "wss") #metodo 1

fviz_nbclust(datos_n, kmeans, method = "silhouette") #metodo 2

fviz_nbclust(datos_n, kmeans, method = "gap_stat") #metodo 3

Segun los resultados en las graficas el metodo 3 nos muestra el numero de cluster que se deben hacer de forma mas clara que ek metodo 2 y 1, por consiguiente el numero de cluster sera de 4

Creacion de cluster.

library(cluster)
cluster <- kmeans(datos_n, centers = 4, nstart = 25)
cluster
## K-means clustering with 4 clusters of sizes 270, 632, 679, 419
## 
## Cluster means:
##           ID         Sex Marital status         Age   Education     Income
## 1 -0.2365262  0.05656584      0.3698795  1.69853498  1.81387542  0.9280208
## 2 -0.5933860 -0.85683438     -0.6352618 -0.02355825 -0.50128098  0.4983146
## 3  0.2163311  0.84148524      1.0038280 -0.58928385  0.04959601 -0.4029745
## 4  0.6968812 -0.10768956     -0.9068766 -0.10403794 -0.49310854 -0.6966128
##   Occupation Settlement size
## 1  0.4475446       0.4214988
## 2  0.6882380       0.7983166
## 3 -0.2821248      -0.3947385
## 4 -0.8693097      -0.8360701
## 
## Clustering vector:
##    [1] 1 3 4 2 2 2 2 2 1 2 3 3 3 1 3 3 2 2 1 2 2 2 4 2 2 4 3 1 2 1 2 2 2 1 2 4 2
##   [38] 2 2 2 2 3 4 2 1 2 2 3 4 3 4 2 2 2 1 4 2 3 3 3 2 2 1 2 3 2 3 3 2 3 3 4 2 3
##   [75] 2 1 2 2 2 2 1 2 3 1 4 3 3 2 2 2 2 2 3 2 2 1 1 2 2 2 3 2 3 2 2 2 2 2 3 2 2
##  [112] 3 2 3 2 2 3 3 3 2 3 1 4 1 3 2 3 2 2 3 2 2 4 2 3 3 2 1 2 3 3 2 2 2 3 2 3 1
##  [149] 2 2 2 2 2 2 2 3 2 3 2 4 2 3 2 1 2 2 3 3 3 2 2 3 2 2 2 1 1 2 2 1 2 2 4 2 2
##  [186] 2 1 1 3 3 2 4 2 2 2 2 3 3 2 2 2 3 2 3 4 2 2 2 3 2 2 3 2 1 2 3 2 2 3 1 3 3
##  [223] 2 2 2 2 2 2 2 2 2 4 2 3 4 2 2 1 3 2 3 2 2 3 3 2 2 2 2 3 3 3 3 2 2 4 4 2 3
##  [260] 1 2 1 2 1 4 2 2 3 1 2 2 3 2 2 3 2 3 1 3 2 2 2 4 1 2 3 2 2 1 1 3 2 1 2 1 2
##  [297] 3 4 2 2 3 1 4 2 2 2 3 3 3 3 4 2 3 3 4 2 4 1 2 3 2 3 2 2 3 4 2 3 2 2 1 3 2
##  [334] 3 2 1 3 3 2 3 3 3 2 2 4 3 2 3 4 2 3 3 2 2 2 4 2 2 3 3 1 2 3 2 4 2 2 3 2 1
##  [371] 2 2 3 1 1 3 3 2 1 3 2 1 3 2 4 3 3 2 2 3 2 3 2 3 2 2 1 1 1 3 2 2 2 4 2 3 2
##  [408] 2 2 2 3 2 2 4 3 2 4 3 2 3 3 2 4 2 3 2 2 2 2 3 1 2 2 3 2 3 3 3 1 3 2 3 2 4
##  [445] 2 3 3 2 1 1 2 3 2 2 2 2 2 2 3 2 2 2 3 2 2 1 3 2 3 4 3 3 4 2 3 3 2 2 4 2 3
##  [482] 2 1 3 2 2 2 1 4 2 2 1 3 2 4 2 2 2 3 3 3 2 1 2 3 4 2 2 2 2 2 2 2 3 2 3 4 3
##  [519] 2 2 2 3 2 3 3 2 3 4 2 4 2 3 3 2 2 2 1 3 2 3 3 1 2 4 1 2 3 2 3 2 3 4 2 2 1
##  [556] 4 3 3 2 4 2 4 3 2 2 3 3 2 2 3 3 2 3 3 4 3 3 3 2 3 2 4 3 4 1 3 2 4 3 1 1 1
##  [593] 3 3 2 3 3 4 2 2 1 3 3 2 3 2 1 1 2 2 3 3 3 3 3 2 2 2 3 1 2 2 2 3 1 2 2 2 2
##  [630] 1 3 2 2 3 3 2 3 2 3 2 3 4 2 2 2 2 2 3 2 4 2 4 2 2 2 2 4 2 3 2 3 3 2 2 3 2
##  [667] 2 3 2 2 4 2 2 2 4 3 2 3 1 3 1 2 2 1 4 2 2 2 2 2 2 3 2 4 2 2 4 3 2 2 3 2 1
##  [704] 2 3 3 2 3 3 4 2 3 2 4 2 1 2 2 2 2 2 3 3 1 3 3 1 3 1 2 2 4 3 3 3 3 2 4 2 3
##  [741] 2 4 2 2 2 4 3 3 2 2 1 3 3 3 2 3 1 2 4 2 1 3 4 2 2 3 3 3 2 1 3 2 2 2 1 3 2
##  [778] 3 2 1 2 1 4 3 1 4 2 2 2 2 1 2 3 1 2 3 2 3 1 4 2 3 3 4 3 2 3 1 2 3 2 3 2 2
##  [815] 2 1 1 3 1 2 3 2 4 4 2 3 3 2 2 2 2 3 2 1 3 2 3 3 1 1 2 4 3 4 2 2 1 3 1 4 2
##  [852] 2 4 4 2 2 1 4 3 2 2 3 3 4 4 3 3 2 2 3 1 2 2 3 2 1 2 2 2 2 2 1 2 1 1 1 2 2
##  [889] 2 2 2 2 4 2 2 2 3 3 3 2 2 1 2 2 2 2 4 3 3 3 3 3 3 2 4 1 4 1 2 2 3 2 3 2 1
##  [926] 2 3 2 1 4 4 3 2 2 3 2 3 2 2 2 2 4 2 4 1 3 2 2 3 2 4 2 3 2 3 1 4 4 4 2 3 1
##  [963] 2 2 3 3 4 1 2 4 2 4 3 2 3 1 1 2 4 2 2 2 2 2 4 3 2 1 2 4 4 4 3 2 2 3 2 2 4
## [1000] 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [1037] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [1074] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 2 3 2
## [1111] 1 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 4 2 2 2 2 2 2 1 2 2 2 1 1 2 2 2
## [1148] 1 3 2 2 2 2 2 1 2 2 2 2 2 3 2 2 2 3 2 2 2 1 2 2 2 4 1 2 2 2 2 2 4 4 2 2 3
## [1185] 2 1 2 4 2 4 2 2 2 4 2 4 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 3 2 2 2 2 2 2 2 2
## [1222] 2 2 2 2 3 2 2 2 2 3 2 2 2 2 2 2 1 2 1 2 2 3 2 2 2 4 4 2 2 2 2 2 3 2 2 2 4
## [1259] 3 2 2 3 2 2 1 2 2 2 3 2 2 2 2 2 2 2 1 1 2 2 4 2 2 2 3 1 2 3 2 2 2 2 2 2 4
## [1296] 2 2 1 2 2 4 1 3 4 1 3 3 3 3 3 3 3 4 3 3 3 1 3 3 4 3 4 3 3 3 3 3 3 4 4 1 1
## [1333] 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 4 4 3 3 1 3 3 4 3 3 1 3 3 3 3 4 3 2 3 4
## [1370] 4 3 3 3 3 3 3 3 4 3 4 3 4 3 3 3 4 3 4 3 3 3 1 3 1 3 3 4 1 3 3 3 3 4 3 3 3
## [1407] 4 3 3 4 1 4 3 1 3 4 3 4 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 4 3 4 3 4 3 3 3 3 3
## [1444] 3 3 4 3 4 4 4 3 4 3 3 3 3 1 3 3 4 3 3 3 3 3 3 3 1 4 1 3 1 3 4 3 3 3 1 3 4
## [1481] 4 3 4 1 3 3 4 3 3 3 4 4 3 3 4 1 3 3 4 3 4 3 4 3 3 3 3 4 4 1 1 4 3 3 3 4 4
## [1518] 3 3 3 3 3 3 3 3 3 4 3 4 4 3 3 1 3 3 4 3 3 1 3 3 3 3 4 3 2 3 4 4 3 3 3 3 3
## [1555] 3 3 4 3 4 3 4 3 3 3 4 3 4 3 3 3 1 3 1 3 3 4 1 3 3 3 3 4 3 3 3 4 3 3 4 1 4
## [1592] 3 1 3 4 3 4 3 3 3 3 4 4 3 3 3 4 4 4 3 3 4 3 4 4 4 3 3 4 3 4 4 3 4 4 4 3 4
## [1629] 4 4 4 3 3 3 4 3 4 4 4 4 3 4 4 4 4 3 4 4 3 3 3 4 4 4 3 4 4 3 3 3 4 3 4 4 4
## [1666] 3 3 3 3 3 3 3 4 4 3 4 4 3 3 4 4 3 4 3 4 4 4 4 3 3 3 4 4 3 4 4 3 4 3 3 4 4
## [1703] 4 3 4 4 4 3 3 3 4 3 3 4 4 3 3 4 4 3 3 3 4 4 4 4 4 4 3 4 3 3 3 4 4 3 4 3 3
## [1740] 3 4 4 4 4 4 3 4 3 4 4 3 3 4 4 3 3 4 4 4 3 4 4 4 3 4 4 4 4 4 3 3 4 4 3 4 4
## [1777] 3 4 3 4 3 3 3 4 4 4 3 4 3 4 4 4 4 3 3 3 3 4 3 4 4 4 3 3 4 4 4 4 3 4 3 4 4
## [1814] 4 4 4 4 3 4 3 4 3 3 3 3 3 4 3 3 4 3 4 3 3 3 3 4 3 4 4 3 4 3 3 4 3 4 3 3 3
## [1851] 3 3 4 4 3 3 4 4 4 4 3 3 4 3 4 4 4 3 3 4 4 4 4 3 4 4 4 4 4 4 4 4 3 3 3 4 3
## [1888] 4 4 4 3 3 4 4 4 4 3 4 4 3 3 3 4 4 4 3 4 4 3 3 3 4 3 4 4 4 3 3 3 3 3 3 3 4
## [1925] 4 3 4 4 3 3 4 4 3 4 3 4 4 4 4 3 3 4 4 4 3 4 4 3 4 3 3 4 4 4 3 4 4 4 3 4 3
## [1962] 4 3 3 4 4 3 3 4 4 3 3 3 4 4 4 4 4 4 3 4 3 3 3 4 4 3 4 3 3 3 4 4 4 4 4 3 4
## [1999] 3 4
## 
## Within cluster sum of squares by cluster:
## [1] 1897.446 2655.509 2526.781 1721.116
##  (between_SS / total_SS =  45.0 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
str(cluster)
## List of 9
##  $ cluster     : int [1:2000] 1 3 4 2 2 2 2 2 1 2 ...
##  $ centers     : num [1:4, 1:8] -0.2365 -0.5934 0.2163 0.6969 0.0566 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:4] "1" "2" "3" "4"
##   .. ..$ : chr [1:8] "ID" "Sex" "Marital status" "Age" ...
##  $ totss       : num 15992
##  $ withinss    : num [1:4] 1897 2656 2527 1721
##  $ tot.withinss: num 8801
##  $ betweenss   : num 7191
##  $ size        : int [1:4] 270 632 679 419
##  $ iter        : int 3
##  $ ifault      : int 0
##  - attr(*, "class")= chr "kmeans"

Comparacion grafica de los cluster.

library(cluster)
fviz_cluster(cluster, data = datos_n)

Observando los datos de los 4 cluster podemos identificar una variable que puede ser de utilidad para la comercial, “income” muestra la renta o ingresos anueles de los clientes, de los cuales los que tienen una renta alta esta en el cluster 1 y como se observa en le grafica es el cluster mas grande por lo que podemos deducir que son los clientes que tiene mas facilidad de comprar, estos datos podrian ocuparse para realizar estrategias de atencion al cliente, mercadeo, pubicidda, descuentos entre otros que sigan llamando la atencion no solo del cluster 1, si no tambien la de los demas cluster siendo el 4 el mas pequeño.

Bibliografía.

IBM documentation. (s. f.). https://www.ibm.com/docs/es/spss-statistics/28.0.0?topic=features-hierarchical-cluster-analysis

Ia, R. (2023, 9 junio). Agrupamiento jerárquico: enfoques aglomerativos y divisivos - PromptEngineer. Promptengineer. https://promptengineer.es/agrupamiento-jerarquico-enfoques-aglomerativos-y-divisivos/

Rodriguez, Y. (2018, 24 octubre). Análisis Cluster No jerárquico K-Means en R. Diego Calvo. https://www.diegocalvo.es/analisis-cluster-no-jerarquico-k-means-en-r/

EcuRed. (s. f.). Clúster no Jerárquico - ECUReD. https://www.ecured.cu/Cl%C3%BAster_no_jer%C3%A1rquico

Google Drive: Sign-in. (s. f.). https://drive.google.com/drive/u/0/shared-with-me

Pablo Vallejo Medina. (2020, 4 junio). [K means] Análisis de clúster en R y RStudio. [Chupitos de R] [Vídeo]. YouTube. https://www.youtube.com/watch?v=7AFuL-1Q8eg

Fernandez (2011). Analisis Conglomerados. Universidad Autonoma de Madrid