Aplicación de Análisis de Clúster

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

MÉTODOS PARA EL ANÁLISIS ECONÓMICO

TEMA:

Aplicación de Análisis de Clúster

DOCENTE:

MSF. Carlos Ademir Pérez Alas

Grupo teórico

GT-03

Integrantes: Carnet: Participación
Lopez Coto, Ezequiel Benjamin LC22057 100%
Méndez Benítez, Carlos Mauricio MB22006 100%
Martínez Guardado, Erick Jesé MG22058 100%

Ciudad Universitaria, 15 de enero de 2025

Del texto: Joaquin, A. M., & Ezequiel, U. J. (2017). Análisis multivariante aplicado con R. 2a ed. Ediciones Paraninfo, S.A.

Desarrollen el ejemplo 3.7, de la página 114, reproduce todas las salidas.

Caso 3.3. Diseño de un plan de incentivos para vendedores

Presentación de datos

library(dplyr)
library(kableExtra)
load("E:/Jese Carpeta/R/Tareas/A33/A33.RData")
Cuadro322$ID <- NULL
Cuadro322 %>% kable(caption = "Equipamiento de los hogares en distintas comunidades autónomas") %>% kable_minimal() %>% 
  add_footnote(label = "Fuente: Panel de Hogares de la Unión Europea. INE.",
               notation = "none")
Equipamiento de los hogares en distintas comunidades autónomas
Automovil Color Video Microondas Lavavajillas Telefono
España 69.0 97.6 62.4 32.3 17.0 85.2
Andalucía 66.7 98.0 82.7 24.1 12.7 74.7
Aragón 67.2 97.5 56.8 43.4 20.6 88.4
Asturias 63.7 95.2 52.1 24.4 13.3 88.1
Balerares 71.9 98.8 62.4 29.8 10.1 87.9
Canarias 72.7 96.8 68.4 27.9 5.8 75.4
Cantabria 63.4 94.9 48.9 36.5 11.2 80.5
Castilla y León 65.8 97.1 47.7 28.1 14.0 85.0
Cast.-La Mancha 61.5 97.3 53.6 21.7 7.1 72.9
Cataluña 70.4 98.1 71.1 36.8 19.8 92.2
Com. Valenciana 72.7 98.4 68.2 26.6 12.1 84.4
Extremadura 60.5 97.7 43.7 20.7 11.7 67.1
Galicia 65.5 91.3 42.7 13.5 14.6 85.9
Madrid 74.0 99.4 76.3 53.9 32.3 95.7
Murcia 69.0 98.7 59.3 19.5 12.1 81.4
Navarra 76.4 99.3 60.6 44.0 20.6 87.4
país Vasco 71.3 98.3 61.6 45.7 23.7 94.3
La Rioja 64.9 98.6 54.4 44.4 17.6 83.4
Fuente: Panel de Hogares de la Unión Europea. INE.
#Se construye la matriz de distancias.
rownames(Cuadro322) <- Cuadro322$...2
Cuadro322$...2 <- NULL

matriz.dis.euclid.caso3 <- dist(Cuadro322,method ="euclidean", diag = TRUE)
as.matrix(matriz.dis.euclid.caso3)[1:6,1:6] %>% kable(caption="Matriz de distancias",row.names = TRUE) %>% kable_minimal()
Matriz de distancias
1 2 3 4 5 6
1 0.00000 24.76934 13.45437 14.98166 8.42615 17.06370
2 24.76934 0.00000 35.97082 33.66318 25.55895 17.44907
3 13.45437 35.97082 0.00000 21.30751 18.72432 28.17073
4 14.98166 33.66318 21.30751 0.00000 15.02431 24.06325
5 8.42615 25.55895 18.72432 15.02431 0.00000 14.79831
6 17.06370 17.44907 28.17073 24.06325 14.79831 0.00000
#round(print(matriz.dis.euclid.caso3),2)

Aplicando métodos jerárquicos

Vemos claramente dos patrones: el correspondiente a los métodos centroid y single, que agregan a todas las comunidades -salvo a Madrid- en un mismo grupo pero con claras distorsiones en el dendograma, y los otros tres procedimientos -Ward, complete y average que generan una solución muy parecida

library(stats)
library(graphics)
hclust.average.caso3<-hclust(matriz.dis.euclid.caso3, method="average")
#data.frame(hclust.average.caso3 [2:1])
plot(hclust.average.caso3, hang = -0.01,cex=0.7)

hclust.ward.caso3 <- hclust(matriz.dis.euclid.caso3, method = "ward.D2")
#data.frame(hclust.ward.caso3[2:1])
library(graphics)
plot(hclust.ward.caso3,hang = -0.01, cex=0.7)

hclust.complete.caso3 <- hclust(matriz.dis.euclid.caso3, method = "complete")
#data.frame(hclust.complete.caso3[2:1])
plot(hclust.complete.caso3,hang = -0.1)

