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:
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.
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.
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:"
## 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:"
## 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:"
## 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")
