UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

MÉTODOS PARA EL ANÁLISIS ECONÓMICO


LABORATORIO 1. SEGUNDA PARTE


DOCENTE:

MSF. CARLOS ADEMIR PÉREZ ALAS.

INTEGRANTES:

ARITA POLANCO, BRIAN GUADALUPE.      AP18007.

MEJÍA HERRERA, NORMAN JAVIER.       MH18013.

RAMÍREZ URQUIZA, ALEJANDRA EUNICE.      RU18002.

GRUPO:

3

CIUDAD UNIVERSITARIA, LUNES 22 DE NOVIEMBRE DE 2021.

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

ANÁLISIS DE CLUSTER (CONGLOMERADOS)

El Análisis Cluster, también conocido como Análisis de Conglomerados, es una técnica estadística multivariante que busca agrupar elementos (o variables) y que trata de lograr la máxima homogeneidad en cada grupo y la mayor diferencia entre grupos.

El Análisis Cluster tiene una gran importancia en aplicación en muchas áreas de investigación. Pero, con los beneficios del Análisis Cluster existen algunas desventajas. El Análisis de Cluster es una técnica descriptiva, ateórica y no inferencial. Este Análisis no tiene bases estadísticas para deducir inferencias estadísticas sobre una población a partir de una muestra, es un método que se basa en criterios geométricos y es utilizado fundamentalmente como una técnica exploratoria, descriptiva pero no explicativa.

Finalmente, el análisis cluster depende en su totalidad, de las variables que se utilizan, de la adición o destrucción de variables relevantes que pueden tener un impacto significativo sobre la solución resultante. (De la Fuente Fernández 2011)

Existen dos grandes tipos de análisis de clusters: Jerárquicos y No Jerárquicos.

MÉTODOS JERÁRQUICOS

Se basan en el cálculo de una matriz de distancias y se aplican con n<200, ya que los cálculos y resultados se complican al aumentar el tamaño de la muestra. Estos métodos se caracterizan por no permitir una reasignación en los grupos, es decir, que dos clusters o individuos unidos durante el proceso, no pueden separarse en etapas decisivas.

Se pueden aplicar a variables o a observaciones:

  • Si se agrupan variables se necesitan de tres o más variables numéricas.
  • Si se agrupan observaciones se necesita al menos una variable numérica.

Dada la matriz, los algoritmos son de dos tipos:

1. De aglomeración: También se denominan ascendentes. Parten de objetos singulares (cada objeto es un conglomerado) para ir construyendo conglomerados cada vez más complejos, hasta concluir en uno sólo. Requieren menor tiempo y son los más utilizados. Estos son:

Aglomerativos

  • Simple Linkage (Vecino más próximo).
  • Complete Linkage (Vecino más lejano).
  • Promedio entre Grupos.
  • Método del Centroide.
  • Método de la Mediana.
  • Método de Ward.

2. De división: Parten del conjunto de datos y se van dividiendo hasta crear uno solo, los elementos que se incluyen en un grupo no se pueden reasignar. Estos son:

Disociativo

  • Linkage Simple.
  • Linkage Comple.
  • Promedio entre Grupos.
  • Método del Centroide.
  • Método de la Mediana.
  • Método de Ward.
  • Análisis de Asociación.

Estos métodos permiten construir un árbol de clasificación o dendograma.

Un dendograma es una representación gráfica con forma de árbol que sirve para resumir el proceso de agrupación del análisis de clusters.Los objetos similares están conectados por enlaces y su posición, en el diagrama, está determinada por el nivel de similitud o disimilitud de los objetos. (De la Fuente Fernández 2011)

MÉTODOS NO JERÁRQUICOS

También conocidos como métodos de “optimización.” Estos métodos si permiten una reasignación en los grupos, aunque se vuelve necesario fijar de antemano el número de clusters deseado.

Se utilizan cuando:

  • Los métodos de reasignación permiten reasignar objetos a distintos conglomerados en cada fase.
  • Los métodos de búsqueda de densidad se agrupan mediante la búsqueda de altas densidades (modas).
  • Los métodos directos permiten clasificar de forma simultánea individuos y variables.

