UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

METODOS PARA EL ANALISIS ECONOMICO


“LABORATORIO PARTE 2”


ALUMNO:

HERNANDEZ ROMERO, ALAN ERNESTO               HR15033

CANALES LOPEZ, JOSE MANUEL                CL12025

MSF. CARLOS ADEMIR PÉREZ ALAS

CIUDAD UNIVERSITARIA, NOVIEMBRE DE 2021

ANALISIS DE CONGLOMERADOS.

El propósito del análisis de conglomerados (clúster en terminología inglesa) es el agrupar las observaciones de forma que los datos sean muy homogéneos dentro de los grupos (mínima varianza) y que estos grupos sean lo más heterogéneos posible entre ellos (máxima varianza). El objetivo de la agrupación es identificar patrones o grupos de objetos similares y de un mismo interés. De esta manera podemos comprender de mejor manera los datos multivariantes y la población de la cual proceden.

Sintetizando: La idea general es que tenemos una muestra de observaciones multivariada, y deseamos agruparla en grupos similares.

El Análisis Clúster tiene una importante tradición de aplicación en muchas áreas de investigación. Según muchos autores, la describen como una técnica descriptiva, ateórica y no inferencial.

La agrupación o “clustering” se ha utilizado ampliamente desde la década de 1990 en diferentes campos científicos para segmentar grupos. Implica definir los objetos de estudio individuales como un solo grupo.

En un segundo paso, se combinan diferentes clústeres con la mayor similitud para formar un grupo más grande. El siguiente paso del análisis consiste en determinar las distancias entre los grupos individuales para crear clústeres aún más grandes. El resultado final es un grupo enorme.

Para los investigadores de mercado, sin embargo, no sólo el mega clúster es de gran importancia. Las intersecciones entre los segmentos individuales también son cruciales.

Las soluciones no son únicas, en la medida en que la pertenencia al conglomerado para cualquier número de soluciones depende de muchos elementos del procedimiento elegido.

A continuación, algunas recomendaciones para realizar efectivamente el análisis de clúster:

• deben identificarse en primer lugar las características (variables) que deben utilizarse como base para la comparación.

• se utilizarán datos normalizados para la comparación con otros datos.

• los valores atípicos, es decir, los objetos que presentan valores extremos deben excluirse de las comparaciones.

• las variables que son demasiado similares deben evitarse ya que pueden falsificar el resultado final.

• deben evitarse los valores de salida demasiado constantes, ya que pueden complicar la evaluación posterior

El uso más frecuente de esta técnica es para las siguientes disciplinas, entre otras:

• Marketing: Clasificar como consumidores.

• Tecnica de reconocimiento de patrones en la ciencia.

• En imágenes digitalizadas enviadas por un satélite para identificar los terrenos.

• En Urbanismo para identificar grupos de viviendas según su tipo, valor y ubicación.

CUADRO COMPARATIVO.

CUADRO COMPARATIVO

library(kableExtra)
created_var <- data.frame (
  `Analisis_de_cluster` = c (
    'Jerarquico:El método jerárquico, tienen por objetivo agrupar clúster para formar uno nuevo o bien separar alguno ya existente para dar origen a otros dos, de tal forma que, si sucesivamente se va efectuando este proceso de aglomeración o división, se minimice alguna distancia o bien se maximice alguna medida de similitud. ',
    'No jerarquico:Están diseñados para la clasificación de individuos (no de variables) en K grupos. El procedimiento es elegir una partición de los individuos en K grupos e intercambiar los miembros del clúster para tener una partición mejor'
  ),
  `Tecnicas disponibles` = c(
    'Aglomerativas: También conocidos como ascendentes, comienzan el análisis con tantos grupos como individuos haya. A partir de estas unidades iniciales se van formando grupos, de forma ascendente, hasta que al final del proceso todos los casos tratados están englobados en un mismo conglomerado, Disociativos:
También llamados descendentes, constituyen el proceso inverso al anterior. Comienzan con un conglomerado que engloba a todos los casos tratados y, a partir de este grupo inicial, a través de sucesivas divisiones, se van formando grupos cada vez más pequeños.

Aglomerativo y Disociativo ej.
Método de asociación
Método de Ward.
Método de la mediana.
Método del centroide.
',
'Reasignacion:

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

Métodos reductivos:
Análisis factorial.
'
  ),
Ventajas = c (
  'Útil para grupos pequeños.

Posibilita utilizar distintos tipos de medida para estimar distancias.

Podemos obtener el número de clústeres directamente del modelo.

Pueden aplicarse sobre los casos y sobre las variables.

Permite obtener distintos tipos de resultados gráficos y numéricos que facilitan la interpretación de los resultado.
',
'No implican la construcción de una estructura en árbol.

Ofrecen resultados adicionales que permiten seleccionar las variables para la interpretación de los conglomerados.
'
),
Desventajas = c(
  'No proporcionan una solución óptima para todos los problemas que se pueden plantear, ya que es posible llegar a distintos resultados según el método elegido.

Se utiliza como técnica exploratoria.

No es adecuado para data sets muy grandes.

Debemos estandarizar las variables antes de aplicar el algoritmo.

Precisan una gran cantidad de cálculos, que en ocasiones limita la posibilidad de aplicación con muestras muy grandes.
',
'Sólo pueden aplicarse sobre casos.

Exigen definir previamente el número de clúster
'
)
)

