Paso 1

data <- read.csv("Size of the economy.csv")
library(dendextend)
library(factoextra)

rownames(data) <- data$Country
data <- data[, -1]

data2 <- na.omit(data)

datos <- read.csv("Size of the economy.csv", row.names = 1)
pattern1 <- ",| and | y |World|Continent"
datos <- datos[!grepl(pattern1, rownames(datos), ignore.case = TRUE), ]

datos <- datos[!grepl("income", rownames(datos), ignore.case = TRUE), ]

pattern2 <- "Africa|Asia|Europe|America|Oceania"
data3 <- datos[!grepl(pattern2, rownames(datos), ignore.case = TRUE), ]
data3 <- na.omit(data3)
data.scaled <- scale(x = data3,
                     center = TRUE,
                     scale = TRUE)
head(data.scaled)
##             Population..millions. Surface_area Population_density
## Afghanistan           -0.01458144  -0.03390469         -0.2495863
## Albania               -0.25245636  -0.34216544         -0.1825519
## Algeria                0.01143714   0.82002467         -0.3130866
## Angola                -0.05027876   0.25940509         -0.2999762
## Argentina              0.02184059   1.01693103         -0.3156303
## Armenia               -0.25258842  -0.34167646         -0.1902392
##             Gross_national_income Purchasing_power_parity
## Afghanistan           -0.22206679             -0.24910854
## Albania               -0.22141475             -0.25717740
## Algeria               -0.15820351             -0.09232226
## Angola                -0.20315155             -0.20141276
## Argentina             -0.02914326              0.09222748
## Armenia               -0.22301383             -0.25773167
##             Gross_domestic_product
## Afghanistan             -4.2026167
## Albania                  0.8525226
## Algeria                 -0.3497718
## Angola                  -0.9486374
## Argentina                0.8262522
## Armenia                  0.3434805
dist      <- dist(data.scaled,method = "euclidean")
# matriz de distancias
dist_mat  <- as.matrix(round(dist,3))
as.dist(dist_mat[1:6,1:6])
##           Afghanistan Albania Algeria Angola Argentina
## Albania         5.071                                 
## Algeria         3.951   1.707                         
## Angola          3.268   1.914   0.831                 
## Argentina       5.153   1.449   1.214  1.961          
## Armenia         4.563   0.509   1.395  1.445     1.526

Se importo la base de datos y se estandarizaron las variables para que todas tuvieran la misma escala, evitando que las de mayor magnitud dominaran el análisis. Esto permite que la distancia entre observaciones sea comparable.

Paso 2

fviz_nbclust(data.scaled, FUN = hcut, method = "silhouette")

fviz_nbclust(data.scaled, FUN = hcut, method = "wss")

modelo2 <- hclust(dist, method = "complete")

fviz_dend(modelo2, cex = 0.8, lwd = 0.8, k = 4,
          # Seleccionando manualmente los colores
          k_colors = c("red", "green3", "blue", "magenta"),
          rect = TRUE, 
          rect_border = "gray", 
          rect_fill = FALSE)

La gráfica muestra un dendrograma jerárquico que agrupa 210 países según similitudes económicas. Al cortar a una altura cercana a 11, se forman cuatro clústeres, donde uno (color magenta) concentra alrededor de 168 países con perfiles económicos similares, mientras los otros tres agrupan países atípicos o extremos, como grandes economías. La estructura es desbalanceada, con pocos países muy distintos al resto. El dendrograma también permite identificar outliers claros y sugiere visualmente un número óptimo de clústeres, siendo útil para análisis comparativos, segmentación económica y estrategias internacionales.

grupos<-cutree(modelo2, k=4) 
table(grupos)
## grupos
##   1   2   3   4 
## 168   2   1   1
grupos<-cutree(modelo2, k=4) 
table(grupos)
## grupos
##   1   2   3   4 
## 168   2   1   1
grupos_2 <- cbind(data3,grupos)
library(NbClust)

set.seed(1234)