Estos métodos son:

1. Reasignación: Permite que un individuo ya asignado a un grupo en una determinada etapa del proceso sea reasignado a otro grupo en una etapa anterior, si con esto optimiza el criterio de selección. Este proceso termina cuando no existan individuos cuya reasignación permita optimizar el resultado que se ha obtenido. En esta categoría se encuentran los métodos de:

  • Centroides:
    • K-medias.
    • Quick-Cluster.
    • Método de Forgy.
  • Nubes dinámicas.

2. Búsqueda de densidad: Los métodos que se encuentran en esta categoría, tienen su base en la suposición de que los puntos pertenecientes a cada cluster se extraen de una distribución de probabilidad particular. Los métodos de densidad proporcionan una aproximación tipológica y una aproximación probabilística.

Aproximación tipológica: En los métodos de aproximación tipológica, los grupos que se van formando buscan zonas en las que se da una mayor concentración de individuos. Entre ellos están:

  • Análisis Modal.
  • Métodos Taxap.
  • Método de Fortin.

Aproximación probabilística: Los métodos de aproximación probabilística, parten del postulado que las variables prosiguen una ley de probabilidad, por la cual, los parámetros varían de un grupo a otro. Trata de encontrar individuos pertenecientes a una misma distribución, introduciendo el cluster en la inferencia estadística. El por qué de los clusters es explicado por la existencia de poblaciones distintas y cómo descubrirlas. El método que destaca es:

  • Método de Wolf.

4. Métodos directos: Clasifica a la misma vez a los individuos y a las variables. El algoritmo mejor conocido es:

  • Block-Clustering.

5. Métodos reductivos: Radican en la búsqueda de factores en el espacio de los individuos, correspondiendo a un grupo. Este es:

  • Análisis Factorial tipo Q.

Es importante establecer algunas diferencias básicas entre los métodos:

Métodos Jerárquicos:

  • Comienza con las observaciones y no precisa determinar a priori el número de conglomerados.

  • La asignación de objetos es definitiva.

  • Operan con una matriz de similaridades.

Métodos No Jerárquicos:

  • Comienza con una partición inicial de conglomerados. A priori se determina el número y composición de los conglomerados.

  • El procedimiento es iterativo y permite la reasignación de objetos.

  • Operan con la matriz de datos originales.

En Resumen, los usos que se le pueden dar al análisis cluster se puede representar en los siguientes cuatro puntos:

  1. Desarrollar una tipología o clasificación.
  2. Investigar esquemas conceptuales útiles para agrupar entidades.
  3. Generar hipótesis a través de la exploración de los datos.
  4. Intentar determinar si tipos definidos por otros procedimientos están de hecho presentes en un conjunto de datos. (Dı́az Covián et al. 2014)