kbl(created_var) %>%
  kable_paper(full_width = F) %>%
  column_spec(1,
              bold = T,
              border_right = T,
              background = "cornsilk") %>%
  column_spec(2,
              bold = T,
              border_right = T,
              background = "azure1") %>%
  column_spec(3,
              bold = T,
              border_right = T,
              background = "cornsilk") %>%
  column_spec(4,
              bold = T,
              border_right = T,
              background = "azure1") %>%
  add_footnote(label = "Fuente: Elaboración propia con base a documentos varios",
               notation = "symbol") %>%  kable_styling()
Analisis_de_cluster Tecnicas.disponibles Ventajas Desventajas
Jerarquico:El método jerárquico, tienen por objetivo agrupar clúster para formar uno nuevo o bien separar alguno ya existente para dar origen a otros dos, de tal forma que, si sucesivamente se va efectuando este proceso de aglomeración o división, se minimice alguna distancia o bien se maximice alguna medida de similitud.

Aglomerativas: También conocidos como ascendentes, comienzan el análisis con tantos grupos como individuos haya. A partir de estas unidades iniciales se van formando grupos, de forma ascendente, hasta que al final del proceso todos los casos tratados están englobados en un mismo conglomerado, Disociativos: También llamados descendentes, constituyen el proceso inverso al anterior. Comienzan con un conglomerado que engloba a todos los casos tratados y, a partir de este grupo inicial, a través de sucesivas divisiones, se van formando grupos cada vez más pequeños.

Aglomerativo y Disociativo ej. Método de asociación Método de Ward. Método de la mediana. Método del centroide.

Útil para grupos pequeños.

Posibilita utilizar distintos tipos de medida para estimar distancias.

Podemos obtener el número de clústeres directamente del modelo.

Pueden aplicarse sobre los casos y sobre las variables.

Permite obtener distintos tipos de resultados gráficos y numéricos que facilitan la interpretación de los resultado.

No proporcionan una solución óptima para todos los problemas que se pueden plantear, ya que es posible llegar a distintos resultados según el método elegido.

Se utiliza como técnica exploratoria.

No es adecuado para data sets muy grandes.

Debemos estandarizar las variables antes de aplicar el algoritmo.

Precisan una gran cantidad de cálculos, que en ocasiones limita la posibilidad de aplicación con muestras muy grandes.
No jerarquico:Están diseñados para la clasificación de individuos (no de variables) en K grupos. El procedimiento es elegir una partición de los individuos en K grupos e intercambiar los miembros del clúster para tener una partición mejor

Reasignacion:

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

Métodos reductivos: Análisis factorial.

No implican la construcción de una estructura en árbol.

Ofrecen resultados adicionales que permiten seleccionar las variables para la interpretación de los conglomerados.

Sólo pueden aplicarse sobre casos.

Exigen definir previamente el número de clúster
* Fuente: Elaboración propia con base a documentos varios

TECNICAS DISPONIBLES Y SINTAXIS EN R.

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.

Método divisivo Ampliamos: En el método Divisivo suponemos que todas las observaciones pertenecen a un único grupo y luego dividimos el clúster en dos grupos menos similares. Esto se repite recursivamente en cada grupo hasta que haya un grupo para cada observación. Esta técnica también se llama DIANA, que es un acrónimo de Análisis Divisivo.

Método aglomerativo Ampliamos: También se lo conoce como aglomeración aglomerativa jerárquica (HAC) o AGNES (acrónimo de aglomeración de anidación). En este método, cada observación se asigna a su propio clúster. Luego, se calcula la similitud (o distancia) entre cada uno de los clusters y los dos clusters más similares se fusionan en uno. Finalmente, los pasos 2 y 3 se repiten hasta que solo quede un grupo.

Tenga en cuenta que el método divisivo es bueno para identificar clusters grandes, mientras que el método aglomerativo es bueno para identificar clusters pequeños.

Agrupamiento Jerarquico en R

Principales librerías a utilizar:

library(ggplot2)
library(car)
library(dplyr)
library(factoextra)
library(cluster)
library(data.table)
library(PerformanceAnalytics)
library(corrr)
library(tidyverse)
library(simstudy)
library(purrr)

DEMOSTRACION INICIAL.

Se mostrará a continuación la aplicación de K-means clustering y clustering jerárquico para averiguar si las observaciones se agrupan en distintos tipos de cáncer.

Para comenzar, estandarizamos las variables para que tengan media 0 y desviación estándar 1.

Este ejemplo es exclusivo para mostrar como se inicia el proceso, posterior ampliaremos:

