UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
CICLO II - 2025

“A_32_APLICACION_DE_LOS_CONGLOMERADOS”

ASIGNATURA: MÉTODOS PARA EL ANÁLISIS ECONÓMICO
CATEDRÁTICO: MSF. CARLOS ADEMIR PERÉZ ALAS
GRUPO TEÓRICO: 01

EL EQUIPO DE TRABAJO ESTA CONFORMADO POR:

NOMBRE CARNET
HENRY GEOVANNY VENTURA VÁSQUEZ VV19010
JEFFERSON ELIEZER VENTURA MARTINEZ VM21050
NOÉ ALEXANDER SÁNCHEZ TRUJILLO ST21011

Diseño de un plan de incentivos para vendedores

El director de ventas de una cadena de tiendas de electrodomésticos con implantación nacional está estudiando el plan de incentivos de sus vendedores. Considera que los incentivos deben estar ajustados a alas dificultadades de las distintas zonas de ventas, siendo necesario fijar incentivos más altos en aquellas zonas geográficas en que las condiciones de vida de sus habitantes hacen mas diícil las ventas. Por este motivo quiere determinar si las comunidades autónomas se pueden segmentar en grupo homogéneos respecto al equipamiento de los hogares.

Para ello dispone de los datos que aparecen en el cuadro 3.22 y el objetivo es establecer cuántos grupos de comunidades autónomas con niveles de equipamiento similar pueden establecerse y en qué radican las diferencias entre esos grupos. El procedimiento que aplicaremos es el descrito en el tema, a saber:

  1. Análisis de la existencia de outliers en la medida en que pueden generar importantes distorsiones en la detección del número de grupos.

  2. Realización de un análisis de conglomerados jerárquicos, evaluando la solución de distintos métodos de conglomeración, aplicando los criterios presentados para identificar el número adecuado de grupos y obtención de los centroides que han de servir de partida para el paso siguiente.

  3. Realización de un análisis de conglomerados no jerárquico mediante el método de k-medias para la obtención de una solución óptima en términos de homogeneidad intras segmentos y heterogeneidad intersegmentos.

Describimos el procedimiento para detectar los outliers mediante la distancia de Mahalanobis.

Aplicando este procedimiento mediante R a nuestros datos obtendríamos las siguientes distancias y, respectivas significatividades (cuadro 3.23). A la luz de esta información no cabría considerar a ninguna comunidad autónoma como un valor atípico.

Estimaríamos ahora los conglomerados por el procedimiento jerárquico. Como debemos evaluar la coherencia de los resultados para decantarnos o descartar alguno de ellos, lo hacemos por todos los métodos de conglomeración que hemos visto —entre paréntesis el nombre que tiene la función de la función hclust{stats}— centroide (centroid), vecino más cercano (single), vecino más lejano (complete), promedio (average), y Ward (ward.D2). La sintaxis, para todos ellos, con la modificación del método sería:

Cuadro 3.22.: Equipamento de los hogares en distintas comunidades autónomas

CC.AA.

Porcentaje de hogares que poseen

Automóvil

TV color

Vídeo

Microondas

Lavavajillas

Teléfono

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

Baleares

71,9

98,8

62,4

29,8

10,1

87,9

Canarias

72,7

96,8

68,4

27,9

5,80

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,10

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.

Cuadro 3.23.: Resultados de la deteccion de outliers

CC.AA.

D2

p-value χ2(df=6)

España

0,40

0,99

Andalucía

3,93

0,68

Aragón

1,94

0,92

Asturias

4,46

9,61

Baleares

6,02

0,42

Canarias

10,47

0,10

Cantabria

7,27

0,29

Castilla y León

3,25

0,77

Castilla-La Mancha

4,12

0,66

Cataluña

4,21

0,64

Com. Valenciana

2,85

0,82

Extremadura

0,29

0,15

Galicia

13,30

0,03

Madrid

9,49

0,14

Murcia

4,61

0,59

Navarra

9,58

0,14

País Vasco

2,55

0,86

La Rioja

4,25

0,64

 