res.nbclust <- NbClust(data.scaled, 
                       distance = "euclidean",
                       min.nc = 2, 
                       max.nc = 10, 
                       method = "complete", 
                       index = "all")

## *** : 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 
## * 5 proposed 3 as the best number of clusters 
## * 1 proposed 4 as the best number of clusters 
## * 1 proposed 5 as the best number of clusters 
## * 4 proposed 6 as the best number of clusters 
## * 2 proposed 7 as the best number of clusters 
## * 3 proposed 9 as the best number of clusters 
## * 2 proposed 10 as the best number of clusters 
## 
##                    ***** Conclusion *****                            
##  
## * According to the majority rule, the best number of clusters is  2 
##  
##  
## *******************************************************************

Se utilizó una matriz de distancias y se aplicó el método de enlace para construir el dendrograma. La visualización permitió observar estructuras jerárquicas y relaciones entre sectores.

Paso 3

library(clValid)

validclus <- clValid(data.scaled,
                     nClust = 2:5,
                     clMethods = c("kmeans", "diana", "fanny", "pam", "clara", "agnes"),
                     validation = "internal")
summary(validclus)
## 
## Clustering Methods:
##  kmeans diana fanny pam clara agnes 
## 
## Cluster sizes:
##  2 3 4 5 
## 
## Validation Measures:
##                            2       3       4       5
##                                                     
## kmeans Connectivity   6.1869  9.1159 14.2984 14.8984
##        Dunn           0.5169  0.6093  0.2030  0.2541
##        Silhouette     0.8578  0.8500  0.7277  0.7281
## diana  Connectivity   3.9579  6.8869  9.7159 14.8984
##        Dunn           0.5982  0.8016  0.7306  0.2541
##        Silhouette     0.8709  0.8497  0.8207  0.7281
## fanny  Connectivity  43.2933      NA      NA      NA
##        Dunn           0.0058      NA      NA      NA
##        Silhouette     0.1774      NA      NA      NA
## pam    Connectivity  39.2706 40.0036 76.7337 66.5643
##        Dunn           0.0050  0.0077  0.0081  0.0046
##        Silhouette     0.2568  0.2693  0.2060  0.2564
## clara  Connectivity  34.4413 60.7571 63.5341 71.0825
##        Dunn           0.0066  0.0030  0.0041  0.0059
##        Silhouette     0.2604  0.1417  0.2258  0.2312
## agnes  Connectivity   3.9579  6.8869  9.7159 11.7159
##        Dunn           0.5982  0.8016  0.7306  0.7224
##        Silhouette     0.8709  0.8497  0.8207  0.8175
## 
## Optimal Scores:
## 
##              Score  Method Clusters
## Connectivity 3.9579 diana  2       
## Dunn         0.8016 diana  3       
## Silhouette   0.8709 diana  2
library(ggplot2)
library(factoextra)

dist <- dist(data.scaled, method = "euclidean")

modelo <- hclust(dist, method = "complete")

# Visualizar el dendrograma con 2 clústeres
fviz_dend(modelo, cex = 0.5, k = 2,                 
          rect = TRUE,            
          rect_fill = TRUE,
          horiz = TRUE,          
          ggtheme = theme_bw())  

Se aplicaron métodos visuales como la inspección del dendrograma y métricas de validación para decidir cuántos grupos cortar. Esto ayudó a definir la estructura más estable y coherente. Se agrupa 210 países por similitud económica y revela una estructura fuertemente desbalanceada. La gran mayoría de los países comparten características similares y se agrupan a alturas bajas, mientras que Estados Unidos, China, India y Rusia se unen a alturas muy altas, evidenciando que son económicamente distintos del resto del mundo. Esta gráfica permite identificar visualmente los grupos homogéneos y los outliers, lo cual es útil para hacer segmentaciones y análisis comparativos más precisos.

Paso 4

dist<- dist(data.scaled,method = "euclidean")
# matriz de distancias
dist_mat<- as.matrix(round(dist,3))
as.dist(dist_mat[1:6,1:6])
##           Afghanistan Albania Algeria Angola Argentina
## Albania         5.071                                 
## Algeria         3.951   1.707                         
## Angola          3.268   1.914   0.831                 
## Argentina       5.153   1.449   1.214  1.961          
## Armenia         4.563   0.509   1.395  1.445     1.526