library(ISLR)
names(NCI60)
## [1] "data" "labs"
datos.nci <- NCI60$data
dim(datos.nci)
## [1]   64 6830
head(datos.nci)[, 1:6]
##           1         2         3         4         5             6
## V1 0.300000  1.180000  0.550000  1.140000 -0.265000 -7.000000e-02
## V2 0.679961  1.289961  0.169961  0.379961  0.464961  5.799610e-01
## V3 0.940000 -0.040000 -0.170000 -0.040000 -0.605000  0.000000e+00
## V4 0.280000 -0.310000  0.680000 -0.810000  0.625000 -1.387779e-17
## V5 0.485000 -0.465000  0.395000  0.905000  0.200000 -5.000000e-03
## V6 0.310000 -0.030000 -0.100000 -0.460000 -0.205000 -5.400000e-01
# Estandarización de los datos
datos.nci <- scale(datos.nci, center = TRUE, scale = TRUE)
head(datos.nci)[, 1:6]
##            1            2          3          4          5           6
## V1 0.7229554  1.594614647  1.3152906  1.3450554 -0.6001006 -0.21892339
## V2 1.5838967  1.739790603  0.4382214  0.6489885  0.9047460  1.63581692
## V3 2.1731106 -0.016089747 -0.3463542  0.2643754 -1.3010255 -0.01917014
## V4 0.6776381 -0.372557113  1.6153098 -0.4408142  1.2346734 -0.01917014
## V5 1.1421409 -0.577195786  0.9575754  1.1298352  0.3585172 -0.03343823
## V6 0.7456141 -0.002887252 -0.1848054 -0.1202735 -0.4764080 -1.56012378
# Tipos de cáncer distintos en el set de datos
unique(NCI60$labs)
##  [1] "CNS"         "RENAL"       "BREAST"      "NSCLC"       "UNKNOWN"    
##  [6] "OVARIAN"     "MELANOMA"    "PROSTATE"    "LEUKEMIA"    "K562B-repro"
## [11] "K562A-repro" "COLON"       "MCF7A-repro" "MCF7D-repro"
# Número de muestras por tipo de cáncer
table(NCI60$labs)
## 
##      BREAST         CNS       COLON K562A-repro K562B-repro    LEUKEMIA 
##           7           5           7           1           1           6 
## MCF7A-repro MCF7D-repro    MELANOMA       NSCLC     OVARIAN    PROSTATE 
##           1           1           8           9           6           2 
##       RENAL     UNKNOWN 
##           9           1

¿QUE ES EL DENDOGRAMA?

Un dendograma es una representación que ilustra la organización jerárquica entre elementos (puede representarse horizontal o verticalmente).Cada hoja del dendograma representa un elemento u observación.

La clave para interpretar un dendograma es centrarse en la altura a la que dos observaciones se unen. Podemos sacar conclusiones acerca de la similitud de dos observaciones en base a su localización en el eje vertical donde las ramas que contienen esas observaciones se unen por primera vez. Por otro lado, la posición horizontal de cada división da información sobre la distancia (disimilitud) entre dos clústeres.

Ejemplo usando complete, single y average linkage, escogiendo la distancia euclídea como medida de similitud.

# Matriz distancia  entre observaciones
datos.nci.euc <- dist(datos.nci, method = "euclidean")

# Representación de dendogramas
par(mfrow = c(1, 2))

plot(
  hclust(datos.nci.euc, method = "complete"),
  labels = NCI60$labs,
  main = "Complete linkage",
  xlab = "",
  ylab = "",
  cex = 0.3,
  sub = ""
)

plot(
  hclust(datos.nci.euc, method = "average"),
  labels = NCI60$labs,
  main = "Average linkage",
  xlab = "",
  ylab = "",
  cex = 0.3,
  sub = ""
)

par(mfrow = c(1, 1))

plot(
  hclust(datos.nci.euc, method = "single"),
  labels = NCI60$labs,
  main = "Single linkage",
  xlab = "",
  ylab = "",
  cex = 0.4,
  sub = ""
)

Como se observa en cada uno de los tres dendogramas, el tipo de linkage escogido afecta el resultado del agrupamiento (las hojas de un dendograma usando single linkage suelen unirse una a una). Claramente, las líneas celulares de un solo tipo de cáncer tienden a agruparse juntas. Para el resto del ejemplo, utilizaremos el clustering jerárquico con complete linkage

clust.comp <- hclust(dist(datos.nci))
clust.comp
## 
## Call:
## hclust(d = dist(datos.nci))
## 
## Cluster method   : complete 
## Distance         : euclidean 
## Number of objects: 64
# Corte del dendograma resultante en 4 clusteres. Almacena el clúster asignado a cada observación 
clusteres.hc <- cutree(tree = clust.comp, k = 4)
clusteres.hc
##  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 
##   1   1   1   1   2   2   2   2   1   1   1   1   1   1   1   1   1   2   2   2 
## V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   3   3   3   3   3   3   3 
## V41 V42 V43 V44 V45 V46 V47 V48 V49 V50 V51 V52 V53 V54 V55 V56 V57 V58 V59 V60 
##   3   1   4   1   4   4   4   4   4   4   4   4   1   1   1   1   1   1   1   1 
## V61 V62 V63 V64 
##   1   1   1   1
# Representación gráfica del corte en el dendograma
par(mfrow = c(1, 1))
plot(clust.comp, labels = NCI60$labs, cex = 0.4)
abline(h = 139, col = "red")

Otra opción sería llevar a cabo el clustering jerárquico sobre los primeros componentes principales, de la siguiente manera:

# Cálculo de componentes principales
pca.nci <- prcomp(datos.nci, scale = TRUE)
# Cinco primeros vectores de scores
head(pca.nci$x)[, 1:5]
##          PC1       PC2         PC3         PC4        PC5
## V1 -19.68245  3.527748  -9.7354382   0.8177816 -12.511081
## V2 -22.90812  6.390938 -13.3725378  -5.5911088  -7.972471
## V3 -27.24077  2.445809  -3.5053437   1.3311502 -12.466296
## V4 -42.48098 -9.691742  -0.8830921  -3.4180227 -41.938370
## V5 -54.98387 -5.158121 -20.9291076 -15.7253986 -10.361364
## V6 -26.96488  6.727122 -21.6422924 -13.7323153   7.934827
# Clustering jerárquico sobre los primeros 5 componentes principales
clust.jer <- hclust(dist(pca.nci$x[, 1:5]))

plot(clust.jer,
     labels = NCI60$labs,
     cex = 0.4,
     main = "Clust. jerárquico sobre componentes principales")

table(cutree(clust.jer, 4), NCI60$labs)
##    
##     BREAST CNS COLON K562A-repro K562B-repro LEUKEMIA MCF7A-repro MCF7D-repro
##   1      0   2     7           0           0        2           0           0
##   2      5   3     0           0           0        0           0           0
##   3      0   0     0           1           1        4           0           0
##   4      2   0     0           0           0        0           1           1
##    
##     MELANOMA NSCLC OVARIAN PROSTATE RENAL UNKNOWN
##   1        1     8       5        2     7       0
##   2        7     1       1        0     2       1
##   3        0     0       0        0     0       0
##   4        0     0       0        0     0       0

K MEANS CLUSTERING.

Este algoritmo de clasificación no supervisada agrupa objetos en k grupos basándose en la mínima suma de distancias entre cada objeto y el centroide de su grupo o cluster

# Asignación de semilla para resultados reproducibles
set.seed(2)
# K-means clustering con K = 4 y 20 asignaciones aleatorias de clústeres iniciales
k.means <- kmeans(x = datos.nci,
                  centers = 4,
                  nstart = 20)

# Suma de cuadrados intra-clúster individual
k.means$withinss
## [1] 108801.44 154545.00  37149.60  44070.83
# Asignación de clústeres de cada observación
clusteres.km <- k.means$cluster

# Comparación clústeres de k-means y clustering jerarquico
table(clusteres.km, clusteres.hc)
##             clusteres.hc
## clusteres.km  1  2  3  4
##            1 11  0  0  9
##            2 20  7  0  0
##            3  9  0  0  0
##            4  0  0  8  0

Los cuatro clústeres obtenidos por ambos métodos difieren en cierta medida: el clúster 2 de K-means clustering es idéntico al clúster 3 del clustering jerárquico. Sin embargo, el clúster 4 de K-means clustering contiene una proporción de las observaciones asignadas al clúster 1 del clustering jerárquico y todas las observaciones asignadas al clúster 2

Representacion grafica:

library(FactoMineR)
# Cálculo componentes principals con la función PCA()
pca.nci <-
  PCA(
    X = datos.nci,
    scale.unit = TRUE,
    ncp = 64,
    graph = FALSE
  )

library(factoextra)
fviz_pca_ind(
  pca.nci,
  geom.ind = "point",
  col.ind = as.factor(k.means$cluster),
  axes = c(1, 2),
  pointsize = 1.5
)

EJEMPLO CAPITULO 4

Agrupación de K-medias

La agrupación en clústeres de K-medias (MacQueen, 1967) es el algoritmo de aprendizaje automático no supervisado más utilizado para dividir un conjunto de datos dado en un conjunto de k grupos (es decir, k clústeres), donde k representa el número de grupos preespecificado por el analista. Clasifica los objetos en varios grupos (es decir, conglomerados), de modo que los objetos dentro del mismo conglomerado son lo más similares posible (es decir, alta similitud intraclase), mientras que los objetos de diferentes conglomerados son tan diferentes como sea posible (es decir, bajo interclase). -similitud de clase). En el agrupamiento de k-medias, cada grupo está representado por su centro (es decir, centroide) que corresponde a la media de puntos asignados al grupo.

K-significa ideas básicas

La idea básica detrás de la agrupación de k-medias consiste en definir agrupaciones de modo que se minimice la variación total dentro de la agrupación (conocida como variación total dentro de la agrupación). Hay varios algoritmos de k-medias disponibles. El algoritmo estándar es el algoritmo de Hartigan-Wong (1979), que define la variación total dentro del conglomerado como la suma de las distancias al cuadrado, las distancias euclidianas entre los elementos y el centroide correspondiente:

ALGORITMO K-MEDIOS W(Ck)= ÿ(xi≠μk)2 xi œCk

• xi diseñar un punto de datos perteneciente al cluster Ck • μk es el valor medio de los puntos asignados al cluster Ck Cada observación (xi) se asigna a un grupo dado de modo que la suma de cuadrados (SS) la distancia de la observación a sus centros de conglomerados asignados μk es mínima. Definimos la variación total dentro del conglomerado de la siguiente manera:

revisar formulas, sobre todo las escrituras ÿk ÿkÿ 2 tot.withinss = W(Ck) = (xi ≠ μk) k=1 k=1 xiœCk

La suma de cuadrados total dentro del conglomerado mide la compacidad (es decir, la bondad) de la clustering y queremos que sea lo más pequeño posible.

Algoritmo de K-medias

El primer paso al utilizar la agrupación de k-medias es indicar el número de agrupaciones (k) que se generarán en la solución final. El algoritmo comienza seleccionando aleatoriamente k objetos del conjunto de datos para que sirvan como centros iniciales para los grupos. Los objetos seleccionados también se conocen como medias de clúster o centroides. A continuación, cada uno de los objetos restantes se asigna a su centroide más cercano, donde más cercano se define utilizando la distancia euclidiana (Capítulo 3) entre el objeto y la media del grupo. Este paso se denomina “paso de asignación de clúster”. Tenga en cuenta que, para usar la distancia de correlación, los datos se ingresan como puntajes z. Después del paso de asignación, el algoritmo calcula el nuevo valor medio de cada grupo. El término “actualización de centroide” de clúster se utiliza para diseñar este paso. Ahora que se han recalculado los centros, se vuelve a comprobar cada observación para ver si podría estar más cerca de un grupo diferente. Todos los objetos se reasignan nuevamente utilizando los medios de clúster actualizados. Los pasos de actualización de centroide y asignación de conglomerados se repiten iterativamente hasta que las asignaciones de conglomerados dejan de cambiar (es decir, hasta que se logra la convergencia). es decir, los grupos formados en la iteración actual son los mismos que los obtenidos en la anterior iteración. El algoritmo K-means se puede resumir de la siguiente manera: 1. Especifique el número de clústeres (K) que se crearán (por el analista) 2. Seleccione aleatoriamentekobjetos de los datos de los centros de clúster iniciales. 3. Asigna cada observación a su centroide más cercano, según la distancia euclidiana entre el objeto y el centroide. 4. Para cada uno de los k conglomerados, actualice el centroide del conglomerado calculando los nuevos valores medios de todos los puntos de datos del conglomerado. El centoide de un grupo Kth es un vector de longitud p que contiene las medias de todas las variables para las observaciones en el grupo kth; p es el número de variables. 5. Minimice iterativamente el total dentro de la suma del cuadrado. Es decir, repita los pasos 3 y 4 hasta que las asignaciones de clúster dejen de cambiar o se alcance el número máximo de iteraciones. De forma predeterminada, el software R utiliza 10 como valor predeterminado para el número máximo de iteraciones.

Cálculo de la agrupación de k-medias en R 4.3.1 Datos Usaremos los conjuntos de datos de demostración “USArrests”. Los datos deben prepararse como se describe en el capítulo 2. Los datos deben contener solo variables continuas, ya que el algoritmo de k-medias utiliza medias variables. Como no queremos que el algoritmo de k-medias dependa de una unidad variable arbitraria, comenzamos escalando los datos usando la función R scale () de la siguiente manera:

data("USArrests")
df <- scale(USArrests)
# ver las primeras 3 columnas de la data
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

Estimando el número óptimo de clústeres

La agrupación de k-means requiere que los usuarios especifiquen el número de agrupaciones que se generarán. Una pregunta fundamental es: ¿Cómo elegir el número correcto de grupos esperados (k)? Se presentarán diferentes métodos en el capítulo “Evaluación y validación de conglomerados Estadísticas”. Aquí ofrecemos una solución sencilla. La idea es calcular el agrupamiento de k medias utilizando diferentes valores de los grupos k. A continuación, se dibuja el wss (dentro de la suma del cuadrado) de acuerdo con el número de grupos. La ubicación de una curva (rodilla) en la parcela se considera generalmente como un indicador del número apropiado de grupos. La función R fviz_nbclust () [en el paquete factoextra] proporciona una solución conveniente para estimar el número óptimo de clústeres.

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

El gráfico anterior representa la varianza dentro de los grupos. Disminuye a medida que k aumenta, pero se puede ver una curva (o “codo”) en k = 4. Esta curva indica que los grupos adicionales más allá del cuarto tienen poco valor. En la siguiente sección, clasificaremos las observaciones en 4 racimos.

Computación de clústeres de k-medias

Como el algoritmo de agrupamiento de k-medias comienza con k centroides seleccionados al azar, siempre se recomienda usar la función set.seed () para establecer una semilla para el generador de números aleatorios de R. El objetivo es hacer reproducibles los resultados, de modo que el lector de este artículo obtendrá exactamente los mismos resultados que los que se muestran a continuación. El siguiente código R realiza la agrupación de k-medias con k = 4:

set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)

Como el resultado final del resultado de la agrupación de k-medias es sensible a las asignaciones iniciales aleatorias, especificamos nstart = 25. Esto significa que R probará 25 asignaciones iniciales aleatorias diferentes y luego seleccionará los mejores resultados correspondientes al que tenga el menor dentro de variación de racimo. El valor predeterminado de nstart en R es uno. Sin embargo, se recomienda encarecidamente calcular la agrupación en clústeres de k medias con un valor alto de nstart, como 25 o 50, para tener un resultado más estable.

 #Imprimiendo resultados
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"