2. Elabore un cuadro comparativo:

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.1.2
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.5     v dplyr   1.0.7
## v tidyr   1.1.4     v stringr 1.4.0
## v readr   2.0.2     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(dplyr)
library(knitr)
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
timeline_tab <- tibble(
`Análisis de Clúster` = c(
    "Jerárquico:  
En este análisis se busca agrupar clúster para formar uno nuevo o separar alguno que existía para dar origen a otros dos maximizando la similaridad o se minimice la distancia.
"
  ),
`Técnicas Disponibles` = c(
    "Aglomerativos

• Simple Linkage (Vecino más próximo).
• Complete Linkage (Vecino más lejano).
• Promedio entre Grupos.
• Método del Centroide.
• Método de la Mediana.
• Método de Ward.

Disociativos

• Linkage Simple.
• Linkage Comple.
• Promedio entre Grupos.
• Método del Centroide.
• Método de la Mediana.
• Método de Ward.
• Análisis de Asociación.
"
  ),
`Ventajas` = c(
  "• No requiere hacer inferencias sobre el número de cluster. 

• Permite representar las sucesivas agrupaciones en forma de árbol (dendograma).

• Proporcionan  una  fotografía  de  cómo  están  organizados  los  datos. El  investigador puede  ver  cuántos  conglomerados  “existen”  en  los  datos.

• Pueden  calcularse  los  centros de  esos  conglomerados:  centroides  (medias).

• Vecino  Más  Próximo  es especialmente  bueno  para  localizar  outliers. 
"
),
`Desventajas` = c(
  "• Si la estructura de la muestra es desconocida resulta difícil escoger el algoritmo.

• Es difícil operar e interpretar los gráficos con más de 200 datos.

• Mayor cantidad de atípicos en esta partición.

• Una mala partición no puede modificarse.
"
)) %>%
  add_row(
    `Análisis de Clúster` = c(
      "No Jerárquico:

Es aquel análisis que asigna casos o grupos diferenciados y los configura de manera que unos dependan de otros. A su vez, produce clusters disjuntos (cada caso es un grupo), o bien clusters solapados (un caso puede pertenecer a más de un grupo).
"
    ),
    `Técnicas Disponibles` = c(
    "Reasignación

• K-Medias.
• Nubes Dinámicas.

Búsqueda de densidad

• Análisis Modal.
• Métodos Taxap.
• Método de Fortin.
• Método de Wolf.

Métodos directos

• Block Clustering.

Métodos reductivos

• Análisis Factorial tipo Q.
"),
`Ventajas` = c(
  "• Rapidez. 

• Permite el procesamiento de gran número de datos.

• K medias  es  el  método  más  robusto  respecto  a  presencia  de  outliers  y errores  en las  medidas  de  distancia.
"
),
`Desventajas` = c(
  "• Dificultad en conocer a priori el número real de los conglomerados existentes en la muestra.

• Formar todas las particiones posibles para escoger la óptima es muy complejo.

• Mayor complejidad en los análisis.

• Una mala decisión inicial sobre el nº y composición de los grupos ocasiona una errónea clasificación.
"
) )

timeline_tab %>%
  kable(caption = "Tabla 1: Resumen del Análisis Clúster") %>% 
  kable_styling("hover") %>% 
  row_spec(0, bold = T, align = "c") %>%
  column_spec(c(1), width = "7cm", border_right = T, border_left = T) %>%
  column_spec(c(2), width = "6cm", border_right = T) %>%
  column_spec(c(3), width = "9cm", border_right = T) %>%
  column_spec(c(4), width = "8cm", border_right = T) %>%
  kable_classic(html_font = "Times New Roman",
                font_size = 14) %>% 
  footnote(general = "Elaboración propia con base en:",
           number = c("[@de2011analisis]"), general_title = "Fuente: Elaboración propia con base en Análisis conglomerados. De la Fuente Fernández, S. (2011).")
Tabla 1: Resumen del Análisis Clúster
Análisis de Clúster Técnicas Disponibles Ventajas Desventajas
Jerárquico:
En este análisis se busca agrupar clúster para formar uno nuevo o separar alguno que existía para dar origen a otros dos maximizando la similaridad o se minimice la distancia.

Aglomerativos

• Simple Linkage (Vecino más próximo). • Complete Linkage (Vecino más lejano). • Promedio entre Grupos. • Método del Centroide. • Método de la Mediana. • Método de Ward.

Disociativos

• Linkage Simple. • Linkage Comple. • Promedio entre Grupos. • Método del Centroide. • Método de la Mediana. • Método de Ward. • Análisis de Asociación.

• No requiere hacer inferencias sobre el número de cluster.

• Permite representar las sucesivas agrupaciones en forma de árbol (dendograma).

• Proporcionan una fotografía de cómo están organizados los datos. El investigador puede ver cuántos conglomerados “existen” en los datos.

• Pueden calcularse los centros de esos conglomerados: centroides (medias).

• Vecino Más Próximo es especialmente bueno para localizar outliers.

• Si la estructura de la muestra es desconocida resulta difícil escoger el algoritmo.

• Es difícil operar e interpretar los gráficos con más de 200 datos.

• Mayor cantidad de atípicos en esta partición.

• Una mala partición no puede modificarse.

No Jerárquico:

Es aquel análisis que asigna casos o grupos diferenciados y los configura de manera que unos dependan de otros. A su vez, produce clusters disjuntos (cada caso es un grupo), o bien clusters solapados (un caso puede pertenecer a más de un grupo).

Reasignación

• K-Medias. • Nubes Dinámicas.

Búsqueda de densidad

• Análisis Modal. • Métodos Taxap. • Método de Fortin. • Método de Wolf.

Métodos directos

• Block Clustering.

Métodos reductivos

• Análisis Factorial tipo Q.

• Rapidez.

• Permite el procesamiento de gran número de datos.

• K medias es el método más robusto respecto a presencia de outliers y errores en las medidas de distancia.

• Dificultad en conocer a priori el número real de los conglomerados existentes en la muestra.

• Formar todas las particiones posibles para escoger la óptima es muy complejo.

• Mayor complejidad en los análisis.

• Una mala decisión inicial sobre el nº y composición de los grupos ocasiona una errónea clasificación.
Fuente: Elaboración propia con base en Análisis conglomerados. De la Fuente Fernández, S. (2011).
Elaboración propia con base en:
1 (De la Fuente Fernández 2011)

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.

3.1 Descripción de las técnicas

Existen varios métodos de unión de algoritmos de clasificación jerárquica. Suelen distinguir entre métodos aglomerativos y métodos disociativos.

Simple Linkage (Vecino más próximo)

Considera que la distancia entre dos clúster es la distancia más corta desde un miembro de un clúster a otro miembro de otro clúster. Si los datos se basan en similitudes entre dos clúster, se considera la mayor similaridad desde cualquier miembro de un clúster a otro miembro de otro clúster. Por tanto, el proceso de unión de estos dos clusters sería para minimizar las distancias o maximizar las similaridades.

Complete Linkage (Vecino más lejano)

Considera la distancia más grande desde cualquier miembro de un clúster a otro miembro de otro clúster. Si la medida es la distancia, se recoge la distancia máxima de los individuos del grupo al nuevo individuo. Si la medida es la similaridad entre el grupo formado y el nuevo individuo, se toma la mínima de los individuos del grupo al nuevo individuo. Por tanto, el proceso de unión de los dos clusters sería para minimizar las distancias o para maximizar las similaridades. (Santos Mangudo et al. 2015)

Promedio entre Grupos

Mide la proximidad de dos grupos, calculando la media de las distancias entre objetos de ambos grupos o las medias de las similitudes entre objetos de ambos grupos. Según algunos autores, afirman que este método está sesgado a formar conglomerados con aproximadamente la misma varianza.

Método del Centroide

En este método se calculan las distancias entre cada centroide de cada clúster, sin embargo, este centro se puede mover cuando los centroides de diferentes clúster están cerca uno del otro. En efecto, la distancia entre los grupos combinados se puede reducir a distintos pasos, dando lugar a problemas en el análisis de resultados. Por tanto, la semejanza entre dos clusters viene dada por la semejanza entre sus centroides.

Método de la Mediana

Este método se puede aplicar cuando el tamaño de los clusters es distinto y el centroide del nuevo cluster estará situado muy cerca del más grande (estando incluso dentro del mismo). Se puede aplicar para medidas de distancias y para medida de similitud.

Método de Ward

Aquí se unen clusters si la variación dentro de ellos no ha aumentado de manera significativa, haciendo más homogéneos los nuevos cluster formados. Este método se basa en la suma de cuadrados y a crear grupos de tamaño similar, dando paso a realizar buenos análisis de varianza por la producción de clusters definidos.

Existen varios métodos de unión de algoritmos de clasificación no jerárquica. Suelen distinguir entre reasignación, búsqueda de densidad, métodos directos y métodos reductivos. (Fernández, 2011)

Reasignación

  • Centroides
    • K-medias.

Parte de medias arbitrarias y por medio de pruebas sucesivas, comprueba el efecto que sobre la varianza residual tiene la asignación de cada uno de los casos a cada uno de los grupos.

  • Quick-Cluster

Permite que un individuo asignado a un cluster en un momento determinado del proceso, sea reasignado a otro cluster, si con esto se puede optimizar el criterio de selección. Este método es el más adecuado para establecer perfiles en una muestra amplia de individuos.

  • Método de Forgy

Fue propuesto por Forgy y es una aproximación más simple al clustering particionado. Al igual que el método de K-medias, utiliza el concepto de centroide.

  • Nubes dinámicas.

Parte del hecho que cada cluster debe de tener una representación llamada núcleo o centroide de cluster para, luego, hacer una búsqueda iterada de centroides y de cluster. Por esto, cada clase debe estar representada por un núcleo, siendo un elemento importante de todos los que integran la misma.

Búsqueda de densidad

  • Aproximación tipológica:
    • Análisis Modal

Parte del supuesto de que los clusters son esféricos

  • Métodos Taxap

Una de las características esenciales de este metodo es que tiene en cuenta el problema del chaining, es decir, cuando los cluster no forman grupos claramente aislados sino que forman parte uno continuo, el usuario debe de introducir el valor de corte, lo que proporciona una subjetividad a los resultados obtenidos

  • Método de Fortin

  • Aproximación probabilística:

    • Método de Wolf

Métodos directos

  • Block-Clustering

Técnica aplicada para el análisis de datos bidreccional. Su objetivo es encontrar sub-matrices, con filas y columnas con alta correlación, sin embargo, existe el inconveniente que el número de cluster a calcular tiene que estar proporcionado previamente al cálculo del algoritmo.

Métodos reductivos

  • Análisis Factorial tipo Q

Esta técnica tiene como objetivo encontrar grupos de individuos con valores similares en las variables, con el fin de establecer un número pequeño de cluster, esperando que los individuos contenidos en cada cluster tenga algún tipo de propiedad común. Parte de la matriz de correlaciones entre los individuos y somete los factores encontrados a una rotación ortogonal pero puede existir el problema que los individuos pertenezcan a más de uno y por tanto, los clusters pueden presentar solapamiento, dificultando la interpretación. (Díaz Covián, 2014)

3.2 Explicación de librerías e implementación de sintaxis

R cuenta con dos paquetes para realizar el análisis de cluster:

  • Stats, es el paquete general más grande de R y contiene algunas funciones generales para realizar este tipo de análisis.

  • Cluster, es un paquete específico ya que contiene un amplio abanico de funciones en relación a cualquier tipo de análisis de cluster, que trabajan con dataSets por defecto.

Para realizar análisis de cluster jerárquico aglomerativo, las funciones principales son:

  • hclust() del paquete stats; muestra esas distancias sucesivas en lo que denominamos el historial de conglomeración. (Aldas Manzano and Uriel Jimenez 2017) Se puede utilizar de la siguiente manera:

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

d: estructura de disimilitud producida por la función dist()

  • Method: Método de aglomeración (enlace) que se utiliza para calcular la distancia entre clústeres. Los valores permitidos son los de “Ward.D,” “Ward.D2,” “single,” “complete,” “promedio,” “mcquitty,” “mediana” o “centroide.”

agnes() del paquete cluster; construye una jerarquía de clusterings. Al principio, cada observación es un pequeño cluster por sí solo. Los clústeres se fusionan hasta que sólo quede un clúster grande que contenga todas las observaciones. Se puede utilizar de la siguiente manera:

agnes(x, diss = inherits(x, “dist”), stand = TRUE, metric = “euclidean,” method = “ward”)

  • X: matriz de datos o dataframe, o matriz de disimilitud, dependiendo del valor del argumento diss; indicador lógico; si TRUE entonces x se asume como una matriz de disimilitud. Si FALSE entonces X se trata como una matriz de observaciones por variables.

  • Stand: Indicador lógico: Si TRUE, las mediciones en x se estandarizan antes de calcular las disimilitudes. Si x ya es una matriz de disimilitud, este argumento se ignorará.

  • Metric: cadena de caracteres que especifica la métrica que se va a utilizar para calcular las diferencias entre las observaciones. Las opciones son euclidean y manhattan.

  • Method: cadena de caracteres que define el método de agrupación en clústeres. Los seis métodos implementados son “average” “single” “complete” “Ward” “weight” “flexible.”

Para el análisis de cluster jerárquico disociativo, principalmente se ocupa la función:

diana() del paquete cluster; construye una jerarquía de clusterings, comenzando con un cluster grande que contiene todas las “n” observaciones. Los grupos se dividen hasta que cada grupo contiene sólo una observación. Se puede utilizar de la siguiente manera:

diana(x, diss = inherits(x, “dist”), stand = FALSE, metric =“euclidean”)

  • X: matriz de datos o dataframe, o matriz de disimilitud, dependiendo del valor del argumento diss; indicador lógico; si TRUE entonces x se asume como una matriz de disimilitud. Si FALSE entonces X se trata como una matriz de observaciones por variables.

  • Stand: Indicador lógico: Si TRUE, las mediciones en x se estandarizan antes de calcular las disimilitudes. Si x ya es una matriz de disimilitud, este argumento se ignorará.

  • Metric: cadena de caracteres que especifica la métrica que se va a utilizar para calcular las diferencias entre las observaciones. Las opciones son euclidean y manhattan.

Para el análisis de cluster no jerárquico, las funciones principales son:

kmeans() del paquete stats; que implementa el procedimiento de agrupamiento de K–medias, la sintaxis se muestra en el siguiente código:

kmeans(x, centers, iter.max = 10, nstart = 1)

  • centers: Los valores posibles son el número de clústeres (k) o un conjunto de centros de clústeres iniciales (distintos). Si se trata de un número, se elige un conjunto aleatorio de filas (distintas) en x como centros iniciales.

  • iter.max: Número máximo de iteraciones permitidas. El valor predeterminado es 10.

  • nstart: El número de particiones de inicio aleatorias cuando los centros son un número. A menudo se recomienda intentar nstart > 1.

Para crear un hermoso gráfico de los clústeres generados con la función kmeans(), se utilizará el paquete factoextra.

pam() del paquete cluster; se basa en la búsqueda de k objetos representativos o medoides entre las observaciones del conjunto de datos. Se utiliza de la siguiente manera:

pam(x, k, metric = “euclidean,” stand = FALSE

  • X: Los valores posibles incluyen:

    • Matriz de datos numéricos o trama de datos numéricos: Cada fila corresponde a una observación y cada columna corresponde a una variable.

    • Matriz de disimilitud: En este caso x es normalmente la salida de daisy() o dist()

  • k: El número de clústeres

  • metric: Las métricas de distancia que se van a utilizar. Las opciones disponibles son “euclidean” y “manhattan.”

  • stand: valor lógico; si es true, las variables (columnas) de x se estandarizan antes de

  • Calcular las diferencias. Se ignora cuando x es una matriz de disimilitud.

Para crear un hermoso gráfico de los clústeres generados con la función kmeans(), se utilizará el paquete factoextra.

clara() del paquete cluster; es una extensión de los métodos k-medoids para tratar datos que contienen un gran número de objetos (más de varios miles de observaciones) con el fin de reducir el tiempo de computación y el problema de almacenamiento RAM. Su sintaxis es:

clara(x, k, metric = “euclidean,” stand = FALSE, samples = 5, pamLike = FALSE)

  • x: una matriz de datos numéricos o marco de datos, cada fila corresponde a una observación, y cada columna corresponde a una variable. Se permiten los valores que faltan (NAs).

  • k: el número de grupos.

  • métrica: las métricas de distancia que se van a utilizar. Las opciones disponibles son “euclidean” y “manhattan.”

  • stand: valor lógico; si es true, las variables (columnas) de x se estandarizan antes decalcular las diferencias.

  • muestras: número de muestras que deben extraerse del conjunto de datos. El valor predeterminado es 5, pero se recomienda un valor mucho mayor.

  • pamLike: Indicación lógica de si se debe utilizar el mismo algoritmo en la función pam(). Esto siempre debe ser cierto.

Para crear un hermoso gráfico de los clústeres generados con la función kmeans(), se utilizará el paquete factoextra.

4. Desarrollo de los ejercicios de los capítulos 4, 5, 6, 7, 8, y 9 del Texto “Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis)” de Kassambara, A.

Capítulo 4: K-Means Clustering

4.1 Computing k-means clustering in R

4.1.1 Data

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

4.1.2 Estimating the optimal number of clusters

library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)