Una vez definido el número de clústeres= 4, se cortó el dendrograma para asignar cada sector económico a un grupo. Estos grupos representaron conjuntos de sectores con patrones similares en términos de su nivel de empleo y otras variables.

Paso 5: graficas

fviz_nbclust(data.scaled, FUN = hcut, method = "silhouette")

Según este gráfico, el número óptimo de clústeres es 2, ya que es donde se obtiene el mayor valor del promedio de silueta, lo que indica que los países se separan de forma más clara y coherente en dos grupos distintos. A partir de k=3 en adelante, el valor del ancho de silueta disminuye progresivamente, lo que sugiere que aumentar la cantidad de clústeres reduce la calidad de la segmentación.

fviz_nbclust(data.scaled, FUN = hcut, method = "wss")

Esta gráfica del método del codo muestra que la mayor reducción en la variabilidad interna ocurre entre k=1 y k=2, y luego la mejora se vuelve menos significativa. El “codo” se forma en k=2, lo que indica que 2 es el número óptimo de clústeres, ya que ofrece un buen balance entre simplicidad y agrupación efectiva.

modelo2 <- hclust(dist, method = "complete")

fviz_dend(modelo2, cex = 0.8, lwd = 0.8, k = 4,
# Seleccionando manualmente los colores
k_colors = c("red", "green3", "blue", "magenta"),
rect = TRUE, 
rect_border = "gray", 
rect_fill = FALSE)

grupos<-cutree(modelo2, k=4) 
table(grupos)
## grupos
##   1   2   3   4 
## 168   2   1   1
grupos<-cutree(modelo2, k=4) 
table(grupos)
## grupos
##   1   2   3   4 
## 168   2   1   1
grupos_2 <- cbind(data3,grupos)

El análisis de clúster jerárquico permitió clasificar las observaciones del conjunto de datos económicos según similitudes en sus variables estandarizadas. A través del dendrograma y el corte en cuatro grupos, se identificaron clústeres que reflejan patrones distintos, aunque altamente desbalanceados: el Grupo 1 concentró 168 observaciones, mientras que los grupos 2, 3 y 4 estuvieron conformados por 2, 1 y 1 observaciones, respectivamente. Esta segmentación revela que existe una estructura dominante en los datos, donde la mayoría de las observaciones comparten características económicas similares, mientras que unas pocas presentan comportamientos atípicos. La metodología resultó útil para explorar la organización natural de los datos sin necesidad de definir previamente el número de clústeres, lo cual permitió detectar tanto núcleos comunes como posibles outliers que podrían ser analizados con mayor profundidad.

Metodo de Particionamiento

Paso 1

library(NbClust)

set.seed(1234)

res.nbclust <- NbClust(data.scaled, 
                       distance = "euclidean",
                       min.nc = 2, 
                       max.nc = 10, 
                       method = "complete", 
                       index = "all")

## *** : 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 
## * 5 proposed 3 as the best number of clusters 
## * 1 proposed 4 as the best number of clusters 
## * 1 proposed 5 as the best number of clusters 
## * 4 proposed 6 as the best number of clusters 
## * 2 proposed 7 as the best number of clusters 
## * 3 proposed 9 as the best number of clusters 
## * 2 proposed 10 as the best number of clusters 
## 
##                    ***** Conclusion *****                            
##  
## * According to the majority rule, the best number of clusters is  2 
##  
##  
## *******************************************************************

Se estandarizaron las variables para asegurar que todas contribuyeran por igual al análisis, evitando que las de mayor magnitud dominaran el proceso de agrupamiento. La estadística de Hubert muestra una caída en k=6, la consistencia con los métodos de silueta y codo, junto con la clara separación observada en el dendrograma, apoya que 2 clústeres representan la segmentación más clara y útil para este conjunto de datos. Esta elección permite distinguir con precisión entre la mayoría de los países con economías similares y un grupo reducido de outliers económicos.

