Análisisde Clúster

Universidad de El Salvador
Faculdad de ciencias económicas
escuela de economía

<>

Metodos para el analisis económico
Docente: Carlos Ademir Perez Alas
Grupo teorico: “02”
Tema de investigación: Análisisde Clúster.
Integrantes
Apellidos Nombres DUE Participación
Álvarez Pineda Heidy Judith AP18017 100%
Hernández García Estefany Azucena HG20004 100%
Hernandez Gutierrez German Alejandro HG19046 100%
Mendez Carrillo Jairo Rodrigo MC19167 100%
Lemus Perez Elias Amilcar LP16016 100%
Fecha de entrega: 07 de enero de 2024
Ciudad universitaria, San Salvador, El Salvador

Númeral 1.

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

¿Qué es el análisis de conglomerados?

El análisis de clúster, también conocido como análisis de conglomerado, es una técnica estadística multivariante que busca agrupar elementos (o variables) tratando de lograr la máxima homogeneidad en cada grupo y la mayor diferencia entre los grupos.

El objetivo principal del análisis de conglomerados es la identificación de grupos de manera que la variabilidad intraclase sea inferior a la variabilidad entreclases. El análisis de clúster tiene una gran importancia en aplicación en muchas áreas de investigación. Sin embargo, con los beneficios del análisis de clúster posee ciertas desventajas. El Análisis de clúster 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. Por otra parte, la solución al análisis de clúster depende totalmente de las variables utilizadas, la adición o destrucción de la s variables relevantes que pueden tener un impacto substancial sobre la solución resultante.

Alboukadel Kassambara, 2017.

Existen dos tipos de análisis de clúster: Jerárquicos y no Jerárquicos.

  • Jerárquicos: Son los que se basan en el cálculo de una matriz de distancia y se aplican con n<200, pues los cálculos y resultados generan complicación con muestras grandes. Una característica de estos métodos es que no permiten una reasignación de los grupos es decir, que dos clúster o individuos unidos durante el proceso, no pueden separarse en etapas decisivas.

Estos métodos Jerárquicos se dividen en jerárquicos aglomerativos y de división. Los Jerarquicos aglomerativos: Se denominan también ascendentes y parten de objetos singulares para ir construyendo conglomerados más complejos hasta concluir en uno solo, una de las ventajas de este tipo es que requieren menor tiempo de realización y son los más utilizados.

Entre algunos métodos los jerárquicos aglomerativos tenemos los siguientes:

  • Método de Linkage Simple, Enlace Simple o Vecino más próximo

  • Método del Linkage Completo, Enlace Completo o Vecino más alejado

  • Método del Promedio entre grupos

  • Método del Centroide

  • Método del la Mediana

  • Método de Ward

Por otra parte, los métodos jerárquicos de Division son los que parten del conjunto de datos y se van dividiendo hasta crear un solo elemento, los elementos que se incluyen en un grupo no se pueden reasignar. Dentro de estos métodos tenemos:

  • Método del Linkage Simple
  • Método del Linkage Completo
  • Método del Promedio entre grupos
  • Método del Centroide
  • Método del la Mediana
  • Análisis de Asociación

Por otro lado, tenemos los Mejor conocidos como métodos de optimización

  • Métodos No jerárquicos: Mejor 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 cluster deseado.

Estos métodos 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.

Procedimiento previo general

  • Realizar la matriz con las observaciones y las variables.
  • Estandarizar la base de datos
  • Luego se miden las distancias de las parejas de datos.
    • Usando la función dist() (ejemplo a continuación)
      • res.dist <- dist(df, method = “euclidean”)
      • as.matrix (res.dist)[1:6, 1:6]
    • Los métodos son:
      • Distancia Euclidiana
      • √(∑(X1-X2)^2 + (Y1-Y2)^2 + (….)^2 )
    • Distancia Manhattan
    • Solo es
      • ∑|(X1-X2)^1|

Númeral 2.

2. Elabore un cuadro comparativo

Resumen de Análisis de Clúster