4.1.3 Computing k-means clustering

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

4.1.4 Accessing to the results of kmeans() function

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$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

4.1.5 Visualizing k-means clusters

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

Capítulo 5: K-Medoids

5.1 Computing PAM in R

5.1.1 Data

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

5.1.2 Estimating the optimal number of clusters

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

5.1.3 Computing PAM clustering

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"
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

5.1.4 Accessing to the results of the pam() function

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

5.1.5 Visualizing PAM clusters

fviz_cluster(pam.res,
palette = c("#00AFBB", "#FC4E07"), 
ellipse.type = "t", 
repel = TRUE, 
ggtheme = theme_classic()
)

Capítulo 6: Clustering Large Applications

6.1 Computing CLARA in R

6.1.1 Data format and preparation

set.seed(1234)
# Generate 500 objects, divided into 2 clusters.
df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))
# Specify column and row names
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))
# Previewing the data
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

6.1.2 Estimating the optimal number of clusters

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

6.1.3 Computing CLARA

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

6.1.4 Visualizing CLARA clusters

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

Capítulo 7: Agglomerative Clustering

7.1 Steps to agglomerative hierarchical clustering

7.1.1 Data structure and preparation

# Load the data
data("USArrests")
# Standardize the data
df <- scale(USArrests)
# Show the first 6 rows
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 Similarity measures