# Cargar librerías necesarias
library(NbClust)
library(cluster)
library(FactoMineR)
library(ggplot2)

# Crear dataframe manualmente INCLUYENDO ESPAÑA
equipamiento <- data.frame(
  CCAA = c("Espana", "Andalucia", "Aragon", "Asturias", "Baleares", 
           "Canarias", "Cantabria", "Castilla y Leon", "Cast-La Mancha",
           "Cataluna", "Valenciana", "Extremadura", "Galicia", "Madrid",
           "Murcia", "Navarra", "Pais Vasco", "La Rioja"),
  Automovil = c(69.0, 66.7, 67.2, 63.7, 71.9, 72.7, 63.4, 65.8, 61.5, 
                70.4, 72.7, 60.5, 65.5, 74.0, 69.0, 76.4, 71.3, 64.9),
  TVcolor = c(97.6, 98.0, 97.5, 95.2, 98.8, 96.8, 94.9, 97.1, 97.3, 
              98.1, 98.4, 97.7, 91.3, 99.4, 98.7, 99.3, 98.3, 98.6),
  Video = c(62.4, 82.7, 56.8, 52.1, 62.4, 68.4, 48.9, 47.7, 53.6, 
            71.1, 68.2, 43.7, 42.7, 76.3, 59.3, 60.6, 61.6, 54.4),
  Microondas = c(32.3, 24.1, 43.4, 24.4, 29.8, 27.9, 36.5, 28.1, 21.7, 
                 36.8, 26.6, 20.7, 13.5, 53.9, 19.5, 44.0, 45.7, 44.4),
  Lavavajillas = c(17.0, 12.7, 20.6, 13.3, 10.1, 5.8, 11.2, 14.0, 7.1, 
                   19.8, 12.1, 11.7, 14.6, 32.3, 12.1, 20.6, 23.7, 17.6),
  Telefono = c(85.2, 74.7, 88.4, 88.1, 87.9, 75.4, 80.5, 85.0, 72.9, 
               92.2, 84.4, 67.1, 85.9, 95.7, 81.4, 87.4, 94.3, 83.4)
)

# 1. DETECCIÓN DE OUTLIERS (INCLUYENDO ESPAÑA)
rownames(equipamiento) <- equipamiento$CCAA
datos_numericos <- equipamiento[, -1]  # Excluir columna CCAA

# Calcular distancia de Mahalanobis INCLUYENDO ESPAÑA
matriz_cov <- cov(datos_numericos)
vector_medias <- colMeans(datos_numericos)

mahalanobis_dist <- mahalanobis(datos_numericos, 
                               center = vector_medias, 
                               cov = matriz_cov)

# Valores p (usando df = 6 como en el libro)
p_values <- pchisq(mahalanobis_dist, df = 6, lower.tail = FALSE)

# Mostrar resultados igual que en el libro
resultados_mahalanobis <- data.frame(
  CCAA = equipamiento$CCAA,
  D2 = round(mahalanobis_dist, 2),
  p_value = round(p_values, 2)
)

print("Distancias de Mahalanobis (INCLUYENDO ESPAÑA):")
## [1] "Distancias de Mahalanobis (INCLUYENDO ESPAÑA):"
print(resultados_mahalanobis)
##                            CCAA    D2 p_value
## Espana                   Espana  0.20    1.00
## Andalucia             Andalucia 10.52    0.10
## Aragon                   Aragon  1.91    0.93
## Asturias               Asturias  4.46    0.61
## Baleares               Baleares  5.70    0.46
## Canarias               Canarias  9.58    0.14
## Cantabria             Cantabria  7.29    0.29
## Castilla y Leon Castilla y Leon  2.21    0.90
## Cast-La Mancha   Cast-La Mancha  3.54    0.74
## Cataluna               Cataluna  2.95    0.82
## Valenciana           Valenciana  2.65    0.85
## Extremadura         Extremadura 10.43    0.11
## Galicia                 Galicia 13.24    0.04
## Madrid                   Madrid  8.31    0.22
## Murcia                   Murcia  4.88    0.56
## Navarra                 Navarra  7.65    0.26
## Pais Vasco           Pais Vasco  2.32    0.89
## La Rioja               La Rioja  4.17    0.65
# 2. ANÁLISIS DE CONGLOMERADOS (EXCLUYENDO ESPAÑA para el clustering)
datos_sin_espana <- equipamiento[-1, ]  # Excluir España
rownames(datos_sin_espana) <- datos_sin_espana$CCAA
datos_numericos_sin_espana <- datos_sin_espana[, -1]

