Tarea A-31, Investigacion de Análisis de Clusters

UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
CICLO 1-2025
Trabajo De Investigacion
Trabajo De Investigacion

Tema: Investigacion acerca del analisis de cluters

Asigantura:
Metodos para el analisis economico

Grupo Teorico
01

Docente.
MSF. Carlos Ademir Perez alas.

Presentado por:
Jonathan Alexander Hernández Pérez (HP22013)

Ciudad Universitaria, 17 de Noviembre del 2025

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

El análisis de conglomerados es una técnica estadística multivariante, cuyo objetivo es clasificar un conjunto de observaciones en grupos o conglomerados de tal manera que cumpla con:

1- Las observaciones del conglomerado deben ser lo más similar posible entre si (debe ser homogeneas las observaciones dentro del cluster).

2- Las observaciones de diferentes grupos deben ser lo más distintas en medida de lo posible, de otros grupos (Cada grupo debe ser distinto de los demás).

A diferencia de otros métodos de análisis, el conglomerado no utiliza una variable de respuesta predefinida; en cambio, el algoritmo identifica distintos patrones o estructuras en los datos a partir de las variables a explicar (Kassambara 2017). Este proceso es conocido como “aprendizaje no supervisado”, haciendo referencia a que no se busca a priori que las ideas guíen que muestras pertenecen a qué conglomerados, y ‘aprendizaje’ porque el algoritmo de la máquina ‘aprende’ a agrupar (Kassambara 2017).

Las aplicaciones tanto económicas como empresariales son realmente variadas. Por ejemplo:

  • Segmentación de mercado: identificar distintos tipos o perfiles de consumidores, agrupados por sus distintas características, ya sea comportamiento, demografía, tipos de compra, cantidad gastada, etc. Esto permitiría realizar estrategias de publicidad más personalizadas y posiblemente efectivas.

  • Análisis financieros: Agrupar empresas, instrumentos financieros, activos, etc. Esto con base en características como el riesgo, rentabilidad, perfil operativo y así tomar decisiones económicas bien informadas. (Aldás-Manzano and Uriel Jiménez 2017)

2. Elabore un cuadro comparativo, que incluya los siguientes elementos:(Lo indicado en rojo corresponde a los elementos a redactar, en la versión a ser entregada debe aparecer el texto negro normal.)