# Compute the dissimilarity matrix
# df = the standardized data
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 Linkage

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

7.1.4 Dendrogram

# cex: label size
library("factoextra")
fviz_dend(res.hc, cex = 0.5)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

7.2 Verify the cluster tree

# 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

7.3 Cut the dendrogram into dierent groups

# 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"
# 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
)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

#Other example
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())

7.4 Cluster R package

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)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

Capítulo 8: Comparing Dendrograms

8.1 Data preparation

df <- scale(USArrests)
# Subset containing 10 rows
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]

8.2 Comparing dendrograms

library(dendextend)
## 
## ---------------------
## Welcome to dendextend version 1.15.1
## Type citation('dendextend') for how to cite the package.
## 
## Type browseVignettes(package = 'dendextend') for the package vignette.
## The github page is: https://github.com/talgalili/dendextend/
## 
## Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
## Or contact: <tal.galili@gmail.com>
## 
##  To suppress this message use:  suppressPackageStartupMessages(library(dendextend))
## ---------------------
## 
## Attaching package: 'dendextend'
## The following object is masked from 'package:stats':
## 
##     cutree
# Compute distance matrix
res.dist <- dist(df, method = "euclidean")
# Compute 2 hierarchical clusterings
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Create two dendrograms
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Create a list to hold dendrograms
dend_list <- dendlist(dend1, dend2)