# Estandarizar datos (sin España)
datos_std <- scale(datos_numericos_sin_espana)

# Matriz de distancias euclídeas
d <- dist(datos_std, method = "euclidean")

# Métodos de conglomeración
hc_ward <- hclust(d, method = "ward.D2")
hc_complete <- hclust(d, method = "complete")
hc_average <- hclust(d, method = "average")

# Visualizar dendogramas
par(mfrow = c(2, 2))
plot(hc_ward, main = "Metodo Ward", hang = -1, cex = 0.7)
rect.hclust(hc_ward, k = 2, border = "red")
plot(hc_complete, main = "Metodo Complete", hang = -1, cex = 0.7)
rect.hclust(hc_complete, k = 2, border = "blue")
plot(hc_average, main = "Metodo Average", hang = -1, cex = 0.7)
rect.hclust(hc_average, k = 2, border = "green")
par(mfrow = c(1, 1))

# 3. DETERMINAR NÚMERO ÓPTIMO DE CONGLOMERADOS
set.seed(123)
nb <- NbClust(datos_std, distance = "euclidean", min.nc = 2, max.nc = 6, 
              method = "ward.D2", 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:                                                
## * 3 proposed 2 as the best number of clusters 
## * 10 proposed 3 as the best number of clusters 
## * 3 proposed 4 as the best number of clusters 
## * 7 proposed 6 as the best number of clusters 
## 
##                    ***** Conclusion *****                            
##  
## * According to the majority rule, the best number of clusters is  3 
##  
##  
## *******************************************************************
print("Número óptimo de clusters según NbClust:")
## [1] "Número óptimo de clusters según NbClust:"
print(nb$Best.nc)
##                     KL      CH Hartigan     CCC   Scott  Marriot  TrCovW
## Number_clusters 3.0000  3.0000   3.0000  3.0000  6.0000      3.0  3.0000
## Value_Index     2.0446 10.0082   3.3515 -1.0521 34.8718 103513.1 55.9546
##                  TraceW Friedman   Rubin Cindex     DB Silhouette   Duda
## Number_clusters  3.0000   6.0000  3.0000 4.0000 6.0000     6.0000 2.0000
## Value_Index     10.7686  18.1574 -0.0852 0.3936 0.6987     0.3966 0.4761
##                 PseudoT2  Beale Ratkowsky    Ball PtBiserial Frey McClain
## Number_clusters   2.0000 4.0000    3.0000  3.0000     6.0000    1  2.0000
## Value_Index       9.9027 1.7005    0.4404 16.5244     0.5353   NA  0.6801
##                   Dunn Hubert SDindex Dindex   SDbw
## Number_clusters 6.0000      0  4.0000      0 6.0000
## Value_Index     0.6188      0  1.0601      0 0.1577
# 4. SOLUCIÓN CON 2 CONGLOMERADOS (JERÁRQUICO)
grupos_hc <- cutree(hc_ward, k = 2)
datos_sin_espana$grupo_hc <- grupos_hc

# Centroides del método jerárquico
centroides_hc <- aggregate(datos_std, list(grupos_hc), mean)
print("Centroides método jerárquico:")
## [1] "Centroides método jerárquico:"
print(centroides_hc)
##   Group.1  Automovil    TVcolor      Video Microondas Lavavajillas   Telefono
## 1       1 -0.3062649 -0.3149902 -0.1949203 -0.6195514   -0.5968552 -0.4512161
## 2       2  0.5614856  0.5774821  0.3573539  1.1358443    1.0942345  0.8272296
# 5. ANÁLISIS NO JERÁRQUICO (K-MEDIAS)
set.seed(123)
km <- kmeans(datos_std, centers = centroides_hc[, -1])

# Añadir grupos al dataframe
datos_sin_espana$grupo_km <- km$cluster

# Mostrar asignación final
print("Asignación de comunidades a clusters (sin España):")
## [1] "Asignación de comunidades a clusters (sin España):"
print(datos_sin_espana[, c("CCAA", "grupo_hc", "grupo_km")])
##                            CCAA grupo_hc grupo_km
## Andalucia             Andalucia        1        1
## Aragon                   Aragon        2        2
## Asturias               Asturias        1        1
## Baleares               Baleares        1        1
## Canarias               Canarias        1        1
## Cantabria             Cantabria        1        1
## Castilla y Leon Castilla y Leon        1        1
## Cast-La Mancha   Cast-La Mancha        1        1
## Cataluna               Cataluna        2        2
## Valenciana           Valenciana        1        1
## Extremadura         Extremadura        1        1
## Galicia                 Galicia        1        1
## Madrid                   Madrid        2        2
## Murcia                   Murcia        1        1
## Navarra                 Navarra        2        2
## Pais Vasco           Pais Vasco        2        2
## La Rioja               La Rioja        2        2
# 6. CARACTERIZACIÓN DE LOS CONGLOMERADOS

# Estadísticas descriptivas por grupo
estadisticas <- aggregate(datos_numericos_sin_espana, 
                         list(Cluster = datos_sin_espana$grupo_km), 
                         mean)
print("Medias por cluster:")
## [1] "Medias por cluster:"
print(round(estadisticas, 2))
##   Cluster Automovil TVcolor Video Microondas Lavavajillas Telefono
## 1       1     66.67   96.75 57.25       24.8        11.34    80.30
## 2       2     70.70   98.53 63.47       44.7        22.43    90.23
# Pruebas t para diferencias entre grupos
variables <- colnames(datos_numericos_sin_espana)
resultados_t <- data.frame(Variable = character(),
                          t_value = numeric(),
                          p_value = numeric(),
                          stringsAsFactors = FALSE)

for (var in variables) {
  prueba <- t.test(datos_numericos_sin_espana[[var]] ~ datos_sin_espana$grupo_km)
  resultados_t <- rbind(resultados_t, 
                       data.frame(Variable = var,
                                 t_value = round(prueba$statistic, 3),
                                 p_value = round(prueba$p.value, 4)))
}

print("Pruebas t para diferencias entre clusters:")
## [1] "Pruebas t para diferencias entre clusters:"
print(resultados_t)
##        Variable t_value p_value
## t     Automovil  -1.851  0.0920
## t1      TVcolor  -2.444  0.0292
## t2        Video  -1.224  0.2414
## t3   Microondas  -6.882  0.0000
## t4 Lavavajillas  -4.860  0.0022
## t5     Telefono  -3.528  0.0033
# 7. VISUALIZACIÓN CON ANÁLISIS DE COMPONENTES PRINCIPALES
acp <- PCA(datos_std, graph = FALSE)

# Crear dataframe para ggplot
coordenadas <- as.data.frame(acp$ind$coord)
coordenadas$CCAA <- datos_sin_espana$CCAA
coordenadas$Grupo <- as.factor(datos_sin_espana$grupo_km)

# Gráfico de componentes principales
ggplot(coordenadas, aes(x = Dim.1, y = Dim.2, color = Grupo, label = CCAA)) +
  geom_point(size = 3) +
  geom_text(size = 3, vjust = -0.8, hjust = 0.5) +
  scale_color_manual(values = c("1" = "blue", "2" = "red"),
                     labels = c("1" = "Bajo Equipamiento", "2" = "Alto Equipamiento")) +
  labs(title = "Analisis de Conglomerados - Equipamiento de Hogares por CC.AA.",
       x = paste("Dimension 1 (", round(acp$eig[1,2], 1), "%)"),
       y = paste("Dimension 2 (", round(acp$eig[2,2], 1), "%)"),
       color = "Cluster") +
  theme_minimal() +
  theme(legend.position = "bottom")