Es posible calcular la media de cada variable por conglomerados utilizando los datos originales:

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

Si desea agregar las clasificaciones de puntos a los datos originales, use esto:

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 kmeans () La función kmeans () devuelve una lista de componentes, que incluyen: • cluster: un vector de números enteros (de 1: k) que indica el cluster al que se asigna cada punto • centros: una matriz de centros de conglomerados (clustqer significa) • totss: La suma total de cuadrados (TSS), es decir (xi ≠ x ̄) 2. TSS mide el total varianza en los datos. • withinss: Vector de suma de cuadrados dentro del conglomerado, un componente por conglomerado • tot.withinss: suma total de cuadrados dentro del conglomerado, es decir, suma (dentro de) • between: La suma de cuadrados entre grupos, es decir, totss ≠ tot.withinss • tamaño: el número de observaciones en cada grupo Se puede acceder a estos componentes de la siguiente manera:

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
# Cluster size
km.res$size
## [1]  8 13 16 13
# Cluster means
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

Ventajas y desventajas de la agrupación de K-means La agrupación en clústeres de K-means es un algoritmo muy simple y rápido. Puede manejar de manera eficiente conjuntos de datos muy grandes. Sin embargo, existen algunas debilidades, que incluyen: 1. Supone un conocimiento previo de los datos y requiere que el analista elija el número apropiado de clúster (k) de antemano. 2. Los resultados finales obtenidos son sensibles a la selección aleatoria inicial de centros de conglomerados. ¿Por qué es esto un problema? Porque, para cada ejecución diferente del algoritmo en el mismo conjunto de datos, puede elegir un conjunto diferente de centros iniciales. Esto puede dar lugar a diferentes resultados de agrupación en diferentes ejecuciones del algoritmo. 3. Es sensible a los valores atípicos. 4. Si reorganiza sus datos, es muy posible que obtenga una solución diferente cada vez que cambie el orden de sus datos. Las posibles soluciones a estas debilidades incluyen: 1. Solución al problema 1: Calcule k-medias para un rango de valores de k, por ejemplo, variando k entre 2 y 10. Luego, elija el mejor k comparando los resultados de agrupamiento obtenidos para los diferentes valores de k. 2. Solución al problema 2: Calcule el algoritmo de K-medias varias veces con diferentes centros de conglomerados iniciales. La ejecución con la suma de cuadrados dentro del grupo más baja se selecciona como la solución de agrupamiento final. 3. Para evitar distorsiones causadas por valores atípicos excesivos, es posible utilizar el algoritmo PAM, que es menos sensible a los valores atípicos.

Alternativa a la agrupación en clústeres de k-medias Una alternativa robusta a k-means es PAM, que se basa en medoides. Como se discutió en el próximo capítulo, la agrupación en clústeres PAM se puede calcular usando la función pam () [paquete de clúster]. La función pamk () [paquete fpc] es un contenedor para PAM que también imprime el número sugerido de clústeres basado en el ancho de silueta promedio óptimo.

EJEMPLO CAPITULO 5

Usaremos los conjuntos de datos de demostración “USArrests”, que comenzamos escalando (Capítulo 2) usando la función R scale () de la siguiente manera:

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

Paquetes y funciones de R requeridos

Instalando paquetes requeridos

install.packages(c("cluster", "factoextra"))

Cargando los paquetes

library(cluster) 
library(factoextra)

Estimando el número óptimo de clústeres Para estimar el número óptimo de conglomerados, usaremos el método de silueta promedio. La idea es calcular el algoritmo PAM utilizando diferentes valores de los clusters k. A continuación, se dibuja la silueta de los conglomerados promedio de acuerdo con el número de conglomerados. La silueta promedio mide la calidad de un agrupamiento. Un ancho de silueta medio alto indica una buena agrupación. El número óptimo de conglomerados k es el que maximiza la silueta promedio sobre un rango de valores posibles para k (Kaufman y Rousseeuw [1990]). La función R fviz_nbclust () [paquete factoextra] proporciona una solución conveniente para estimar el número óptimo de clústeres.

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

Computación en clústeres PAM El siguiente código R calcula el algoritmo PAM con k = 2:

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

Si desea agregar las clasificaciones de puntos a los datos originales, use esto:

 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 () La función pam () devuelve un objeto de clase pam cuyos componentes incluyen: • medoides: objetos que representan agrupaciones • agrupación: un vector que contiene el número de agrupación de cada objeto. Se puede acceder a estos componentes de la siguiente manera:

# Cluster medoids: New Mexico, Nebraska
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
# Cluster numbers
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

EJEMPLO CAPITULO 6

Formato y preparación de datos Para calcular el algoritmo CLARA en R, los datos deben prepararse como se indica en el Capítulo 2. Aquí, generaremos el uso de un conjunto de datos aleatorios. Para hacer que el resultado sea reproducible, comenzamos usando la función set.seed ().

set.seed(1234)
df <- rbind(cbind(rnorm(200, 0, 8), rnorm(200, 0, 8)),
            cbind(rnorm(300, 50, 8), rnorm(300, 50, 8)))
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))
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