8.2.1 Visual comparison of two dendrograms

tanglegram(dend1, dend2)

#Other form

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

8.2.2 Correlation matrix between a list of dendrograms

# Cophenetic correlation matrix
cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Baker correlation matrix
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
# Cophenetic correlation coefficient
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Baker correlation coefficient
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
# Create multiple dendrograms by chaining
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
# Compute correlation matrix
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)
# Print correlation matrix
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
# Visualize the correlation matrix using corrplot package
library(corrplot)
## corrplot 0.90 loaded
corrplot(cors, "pie", "lower")

Capítulo 9: Visualizing Dendrograms

9.1 Data

# Load data
data(USArrests)
# Compute distances and hierarchical clustering
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

9.2 Visualizing dendrograms

fviz_dend(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
rect_border = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
rect_fill = TRUE)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
## Warning in if (color == "cluster") color <- "default": la condición tiene
## longitud > 1 y sólo el primer elemento será usado

#Other form
fviz_dend(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
ggtheme = theme_gray() # Change theme
)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

# Othe form
fviz_dend(hc, cex = 0.5, k = 4, # Cut in four groups
k_colors = "jco")
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

#horizotal form
fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

#Circular
fviz_dend(hc, cex = 0.5, k = 4,
k_colors = "jco", type = "circular")
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