library(knitr)
library(kableExtra)
cuadro_comparativo <- data.frame(
  Conceptos = c(" JERÁRQUICOS: Este construye una jerarquía, algo similar a un abril genealógico con los datos, dónde comenzando desde una sola observaciones se forman subgrupos cada vez grandes; o también desde un único grupo se van haciendo grupos cada vez más pequeños hasta un valor K específico. Este viene dado por el investigador y se define usualmente de manera teórica o incluso realizando primero métodos no jerárquicos únicamente para encontrar la cantidad de clusters y para el agrupamiento utilizar las técnicas Jerarquícas conociendo el valor K. Existe dos enfoques uno Aglomerativo (de abajo hacia arriba) y otro Divisivo (de arriba hacia abajo)" , "NO JERÁRQUICOS:
Es en vez de contruir una jerarquía, este análisis directamente busca la mejor manera de dividir lo datos en K subgrupos. Dónde el valor de K, debe ser elegido antes de el análisis, es como asignar grupos de trabajo, se elige quienes estarán en cuáles grupos, pero ya se sabe de ante mano la cantidad de grupos."),
tecnicas <- c ("-Agrupamiento Aglomerativo: Método de Vinculación Simple o Vecino más próximo, Método del, Enlace Completo o Vecino más alejado, Método del Promedio entre grupos, Método del Centroide, Método de Ward.

- Agrupamiento Divisivo: 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"

, "
- K means
- K Medoids (PAM)
- CLARA " ),

ventajas = c( "
 - No requiere de especificar el número de clusters de antemano.
- Genera un dendograma que puede mostrar claramente la forma en que se han agrupado las observaciones.
- Suele preservar la estructura natural de los datos.
- Útil para cuando no se conoce la cantidad de clusters posibles o inherente a los propios datos. " , " 
- Menos complejidad computacional.
- Eficiente para grandes conjuntos de datos.
- Menos sensible a como estén ordenados los datos de manera inherente.
- Algunos Algoritmos están diseñados para problemas específicos como valores atipicos, ruido, o distintas formas de clusters. "), 
desventajas = c("- Puede necesitar mucho poder computacional para muestras grandes.
- Es sensible a los datos atipicos y el ruido en el dataset.
- Los subgrupos pueden tener problemas al momento de manejar grandes conjuntos de datos.
- Los resultados pueden variar dependiendo de la medida de distancia que se elije." ,

"- Requiere un número de específico de clusters, si bien a priori no es una desventaja esto puede ser problemático en caso no se tenga una sustentación teoría que permita determina los K clusters buscados.
- Asume formas esféricas (en los métodos más comunes como K-Means)"))


# Asignar nombres en español sin caracteres especiales problematicos
colnames(cuadro_comparativo) <- c("Analisis de Cluster", "Tecnicas disponibles", 
                                  "Ventajas", "Desventajas")

# Generar la tabla
kbl(cuadro_comparativo, booktabs = TRUE, align = "l", escape = FALSE) %>%
  kable_styling(
    latex_options = c("striped", "hold_position"),
    full_width = FALSE,
    font_size = 15
  ) %>%
  column_spec(1, width = "4cm") %>%
  column_spec(2, width = "4cm") %>%
  column_spec(3, width = "4cm") %>%
  column_spec(4, width = "4cm") %>%
  add_header_above(
    c( "Resumen del Analisis de Cluster" = 4),
    background = "#2E9FDF",
    color = "white",
    bold = TRUE
  ) %>%
  row_spec(0, background = "#00AFBB", color = "white", bold = TRUE) %>%
  row_spec(1:2, background = "#F8F9FA") %>%
  footnote(
    general = "Fuente: Elaboracion propia con base en Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (1st ed.). STHDA.",
    general_title = "",
    footnote_as_chunk = TRUE
  )
Resumen del Analisis de Cluster
Analisis de Cluster Tecnicas disponibles Ventajas Desventajas
JERÁRQUICOS: Este construye una jerarquía, algo similar a un abril genealógico con los datos, dónde comenzando desde una sola observaciones se forman subgrupos cada vez grandes; o también desde un único grupo se van haciendo grupos cada vez más pequeños hasta un valor K específico. Este viene dado por el investigador y se define usualmente de manera teórica o incluso realizando primero métodos no jerárquicos únicamente para encontrar la cantidad de clusters y para el agrupamiento utilizar las técnicas Jerarquícas conociendo el valor K. Existe dos enfoques uno Aglomerativo (de abajo hacia arriba) y otro Divisivo (de arriba hacia abajo)

-Agrupamiento Aglomerativo: Método de Vinculación Simple o Vecino más próximo, Método del, Enlace Completo o Vecino más alejado, Método del Promedio entre grupos, Método del Centroide, Método de Ward.

  • Agrupamiento Divisivo: 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
  • No requiere de especificar el número de clusters de antemano.
  • Genera un dendograma que puede mostrar claramente la forma en que se han agrupado las observaciones.
  • Suele preservar la estructura natural de los datos.
  • Útil para cuando no se conoce la cantidad de clusters posibles o inherente a los propios datos.
    • Puede necesitar mucho poder computacional para muestras grandes.
  • Es sensible a los datos atipicos y el ruido en el dataset.
  • Los subgrupos pueden tener problemas al momento de manejar grandes conjuntos de datos.
  • Los resultados pueden variar dependiendo de la medida de distancia que se elije.
  • NO JERÁRQUICOS: Es en vez de contruir una jerarquía, este análisis directamente busca la mejor manera de dividir lo datos en K subgrupos. Dónde el valor de K, debe ser elegido antes de el análisis, es como asignar grupos de trabajo, se elige quienes estarán en cuáles grupos, pero ya se sabe de ante mano la cantidad de grupos.
    • K means
  • K Medoids (PAM)
  • CLARA
    • Menos complejidad computacional.
  • Eficiente para grandes conjuntos de datos.
  • Menos sensible a como estén ordenados los datos de manera inherente.
  • Algunos Algoritmos están diseñados para problemas específicos como valores atipicos, ruido, o distintas formas de clusters.
    • Requiere un número de específico de clusters, si bien a priori no es una desventaja esto puede ser problemático en caso no se tenga una sustentación teoría que permita determina los K clusters buscados.
  • Asume formas esféricas (en los métodos más comunes como K-Means)
  • Fuente: Elaboracion propia con base en Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (1st ed.). STHDA.

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

    3.1 Métodos no Jerárquicos

    3.1.1 K-means.

    Algoritmo más utilizado en este tipo de análisis, consiste en clasificar las observaciones en múltiples cluters o subrgrupos, los cuales deben cumplir con las condiciones del análisis de conglomerados.

    1- Las observaciones en el subgrupos deben ser lo más similares posibles 2- Los subgrupos deben ser lo más distintos entre si

    Cada cluster estará representado por un centroide que no es más que la media de las observaciones del mismo.

    Su Implementación es sencilla; se seleccionan aleatoriamente K objetos como centros iniciales, se asigna cada observación al centro más cercano, lo que se repetirá varias veces hasta el punto dónde la forma de asignación no cambie.

    library(cluster)
    library(factoextra)
    
    # Preparar datos
    data("USArrests")
    df <- scale(USArrests) # Estandarizar
    
    # Estimar número óptimo de clusters
    fviz_nbclust(df, kmeans, method = "wss") +
      geom_vline(xintercept = 4, linetype = 2)

    # Computar k-means con k=4
    set.seed(123)
    km.res <- kmeans(df, 4, nstart = 25)
    
    # Visualizar resultados
    fviz_cluster(km.res, data = df,
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
             ellipse.type = "euclid",
             ggtheme = theme_minimal())

    3.1.2 K medoides (PAM, Partitioning Around Medoids)

    En este método a diferencia del primero, cada cluster estaría representado por una observación. Estos puntos se conocen como medoides, siendo un objeto dentro del subgrupo que debe ser similar a todos los demás objetos del cluster.

    Consiste en seleccionar K objetos como medoides iniciales, al hacerlo todas las observaciones deben asignarse al medoides más cercano. Para cada subgrupo se busca si un objeto distinto disminuye la disimilaridad promedio, en caso de hacerlo se selecciona como nuevo medoide, el proceso se repite hasta que en las últimas dos iteraciones no hayan cambios significativos.

    # Computar PAM con k=2
    pam.res <- pam(df, 2)
    # Resultados
    head(pam.res$clustering) # Asignaciones
    ##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
    ##          1          1          1          2          1          1
    # Visualización
    fviz_cluster(pam.res,
             palette = c("#00AFBB", "#FC4E07"),
             ellipse.type = "t",
             ggtheme = theme_classic())

    3.1.3 CLARA (Clustering

    El algoritmo CLARA es una extensión de los métodos K- medoides con el propósito de.poder manejar grandes números de observaciones con el fin de reducir su tiempo computacional. Para ello aplica un enfoque en nuestras múltiples de los datos objetivo.

    Su funcionamiento es dividir de manera aleatoria el dataset, crea múltiples conjuntos y aplica PAM a cada uno de ellos con el objetivo de seleccionar K medoides. Después sigue con el proceso usual, asignar las observaciones a los medoides más cercanos, calcula su disimilaridad promedio, y retiene aquella conjuntos con la menos disimilaridad.

    # Generar datos de ejemplo grandes
    set.seed(124)
    large_df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
                cbind(rnorm(300,50,8), rnorm(300,50,8)))
    
    # Computar CLARA
    clara.res <- clara(large_df, 2, samples = 50, pamLike = TRUE)

    3.2 Metodos Jerárquicos

    3.1.1 Vinculación simple (Single Linkage)

    Se basa con el “vecino más cercano”, dónde la distancia entre dos clusters puede definirse como la distancia mínima que hay entre dos observaciones de distintos clusters.

    • Este tienes a producir clusters alargados
    • Sensible a los datos atipicos y el ruido
    • Útil cuando no son clusters esféricos
    library(stats)
    # Matriz de distancias
    distancias <- dist(df, method = "euclidean")
    # Clúster jerárquico con vinculación simple
    hc_single <- hclust(distancias, method = "single")
    plot(hc_single, main = "Dendrograma - Vinculación Simple")

    3.1.2 Vinculación completa

    Este es el vecino más lejano, a diferencia de su versión anterior lo que se mide es la distancia máxima que hay entre un par de observaciones de diferentes clusters.

    • Produce clusters compactos y de tamaño similar
    • Menos sensible al ruido que el vecino más cercano
    • puede dividir por error clusters grandes
    hc_complete <- hclust(distancias, method = "complete")
    plot(hc_complete, main = "Dendrograma - Vinculación Completa")

    3.1.3 Vinculación promedio

    En este método se calcula la distancia entre clusters como el promedio de todas las distancias entre distintos pares de observaciones, de clusters distintos.

    • Tiene un equilibrio óptimo entre sensibilidad y robustez
    • Menos afectado por datos atípicos que los otros dos métodos de vinculación
    • Sus clusters son relativamente uniforme
    • Lo ideal es aplicarlo en dónde se tiene información previa de la forma o cantidad de clusters.
    hc_average <- hclust(distancias, method = "average")
    
    plot(hc_average,
         main = "Dendrograma - Método de Vinculación Promedio",
         xlab = "Observaciones",
         ylab = "Distancia")

    # Análisis de estabilidad con diferentes cortes
    clusters_avg_3 <- cutree(hc_average, k = 3)
    clusters_avg_4 <- cutree(hc_average, k = 4)

    3.1.4 Método del centroide

    Este método calcula la distancia entre los distintos clusters como la distancia que hay entre sus centroides.

    • Fácil interpretación conceptual
    • Produce inversiones dónde el dendrogama fusicona clusters más similares después que los clusters menos similares.
    • El uso no es tan común actualmente.
    hc_centroid <- hclust(distancias, method = "centroid")
    
    plot(hc_centroid,
         main = "Dendrograma - Método del Centroide",
         xlab = "Observaciones",
         ylab = "Distancia entre Centroides")

    3.1.5 Ward

    Este método busca minimizar la varianza que existe dentro de los distintos clusters. Fusiona aquellos clusters que producen un menor incremento en la suma total de cuadrados dentro de los grupos. En esencia se enfoca en la homigenidad interna.

    • Tiende a producir cluster de tamaño similar y muy compactos
    • Se deben eliminar los valores atipicos antes debido a que es sumamente sensible a ese tipo de datos
    • Su aplicación ideal es cuando se buscan clusters esféricos y de tamaño balanceado.
    # Cargar datos de ejemplo
    data(iris)
    datos <- iris[, 1:4]  # Usamos solo las variables numéricas
    
    # Método 1: Usando hclust con method = "ward.D2"
    distancias <- dist(datos)  # Matriz de distancias
    cluster_ward <- hclust(distancias, method = "ward.D2")
    
    # Visualizar el dendrograma
    plot(cluster_ward, main = "Dendrograma - Método Ward", 
         xlab = "Observaciones", ylab = "Distancia")
    rect.hclust(cluster_ward, k = 3, border = "red")  # Agrupar en 3 clusters

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

    4.1 Capitulo 4 K-means

    4.1.1 Cargo de datos

    # datos para la prueba k means
    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

    4.1.2 Estimar número óptimo de clusters

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

    4.1.3 K-means con k=4

    # Compute k-means with k = 4
    set.seed(123)
    km.res <- kmeans(df, 4, nstart = 25)
    # Print the results
    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"

    4.1.4 Media por cluster

    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

    4.1.5 Añadir clasificación a datos originales

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

    4.1.6 Visualización

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

    4.2 Capitulo 5: K-medoids

    4.2.1 Carga de datos

    data("USArrests") # Load the data set
    df <- scale(USArrests) # Scale the data
    head(df, n = 3) # View the firt 3 rows of the data
    ##             Murder   Assault   UrbanPop         Rape
    ## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
    ## Alaska  0.50786248 1.1068225 -1.2117642  2.484202941
    ## Arizona 0.07163341 1.4788032  0.9989801  1.042878388

    4.2.2 Estimar número óptimo de clusters

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

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

    4.2.4 Añadir clasificación

    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

    4.2.5 Clusters

    # 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

    4.2.6 Visualización

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

    4.3 Capitulo 6: CLARA

    4.3.1 Generar datos aleatorios

    set.seed(1234)
    # Generate 500 objects, divided into 2 clusters.
    df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
    cbind(rnorm(300,50,8), rnorm(300,50,8)))
    # Specify column and row names
    colnames(df) <- c("x", "y")
    rownames(df) <- paste0("S", 1:nrow(df))
    # Previewing the data
    head(df, nrow = 6)
    ##             x        y
    ## S1  -9.656526 3.881815
    ## S2   2.219434 5.574150
    ## S3   8.675529 1.484111
    ## S4 -18.765582 5.605868
    ## S5   3.432998 2.493448
    ## S6   4.048447 6.083699
    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"
    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("#00AFBB", "#FC4E07"), # color palette
    ellipse.type = "t", # Concentration ellipse
    geom = "point", pointsize = 1,
    ggtheme = theme_classic()
    )

    4.4 Capitulo 7: Clustering Aglomerativo

    4.4.1 Carga de datos

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

    4.4.2 Matriz de distancias

    # Compute the dissimilarity matrix
    # df = the standardized data
    res.dist <- dist(df, method = "euclidean")
    as.matrix(res.dist)[1:6, 1:6]
    ##             Alabama   Alaska  Arizona Arkansas California Colorado
    ## Alabama    0.000000 2.703754 2.293520 1.289810   3.263110 2.651067
    ## Alaska     2.703754 0.000000 2.700643 2.826039   3.012541 2.326519
    ## Arizona    2.293520 2.700643 0.000000 2.717758   1.310484 1.365031
    ## Arkansas   1.289810 2.826039 2.717758 0.000000   3.763641 2.831051
    ## California 3.263110 3.012541 1.310484 3.763641   0.000000 1.287619
    ## Colorado   2.651067 2.326519 1.365031 2.831051   1.287619 0.000000

    4.4.3 clustering jerárquico

    res.hc <- hclust(d = res.dist, method = "ward.D2")
    # cex: label size
    library("factoextra")
    fviz_dend(res.hc, cex = 0.5)

    4.4.4 validacion del cluster

    #Compute cophentic distance
    res.coph <- cophenetic(res.hc)
    # Correlation between cophenetic distance and
    # the original distance
    cor(res.dist, res.coph)
    ## [1] 0.6975266

    4.4.5 Dendograma

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

    4.4.6 Cortar dendongrama en 4 grupos

    # Cut tree into 4 groups
    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
    # Get the names for the members of cluster 1
    rownames(df)[grp == 1]
    ## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
    ## [5] "North Carolina" "South Carolina" "Tennessee"

    4.4.7 Visualizar grupos en dendrograma

    # Cut in 4 groups and color by groups
    fviz_dend(res.hc, k = 4, # Cut in four groups
    cex = 0.5, # label size
    k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
    color_labels_by_k = TRUE, # color labels by groups
    rect = TRUE # Add rectangle around groups
    )

    4.4.8 Visualizar en scatter plot

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

    4.4.9 Realización AGNES

    library("cluster")
    # Agglomerative Nesting (Hierarchical Clustering)
    res.agnes <- agnes(x = USArrests, # data matrix
    stand = TRUE, # Standardize the data
    metric = "euclidean", # metric for distance matrix
    method = "ward" # Linkage method
    )
    # DIvisive ANAlysis Clustering
    res.diana <- diana(x = USArrests, # data matrix
    stand = TRUE, # standardize the data
    metric = "euclidean" # metric for distance matrix
    )
    fviz_dend(res.agnes, cex = 0.6, k = 4)

    4.5 Capitulo 8

    df <- scale(USArrests)
    # Subset containing 10 rows
    set.seed(123)
    ss <- sample(1:50, 10)
    df <- df[ss,]
    library(dendextend)
    # Compute distance matrix
    res.dist <- dist(df, method = "euclidean")
    # Compute 2 hierarchical clusterings
    hc1 <- hclust(res.dist, method = "average")
    hc2 <- hclust(res.dist, method = "ward.D2")
    # Create two dendrograms
    dend1 <- as.dendrogram (hc1)
    dend2 <- as.dendrogram (hc2)
    # Create a list to hold dendrograms
    dend_list <- dendlist(dend1, dend2)
    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))
    )

    # Cophenetic correlation matrix
    cor.dendlist(dend_list, method = "cophenetic")
    ##           [,1]      [,2]
    ## [1,] 1.0000000 0.9925544
    ## [2,] 0.9925544 1.0000000
    # Baker correlation matrix
    cor.dendlist(dend_list, method = "baker")
    ##           [,1]      [,2]
    ## [1,] 1.0000000 0.9895528
    ## [2,] 0.9895528 1.0000000
    # Cophenetic correlation coefficient
    cor_cophenetic(dend1, dend2)
    ## [1] 0.9925544
    #Baker correlation coefficient
    cor_bakers_gamma(dend1, dend2)
    ## [1] 0.9895528
    # Create multiple dendrograms by chaining
    dend1 <- df %>% dist %>% hclust("complete") %>% as.dendrogram
    dend2 <- df %>% dist %>% hclust("single") %>% as.dendrogram
    dend3 <- df %>% dist %>% hclust("average") %>% as.dendrogram
    dend4 <- df %>% dist %>% hclust("centroid") %>% as.dendrogram
    # Compute correlation matrix
    dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
    "Average" = dend3, "Centroid" = dend4)
    cors <- cor.dendlist(dend_list)
    # Print correlation matrix
    round(cors, 2)
    ##          Complete Single Average Centroid
    ## Complete     1.00   0.46    0.45     0.30
    ## Single       0.46   1.00    0.23     0.17
    ## Average      0.45   0.23    1.00     0.31
    ## Centroid     0.30   0.17    0.31     1.00
    # Visualize the correlation matrix using corrplot package
    library(corrplot)
    corrplot(cors, "pie", "lower")

    4.6 Capitulo 9

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

    fviz_dend(hc, k = 4, # Cut in four groups
    cex = 0.5, # label size
    k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
    color_labels_by_k = TRUE, # color labels by groups
    ggtheme = theme_gray() # Change theme
    )

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

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

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

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

    2
    ## [1] 2
    # Create a plot of the whole dendrogram,
    # and extract the dendrogram data
    dend_plot <- fviz_dend(hc, k = 4, # Cut in four groups
    cex = 0.5, # label size
    k_colors = "jco"
    )
    dend_data <- attr(dend_plot, "dendrogram") # Extract dendrogram data
    # Cut the dendrogram at height h = 10
    dend_cuts <- cut(dend_data, h = 10)
    # Visualize the truncated version containing
    # two branches
    fviz_dend(dend_cuts$upper)

    # Plot the whole dendrogram
    print(dend_plot)

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

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

    pdf("dendrogram.pdf", width=30, height=15) # Open a PDF
    p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "jco" ) # Do plotting
    print(p)
    dev.off()
    ## png 
    ##   2
    library(dendextend)
    data <- scale(USArrests)
    dist.res <- dist(data)
    hc <- hclust(dist.res, method = "ward.D2")
    dend <- as.dendrogram(hc)
    plot(dend)

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

    library(dendextend)
    # 1. Create a customized dendrogram
    mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
    dend <- as.dendrogram(hc) %>%
    set("branches_lwd", 1) %>% # Branches line width
    set("branches_k_color", mycols, k = 4) %>% # Color branches by groups
    set("labels_colors", mycols, k = 4) %>% # Color labels by groups
    set("labels_cex", 0.5) # Change label size
    # 2. Create plot
    fviz_dend(dend)

    5. Presente un ejemplo de aplicación de Análisis de Cluster, con datos de un caso de los disponibles en (puede buscar dentro del sitio por la palabra clave “Cluster”)

    Para el ejemplo de aplicacion utlizaremos un datset llamado “2023 Global Country Development & Prosperity Index”, que contiene clasificaciones e indicadores detalldos del indice de prosperidad Legatum.

    Detalle de las variables:

    País: El nombre del país. Puntuación promedio: La puntuación promedio general del país en todos los indicadores. Seguridad: Libertad frente a conflictos, terrorismo y delincuencia. Libertad personal: Derechos a la expresión, reunión y autonomía individual. Gobernanza: Calidad de la democracia, estado de derecho y eficacia del gobierno. Capital social: Fortaleza de las relaciones personales y el compromiso cívico. Entorno de inversión: Condiciones para la inversión privada y el acceso al crédito. Condiciones empresariales: Entorno empresarial y competencia de mercado. Infraestructura de acceso al mercado: Facilidad para el comercio y calidad de la infraestructura. Calidad económica: Estabilidad macroeconómica y calidad del empleo. Condiciones de vida: Nivel de vida y acceso a servicios básicos. Salud: Salud de la población y acceso a la atención sanitaria. Educación: Calidad y accesibilidad de la educación. Medio ambiente natural: Calidad ambiental y sostenibilidad.

    Fuente: Global Change Data Lab. (2023). 2023 global country development and prosperity index [Data set]. Kaggle. https://www.kaggle.com/datasets/tarktunataalt/2023-global-country-development-and-prosperity-index/data

    5.1 Carga de datos

    library(dplyr)
    datos <- read.csv("data.csv", header = TRUE)
    #estabelciendo la columna de los paises como nombre de las observaciones 
    row.names(datos) <- datos$Country
    # removiendo la columna de country
    datos_num <- datos[, -1] 
    # normalizando los datos antes de usarlo
    datos_est <- scale(datos_num) %>% as.data.frame() 
    head(datos_est)
    ##               AveragScore SafetySecurity PersonelFreedom Governance
    ##  Denmark         1.990522       1.444937        1.871016   2.202597
    ##  Sweden          1.924406       1.352589        1.761046   2.031302
    ##  Norway          1.918395       1.485411        1.871518   2.214430
    ##  Finland         1.909380       1.272211        1.764059   2.256691
    ##   Switzerland    1.905623       1.619943        1.540103   2.102299
    ##  Netherlands     1.822978       1.365130        1.669656   2.083705
    ##               SocialCapital InvestmentEnvironment EnterpriseConditions
    ##  Denmark           2.714033              1.756261             1.929792
    ##  Sweden            2.301498              1.779553             1.611374
    ##  Norway            2.372991              1.745511             1.643216
    ##  Finland           2.202953              1.857792             1.744178
    ##   Switzerland      1.417495              1.660106             2.255976
    ##  Netherlands       1.889929              1.857194             1.887077
    ##               MarketAccessInfrastructure EconomicQuality LivingConditions
    ##  Denmark                        1.499798        1.879779         1.314592
    ##  Sweden                         1.555322        1.832861         1.292316
    ##  Norway                         1.315559        1.912547         1.260422
    ##  Finland                        1.498536        1.393475         1.248272
    ##   Switzerland                   1.490964        2.095749         1.258397
    ##  Netherlands                    1.627881        1.695832         1.319148
    ##                 Health Education NaturalEnvironment
    ##  Denmark      1.114526  1.461263          1.9542822
    ##  Sweden       1.222888  1.381991          2.4840098
    ##  Norway       1.285577  1.369795          1.7810172
    ##  Finland      1.125272  1.506997          2.4012398
    ##   Switzerland 1.207663  1.473459          1.9167599
    ##  Netherlands  1.202290  1.407907          0.6906613

    5.2 Analisis de valores atipicos para su posterior eliminacion antes de realizar el analisis de conglomerados jerarquico.

    library(dplyr)
    library(kableExtra)
    # Calcular distancia de Mahalanobis (D²)
    datos_numericos <- datos_est 
    medias <- colMeans(datos_numericos)
    matriz_cov <- cov(datos_numericos)
    distancias_mh <- mahalanobis(datos_numericos, center = medias, cov = matriz_cov) 
    # Grados de libertad (número de variables)
    df <- ncol(datos_numericos)
    # Calcular valor p (probabilidad chi-cuadrado)
    valores_p <- 1 - pchisq(distancias_mh, df = df)
    # Identificar outliers (α = 0.05)
    es_outlier <- distancias_mh > qchisq(0.95, df = df)
    # Crear cuadro de resultados
    resultados_completos <- data.frame(
      valor_mh = distancias_mh,
      Valor_P = valores_p,
      Es_Outlier = ifelse(es_outlier, "Si", "No")
    )
    
    # mostrar cuadro de resultados usando la libreria Kable
    
    kable(resultados_completos,
          caption = "cuadro final",
          col.names = c("pais", "valor mh", "valor p", "outlier")) %>% 
      kable_styling(bootstrap_options = c("striped","hover")) %>%
      row_spec(which(resultados_completos$Es_Outlier == "Si"),
               background = "#64454345", bold = TRUE)  
    cuadro final
    pais valor mh valor p outlier
     Denmark 9.485488 0.7353687 No
     Sweden 8.969306 0.7752578 No
     Norway 10.293072 0.6698111 No
     Finland 11.295013 0.5861183 No
      Switzerland 10.025625 0.6918376 No
     Netherlands 6.924262 0.9060123 No
     Luxembourg 9.876278 0.7040189 No
     Iceland 7.114268 0.8961672 No
     Germany 7.269726 0.8877215 No
     New Zealand 12.532614 0.4845262 No
     Ireland 8.839956 0.7849207 No
     United Kingdom 6.205984 0.9383337 No
     Canada 8.798143 0.7880122 No
     Austria 5.008319 0.9750095 No
     Australia 8.385927 0.8175810 No
     Japan 19.726846 0.1022337 No
     Singapore 17.143901 0.1928090 No
     Belgium 7.236985 0.8895291 No
     United States 16.241545 0.2363323 No
     Taiwan 12.396656 0.4954169 No
     Estonia 7.298469 0.8861221 No
     Hong Kong 14.038663 0.3711268 No
     France 7.742019 0.8599916 No
     Spain 8.000141 0.8435911 No
     Czech Republic 9.694001 0.7187450 No
     Portugal 6.907573 0.9068516 No
     Slovenia 8.506841 0.8090867 No
     Malta 10.405422 0.6604929 No
     South Korea 16.380826 0.2291754 No
     Italy 7.522951 0.8732324 No
     Latvia 8.838146 0.7850548 No
     Lithuania 12.567853 0.4817179 No
     Israel 15.332242 0.2870732 No
     Cyprus 5.845964 0.9515796 No
     Slovakia 6.398867 0.9304247 No
     Chile 4.385701 0.9863541 No
     Poland 5.221052 0.9699990 No
     Uruguay 13.350291 0.4211328 No
     Costa Rica 6.099177 0.9424688 No
     Greece 16.841476 0.2066526 No
     Croatia 11.696499 0.5526742 No
     Hungary 10.697042 0.6361807 No
     Malaysia 8.741648 0.7921637 No
     United Arab Emirates 14.129165 0.3648108 No
     Romania 9.039628 0.7699441 No
     Qatar 18.406386 0.1426898 No
     Mauritius 10.921146 0.6174235 No
     Bulgaria 4.264945 0.9880327 No
     Montenegro 10.061707 0.6888807 No
     Panama 15.464875 0.2792367 No
     Seychelles 8.989711 0.7737202 No
     Serbia 9.097428 0.7655460 No
     Georgia 8.267639 0.8257374 No
     China 18.456255 0.1409514 No
     Macedonia 8.554596 0.8056897 No
     Trinidad and Tobago 5.682533 0.9569479 No
     Jamaica 9.299164 0.7499923 No
     Argentina 10.594364 0.6447575 No
     Peru 8.743220 0.7920486 No
     Kuwait 6.863813 0.9090327 No
     Armenia 8.561654 0.8051856 No
     Bahrain 20.169549 0.0910625 No
     Indonesia 4.801444 0.9793078 No
     Thailand 13.335827 0.4222189 No
     Albania 6.769982 0.9136129 No
     Brazil 13.525135 0.4081146 No
     Oman 11.147787 0.5984385 No
     Dominican Republic 6.063443 0.9438135 No
     Kazakhstan 15.039167 0.3049141 No
     Moldova 8.468989 0.8117625 No
     Mexico 14.869652 0.3155607 No
     Bosnia and Herzegovina 11.527367 0.5667271 No
     Vietnam 18.110066 0.1533849 No
     Ukraine 22.753677 0.0447290 Si
     South Africa 17.535046 0.1759844 No
     Paraguay 8.943829 0.7771725 No
     Russia 15.608511 0.2709177 No
     Belarus 22.219227 0.0520567 No
     Saudi Arabia 10.504497 0.6522506 No
     Cabo Verde 15.842011 0.2577666 No
     Colombia 15.608509 0.2709179 No
     Suriname 17.867455 0.1626173 No
     Botswana 13.014237 0.4467125 No
     Philippines 14.521591 0.3381623 No
     Ecuador 7.852749 0.8530592 No
     Jordan 17.210510 0.1898586 No
     São Tomé and Príncipe 13.969650 0.3759849 No
     Mongolia 18.101648 0.1536980 No
     Guyana 9.268884 0.7523463 No
     Namibia 8.883306 0.7816987 No
     Sri Lanka 10.968782 0.6134330 No
     Azerbaijan 11.098413 0.6025735 No
     Belize 9.670987 0.7205921 No
     Kyrgyzstan 7.194946 0.8918275 No
     Turkey 13.018718 0.4463669 No
     Morocco 22.718311 0.0451835 Si
     El Salvador 7.167563 0.8933110 No
     Ghana 8.667901 0.7975374 No
     Tunisia 11.653109 0.5562732 No
     Uzbekistan 15.510707 0.2765633 No
     Guatemala 10.060318 0.6889946 No
     Senegal 13.821066 0.3865651 No
     India 12.761192 0.4664226 No
     Cuba 22.479161 0.0483679 Si
     Honduras 16.035015 0.2472442 No
     Bolivia 7.740119 0.8601092 No
     Turkmenistan 26.663591 0.0138286 Si
     Kenya 12.628401 0.4769070 No
     Algeria 16.105911 0.2434580 No
       Nepal 5.240696 0.9695052 No
     Rwanda 22.710153 0.0452890 Si
     Lebanon 22.600446 0.0467285 Si
     Tajikistan 14.677923 0.3278885 No
     Nicaragua 10.840853 0.6241479 No
     Laos 22.908637 0.0427858 Si
     Gambia 15.407822 0.2825895 No
     Tanzania 7.231436 0.8898339 No
     Cambodia 20.030392 0.0944550 No
     Gabon 9.105593 0.7649226 No
     Côte d’Ivoire 7.320512 0.8848876 No
     Egypt 17.362240 0.1832692 No
     Djibouti 8.726224 0.7932919 No
     Benin 13.209626 0.4317531 No
     Bangladesh 9.654656 0.7219010 No
     Malawi 13.796656 0.3883188 No
     Iran 19.156345 0.1183354 No
     Zambia 12.790961 0.4640852 No
     Comoros 13.528949 0.4078330 No
     Uganda 8.168532 0.8324499 No
     Papua New Guinea 9.908968 0.7013609 No
     Equatorial Guinea 22.633298 0.0462932 Si
     Lesotho 29.306782 0.0059204 Si
     Togo 6.798593 0.9122302 No
     Swaziland 15.621437 0.2701777 No
     Burkina Faso 13.820153 0.3866306 No
     Pakistan 14.827906 0.3182191 No
     Madagascar 12.039774 0.5243851 No
     Liberia 17.592735 0.1736041 No
     Zimbabwe 20.568095 0.0819223 No
     Iraq 22.302081 0.0508544 No
     Guinea 12.166868 0.5140104 No
     Nigeria 10.247698 0.6735646 No
     Myanmar  23.575423 0.0352677 Si
     Sierra Leone 8.721397 0.7936445 No
     Venezuela 28.322443 0.0081572 Si
     Libya 19.857835 0.0988122 No
     Cameroon 13.663309 0.3979753 No
     Congo 9.144111 0.7619744 No
     Guinea-Bissau 16.080888 0.2447895 No
     Mozambique 9.974557 0.6960136 No
     Mali 17.179411 0.1912317 No
     Niger 14.358482 0.3490910 No
     Ethiopia 17.235190 0.1887744 No
     Mauritania 16.782758 0.2094264 No
     Angola 18.381636 0.1435591 No
     Haiti 15.388525 0.2837297 No
     Burundi 16.272358 0.2347350 No
     Sudan 13.630317 0.4003841 No
     Syria 31.729456 0.0026342 Si
     Eritrea 16.608896 0.2178053 No
     Democratic Republic of Congo 11.771804 0.5464389 No
     Chad 16.091784 0.2442091 No
     Somalia 9.987385 0.6949656 No
     Afghanistan 12.651706 0.4750603 No
     Central African Republic 21.596236 0.0619423 No
     Yemen 8.319837 0.8221573 No
     South Sudan 27.192257 0.0117080 Si

    5.3 Eliminando los valores atipicos encontrados. (se puede omitir simplemente no ejecutando el chunk)

    DF <- cbind(es_outlier, datos_est) 
    # Si se decide excluir outliers para análisis posteriores
    df <- DF [!es_outlier, ] 
    df <- df[, -1]
    
    head(df)
    ##               AveragScore SafetySecurity PersonelFreedom Governance
    ##  Denmark         1.990522       1.444937        1.871016   2.202597
    ##  Sweden          1.924406       1.352589        1.761046   2.031302
    ##  Norway          1.918395       1.485411        1.871518   2.214430
    ##  Finland         1.909380       1.272211        1.764059   2.256691
    ##   Switzerland    1.905623       1.619943        1.540103   2.102299
    ##  Netherlands     1.822978       1.365130        1.669656   2.083705
    ##               SocialCapital InvestmentEnvironment EnterpriseConditions
    ##  Denmark           2.714033              1.756261             1.929792
    ##  Sweden            2.301498              1.779553             1.611374
    ##  Norway            2.372991              1.745511             1.643216
    ##  Finland           2.202953              1.857792             1.744178
    ##   Switzerland      1.417495              1.660106             2.255976
    ##  Netherlands       1.889929              1.857194             1.887077
    ##               MarketAccessInfrastructure EconomicQuality LivingConditions
    ##  Denmark                        1.499798        1.879779         1.314592
    ##  Sweden                         1.555322        1.832861         1.292316
    ##  Norway                         1.315559        1.912547         1.260422
    ##  Finland                        1.498536        1.393475         1.248272
    ##   Switzerland                   1.490964        2.095749         1.258397
    ##  Netherlands                    1.627881        1.695832         1.319148
    ##                 Health Education NaturalEnvironment
    ##  Denmark      1.114526  1.461263          1.9542822
    ##  Sweden       1.222888  1.381991          2.4840098
    ##  Norway       1.285577  1.369795          1.7810172
    ##  Finland      1.125272  1.506997          2.4012398
    ##   Switzerland 1.207663  1.473459          1.9167599
    ##  Netherlands  1.202290  1.407907          0.6906613

    5.4 Calculo de la matriz de distancias usando el metodo “euclidean”

    # Distancias entre las observaciones
    matriz.dis.euclid.caso3 <- dist(df, method = "euclidean", diag = FALSE)

    5.6 Aplicando y graficando el cluster del metodo Ward.D2

    # metodo "ward"
    hclust.ward.caso3 <- hclust(matriz.dis.euclid.caso3, method = "ward.D2")
    # Gráfico
    ward <- plot(hclust.ward.caso3 )

    5.7 Aplicando y graficando el cluster del metodo average

    # Metodo "average"
    hclust.average.caso3 <- hclust(matriz.dis.euclid.caso3, method = "average")
    # Grafica
    average <- plot(hclust.average.caso3)

    5.8 Aplicando y graficando el cluster del metodo complete

    # método "complete"
    hclust.complete.caso3 <- hclust(matriz.dis.euclid.caso3, method = "complete")
    
    # Gráfica 
    complete <- plot(hclust.complete.caso3)

    5.9 Aplicando y graficando el cluster del metodo single

    # método "single"
    hclust.single.caso3 <- hclust(matriz.dis.euclid.caso3, method = "single")
    
    # Gráfica 
    single <- plot(hclust.single.caso3)

    5.10 Aplicando y graficando el cluster del metodo centroid

    # método centroid
    hclust.centroid.caso3 <- hclust(matriz.dis.euclid.caso3, method = "centroid")
    
    # Gráfica 
    plot(hclust.centroid.caso3)

    Con los dendogramas podemos ver que los algoritmos de centroid y single, estan visiblemente distorsionados; por lo tanto utilizaremos los algoritmos de complete, average y ward.D2. Para determinar el numero de clusters optimo, utilizando posteriormente el analisis no jerarquico para agrupar las observaciones.

    5.11 analisis jerarquito usando los metodos seleccionados para determinar la cantidad de clusters optima usando la regla del ala mayoria

    library(NbClust)
    Datos.NbClust <- df
    
    res.wardD2 <- NbClust (Datos.NbClust, distance = "euclidean" , min.nc=2, max.nc = 15, method = "ward.D2" )

    ## *** : The Hubert index is a graphical method of determining the number of clusters.
    ##                 In the plot of Hubert index, we seek a significant knee that corresponds to a 
    ##                 significant increase of the value of the measure i.e the significant peak in Hubert
    ##                 index second differences plot. 
    ## 

    ## *** : The D index is a graphical method of determining the number of clusters. 
    ##                 In the plot of D index, we seek a significant knee (the significant peak in Dindex
    ##                 second differences plot) that corresponds to a significant increase of the value of
    ##                 the measure. 
    ##  
    ## ******************************************************************* 
    ## * Among all indices:                                                
    ## * 6 proposed 2 as the best number of clusters 
    ## * 12 proposed 3 as the best number of clusters 
    ## * 2 proposed 7 as the best number of clusters 
    ## * 1 proposed 13 as the best number of clusters 
    ## * 1 proposed 15 as the best number of clusters 
    ## 
    ##                    ***** Conclusion *****                            
    ##  
    ## * According to the majority rule, the best number of clusters is  3 
    ##  
    ##  
    ## *******************************************************************
    res.average <- NbClust (Datos.NbClust, distance = "euclidean" , min.nc=2, max.nc = 15, method = "average" , index = "alllong")

    ## *** : The Hubert index is a graphical method of determining the number of clusters.
    ##                 In the plot of Hubert index, we seek a significant knee that corresponds to a 
    ##                 significant increase of the value of the measure i.e the significant peak in Hubert
    ##                 index second differences plot. 
    ## 

    ## *** : The D index is a graphical method of determining the number of clusters. 
    ##                 In the plot of D index, we seek a significant knee (the significant peak in Dindex
    ##                 second differences plot) that corresponds to a significant increase of the value of
    ##                 the measure. 
    ##  
    ## ******************************************************************* 
    ## * Among all indices:                                                
    ## * 7 proposed 2 as the best number of clusters 
    ## * 12 proposed 3 as the best number of clusters 
    ## * 2 proposed 6 as the best number of clusters 
    ## * 1 proposed 7 as the best number of clusters 
    ## * 2 proposed 10 as the best number of clusters 
    ## * 3 proposed 15 as the best number of clusters 
    ## 
    ##                    ***** Conclusion *****                            
    ##  
    ## * According to the majority rule, the best number of clusters is  3 
    ##  
    ##  
    ## *******************************************************************
    res.complete <- NbClust (Datos.NbClust, distance = "euclidean" , min.nc=2, max.nc = 15, method = "complete" , index = "alllong")

    ## *** : The Hubert index is a graphical method of determining the number of clusters.
    ##                 In the plot of Hubert index, we seek a significant knee that corresponds to a 
    ##                 significant increase of the value of the measure i.e the significant peak in Hubert
    ##                 index second differences plot. 
    ## 

    ## *** : The D index is a graphical method of determining the number of clusters. 
    ##                 In the plot of D index, we seek a significant knee (the significant peak in Dindex
    ##                 second differences plot) that corresponds to a significant increase of the value of
    ##                 the measure. 
    ##  
    ## ******************************************************************* 
    ## * Among all indices:                                                
    ## * 6 proposed 2 as the best number of clusters 
    ## * 12 proposed 3 as the best number of clusters 
    ## * 4 proposed 7 as the best number of clusters 
    ## * 5 proposed 15 as the best number of clusters 
    ## 
    ##                    ***** Conclusion *****                            
    ##  
    ## * According to the majority rule, the best number of clusters is  3 
    ##  
    ##  
    ## *******************************************************************

    Podemo concluir con el analisis que la cantidad optima de cluseters que el dataset posee es de 3, ya que los tres metodos seleccionados concordaron en el numero utilizando la regla de la mayoria

    5.12 Aplicando k means

    Para continuar esta vez sabiendo que K =3, utilizamos K medias para determinar que observaciones van en cada cluster

    5.13Visualizacion del metodo K medias

    km <- kmeans(datos_est, centers = 3, nstart = 25)
    datos$cluster <- km$cluster
    pca <- prcomp(datos_est, scale. = TRUE)
    pca <- prcomp(datos_est, scale. = TRUE)
    library(ggplot2)
    df_pca <- as.data.frame(pca$x[, 1:2])
    df_pca$cluster <- as.factor(km$cluster)
    df_pca$pais <- row.names(datos_est)
    
    ggplot(df_pca, aes(x = PC1, y = PC2, color = cluster)) +
      geom_point(size = 2.5) +
      stat_ellipse(level = 0.95, linewidth = 1) +
      theme_minimal() +
      labs(title = "Clusters K-means con elipses de confianza (95%)") +
      scale_color_brewer(palette = "Dark2")

    n <- table(km$cluster)

    Aplicando k-means, podemos observar que los paises han sido particionados en tres grupos

    Para el cluster 1, el metodo k-means agrupo 42 paises son los pertenecientes.

    Para el cluster 2, el metodo k-menas agrupo 76 paises son los pertenecientes.

    Para el cluster 3, el metodo k-means agrupo 49 paises son los pertenencientes.

    5.14 Aplicando k medoids (PAM)

    Para continuar aplicaremos PAM esta vez sabiendo que K =3, asi determinar que observaciones van en cada cluster.

    library(cluster)
    pam_result <- pam(datos_est, k = 3)
    
    datos$pam_cluster <- pam_result$clustering
    
    df_pca$pam_cluster <- as.factor(pam_result$clustering)
    
    ggplot(df_pca, aes(x = PC1, y = PC2, color = pam_cluster)) +
      geom_point(size = 2.5) +
      stat_ellipse(level = 0.95, linewidth = 1) +
      theme_minimal() +
      labs(title = "Clusters PAM (K-medoids) con elipses de confianza (95%)") +
      scale_color_brewer(palette = "Dark2")

    medoids_paises <- row.names(datos_est)[pam_result$id.med]
    
    n_pam <- table(pam_result$clustering)

    5.15 comparamos ambos metodos para saber que observaciones se mantienen en el mismo grupo en cada metodo.

    # Crear tabla comparativa
    comparacion <- data.frame(
      Pais = row.names(datos_est),
      Kmeans = datos$cluster,
      PAM = datos$pam_cluster,
      Coincide = ifelse(datos$cluster == datos$pam_cluster, "Si", "No")
    ) 
    head(comparacion)
    ##            Pais Kmeans PAM Coincide
    ## 1       Denmark      1   1       Si
    ## 2        Sweden      1   1       Si
    ## 3        Norway      1   1       Si
    ## 4       Finland      1   1       Si
    ## 5   Switzerland      1   1       Si
    ## 6   Netherlands      1   1       Si
    # Porcentaje de coincidencia
    porcentaje_coincidencia <- mean(comparacion$Coincide == "Si") * 100
    cat("Porcentaje de coincidencia entre K-means y PAM:", round(porcentaje_coincidencia, 2), "%\n")
    ## Porcentaje de coincidencia entre K-means y PAM: 87.43 %

    Global Change Data Lab. (2023). 2023 global country development and prosperity index [Data set]. Kaggle. https://www.kaggle.com/datasets/tarktunataalt/2023-global-country-development-and-prosperity-index/data

    Aldás-Manzano, Joaquín, and Ezequiel Uriel Jiménez. 2017. Análisis Multivariante Aplicado Con r. 2ª ed. Madrid: Paraninfo,.
    Kassambara, Alboukadel. 2017. Practical Guide to Principal Component Methods in r: PCA, m (CA), FAMD, MFA, HCPC, Factoextra. Vol. 2. STHDA.