Estimando el número óptimo de clústeres

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

computación CLARA El siguiente código R calcula el 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"

La salida de la función clara () incluye los siguientes componentes: • medoides: objetos que representan grupos • agrupación: un vector que contiene el número de agrupación de cada objeto • muestra: etiquetas o números de caso de las observaciones en la mejor muestra, es decir, la muestra utilizada por el algoritmo clara para la partición final. Si desea agregar las clasificaciones de puntos a los datos originales, use esto:

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

Puede acceder a los resultados devueltos por clara () de la siguiente manera:

 # 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

visualizando clusters CLARA Para visualizar los resultados de la partición, usaremos la función fviz_cluster () [paquete factoextra]. Dibuja un diagrama de dispersión de puntos de datos coloreados por números de grupo.

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

EJEMPLO CAPITULO 7

data("USArrests")
df <- scale(USArrests)
head(df, nrow = 6)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292
## Colorado   0.02571456 0.3988593  0.8608085  1.864967207

Matriz de distancia o similitud

res.dist <- dist(df, method = "euclidean")

La función Dist() calcula la distancia entre las filas de un dato matriz utilizando el método de medida de distancia especificado.

Para ver fácilmente la información de distancia entre objetos, reformateamos los resultados de la función dist() en una matriz usando la función as.matrix().

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

Funcion de enlance

La función de enlace toma la información de distancia, devuelta por la función dist()y agrupa pares de objetos en grupos en función de su similitud. A continuación, estos nuevos los clústeres formados están vinculados entre sí para crear clústeres más grandes. Este proceso es iterado hasta que todos los objetos del conjunto de datos original se vinculen entre sí en un jerárquico árbol.

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

Hay muchos métodos de aglomeración de conglomerados (es decir, métodos de vinculación). Los métodos de vinculación más comunes se describen a continuación:

• Vinculación máxima o completa: la distancia entre dos conglomerados se define como el valor máximo de todas las distancias por pares entre los elementos en el grupo 1 y los elementos del grupo 2. Tiende a producir grupos más compactos.

• Vínculo mínimo o único: se define la distancia entre dos conglomerados como el valor mínimo de todas las distancias por pares entre los elementos en el grupo 1 y los elementos del grupo 2. Tiende a producir grupos largos y “sueltos”.

• Vinculación media o media: la distancia entre dos conglomerados se define como la distancia media entre los elementos del conglomerado 1 y los elementos del conglomerado 2.

• Enlace centroide: la distancia entre dos grupos se define como la distancia entre el centroide del conglomerado 1 (un vector medio de variables de longitud p) y el centroide del conglomerado 2.

Dendograma

Los dendrogramas corresponden a la representación gráfica del árbol jerárquico generado por la función hclust(). El dendrograma se puede producir en R utilizando el función base plot(res.hc), donde res.hc es la salida de hclust(). Aquí, usaremos la función fviz_dend()[ in factoextra paquete R] para producir dendrograma.

Comprobacion del cluster de arbol

res.coph <- cophenetic(res.hc)
cor(res.dist, res.coph)
## [1] 0.6975266

Ejecute la función hclust() de nuevo utilizando el método de vinculación promedio. A continuación, llame cofenetic() para evaluar la solución de clustering.

res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

Dendograma en diferentes grupos

Uno de los problemas con el clustering jerárquico es que, no nos dice cuántos grupos que hay, o dónde cortar el dendrograma para formar grupos.

Puede cortar el árbol jerárquico a una altura determinada para particionar sus datos en grupos. La función base R cutree() se puede utilizar para cortar un árbol, generada por la función Hclust(), en varios grupos.

grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
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
)

Paquete Cluster

El clúster del paquete R facilita la realización del análisis del clúster en R. Proporciona la función agnes() y diana() para calcular la agrupación aglomerativa y divisiva, respectivamente. Estas funciones realizan todos los pasos necesarios para usted. No necesitas Para ejecutar las funciones Scale(), Dist() y HCLUST() por separado.

library("cluster")

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

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

Después de ejecutar agnes () y diana (), puede usar la función fviz_dend () [in factoextra] para visualizar la salida:

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

EJEMPLO CAPITULO 8

Comparando Dendogramas

Después de mostrar cómo calcular la agrupación jerárquica (Capítulo 7), describimos, aquí, cómo comparar dos dendrogramas usando el paquete dendextend R.

El paquete dendextend proporciona varias funciones para comparar dendrogramas. Aquí nos centraremos en dos funciones:

• tanglegram() para la comparación visual de dos dendrogramas • y cor.dendlist() para calcular una matriz de correlación entre dendrogramas.

Preparacion de la data:

df <- scale(USArrests)
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss, ]
library(dendextend)
# Compute distance matrix
res.dist <- dist(df, method = "euclidean")

hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")

dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)

dend_list <- dendlist(dend1, dend2)

Comparacion visual

Para comparar visualmente dos dendrogramas, usaremos la función tanglegram() [dendextend package], que traza los dos dendrogramas, uno al lado del otro, con sus etiquetas conectadas por líneas