#phylogenic-like tree
require("igraph")
## Loading required package: igraph
## Warning: package 'igraph' was built under R version 4.1.2
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:dplyr':
## 
##     as_data_frame, groups, union
## The following objects are masked from 'package:purrr':
## 
##     compose, simplify
## The following object is masked from 'package:tidyr':
## 
##     crossing
## The following object is masked from 'package:tibble':
## 
##     as_data_frame
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
fviz_dend(hc, k = 4, k_colors = "jco",
type = "phylogenic", repel = TRUE)

#phylogenic trees 
require("igraph")
fviz_dend(hc, k = 4, # Cut in four groups
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")

9.3 Case of dendrogram with large data sets

9.3.1 Zooming in the dendrogram

fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

9.3.2 Plotting a sub-tree of dendrograms

# Create a plot of the whole dendrogram,
# and extract the dendrogram data
dend_plot <- fviz_dend(hc, k = 4, # Cut in four groups
cex = 0.5, # label size
k_colors = "jco"
)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
dend_data <- attr(dend_plot, "dendrogram") # Extract dendrogram data
# Cut the dendrogram at height h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualize the truncated version containing
# two branches
fviz_dend(dend_cuts$upper)
## Warning in min(-diff(our_dend_heights)): ningún argumento finito para min;
## retornando Inf

## Warning in min(-diff(our_dend_heights)): `guides(<scale> = FALSE)` is
## deprecated. Please use `guides(<scale> = "none")` instead.

# Plot the whole dendrogram
print(dend_plot) 

# Plot subtree 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

# Plot subtree 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

#Plor circular
fviz_dend(dend_cuts$lower[[2]], type = "circular")
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

9.3.3 Saving dendrogram into a large PDF page

pdf("dendrogram.pdf", width=30, height=15) # Open a PDF
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "jco" ) # Do plotting
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
print(p)
dev.off() # Close the PDF
## png 
##   2