hclust.single.caso3<- hclust(matriz.dis.euclid.caso3, method = "single")
#data.frame(hclust.single.caso3[2:1])
plot(hclust.single.caso3,  hang = -0.1, cex=0.7)

hclust.centroid.caso3 <-hclust(matriz.dis.euclid.caso3, method = "centroid")
#data.frame(hclust.centroid.caso3[2:1])
plot(hclust.centroid.caso3, hang = -0.2, cex=0.7)

Hemos de establecer cuántos grupos, pero los dendogramas nos permiten intuir que las comunidades que acabarán en cada grupo van a ser las mismas independientemente del método de conglomeración empleado. Pasamos a la siguiente fase -determinación del número de conglomerados- solo para las tres técnicas que no nos generan dudas respecto a la claridad de los dendogramas: Ward, complete y average.

Determinación del número de conglomerados

Aplicamos para ello el procedimiento descrito de generación de índices propuestos por {NbClust)

Datos.NbClust<-Cuadro322[, c("Automovil", "Color", "Video", "Microondas", "Lavavajillas","Telefono")]
library(NbClust)
res.wardD2<-NbClust(Datos.NbClust, distance ="euclidean", min.nc=2, max.nc=15, method ="ward.D2", 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 
## * 9 proposed 3 as the best number of clusters 
## * 2 proposed 4 as the best number of clusters 
## * 1 proposed 7 as the best number of clusters 
## * 1 proposed 13 as the best number of clusters 
## * 8 proposed 15 as the best number of clusters 
## 
##                    ***** Conclusion *****                            
##  
## * According to the majority rule, the best number of clusters is  3 
##  
##  
## *******************************************************************
#res.wardD2$All.index #Muestra los valores de los diferentes índices evaluados para determinar el número óptimo de clusters.   
#res.wardD2$Best.nc  #Muestra el número óptimo de clusters según los índices calculados.
#res.wardD2$Best.partition #Devuelve la partición final, es decir, la asignación de cada observación a un cluster específico.

Solo cabría sustituir el método de conglomeración para obtener la mejor solución para cada uno de ellos. La aplicación de los criterios es consistente en sus resultados y para cualquier método de conglomeración la solución adecuada es la de 2 conglomerados. Ilustramos la consistencia de los resultados con la evolución para distintos conglomerados del criterio CCC (Sarle, 1983), que, recordemos, alcanzaba su valor máximo para el número óptimo de grupos, que siempre es 2.

library(graphics)
library(factoextra)
plot(hclust.ward.caso3)
rect.hclust(hclust.ward.caso3, k = 2, border = "red")

plot(hclust.average.caso3)
rect.hclust(hclust.average.caso3, k = 2, border = "red")

plot(hclust.complete.caso3)
rect.hclust(hclust.complete.caso3,k = 2, border = "red")

Cálculo de los centroides

Decidido trabajar con una solución de dos grupos que, agrupa a las mismas comunidades en los mismos grupos independientemente del método de conglomeración, el paso siguiente es obtener los centroides (valores medios de las 6 variables en cada uno de los dos grupos) con el fin de alimentar con ello el método no jerárquico. Es recomendable dejar que el método no jerárquico los obtenga de manera aleatoria, en la medida en que un punto de partida sensato y el resultado del jerárquico lo es- aumenta las probabilidades de que el proceso de optimización no se estanque en un mínimo local (Milligan, 1980). A partir de este momento ilustraremos el resultado solo con los datos obtenidos del método de conglomeración de Ward. Generamos una variable que contiene la pertenencia al grupo y la añadimos a la base de datos:

library(stats)
grupo.ward<-cutree(hclust.ward.caso3, k=2, h = NULL) 
datos.caso3.grupos<-cbind (Cuadro322, grupo.ward) 
datos.caso3.grupos$id<-NULL

A continuación obtenemos los centroides, que no es otra cosa que la media de las seis variables analizadas en cada uno de los dos grupos obtenidos.

library(factoextra)
#Calcula la media
round (aggregate(datos.caso3.grupos, list (grupo.ward), mean),2)
##   Group.1 Automovil Color Video Microondas Lavavajillas Telefono grupo.ward
## 1       1     66.87 96.82 57.68      25.42        11.81    80.71          1
## 2       2     70.70 98.53 63.47      44.70        22.43    90.23          2

Estimación del análisis de conglomerados no jerárquico

#Centroides Iniciales.
c1<-c(66.87,96.82,56.01,25.43,11.81,80.71) 
c2<-c(70.70,98.53,63.47,44.70,22.43,90.23) 
CentroidesIniciales=rbind(c1,c2)

solucion<-kmeans(x = Cuadro322,centers = rbind(c1, c2),nstart = 25)
solucion
## K-means clustering with 2 clusters of sizes 12, 6
## 
## Cluster means:
##   Automovil    Color    Video Microondas Lavavajillas Telefono
## 1  66.86667 96.81667 57.67500     25.425     11.80833 80.70833
## 2  70.70000 98.53333 63.46667     44.700     22.43333 90.23333
## 
## Clustering vector:
##  [1] 1 1 2 1 1 1 1 1 1 2 1 1 1 2 1 2 2 2
## 
## Within cluster sum of squares by cluster:
## [1] 2810.6467  848.3533
##  (between_SS / total_SS =  40.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Como se puede comprobar, al ser un caso con pocos datos, la solución del jerárquico coincide con la del no jerárquico.

Diferencias entre los perfiles de los conglomerados

Antes de interpretar las medias, conviene saber cuáles son significativamente diferentes entre los grupos.

Al tener solo dos grupos, podemos aplicar una prueba t, con la siguiente sintaxis para cada variable dependiente:

library(stats)
t.test(Automovil~solucion$cluster, data=Cuadro322) -> Pruebat
Pruebat
## 
##  Welch Two Sample t-test
## 
## data:  Automovil by solucion$cluster
## t = -1.8106, df = 10.091, p-value = 0.1
## alternative hypothesis: true difference in means between group 1 and group 2 is not equal to 0
## 95 percent confidence interval:
##  -8.5449256  0.8782589
## sample estimates:
## mean in group 1 mean in group 2 
##        66.86667        70.70000
library(dplyr)
library(kableExtra)
#Realizamos las pruebas t para cada variable.
t.test(Color~solucion$cluster, data=Cuadro322) -> Pruebat1
t.test(Video~solucion$cluster, data=Cuadro322) -> Pruebat2
t.test(Microondas~solucion$cluster, data=Cuadro322) -> Pruebat3
t.test(Lavavajillas~solucion$cluster, data=Cuadro322) -> Pruebat4
t.test(Telefono~solucion$cluster, data=Cuadro322) -> Pruebat5

#Agrupanos Todas Las Pruebas t.
Pruebast<-as.data.frame(c(Pruebat$statistic,Pruebat1$statistic,Pruebat2$statistic, Pruebat3$statistic, Pruebat4$statistic, Pruebat5$statistic))

#Se generan los Centroides Iniciales con sus respectivas pruebas t.
Significatividad <- cbind(t(solucion$centers),abs(Pruebast))
names(Significatividad) =c("Grupo 1", "Grupo 2", "Prueba t")
round(Significatividad,2) %>% kable(caption = "Significatividad de las diferencias entre los perfiles de los conglomerados",align = "c") %>% kable_material()
Significatividad de las diferencias entre los perfiles de los conglomerados
Grupo 1 Grupo 2 Prueba t
Automovil 66.87 70.70 1.81
Color 96.82 98.53 2.52
Video 57.68 63.47 1.19
Microondas 25.42 44.70 6.73
Lavavajillas 11.81 22.43 4.61
Telefono 80.71 90.23 3.51

En el ejemplo ilustrado vemos como el porcentaje de la población que tiene automóvil en el primer grupo de comunidades autónomas es (66,86%) inferior al del segundo grupo (70,70%), aunque esta diferencia no es significativa (\(t=-1,81; p > 0,05\)).

Para facilitar el análisis general, llevamos todos los resultados al cuadro de Significatividad de las diferencias entre los perfiles de los conglomerados. A la luz del mismo podemos concluir que el grupo 2 se corresponde con comunidades autónomas donde los equipamientos son significativamente superiores, probablemente debido a una mayor renta per cápita. Una manera de intentar visualizar los resultados de un análisis de conglomerados, más allá de los dendogramas, es sintetizar todas las variables en dos componentes principales y proyectar sobre ellos los objetos.

La siguiente figura muestra el claro nivel de separación entre los dos grupos que ya hemos interpretado.

library(factoextra)
fviz_cluster(solucion,data = Cuadro322,labelsize = 12,
             main = "Visualización de los resultados de un análisis de conglomerados",
             xlab = "Componente principal 1",
             ylab = "Componente principal 2",
             palette = c( "#E7B800", "#FC4E07"),
             ellipse.type = "euclid", # Concentration ellipse
             repel = TRUE, # Avoid label overplotting (slow)
             show.clust.cent = TRUE,
             ggtheme = theme_minimal())

  • Puntos: Cada punto representa una observación en el espacio reducido. Los puntos están coloreados según el cluster al que pertenecen.

  • Elipses: Indican el área de concentración de los puntos dentro de cada cluster.

  • Colores: Los colores diferencian visualmente los clusters.

  • Componentes principales: Los ejes corresponden a las dos primeras componentes principales, que explican la mayor parte de la variabilidad en los datos.