tanglegram(dend1, dend2)

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

La función cor.dendlist() se utiliza para calcular la correlación “Baker” o “Cofenética” matriz entre una lista de árboles. El valor puede oscilar entre -1 y 1. Con cerca de 0 valores que significan que los dos árboles no son estadísticamente similares.

cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
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

dend_list <- dendlist(
  "Complete" = dend1,
  "Single" = dend2,
  "Average" = dend3,
  "Centroid" = dend4
)
cors <- cor.dendlist(dend_list)

round(cors, 2)
##          Complete Single Average Centroid
## Complete     1.00   0.46    0.45     0.30
## Single       0.46   1.00    0.23     0.17
## Average      0.45   0.23    1.00     0.31
## Centroid     0.30   0.17    0.31     1.00

Visualizar la matriz de correlación mediante el paquete corrplot

library(corrplot)
corrplot(cors, "pie", "lower")

EJEMPLO CAPITULO 9

Visualizando los Dendogramas

Como se describió en capítulos anteriores, un dendrograma es una representación basada en árbol de undatos creados mediante métodos de agrupación jerárquica.

En este apartado,proporcionaremos código R para visualizar y personalizar dendrogramas. Además, mostramos Cómo guardar y ampliar un dendrograma grande

data(USArrests)

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

Para visualizar el dendrograma, usaremos las siguientes funciones y paquetes de R:

• fviz_dend()[in factoextra R package] para crear fácilmente una hermosa basada en ggplot2 dendrograma. • paquete dendextend para manipular dendrogramas

install.packages(c("factoextra", "dendextend"))
library(factoextra)
fviz_dend(hc, cex = 0.5)

Puede usar los argumentos main, sub, xlab, ylab para cambiar los títulos de la trama de la siguiente manera:

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

fviz_dend(hc, cex = 0.5, horiz = TRUE)

También es posible cortar el árbol a una altura determinada para particionar los datos en múltiples grupos como se describe en el capítulo anterior: Agrupación jerárquica. En este caso, es posible colorear las ramas por grupos y agregar rectángulos alrededor de cada uno grupo.

fviz_dend(
  hc,
  k = 4,
  cex = 0.5,
  k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
  color_labels_by_k = TRUE,
  rect = TRUE,
  rect_border = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
  rect_fill = TRUE
)

Para cambiar el tema de la gráfica, utilice el argumento ggtheme.

fviz_dend(
  hc,
  k = 4,
  cex = 0.5,
  k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
  color_labels_by_k = TRUE,
  ggtheme = theme_gray()
)

Dendograma horizontal:

fviz_dend(
  hc,
  k = 4,
  cex = 0.4,
  horiz = TRUE,
  k_colors = "jco",
  rect = TRUE,
  rect_border = "jco",
  rect_fill = TRUE
)

Además, puede trazar un dendrograma circular utilizando el tipo de opción = “circular”

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

Dendogramas con amplia informacion

Si desea hacer zoom en los primeros clústeres, es posible utilizar la opción xlim y ylim para limitar el área de la parcela. Por ejemplo, escriba el código siguiente:

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

Para trazar un sub-árbol, seguiremos el siguiente procedimiento:

  1. Cree todo el dendrograma usando fviz_dend() y guarde el resultado en un objeto, denominado dend_plot por ejemplo.

  2. Utilice la función base R cut.dendrogram() para cortar el dendrograma, en un momento dado altura (h), en múltiples sub-árboles. Esto devuelve una lista con componentes $upper y $lower, la primera es una versión truncada del árbol original, también de clase dendrograma, este último una lista con las ramas obtenidas de la tala del árbol, cada uno un dendrograma.

  3. Visualice los sub-árboles usando fviz_dend()

dend_plot <- fviz_dend(hc,
                       k = 4,
                       cex = 0.5,
                       k_colors = "jco")
dend_data <- attr(dend_plot, "dendrogram")

dend_cuts <- cut(dend_data, h = 10)

fviz_dend(dend_cuts$upper)

print(dend_plot)

fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")

fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

Guardar el dendrograma en una página PDF grande

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

Manipulación de dendrogramas mediante dendextend

El paquete dendextend proporciona funciones para cambiar fácilmente la apariencia de un dendrograma y para comparar dendrogramas.

En esta sección usaremos el operador de encadenamiento (%>%) para simplificar nuestro código. El El operador de encadenamiento convierte x %>% f(y) en f(x, y) para que pueda usarlo para reescribir varios operaciones tales que se pueden leer de izquierda a derecha, de arriba a abajo.

Por ejemplolos resultados de los dos códigos R que figuran a continuación son equivalentes.

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

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

BIBLIOGRAFIA

Barnier, J. 2021. GitHub https://github.com/juba/rmdformats

De la Fuente Fernandez, Santiago. Análisis de conglomerados. https://www.estadistica.net/Master-Econometria/Analisis_Cluster.pdf

Gallardo, Métodos Jerarquicos de análisis de cluster. https://www.ugr.es/~gallardo/pdf/cluster-3.pdf

Kassambara, A. 2017. Practical Guide To Cluster Analysis in R clustering_english_edition1_amazon (xsliulab.github.io)