Análisis de Clúster Técnicas Disponibles Ventajas Desventajas
  • Jerárquico: Genera grupos en cada una de las fases del proceso para buscar el número de clúster que hacer para agrupación óptima. El agrupamiento jerárquico es capaz de fijar por sí solos el número de clústers, por ello se pueden utilizar de forma exploratoria y posteriormente aplicar un análisis no jerárquico con el número de clúster ya fijado.
  • Minimum or single linkage. (Método del vecino más próximo o Enlace simple)
  • Maximum or complete linkage. (Método del vecino más lejano o enlace completo)
  • Mean or average linkage. (Método de agrupación de vinculación promedio o vinculación inter-grupo)
  • Método del Centroide.
  • Método de Ward o Varianza mínima. (Minimum variante clustering)
    • No requiere un número de clústers especificados a priori.
    • Tiene una salida en forma de diagrama de árbol (dendrograma).*
    • Posteriormente se debe utilizar un análisis de cluster no jerárquico.
    • No Jerárquico: Este tipo de técnicas categorizan los elementos según un número de clúster dado. O sea que necesitan que el número de particiones esté fijado a priori.
    • K – Means.
  • K–Medoids(PAM)
  • CLARA.
    • Puede procesar una gran cantidad de datos (Varios miles de observaciones) (CLARA)
  • Es menos sensible a los valores atípicos (K-Medoids).
    • Se debe especificar con anticipación el número de clústers.
  • Asume que se tiene conocimiento de la data (K-means)
  • Los resultados finales son sensibles a la selección aleatoria de clusters centers. (K-means)
  • Si se ordena nuevamente la data es muy posible que se obtengan salidas diferentes cada vez que la data se reordene (K-means)
  • Es muy sensible a los datos atípicos (K-means)
  • Note:
    Fuente: Elaboración propia con base en (Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA,)

    Númeral 3.

    3. Describa las técnicas disponibles para realizar el análisis de clúster.

    Describa las técnicas disponibles para realizar el análisis de clúster, tanto jerárquicas como no jerárquicas.

    Entre los métodos de unión de algoritmos de clasificación no jerárquica tenemos: reasignación, búsqueda de densidad, métodos directos y métodos reductivos.

    Reasignación

    • 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

    • 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é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 El objetivo principal de esta técnica es 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.

    Entre los métodos de unióm de algoritmos de clasificación jerárquica tenemos: 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.

    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.

    3.2 Incluir una explicación de la librería y sintaxis para implementarla en R.

    El análisis de cluster se puede realizar por medio de dos librerias: stats y 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.

    Análisis de cluster no jerárquico

    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.

    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.

    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.

    Análisis de cluster jerárquico disociativo

    Para el análisis de cluster jerárquico disociativo, principalmente se ocupa la función “diana(…)”

    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.

    Análisis de cluster jerárquico aglomerativo

    Para realizar análisis de cluster jerárquico aglomerativo, la funcion principal es “hclust(…)”.

    hclust() del paquete stats; muestra esas distancias sucesivas en lo que denominamos el historial de conglomeración. 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.”

    Numeral 4.

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

    Capitulo 4:

    (K-Means Clustering).

    Computing k-means clustering in R

    data("USArrests") # Loading the data set
    df <- scale(USArrests) # Scaling the data
    # View the firt 3 rows of the 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

    Estimating the optimal number of clusters

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

    COMPUTING K-MEANS CLUSTERING IN R

    # Compute k-means with k = 4
    set.seed(123)
    km.res <- kmeans(df, 4, nstart = 25)
    print(km.res)
    ## K-means clustering with 4 clusters of sizes 8, 13, 16, 13
    ## 
    ## Cluster means:
    ##       Murder    Assault   UrbanPop        Rape
    ## 1  1.4118898  0.8743346 -0.8145211  0.01927104
    ## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
    ## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
    ## 4  0.6950701  1.0394414  0.7226370  1.27693964
    ## 
    ## Clustering vector:
    ##        Alabama         Alaska        Arizona       Arkansas     California 
    ##              1              4              4              1              4 
    ##       Colorado    Connecticut       Delaware        Florida        Georgia 
    ##              4              3              3              4              1 
    ##         Hawaii          Idaho       Illinois        Indiana           Iowa 
    ##              3              2              4              3              2 
    ##         Kansas       Kentucky      Louisiana          Maine       Maryland 
    ##              3              2              1              2              4 
    ##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
    ##              3              4              2              1              4 
    ##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
    ##              2              2              4              2              3 
    ##     New Mexico       New York North Carolina   North Dakota           Ohio 
    ##              4              4              1              2              3 
    ##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
    ##              3              3              3              3              1 
    ##   South Dakota      Tennessee          Texas           Utah        Vermont 
    ##              2              1              4              3              2 
    ##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
    ##              3              3              2              2              3 
    ## 
    ## Within cluster sum of squares by cluster:
    ## [1]  8.316061 11.952463 16.212213 19.922437
    ##  (between_SS / total_SS =  71.2 %)
    ## 
    ## Available components:
    ## 
    ## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
    ## [6] "betweenss"    "size"         "iter"         "ifault"
    library(kableExtra)
    resultados <- aggregate(USArrests, by=list(cluster=km.res$cluster), mean)  
      resultados %>% 
      kable(align ="c",
            digits =2) %>%
      row_spec(0,background = "#E0D7FF") %>% 
      column_spec(1:ncol(resultados), width = "100px")
    cluster Murder Assault UrbanPop Rape
    1 13.94 243.62 53.75 21.41
    2 3.60 78.54 52.08 12.18
    3 5.66 138.88 73.88 18.78
    4 10.82 257.38 76.00 33.19
    dd <- cbind(USArrests, cluster = km.res$cluster)
      dd %>% 
      head(dd, n= 3) %>% 
      kable(align ="c",
            digits =2) %>%
      row_spec(0,background = "#E0D7FF") %>% 
      column_spec(1:ncol(resultados), width = "100px")
    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

    Accessing to the results of kmeans() function

    # Cluster number for each of the observations
    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

    Visualizing k-means clusters

    fviz_cluster(km.res, data = df,
    
    palette = c("cyan4", "#201B1A", "#6AAB40", "#614731"),
    ellipse.type = "euclid", # Concentration ellipse
    star.plot = TRUE, # Add segments from centroids to items
    repel = TRUE, # Avoid label overplotting (slow)
    ggtheme = theme_minimal()
    )

    Capitulo 5

    (K-Medoids)

    library(cluster)
    library(factoextra)

    Estimating the optimal number of clusters

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

    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)
    dd %>% 
      head(dd, n= 3) %>% 
      kable(align ="c",
            digits =2) %>%
      row_spec(0,background = "#E0D7FF") %>% 
      column_spec(1:ncol(resultados), width = "100px")
    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

    Accessing to the results of the pam() function

    # 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

    Visualizing PAM clusters

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

    Capitulo 6:

    # Generar 500 objetos, divido en 2 clusters
    set.seed(1234)
    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

    Estimar el número optimo de clusters

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

    # Compute CLARA
    clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
    # Print components of clara.res
    print(clara.res)
    ## Call:     clara(x = df, k = 2, samples = 50, pamLike = TRUE) 
    ## Medoids:
    ##              x         y
    ## S121 -1.531137  1.145057
    ## S455 48.357304 50.233499
    ## Objective function:   9.87862
    ## Clustering vector:    Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
    ##  - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
    ## Cluster sizes:            200 300 
    ## Best sample:
    ##  [1] S37  S49  S54  S63  S68  S71  S76  S80  S82  S101 S103 S108 S109 S118 S121
    ## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
    ## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
    ## 
    ## Available components:
    ##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
    ##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"
    # Agregar las clasificaciones a los datos originales
    
    dd <- cbind(df, cluster = clara.res$cluster)
    head(dd, n = 4)
    ##             x        y cluster
    ## S1  -9.656526 3.881815       1
    ## S2   2.219434 5.574150       1
    ## S3   8.675529 1.484111       1
    ## S4 -18.765582 5.605868       1
    # 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
    fviz_cluster(clara.res,
    palette = c("#254D63", "#F5350A"), ellipse.type = "t", geom = "point", pointsize = 1, ggtheme = theme_classic()
    )

    Capitulo 7

    Cargar los datos

    data("USArrests")
    # Estandarizar los datos
    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

    Medidas de similitud

    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

    Vinculación de la información

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

    Dendograma

    res.coph <- cophenetic(res.hc)
    # Correlación entre la distancia cofenética y la distancia original
    cor(res.dist, res.coph)
    ## [1] 0.6975266
    res.hc2 <- hclust(res.dist, method = "average")
    cor(res.dist, cophenetic(res.hc2))
    ## [1] 0.7180382

    El coeficiente de correlación muestra que el uso de un método de vinculación diferente crea un árbol que representa las distancias originales levemente mejor

    Dividir el dendrograma en diferentes 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, cex = 0.5, k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
    color_labels_by_k = TRUE, rect = TRUE)

    fviz_cluster(list(data = df, cluster = grp),
    palette = c("#F5350A", "#469B72", "#1C1A19", "#3614E0"),
    ellipse.type = "convex", repel = TRUE, show.clust.cent = FALSE, ggtheme = theme_minimal())

    Cluster libreria de R

    library(cluster)
    res.agnes <- agnes(x = USArrests,
    stand = TRUE,
    metric = "euclidean",
    method = "ward"
    )
    
    res.diana <- diana(x = USArrests, stand = TRUE, metric = "euclidean")
    
    fviz_dend(res.agnes, cex = 0.6, k = 4)

    Capitulo 8:

    Comparacion de Dendrogramas.

    8.1 Preparación de datos

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

    8.2 Comparacion de dendrogramas

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

    8.2.1 Comparación visual de dos dendrogramas

    tanglegram(dend1, dend2)

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

    8.2.2 Matriz de correlación entre una lista de dendogramas

    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
    # Coeficiente de correlacion Cophenetic 
    cor_cophenetic(dend1, dend2)
    ## [1] 0.9925544
    # Coeficiente de correlacion Baker
    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
    library(corrplot)
    corrplot(cors, "pie", "lower")

    Capitulo 9:

    Visualizando Dendrogramas

    9.1 Datos

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

    9.2 Visualizando dendrogramas

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

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

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

    fviz_dend(hc, k = 4, # Cut in four groups
    
    cex = 0.5, # label size
    k_colors = c("#8B0000", "#006400", "#8B008B", "#00008B"),
    color_labels_by_k = TRUE, # color labels by groups
    ggtheme = theme_gray() # Change theme
    )

    # Forma Vertical
    fviz_dend(hc, cex = 0.5, k = 4, 
    k_colors = "npg")

    # Forma Horizontal
    fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "npg",
    rect = TRUE, rect_border = "npg", rect_fill = TRUE)

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

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

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

    9.3 Caso de dendrograma con grandes conjuntos de datos

    9.3.1 Zooming in the dendrograma

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

    9.3.2 Plotting a sub-tree of dendrogramas

    dend_plot <- fviz_dend(hc, k = 4, 
    
    cex = 0.5, 
    k_colors = "lancet"
    )
    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")

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

    9.3.3 Guardar dendrograma en una página PDF grande

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

    9.4 Manipulación de dendrogramas usando dendextend

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

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

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

    Númeral 5.

    5. Apartado de aplicacion de clusters.

    Indicacion

    Presente un ejemplo de aplicación de Análisis de Cluster, con datos de un caso de los disponibles en https://www.kaggle.com/datasets (puede buscar dentro del sitio por la palabra clave “Cluster”

    Cargando librerias y base de datos

    library(readr)
    library(factoextra)
    library(cluster)
    wine_clustering <- read_csv("wine-clustering.csv")
    head(wine_clustering)
    ## # A tibble: 6 × 13
    ##   Alcohol Malic_Acid   Ash Ash_Alcanity Magnesium Total_Phenols Flavanoids
    ##     <dbl>      <dbl> <dbl>        <dbl>     <dbl>         <dbl>      <dbl>
    ## 1    14.2       1.71  2.43         15.6       127          2.8        3.06
    ## 2    13.2       1.78  2.14         11.2       100          2.65       2.76
    ## 3    13.2       2.36  2.67         18.6       101          2.8        3.24
    ## 4    14.4       1.95  2.5          16.8       113          3.85       3.49
    ## 5    13.2       2.59  2.87         21         118          2.8        2.69
    ## 6    14.2       1.76  2.45         15.2       112          3.27       3.39
    ## # ℹ 6 more variables: Nonflavanoid_Phenols <dbl>, Proanthocyanins <dbl>,
    ## #   Color_Intensity <dbl>, Hue <dbl>, OD280 <dbl>, Proline <dbl>

    Análisis de cluster - k-medias

    K-means es un algoritmo de clasificación no supervisada (clusterización) que agrupa objetos en k grupos basándose en sus características. El agrupamiento se realiza minimizando la suma de distancias entre cada objeto y el centroide de su grupo o cluster.

    Con el metodo de K-medias conoceremos las agrupaciones posibles realizables con la data de vinos

    Estandarización de la data

    library(cluster)
    # eliminar datos perdidos
    
    wine_clustering <- na.omit(wine_clustering)
    
    # estandarizar
    
    wine_clustering <- scale(wine_clustering)

    Estimando el número de clusters

    fviz_nbclust(x=wine_clustering ,FUNcluster = kmeans,method = "wss",
                 k.max = 15,
                 diss = get_dist(wine_clustering,method = "euclidean"),
                 nstart=50)+labs(title="Número de clusters")+
      
      xlab(label = "Total de clusters")+
      ylab(label = "Suma de cuadrados")+geom_hline(yintercept = 1500)

    set.seed(50)
    kmeans<-kmeans(wine_clustering,3,nstart=25)
    print(kmeans)
    ## K-means clustering with 3 clusters of sizes 51, 62, 65
    ## 
    ## Cluster means:
    ##      Alcohol Malic_Acid        Ash Ash_Alcanity   Magnesium Total_Phenols
    ## 1  0.1644436  0.8690954  0.1863726    0.5228924 -0.07526047   -0.97657548
    ## 2  0.8328826 -0.3029551  0.3636801   -0.6084749  0.57596208    0.88274724
    ## 3 -0.9234669 -0.3929331 -0.4931257    0.1701220 -0.49032869   -0.07576891
    ##    Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity        Hue
    ## 1 -1.21182921           0.72402116     -0.77751312       0.9388902 -1.1615122
    ## 2  0.97506900          -0.56050853      0.57865427       0.1705823  0.4726504
    ## 3  0.02075402          -0.03343924      0.05810161      -0.8993770  0.4605046
    ##        OD280    Proline
    ## 1 -1.2887761 -0.4059428
    ## 2  0.7770551  1.1220202
    ## 3  0.2700025 -0.7517257
    ## 
    ## Clustering vector:
    ##   [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    ##  [38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2
    ##  [75] 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    ## [112] 3 3 3 3 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ## [149] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ## 
    ## Within cluster sum of squares by cluster:
    ## [1] 326.3537 385.6983 558.6971
    ##  (between_SS / total_SS =  44.8 %)
    ## 
    ## Available components:
    ## 
    ## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
    ## [6] "betweenss"    "size"         "iter"         "ifault"
    aggregate(wine_clustering,by=list(cluster=kmeans$cluster),mean)
    ##   cluster    Alcohol Malic_Acid        Ash Ash_Alcanity   Magnesium
    ## 1       1  0.1644436  0.8690954  0.1863726    0.5228924 -0.07526047
    ## 2       2  0.8328826 -0.3029551  0.3636801   -0.6084749  0.57596208
    ## 3       3 -0.9234669 -0.3929331 -0.4931257    0.1701220 -0.49032869
    ##   Total_Phenols  Flavanoids Nonflavanoid_Phenols Proanthocyanins
    ## 1   -0.97657548 -1.21182921           0.72402116     -0.77751312
    ## 2    0.88274724  0.97506900          -0.56050853      0.57865427
    ## 3   -0.07576891  0.02075402          -0.03343924      0.05810161
    ##   Color_Intensity        Hue      OD280    Proline
    ## 1       0.9388902 -1.1615122 -1.2887761 -0.4059428
    ## 2       0.1705823  0.4726504  0.7770551  1.1220202
    ## 3      -0.8993770  0.4605046  0.2700025 -0.7517257
    clusters_data<-cbind(wine_clustering,cluster=kmeans$cluster)
    head(clusters_data,5)
    ##        Alcohol  Malic_Acid        Ash Ash_Alcanity  Magnesium Total_Phenols
    ## [1,] 1.5143408 -0.56066822  0.2313998   -1.1663032 1.90852151     0.8067217
    ## [2,] 0.2455968 -0.49800856 -0.8256672   -2.4838405 0.01809398     0.5670481
    ## [3,] 0.1963252  0.02117152  1.1062139   -0.2679823 0.08810981     0.8067217
    ## [4,] 1.6867914 -0.34583508  0.4865539   -0.8069748 0.92829983     2.4844372
    ## [5,] 0.2948684  0.22705328  1.8352256    0.4506745 1.27837900     0.8067217
    ##      Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity        Hue
    ## [1,]  1.0319081           -0.6577078       1.2214385       0.2510088  0.3611585
    ## [2,]  0.7315653           -0.8184106      -0.5431887      -0.2924962  0.4049085
    ## [3,]  1.2121137           -0.4970050       2.1299594       0.2682629  0.3174085
    ## [4,]  1.4623994           -0.9791134       1.0292513       1.1827317 -0.4263410
    ## [5,]  0.6614853            0.2261576       0.4002753      -0.3183774  0.3611585
    ##          OD280     Proline cluster
    ## [1,] 1.8427215  1.01015939       2
    ## [2,] 1.1103172  0.96252635       2
    ## [3,] 0.7863692  1.39122370       2
    ## [4,] 1.1807407  2.32800680       2
    ## [5,] 0.4483365 -0.03776747       2

    Tamaño de los clusters

    #Medias
    kmeans$centers
    ##      Alcohol Malic_Acid        Ash Ash_Alcanity   Magnesium Total_Phenols
    ## 1  0.1644436  0.8690954  0.1863726    0.5228924 -0.07526047   -0.97657548
    ## 2  0.8328826 -0.3029551  0.3636801   -0.6084749  0.57596208    0.88274724
    ## 3 -0.9234669 -0.3929331 -0.4931257    0.1701220 -0.49032869   -0.07576891
    ##    Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity        Hue
    ## 1 -1.21182921           0.72402116     -0.77751312       0.9388902 -1.1615122
    ## 2  0.97506900          -0.56050853      0.57865427       0.1705823  0.4726504
    ## 3  0.02075402          -0.03343924      0.05810161      -0.8993770  0.4605046
    ##        OD280    Proline
    ## 1 -1.2887761 -0.4059428
    ## 2  0.7770551  1.1220202
    ## 3  0.2700025 -0.7517257

    Media de los clusters

    kmeans$size
    ## [1] 51 62 65

    Graficando los Clusters

    fviz_cluster(
      kmeans,
      data =  wine_clustering,
      palette=c("purple","blue","green"),
      ellipse.type = "convex",
      star.plot=TRUE,
      repel = TRUE,
      pointsize = 0.5,
      ggtheme = theme_minimal()
    )+labs(title="Gráfico de wine_clustering")

    Los clusters demuestran como se relacionan entre si cada una de las observaciones donde cada una de ellas (las observaciones) poseen un color que las caracteriza enfatizando el cluster al que pertenecen donde tambien se dibuja una elipse alrededor de cada grupo.