9.4 Manipulating dendrograms using dendextend

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

#R code for creating a dendrogram using chaining operator:
library(dendextend)
dend <- USArrests[1:5,] %>% # data
scale %>% # Scale the data
dist %>% # calculate a distance matrix,
hclust(method = "ward.D2") %>% # Hierarchical clustering
as.dendrogram # Turn the object into a dendrogram.
plot(dend)

#other form
library(dendextend)
# 1. Create a customized dendrogram
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>% # Branches line width
set("branches_k_color", mycols, k = 4) %>% # Color branches by groups
set("labels_colors", mycols, k = 4) %>% # Color labels by groups
set("labels_cex", 0.5) # Change label size
# 2. Create plot
fviz_dend(dend)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

Bibliografía

Aldas Manzano, Joaquin, and Ezequiel Uriel Jimenez. 2017. Análisis Multivariante Aplicado Con r. Ediciones Paraninfo, SA.
De la Fuente Fernández, Santiago. 2011. “Análisis Conglomerados.” Madrid: Facultad de Ciencias Económicas y Empresariales, Universidad Autónoma de Madrid. Recuperado de: Http://Tinyurl. Com/Conglomerados.
Dı́az Covián, Iñaki et al. 2014. “Descubrimiento de Conocimiento En Bases de Datos Espaciales.” Descubrimiento de Conocimiento En Bases de Datos Espaciales.
Santos Mangudo, Carlos et al. 2015. “" Two-Step Cluster" En SPSS y técnicas Relacionadas.” Dosegljivo Na.