Paso 2

library(clValid)

validclus <- clValid(data.scaled,
                     nClust = 2:5,
                     clMethods = c("kmeans", "diana", "fanny", "pam", "clara", "agnes"),
                     validation = "internal")

Se aplicaron varios métodos de particionamiento utilizando la función clValid. Este análisis comparativo permitió evaluar la calidad de cada método según métricas como conectividad, índice de Dunn y silueta promedio, determinando qué algoritmo generaba los grupos más consistentes.

Paso 3: Mostrar resumen de los resultados

summary(validclus)
## 
## Clustering Methods:
##  kmeans diana fanny pam clara agnes 
## 
## Cluster sizes:
##  2 3 4 5 
## 
## Validation Measures:
##                            2       3       4       5
##                                                     
## kmeans Connectivity   6.1869  9.1159 14.2984 14.8984
##        Dunn           0.5169  0.6093  0.2030  0.2541
##        Silhouette     0.8578  0.8500  0.7277  0.7281
## diana  Connectivity   3.9579  6.8869  9.7159 14.8984
##        Dunn           0.5982  0.8016  0.7306  0.2541
##        Silhouette     0.8709  0.8497  0.8207  0.7281
## fanny  Connectivity  43.2933      NA      NA      NA
##        Dunn           0.0058      NA      NA      NA
##        Silhouette     0.1774      NA      NA      NA
## pam    Connectivity  39.2706 40.0036 76.7337 66.5643
##        Dunn           0.0050  0.0077  0.0081  0.0046
##        Silhouette     0.2568  0.2693  0.2060  0.2564
## clara  Connectivity  34.4413 60.7571 63.5341 71.0825
##        Dunn           0.0066  0.0030  0.0041  0.0059
##        Silhouette     0.2604  0.1417  0.2258  0.2312
## agnes  Connectivity   3.9579  6.8869  9.7159 11.7159
##        Dunn           0.5982  0.8016  0.7306  0.7224
##        Silhouette     0.8709  0.8497  0.8207  0.8175
## 
## Optimal Scores:
## 
##              Score  Method Clusters
## Connectivity 3.9579 diana  2       
## Dunn         0.8016 diana  3       
## Silhouette   0.8709 diana  2
library(ggplot2)
library(factoextra)

dist <- dist(data.scaled, method = "euclidean")

modelo <- hclust(dist, method = "complete")

Se seleccionó el mejor método y se utilizó para asignar a cada sector económico un clúster específico. Esta clasificación permitió organizar los sectores en grupos homogéneos, facilitando su análisis.

Paso 4: Visualizar el dendrograma con 2 clústeres

fviz_dend(modelo, cex = 0.5, k = 2,
rect = TRUE,
rect_fill = TRUE,
horiz = TRUE,
ggtheme = theme_bw())

Se graficaron los clústeres generados para interpretar visualmente cómo se distribuyen los sectores económicos, evidenciando qué grupos comparten características similares. Esta división en dos clústeres destaca una estructura fuertemente desbalanceada, con un grupo dominante y unos pocos outliers económicos claramente diferenciados.

Paso 5: Conclusion

Se aplicó algoritmos de particionamiento para clasificar directamente los sectores económicos en grupos homogéneos, partiendo de datos previamente escalados. A través del uso de la función clValid, se evaluaron múltiples métodos como k-means, PAM, CLARA, FANNY y DIANA, comparándolos mediante métricas de validación interna como conectividad, índice de Dunn y silueta promedio. Esta evaluación permitió identificar qué algoritmos producían clústeres más compactos y mejor separados, seleccionando el más eficiente para representar la estructura de los datos. Luego, los sectores fueron asignados a los clústeres definidos y se visualizaron gráficamente, lo que permitió interpretar de manera clara la agrupación obtenida. Esta metodología resultó útil no solo para obtener una clasificación precisa, sino también para facilitar el análisis comparativo entre sectores con comportamientos laborales similares, brindando una herramienta valiosa para decisiones estratégicas basadas en agrupamientos reales.