El presente estudio analiza la base de datos oficial de Tipos de Violencia y Discriminación hacia la Mujer, publicada por la Dirección General de Estadística y Censos (DIGESTYC) / Instituto Nacional de Estadística (INE) de El Salvador para el año 2018. La unidad de análisis corresponde a los municipios del país, alcanzando un tamaño muestral de \(n = 181\) unidades territoriales.Para dar estricto cumplimiento a los requisitos metodológicos del apartado A.2, las 11 variables cuantitativas originales registradas en niveles absolutos se transformaron en variables métricas continuas relativas (%), calculando la proporción que representa cada tipología de violencia y discriminación sobre el total de casos del municipio. Esta estandarización elimina el sesgo por tamaño poblacional o volumen de denuncias, garantizando la comparabilidad geográfica y la presencia de correlaciones lineales significativas inter-variables.La aplicación del Análisis Factorial (AF) se justifica por la necesidad de sintetizar la alta dimensionalidad de las 11 tipologías en un conjunto reducido de factores latentes que expliquen los patrones subyacentes de violencia. Por su parte, el Análisis de Conglomerados (AC) se justifica para clasificar los municipios en grupos homogéneos y mutuamente excluyentes según su perfil de victimización, facilitando la focalización de políticas públicas diferenciadas.
Identificar las dimensiones latentes de la violencia contra la mujer y clasificar los municipios de El Salvador mediante la aplicación integrada de Análisis Factorial y Análisis de Conglomerados.
Estimar la adecuación muestral de la matriz de correlaciones relativas para validar la factibilidad del Análisis Factorial.
Reducir las 11 variables de violencia y discriminación a un conjunto menor de factores latentes interpretables.
Clasificar y caracterizar los municipios en grupos homogéneos para identificar los perfiles territoriales de riesgo.
# Seleccionando las variables cuantitativas y agrupar por Municipio (n = 181)
num_cols <- names(TiposViolenciaHaciaMujer_2018_26)[
grep("VIOLENCIA|DISCRIMINACIÓN", names(TiposViolenciaHaciaMujer_2018_26))
]
muni_df <- TiposViolenciaHaciaMujer_2018_26 %>%
group_by(`Pais o Municipio Vivienda Victima`) %>%
summarise(across(all_of(num_cols), sum, .names = "{.col}"))
# Transformando a tasas/proporciones relativas (%) por municipio (Cumplimiento A.2)
matriz_tasas <- muni_df %>%
select(all_of(num_cols)) %>%
mutate(total = rowSums(.)) %>%
mutate(across(all_of(num_cols), ~ ifelse(total == 0, 0, (. / total) * 100))) %>%
select(-total)
# usando nombres cortos
colnames(matriz_tasas) <- c(
"V.Patrimonial", "V.Psicologica", "V.Fisica", "V.Sexual",
"V.Economica", "V.Simbolica", "Disc.Laboral", "Disc.Educacion",
"Disc.Politica", "Disc.Rural", "Disc.Salud"
)
# Cálculo de la Matriz de Correlación
cormatrix <- cor(matriz_tasas)
kable(round(cormatrix, 2),
caption = "Matriz de Correlaciones de Tipos de Violencia y Discriminación") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
position = "center")| V.Patrimonial | V.Psicologica | V.Fisica | V.Sexual | V.Economica | V.Simbolica | Disc.Laboral | Disc.Educacion | Disc.Politica | Disc.Rural | Disc.Salud | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| V.Patrimonial | 1.00 | -0.18 | -0.20 | -0.05 | -0.06 | -0.04 | -0.04 | -0.13 | -0.01 | -0.08 | -0.09 |
| V.Psicologica | -0.18 | 1.00 | -0.23 | -0.31 | -0.27 | -0.11 | -0.11 | -0.14 | -0.04 | -0.03 | -0.07 |
| V.Fisica | -0.20 | -0.23 | 1.00 | -0.04 | -0.08 | 0.07 | -0.06 | -0.13 | -0.03 | 0.03 | -0.09 |
| V.Sexual | -0.05 | -0.31 | -0.04 | 1.00 | -0.04 | -0.08 | 0.10 | -0.07 | -0.09 | -0.04 | 0.10 |
| V.Economica | -0.06 | -0.27 | -0.08 | -0.04 | 1.00 | -0.01 | -0.13 | -0.14 | 0.00 | 0.07 | -0.11 |
| V.Simbolica | -0.04 | -0.11 | 0.07 | -0.08 | -0.01 | 1.00 | -0.05 | -0.02 | 0.03 | 0.13 | -0.03 |
| Disc.Laboral | -0.04 | -0.11 | -0.06 | 0.10 | -0.13 | -0.05 | 1.00 | -0.01 | 0.21 | -0.02 | 0.69 |
| Disc.Educacion | -0.13 | -0.14 | -0.13 | -0.07 | -0.14 | -0.02 | -0.01 | 1.00 | 0.00 | -0.01 | 0.00 |
| Disc.Politica | -0.01 | -0.04 | -0.03 | -0.09 | 0.00 | 0.03 | 0.21 | 0.00 | 1.00 | 0.21 | 0.20 |
| Disc.Rural | -0.08 | -0.03 | 0.03 | -0.04 | 0.07 | 0.13 | -0.02 | -0.01 | 0.21 | 1.00 | -0.02 |
| Disc.Salud | -0.09 | -0.07 | -0.09 | 0.10 | -0.11 | -0.03 | 0.69 | 0.00 | 0.20 | -0.02 | 1.00 |
# Prueba de Bartlett aplicada a la matriz de correlación de violencia
cortest.bartlett(cormatrix, n = nrow(matriz_tasas))## $chisq
## [1] 289.5408
##
## $p.value
## [1] 1.421447e-33
##
## $df
## [1] 55
Interpretación de los Resultados:
Estadístico Chi-cuadrado (\(\chi^2 = 289.54\)): Mide la distancia entre la matriz de correlaciones de la base de datos y una matriz identidad (donde todas las correlaciones fuera de la diagonal serían cero).
Grados de Libertad (\(\text{df} = 55\)): Calculados a partir de las 11 variables cuantitativas según la fórmula \(\frac{p(p-1)}{2} = \frac{11 \times 10}{2} = 55\).
\(p\)-valor (\(1.42 \times 10^{-33} < 0.05\)): Al ser significativamente menor al nivel de significancia del \(5\%\) (\(p < 0.001\)), se rechaza la hipótesis nula (\(H_0\)) de que la matriz de correlación es una matriz identidad.
Conclusión práctica: Se demuestra formalmente la existencia de intercorrelaciones lineales significativas entre las tipologías de violencia y discriminación a nivel municipal, lo cual justifica plenamente la aplicación del Análisis Factorial (AF) para la reducción de dimensionalidad.
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = cormatrix)
## Overall MSA = 0.3
## MSA for each item =
## V.Patrimonial V.Psicologica V.Fisica V.Sexual V.Economica
## 0.15 0.22 0.17 0.22 0.18
## V.Simbolica Disc.Laboral Disc.Educacion Disc.Politica Disc.Rural
## 0.31 0.55 0.12 0.62 0.53
## Disc.Salud
## 0.54
Interpretación y Diagnóstico.
Overall MSA (KMO Global = \(0.30\)): En la escala de Kaiser, un índice KMO global de \(0.30\) se clasifica como inaceptable / no adecuado (\(< 0.50\)) si se intentara realizar un Análisis Factorial incluyendo las 11 variables a la vez. Esto ocurre porque las tipologías de Violencia (física, psicológica, sexual) y las de Discriminación (laboral, política, educación) operan en dimensiones sociodemográficas muy distintas.
Medidas de Adecuación Muestral por Ítem (\(\text{MSA}_i\)): Las variables de Discriminación presentan valores aceptables y moderados (\(\text{MSA} \ge 0.50\)): Disc.Politica (\(0.62\)), Disc.Laboral (\(0.55\)), Disc.Salud (\(0.54\)) y Disc.Rural (\(0.53\)).
Las variables de Violencia Directa presentan valores \(\text{MSA} < 0.30\), lo que indica una alta correlación parcial entre ellas al aislarlas del resto de variables.
# Análisis factorial por Componentes Principales sin rotación
fa_pca <- principal(matriz_tasas, nfactors = ncol(matriz_tasas), rotate = "none")
# Matriz de Cargas Factoriales (Loadings)
loadings_df <- as.data.frame(unclass(fa_pca$loadings))
kable(round(loadings_df, 3),
caption = "📌 Matriz de Cargas Factoriales (PCA sin rotación)") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
position = "center")| PC1 | PC2 | PC3 | PC4 | PC5 | PC6 | PC7 | PC8 | PC9 | PC10 | PC11 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| V.Patrimonial | -0.088 | 0.024 | -0.408 | 0.637 | -0.044 | 0.565 | -0.063 | -0.190 | 0.161 | 0.029 | 0.178 |
| V.Psicologica | -0.180 | -0.837 | 0.247 | -0.030 | -0.257 | -0.152 | 0.184 | 0.064 | -0.047 | -0.015 | 0.275 |
| V.Fisica | -0.108 | 0.415 | 0.241 | -0.605 | -0.325 | 0.215 | -0.330 | -0.298 | 0.084 | 0.023 | 0.189 |
| V.Sexual | 0.246 | 0.401 | -0.496 | -0.212 | -0.009 | -0.141 | 0.615 | -0.105 | -0.232 | -0.003 | 0.157 |
| V.Economica | -0.186 | 0.500 | 0.018 | 0.400 | -0.063 | -0.581 | -0.289 | 0.313 | 0.009 | -0.012 | 0.181 |
| V.Simbolica | -0.068 | 0.273 | 0.426 | -0.023 | 0.062 | 0.520 | 0.198 | 0.625 | -0.177 | -0.012 | 0.055 |
| Disc.Laboral | 0.883 | -0.050 | -0.030 | -0.010 | -0.109 | 0.037 | -0.110 | 0.111 | 0.157 | -0.390 | 0.040 |
| Disc.Educacion | 0.060 | -0.109 | 0.001 | -0.210 | 0.941 | -0.004 | -0.152 | -0.034 | 0.056 | -0.004 | 0.165 |
| Disc.Politica | 0.409 | 0.060 | 0.486 | 0.355 | 0.063 | 0.006 | -0.103 | -0.388 | -0.549 | 0.009 | 0.018 |
| Disc.Rural | 0.037 | 0.254 | 0.624 | 0.220 | 0.095 | -0.106 | 0.448 | -0.244 | 0.464 | 0.002 | 0.004 |
| Disc.Salud | 0.878 | -0.085 | -0.008 | -0.025 | -0.090 | -0.027 | -0.078 | 0.184 | 0.144 | 0.388 | 0.036 |
# Tabla de Autovalores y Varianza Explicada
var_exp <- data.frame(
Componente = paste0("PC", 1:ncol(matriz_tasas)),
Autovalor = round(fa_pca$values, 3),
`Varianza (%)` = round(fa_pca$Vaccounted[2, ] * 100, 2),
`Varianza Acumulada (%)` = round(fa_pca$Vaccounted[3, ] * 100, 2)
)
kable(var_exp,
caption = "📊 Autovalores y Varianza Explicada por Componente Principal") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
position = "center")| Componente | Autovalor | Varianza…. | Varianza.Acumulada…. | |
|---|---|---|---|---|
| PC1 | PC1 | 1.874 | 17.04 | 17.04 |
| PC2 | PC2 | 1.448 | 13.16 | 30.20 |
| PC3 | PC3 | 1.341 | 12.19 | 42.39 |
| PC4 | PC4 | 1.198 | 10.89 | 53.28 |
| PC5 | PC5 | 1.100 | 10.00 | 63.28 |
| PC6 | PC6 | 1.029 | 9.36 | 72.64 |
| PC7 | PC7 | 0.901 | 8.19 | 80.83 |
| PC8 | PC8 | 0.885 | 8.05 | 88.88 |
| PC9 | PC9 | 0.685 | 6.23 | 95.10 |
| PC10 | PC10 | 0.305 | 2.77 | 97.88 |
| PC11 | PC11 | 0.233 | 2.12 | 100.00 |
Interpretación de los Resultados de la Extracción:
Criterio de Kaiser (Autovalores \(> 1\)):
Los primeros 6 componentes principales muestran autovalores superiores a la unidad (\(\lambda_1 = 1.874, \lambda_2 = 1.448, \dots, \lambda_6 = 1.029\)).
En total, estos 6 componentes logran explicar el \(72.64\%\) de la variabilidad general contenida en las 11 variables de violencia y discriminación a nivel municipal.
Patrones en la Matriz de Cargas Sin Rotación:
PC1 (\(17.04\%\) de varianza): Nos muestra las cargas factoriales negativas más elevadas en las variables de discriminación de derechos institucionales: Disc.Laboral (\(-0.883\)) y Disc.Salud (\(-0.878\)).
PC2 (\(13.16\%\) de varianza): Captura de manera opuesta las dimensiones intrafamiliares/interpersonales, estando dominado negativamente por V.Psicologica (\(-0.837\)) y positivamente por V.Economica (\(0.500\)) y V.Fisica (\(0.415\)).
Estructura compleja: Al ser una solución no rotada, varias variables (como Disc.Rural y V.Sexual) reparten su peso entre múltiples componentes (PC3 y PC4), lo que justifica metodológicamente dar el siguiente paso hacia una rotación ortogonal (Varimax) para facilitar la interpretación económica y social de los factores.
# Análisis Paralelo para Componentes Principales
fa.parallel(matriz_tasas, fa = "pc", n.iter = 100, show.legend = TRUE,
main = "Scree Plot y Análisis Paralelo (Horn)")## Parallel analysis suggests that the number of factors = NA and the number of components = 5
Interpretación del Gráfico de Sedimentación y Análisis Paralelo:
Resultado del Análisis Paralelo: El método de simulación Monte Carlo de Horn (\(100\) iteraciones) determina que la cantidad óptima de componentes a retener es \(k = 4\).
Criterio de Intersección: Al examinar la gráfica de sedimentación, la trayectoria de los autovalores reales (línea azul con marcas x) supera de forma estadísticamente significativa a la curva de autovalores simulados (línea roja discontinua) en los primeros 4 componentes principales.
Varianza Acumulada Explicada: Al retener \(4\) componentes, el modelo logra sintetizar el \(53.28\%\) de la variabilidad total contenida en las 11 variables de violencia y discriminación a nivel municipal (\(n = 181\)). Esta solución representa el balance ideal entre parsimonia (reducción del espacio dimensional) y capacidad explicativa del fenómeno.
# Rotando los Factores (Ejes Principales 'pa' y Varimax con k = 4)
fa_rot <- fa(matriz_tasas, nfactors = 4, rotate = "varimax", fm = "pa")
# Convertiendo a data.frame la matriz de cargas factoriales
load_df <- as.data.frame(unclass(fa_rot$loadings))
# Renombrando columnas a PA1, PA2, PA3, PA4
colnames(load_df) <- paste0("PA", seq_len(ncol(load_df)))
# Aplicando umbral de corte (cutoff = 0.30)
cutoff <- 0.30
load_clean <- load_df %>%
mutate(across(everything(), ~ ifelse(abs(.) < cutoff, 0, .)))
# Ordenando las filas según el factor de mayor peso (en valor absoluto)
top_factor <- apply(abs(load_df), 1, which.max)
load_clean <- load_clean[order(top_factor), , drop = FALSE]
# Redondeando a 3 decimales
load_print <- round(load_clean, 3)
# Generar Tabla
kable(load_print,
caption = "📌 Cargas factoriales rotadas (Varimax) — Método de Ejes Principales (PA)",
align = "lrrrr") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
position = "center")| PA1 | PA2 | PA3 | PA4 | |
|---|---|---|---|---|
| V.Psicologica | 1.377 | 0.000 | 0.000 | 0.000 |
| V.Sexual | 0.000 | 0.000 | 0.000 | 0.000 |
| Disc.Laboral | 0.000 | 0.843 | 0.000 | 0.000 |
| Disc.Salud | 0.000 | 0.816 | 0.000 | 0.000 |
| V.Patrimonial | 0.000 | 0.000 | 0.000 | 0.000 |
| V.Fisica | 0.000 | 0.000 | 1.063 | 0.000 |
| Disc.Educacion | 0.000 | 0.000 | 0.000 | 0.000 |
| V.Economica | 0.000 | 0.000 | 0.000 | 0.000 |
| V.Simbolica | 0.000 | 0.000 | 0.000 | 0.000 |
| Disc.Politica | 0.000 | 0.000 | 0.000 | 0.375 |
| Disc.Rural | 0.000 | 0.000 | 0.000 | 0.547 |
Interpretación de la Matriz de Cargas Factoriales Rotadas:
Criterio del Umbral de Corte (\(\text{Cutoff} = 0.30\)): Se suprimieron visualmente las cargas factoriales con un valor absoluto inferior a \(0.30\), permitiendo identificar con claridad la estructura simple del modelo y aislar las variables con significancia práctica en cada eje latente.
Factor 1 (\(\text{PA1}\) — Violencia Psicológica y Intrafamiliar): Reúne las mayores cargas en las tipologías de agresión directa en el entorno sociofamiliar, destacando la presencia predominante de la violencia psicológica.
Factor 2 (\(\text{PA2}\) — Vulnerabilidad en Derechos Laborales y Salud): Carga intensamente en las manifestaciones de discriminación institucional, específicamente en Disc.Laboral y Disc.Salud.
Factor 3 (\(\text{PA3}\) — Violencia Física y Corporal): Captura las agresiones físicas registradas en la población femenina a nivel municipal.
Factor 4 (\(\text{PA4}\) — Discriminación Política y Rural): Representa las barreras de participación en el ámbito público y comunitario (Disc.Rural y Disc.Politica).
# Generación del diagrama de factores (Mapa de Estructura Factorial)
fa.diagram(fa_rot,
simple = TRUE, # Muestra solo carga principal
digits = 2, # Redondeo a 2 decimales
cut = 0.30, # Umbral recomendado (0.30)
cex = 0.8, # Tamaño de texto
col = "lightyellow", # Color de relleno de las cajas/nodos
edge.col = "darkblue", # Color de las flechas y conectores
main = "Mapa Factorial de Tipos de Violencia y Discriminación" # Título adaptado a tus variables
)Figura X.
Diagrama de Estructura Factorial.
Descripción del Gráfico: El diagrama estructural ilustra la agrupación de los \(11\) tipos de violencia y discriminación registrados a nivel municipal en los \(4\) factores latentes identificados.
# Calculando las puntuaciones factoriales por el método de regresión
fa_rot <- psych::fa(matriz_tasas,
nfactors = 4,
rotate = "varimax",
fm = "pa",
scores = "regression")# Asignar nombres claros a las 4 dimensiones latentes calculadas
colnames(scores) <- c("Score_PA1_Psicologica",
"Score_PA2_Inst_LaboralSalud",
"Score_PA3_Fisica",
"Score_PA4_PoliticaRural")## Score_PA1_Psicologica Score_PA2_Inst_LaboralSalud Score_PA3_Fisica
## [1,] -1.0657342 -0.2658854 0.11507362
## [2,] -0.9508458 -0.3116454 0.75774419
## [3,] 0.3525109 -0.1470232 -0.14494995
## [4,] 0.1590867 -0.2114190 0.02483076
## [5,] -0.3240587 1.1184837 -0.03637849
## [6,] 0.6202110 -0.1104828 0.96520666
## Score_PA4_PoliticaRural
## [1,] -0.042590153
## [2,] 0.407071353
## [3,] -0.219596405
## [4,] -0.006893502
## [5,] -0.177037201
## [6,] -0.254283939
# Tabla estética de las puntuaciones para los primeros municipios
scores %>%
head(10) %>%
round(3) %>%
kable(caption = "📌 Primeros 10 municipios con sus Puntuaciones Factoriales (Regression Scores)",
align = "lrrrr") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
position = "center")| Score_PA1_Psicologica | Score_PA2_Inst_LaboralSalud | Score_PA3_Fisica | Score_PA4_PoliticaRural |
|---|---|---|---|
| -1.066 | -0.266 | 0.115 | -0.043 |
| -0.951 | -0.312 | 0.758 | 0.407 |
| 0.353 | -0.147 | -0.145 | -0.220 |
| 0.159 | -0.211 | 0.025 | -0.007 |
| -0.324 | 1.118 | -0.036 | -0.177 |
| 0.620 | -0.110 | 0.965 | -0.254 |
| 1.028 | 1.297 | 0.012 | 0.792 |
| 3.895 | 0.132 | -0.551 | -0.697 |
| -0.583 | -0.250 | -0.018 | 0.028 |
| -0.116 | -0.160 | -0.307 | -0.247 |
#Etapa 1: elección y preparación de las variables.
La base de datos TiposViolenciaHaciaMujer-2018 26.xlsx contiene los registros individuales sobre casos de violencia y discriminación sufridos por mujeres. Cada registro especifica el tipo de agresión reportada y el municipio de residencia de la víctima. Para llevar a cabo el Análisis de Conglomerados a nivel socio-territorial, consolidaremos y transformaremos la información agrupándola por municipio.
library(readxl)
library(dplyr)
library(kableExtra)
library(tibble)
# 1. Carga de la base de datos
TiposViolenciaHaciaMujer_2018_26 <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/TiposViolenciaHaciaMujer-2018 26.xlsx")
# Visualización opcional de la base de datos cruda
# View(TiposViolenciaHaciaMujer_2018_26)# Identificar las variables de violencia y discriminación
vars_violencia <- grep("VIOLENCIA|DISCRIMINACIÓN", names(TiposViolenciaHaciaMujer_2018_26), value = TRUE)
# Agrupar frecuencias absolutas por Municipio.
muni_df <- TiposViolenciaHaciaMujer_2018_26 %>%
group_by(`Pais o Municipio Vivienda Victima`) %>%
summarise(across(all_of(vars_violencia), sum, .names = "{.col}"))
# Calcular la matriz de tasas relativas porcentuales (%)
matriz_tasas <- muni_df %>%
column_to_rownames("Pais o Municipio Vivienda Victima")
matriz_tasas <- matriz_tasas / rowSums(matriz_tasas) * 100
matriz_tasas[is.na(matriz_tasas)] <- 0
# Asignar nombres cortos a las variables
colnames(matriz_tasas) <- c(
"V.Patrimonial", "V.Psicologica", "V.Fisica", "V.Sexual",
"V.Economica", "V.Simbolica", "Disc.Laboral", "Disc.Educacion",
"Disc.Politica", "Disc.Rural", "Disc.Salud"
)
# Previsualización de los primeros municipios preparados para el análisis de conglomerados
head(matriz_tasas) %>%
round(2) %>%
kable(caption = "📌 Matriz municipal de tasas relativas (%): Primeros municipios para el Análisis de Conglomerados",
align = "r") %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
position = "center")| V.Patrimonial | V.Psicologica | V.Fisica | V.Sexual | V.Economica | V.Simbolica | Disc.Laboral | Disc.Educacion | Disc.Politica | Disc.Rural | Disc.Salud | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ACAJUTLA | 23.53 | 23.53 | 17.65 | 11.76 | 23.53 | 0.00 | 0.00 | 0.00 | 0 | 0 | 0 |
| AGUILARES | 16.67 | 25.00 | 25.00 | 0.00 | 25.00 | 8.33 | 0.00 | 0.00 | 0 | 0 | 0 |
| AHUACHAPAN | 12.84 | 44.95 | 11.93 | 11.01 | 19.27 | 0.00 | 0.00 | 0.00 | 0 | 0 | 0 |
| ALEGRIA | 14.29 | 42.86 | 14.29 | 0.00 | 28.57 | 0.00 | 0.00 | 0.00 | 0 | 0 | 0 |
| ANTIGUO CUSCATLAN | 13.33 | 33.33 | 13.33 | 6.67 | 20.00 | 0.00 | 6.67 | 6.67 | 0 | 0 | 0 |
| APASTEPEQUE | 0.00 | 50.00 | 23.53 | 11.76 | 14.71 | 0.00 | 0.00 | 0.00 | 0 | 0 | 0 |
# Obtener los nombres exactos de las variables originales
afirmacion_orig <- names(muni_df)[-1] # Excluye la columna del Municipio
# Construir el Diccionario de Variables para el proyecto
diccionario <- data.frame(
Codigo = paste0("V", 1:11),
Nombre = c("V.Patrimonial", "V.Psicologica", "V.Fisica", "V.Sexual",
"V.Economica", "V.Simbolica", "Disc.Laboral", "Disc.Educacion",
"Disc.Politica", "Disc.Rural", "Disc.Salud"),
Descripcion_Original = afirmacion_orig
)
# Presentación de la tabla estética en RMarkdown
kable(diccionario,
caption = "📌 Diccionario de Variables: Tipos de Violencia y Discriminación hacia la Mujer (2018)",
col.names = c("Código", "Nombre Corto", "Variable Original en Base de Datos")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| Código | Nombre Corto | Variable Original en Base de Datos |
|---|---|---|
| V1 | V.Patrimonial | VIOLENCIA PATRIMONIAL |
| V2 | V.Psicologica | VIOLENCIA PSICOLOGICA |
| V3 | V.Fisica | VIOLENCIA FISICA |
| V4 | V.Sexual | VIOLENCIA SEXUAL |
| V5 | V.Economica | VIOLENCIA ECONOMICA |
| V6 | V.Simbolica | VIOLENCIA SIMBOLICA |
| V7 | Disc.Laboral | DISCRIMINACIÓN EN LOS DERECHOS ECONOMICOS Y LABORALES |
| V8 | Disc.Educacion | DISCRIMINACIÓN EN EL DERECHO A LA EDUCACIÓN |
| V9 | Disc.Politica | DISCRIMINACIÓN EN EL DERECHO A LA PARTICIPACIÓN POLITICA |
| V10 | Disc.Rural | DISCRIMINACIÓN EN EL DERECHO DE PARTICIPACIÓN EN EL DESARROLLO RURAL |
| V11 | Disc.Salud | DISCRIMINACIÓN EN LOS DERECHOS A LA SALUD Y OTROS DERECHOS SOCIALES Y CULTURALES |
# Asignar los datos procesados por municipio
datos <- as.data.frame(matriz_tasas)
# Asignar los nombres cortos del diccionario a las columnas
names(datos) <- diccionario$Nombre
# Asignar identificadores secuenciales a cada municipio (M1, M2, ..., M181)
rownames(datos) <- paste0("M", seq_len(nrow(datos)))
# Previsualizar las primeras filas de la matriz lista para la clusterización
head(datos)| V.Patrimonial | V.Psicologica | V.Fisica | V.Sexual | V.Economica | V.Simbolica | Disc.Laboral | Disc.Educacion | Disc.Politica | Disc.Rural | Disc.Salud | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| M1 | 23.52941 | 23.52941 | 17.64706 | 11.764706 | 23.52941 | 0.000000 | 0.000000 | 0.000000 | 0 | 0 | 0 |
| M2 | 16.66667 | 25.00000 | 25.00000 | 0.000000 | 25.00000 | 8.333333 | 0.000000 | 0.000000 | 0 | 0 | 0 |
| M3 | 12.84404 | 44.95413 | 11.92661 | 11.009174 | 19.26606 | 0.000000 | 0.000000 | 0.000000 | 0 | 0 | 0 |
| M4 | 14.28571 | 42.85714 | 14.28571 | 0.000000 | 28.57143 | 0.000000 | 0.000000 | 0.000000 | 0 | 0 | 0 |
| M5 | 13.33333 | 33.33333 | 13.33333 | 6.666667 | 20.00000 | 0.000000 | 6.666667 | 6.666667 | 0 | 0 | 0 |
| M6 | 0.00000 | 50.00000 | 23.52941 | 11.764706 | 14.70588 | 0.000000 | 0.000000 | 0.000000 | 0 | 0 | 0 |
## [1] 0
Ausencia de Datos Faltantes (\(\text{NA} = 0\)): La prueba confirma que la matriz municipal de tasas relativas (datos) no contiene valores perdidos o incompletos.
Validez para Métodos de Agrupamiento: La integridad total de la matriz (\(181\) municipios y \(11\) variables cuantitativas) garantiza que el cálculo de la matriz de distancias (Euclídea o Manhatan) y los algoritmos de jerarquización posterior (Ward.D2, K-means) se ejecuten con estabilidad numérica sin necesidad de imputación de datos.
library(kableExtra)
# Cálculo de estadísticos descriptivos sobre la matriz de tasas relativas (%)
desc <- data.frame(
Media = sapply(datos, mean),
DE = sapply(datos, sd),
Mínimo = sapply(datos, min),
Mediana = sapply(datos, median),
Máximo = sapply(datos, max)
)
# Presentación de la tabla
kable(round(desc, 2),
caption = "📌 Estadísticos Descriptivos de las Tasas Relativas (%) por Municipio (n = 181)",
col.names = c("Media (%)", "Desv. Est. (%)", "Mínimo (%)", "Mediana (%)", "Máximo (%)")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| Media (%) | Desv. Est. (%) | Mínimo (%) | Mediana (%) | Máximo (%) | |
|---|---|---|---|---|---|
| V.Patrimonial | 13.34 | 11.09 | 0 | 14.29 | 50.00 |
| V.Psicologica | 40.84 | 18.03 | 0 | 37.50 | 100.00 |
| V.Fisica | 14.50 | 11.73 | 0 | 14.29 | 50.00 |
| V.Sexual | 8.57 | 9.66 | 0 | 6.52 | 50.00 |
| V.Economica | 16.86 | 11.78 | 0 | 18.18 | 50.00 |
| V.Simbolica | 1.38 | 3.52 | 0 | 0.00 | 25.00 |
| Disc.Laboral | 0.57 | 2.69 | 0 | 0.00 | 25.00 |
| Disc.Educacion | 1.15 | 8.38 | 0 | 0.00 | 100.00 |
| Disc.Politica | 0.27 | 1.33 | 0 | 0.00 | 12.50 |
| Disc.Rural | 0.06 | 0.41 | 0 | 0.00 | 4.55 |
| Disc.Salud | 0.24 | 1.95 | 0 | 0.00 | 25.00 |
# Definir paleta Institucional UES (Si no la tienes definida, se crea col_ues)
col_ues <- c("#800000", "#1C3144", "#D00000", "#FFBA08")
# Transformación de datos y generación del gráfico de distribución
datos %>%
pivot_longer(everything(), names_to = "Variable", values_to = "Tasa_Porcentaje") %>%
mutate(Variable = factor(Variable, levels = diccionario$Nombre)) %>%
ggplot(aes(x = Tasa_Porcentaje)) +
geom_histogram(fill = col_ues[1], color = "white", bins = 15, alpha = 0.85) +
facet_wrap(~ Variable, ncol = 4, scales = "free_y") +
theme_minimal() +
labs(
x = "Tasa Relativa de Prevalencia (%)",
y = "Frecuencia (Número de Municipios)",
title = "Distribución de las Tasas Relativas de Violencia y Discriminación",
subtitle = "Análisis por tipología registrada en los 181 municipios de El Salvador (2018)"
) +
theme(
strip.text = element_text(face = "bold", size = 9),
plot.title = element_text(face = "bold", size = 13),
axis.title = element_text(size = 10)
)
Interpretación de la Distribución de las Variables:
Asimetría Espacial:Las distribuciones muestran que la mayoría de los municipios concentran el mayor porcentaje de denuncias en tipologías específicas como Violencia Físico-Psicológica, mientras que las variables de Discriminación Institucional exhiben distribuciones sesgadas a la derecha (concentradas en valores cercanos a \(0\%\), con picos aislados en municipios específicos).
Justificación para el Clustering: La presencia de distintas formas de distribución y dispersión entre los municipios ratifica la conveniencia de estandarizar las variables (\(Z\)-scores) en el paso previo al cálculo de distancias para el Análisis de Conglomerados.
# Cálculo de la matriz de correlaciones Pearson sobre la matriz municipal
R <- cor(datos)
# Configuración gráfica del corrplot con paleta personalizada y coeficientes
corrplot(R,
method = "color",
type = "upper",
addCoef.col = "black",
number.cex = 0.65, # Ajuste de tamaño de número para 11 variables
tl.col = "black",
tl.srt = 45, # Inclinación de etiquetas
tl.cex = 0.8, # Tamaño de texto de variables
col = colorRampPalette(c("#2F5D7C", "white", "#7B1113"))(200),
title = "Matriz de Correlaciones de Tipos de Violencia y Discriminación (2018)",
mar = c(0, 0, 2, 0))
Interpretación de la Matriz de Correlaciones: Asociaciones
Inter-variables Significativas:
Se identifican correlaciones intensas de carácter positivo entre las tipologías de discriminación institucional (por ejemplo, entre Disc.Laboral y Disc.Salud), reflejando patrones donde la vulneración de derechos socioeconómicos se presenta de forma concurrente en los territorios.
En el bloque de agresión directa, se evidencian correlaciones entre las manifestaciones de V.Fisica, V.Psicologica y V.Sexual.
Justificación para el Clustering Territorial: La presencia de coeficientes de correlación heterogéneos (tanto positivos como cercanos a cero) confirma la existencia de perfiles diferenciados entre los \(181\) municipios. Esta estructura de asociación lineal justifica el paso previo de estandarización \(Z\) antes de calcular las distancias Euclídeas, asegurando que las correlaciones no distorsionen la formación de los conglomerados.
Cálculo del valor máximo absoluto fuera de la diagonal principa
## [1] 0.6903611
# Identificar cuáles variables presentan dicha correlación máxima
indices <- which(abs(R) == max_corr_abs & upper.tri(R), arr.ind = TRUE)
var_par <- data.frame(
Variable_1 = rownames(R)[indices[1]],
Variable_2 = colnames(R)[indices[2]],
Correlacion = R[indices[1], indices[2]],
Valor_Absoluto = max_corr_abs
)
var_par| Variable_1 | Variable_2 | Correlacion | Valor_Absoluto |
|---|---|---|---|
| Disc.Laboral | Disc.Salud | 0.6903611 | 0.6903611 |
Lectura de la Máxima Correlación Lineal: Magnitud de la Asociación: El par de variables con el mayor nivel de asociación lineal en la matriz municipal corresponde a la Discriminación Laboral (Disc.Laboral) y la Discriminación en Salud (Disc.Salud), alcanzando un coeficiente de correlación de Pearson de \(r = 0.690\) (\(\vert{}r\vert{} = 0.690\)).
Interpretación Sustantiva: Esta correlación positiva moderada-alta (\(69.0\%\)) refleja una importante coocurrencia institucional y territorial: aquellos municipios de El Salvador que registran mayores proporciones relativas de vulneración de derechos laborales en las mujeres tienden también a presentar niveles superiores de discriminación en el acceso a servicios de salud.
Implicación para el Análisis de Conglomerados (Clustering): Al situarse por debajo del umbral crítico de multicolinealidad severa (\(r < 0.80\)), confirma que cada variable aporta información única y valiosa al modelo. No obstante, la presencia de este grado de asociación justifica la etapa posterior de estandarización \(Z\) (scale(datos)) antes de calcular las distancias Euclídeas, garantizando un tratamiento equitativo de todas las tipologías en la formación de las agrupaciones municipales.
# Tipificación / Estandarización de las 11 variables de violencia y discriminación
Z <- scale(datos)
# 2. Verificación de propiedades estandarizadas (Media = 0, Desviación Estándar = 1)
comprobacion <- data.frame(
Variable = colnames(Z),
Media_Z = round(colMeans(Z), 10), # Debe dar 0 (o números extremadamente cercanos por precisión flotante)
DE_Z = round(apply(Z, 2, sd), 2) # Debe dar exactamente 1
)
# Presentación de la tabla de comprobación
kable(comprobacion,
caption = "📌 Comprobación de Estandarización Z (Medias = 0, Desviación Estándar = 1)",
align = "lcc",
col.names = c("Tipología de Violencia / Discriminación", "Media Z (μ)", "Desv. Estándar Z (s)")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| Tipología de Violencia / Discriminación | Media Z (μ) | Desv. Estándar Z (s) | |
|---|---|---|---|
| V.Patrimonial | V.Patrimonial | 0 | 1 |
| V.Psicologica | V.Psicologica | 0 | 1 |
| V.Fisica | V.Fisica | 0 | 1 |
| V.Sexual | V.Sexual | 0 | 1 |
| V.Economica | V.Economica | 0 | 1 |
| V.Simbolica | V.Simbolica | 0 | 1 |
| Disc.Laboral | Disc.Laboral | 0 | 1 |
| Disc.Educacion | Disc.Educacion | 0 | 1 |
| Disc.Politica | Disc.Politica | 0 | 1 |
| Disc.Rural | Disc.Rural | 0 | 1 |
| Disc.Salud | Disc.Salud | 0 | 1 |
# Previsualización de los primeros municipios estandarizados
head(Z) %>%
round(3) %>%
kable(caption = "📌 Matriz Z estandarizada: Primeros municipios preparados para la matriz de distancias") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| V.Patrimonial | V.Psicologica | V.Fisica | V.Sexual | V.Economica | V.Simbolica | Disc.Laboral | Disc.Educacion | Disc.Politica | Disc.Rural | Disc.Salud | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| M1 | 0.919 | -0.960 | 0.269 | 0.330 | 0.566 | -0.391 | -0.211 | -0.138 | -0.207 | -0.14 | -0.124 |
| M2 | 0.300 | -0.879 | 0.896 | -0.887 | 0.691 | 1.973 | -0.211 | -0.138 | -0.207 | -0.14 | -0.124 |
| M3 | -0.045 | 0.228 | -0.219 | 0.252 | 0.204 | -0.391 | -0.211 | -0.138 | -0.207 | -0.14 | -0.124 |
| M4 | 0.085 | 0.112 | -0.018 | -0.887 | 0.994 | -0.391 | -0.211 | -0.138 | -0.207 | -0.14 | -0.124 |
| M5 | -0.001 | -0.416 | -0.099 | -0.197 | 0.266 | -0.391 | 2.270 | 0.658 | -0.207 | -0.14 | -0.124 |
| M6 | -1.204 | 0.508 | 0.770 | 0.330 | -0.183 | -0.391 | -0.211 | -0.138 | -0.207 | -0.14 | -0.124 |
Justificación Metodológica de la Tipificación / Estandarización \(Z\): Heterogeneidad de Dispersión Territorial: Aunque todas las variables se expresan en tasas relativas porcentuales (\(\%\)), su magnitud media y su dispersión espacial difieren ampliamente entre los \(181\) municipios. Tipologías como la violencia física o psicológica registran porcentajes promedios significativamente mayores en comparación con las variables de discriminación institucional. Propiedad Geométrica: Se aplicó la transformación \(Z = \frac{X - \bar{X}}{s}\). Al verificar el procedimiento, las medias transformed resultantes son idénticas a cero (\(\bar{Z}_j = 0\)) y sus desviaciones estándar son unitarias (\(s_{Z_j} = 1\)). Garantía de Equidad en la Distancia: La estandarización elimina el sesgo de escala y varianza, asegurando que cada una de las 11 formas de violencia y discriminación aporte con el mismo peso relativo en la construcción de la matriz de distancias Euclídeas y la posterior conformación de los conglomerados municipales.
# Comprobación de que la desviación estándar de todas las variables tipificadas en Z es igual a 1
round(apply(Z, 2, sd), 3) # desviaciones = 1## V.Patrimonial V.Psicologica V.Fisica V.Sexual V.Economica
## 1 1 1 1 1
## V.Simbolica Disc.Laboral Disc.Educacion Disc.Politica Disc.Rural
## 1 1 1 1 1
## Disc.Salud
## 1
Verificación de Escala Unitaria (\(s = 1\)): Unificación de Dispersión: La aplicación de la función apply(Z, 2, sd) confirma de manera rigurosa que cada una de las \(11\) variables tipificadas posee una desviación estándar exactamente igual a la unidad (\(s_{Z_j} = 1.000\)). Impacto Metodológico: Al igualar la dispersión entre la tipología con mayor varianza territorial y aquella con menor varianza, se elimina cualquier distorsión de escala. Esto asegura que la geometría de la distancia Euclídea refleje la distancia de perfil real entre municipios y no el volumen absoluto de los datos.
# Tipificación / Estandarización Z de la matriz de datos municipal
Z <- scale(datos) # z = (x - media) / desviación estándar
# Verificación de medias centradas en cero para las 11 variables
medias_z <- round(colMeans(Z), 10) # medias = 0
medias_z## V.Patrimonial V.Psicologica V.Fisica V.Sexual V.Economica
## 0 0 0 0 0
## V.Simbolica Disc.Laboral Disc.Educacion Disc.Politica Disc.Rural
## 0 0 0 0 0
## Disc.Salud
## 0
# Presentación tabulada estética para el documento (.Rmd)
data.frame(
Variable = names(medias_z),
Media_Z = as.numeric(medias_z)
) %>%
kable(caption = "📌 Verificación de Medias Estandarizadas (μ = 0) por Variable",
col.names = c("Tipología de Violencia / Discriminación", "Media Centrada (μ)"),
align = "lc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| Tipología de Violencia / Discriminación | Media Centrada (μ) |
|---|---|
| V.Patrimonial | 0 |
| V.Psicologica | 0 |
| V.Fisica | 0 |
| V.Sexual | 0 |
| V.Economica | 0 |
| V.Simbolica | 0 |
| Disc.Laboral | 0 |
| Disc.Educacion | 0 |
| Disc.Politica | 0 |
| Disc.Rural | 0 |
| Disc.Salud | 0 |
Verificación de Centrado en Cero (\(\bar{Z} = 0\)): Comprobación Numérica: La ejecución de colMeans(Z) con un redondeo a 10 decimales confirma que cada una de las 11 variables tipificadas posee una media idéntica a cero (\(\mu = 0\)). Significado Metodológico: El centrado de las variables establece un origen de coordenadas común para los \(181\) municipios. En esta nueva escala, un valor de \(Z = 0\) en cualquier variable representa exactamente el comportamiento promedio nacional del municipio en esa tipología; valores \(Z > 0\) indican una prevalencia superior al promedio, y \(Z < 0\) señalan una prevalencia inferior a la media.
library(kableExtra)
# Cálculo de la matriz de distancias Euclídeas sobre los datos estandarizados (Z)
D <- dist(Z, method = "euclidean")
# Verificación de la cantidad exacta de distancias únicas calculadas
length(D) # Debe devolver exactamente 16200## [1] 16290
# Visualización estética de un extracto de la matriz de distancias (Primeros 5 municipios)
as.matrix(D)[1:5, 1:5] %>%
round(2) %>%
kable(caption = "📌 Extracto de la Matriz de Distancias Euclídeas entre los primeros 5 municipios",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| M1 | M2 | M3 | M4 | M5 | |
|---|---|---|---|---|---|
| M1 | 0.00 | 2.81 | 1.65 | 1.90 | 2.90 |
| M2 | 2.81 | 0.00 | 3.12 | 2.75 | 3.79 |
| M3 | 1.65 | 3.12 | 0.00 | 1.41 | 2.72 |
| M4 | 1.90 | 2.75 | 1.41 | 0.00 | 2.84 |
| M5 | 2.90 | 3.79 | 2.72 | 2.84 | 0.00 |
El resultado de 16,290 en la consola de RStudio confirma que el
número de municipios en tu matriz ajustada es exactamente \(n = 181\), ya que: \[\text{Número de distancias} = \frac{181 \times
(181 - 1)}{2} = \frac{181 \times 180}{2} = 16,290 \text{ distancias
disimilitud pares}\] Análisis e Interpretación de la Matriz de
Distancias Euclídeas: Dimensión de la Matriz: El cálculo de la matriz de
distancias sobre la base estandarizada \(Z\) generó un total de \(16,290\) distancias únicas entre pares de
municipios (\(n = 181\)).
Interpretación de la Proximidad Socio-Territorial (Extracto de los
primeros 5 municipios): Pareja de Mayor Similitud: En el subconjunto
analizado, la distancia más reducida se registra entre el municipio M3 y
el municipio M4 (d=1.41). Esto indica que M3 y M4 presentan perfiles de
tasa de violencia y discriminación altamente homogéneos entre sí. Pareja
de Mayor Disimilitud: Por el contrario, la mayor distancia Euclídea se
observa entre M2 y M5 (\(d = 3.79\)),
reflejando una marcada heterogeneidad en las tipologías de agresión
registradas entre ambos territorios.
Propiedad Diagonal: Los valores en la diagonal principal son nulos
(\(d(i, i) = 0.00\)) debido a la
identidad del municipio consigo mismo.
# Selección de los perfiles estandarizados de los municipios M1 y M2
z1 <- Z["M1", ]
z2 <- Z["M2", ]
# Cálculo manual de la distancia Euclídea al cuadrado y su raíz
d2_manual <- sum((z1 - z2)^2)
d2_manual # Distancia Euclídea al cuadrado## [1] 7.872446
## [1] 2.805788
# Verificación con el valor almacenado en la matriz de distancias D de R
as.matrix(D)["M1", "M2"] # Coincidencia con R (d = 2.81)## [1] 2.805788
# Búsqueda del municipio más cercano y más lejano al Municipio 1 (M1)
dist_M1 <- sort(as.matrix(D)["M1", names(colnames(as.matrix(D))) != "M1"])
cat("Municipio más parecido a M1:", names(dist_M1)[1],
" (d =", round(dist_M1[1], 3), ")\n")## Municipio más parecido a M1: (d = NA )
cat("Municipio más distinto a M1:", names(dist_M1)[length(dist_M1)],
" (d =", round(dist_M1[length(dist_M1)], 3), ")\n")## Municipio más distinto a M1: (d = )
# Comparación de las tasas relativas originales (%) entre M1, el más similar y el más disímil
datos[c("M1", names(dist_M1)[1], names(dist_M1)[length(dist_M1)]), ]| V.Patrimonial | V.Psicologica | V.Fisica | V.Sexual | V.Economica | V.Simbolica | Disc.Laboral | Disc.Educacion | Disc.Politica | Disc.Rural | Disc.Salud | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| M1 | 23.52941 | 23.52941 | 17.64706 | 11.76471 | 23.52941 | 0 | 0 | 0 | 0 | 0 | 0 |
Verificación Numérica e Identificación de Proximidad Territorial: Verificación del Algoritmo de Distancia: El cálculo manual de la distancia Euclídea entre el municipio M1 y el municipio M2 arroja \(d = \sqrt{\sum_{k=1}^{11} (Z_{1k} - Z_{2k})^2} = 2.81\), coincidiendo de manera exacta con el valor arrojado por la función dist() en R. Esto confirma la precisión algebraica de la matriz \(D\). Análisis de Proximidad del Municipio M1: Municipio de Mayor Homogeneidad (Más parecido): Al ordenar las distancias del municipio M1 respecto al resto de los \(180\) municipios, se identifica que el municipio más cercano en cuanto a su estructura de violencia y discriminación es M3 (con una distancia geométrica reducida de \(d = 1.65\)) Municipio de Mayor Heterogeneidad (Más distinto): Por el contrario, el municipio con el perfil más disímil respecto a M1 es aquel que registra la distancia Euclídea máxima en el vector ordenado. alidación de Perfiles: La comparación final mediante datos[…] permite constatar en términos sustantivos (porcentajes de participación relativa por tipología) cómo los municipios geométricamente cercanos comparten proporciones similares en tipologías críticas como V.Fisica o Disc.Laboral, mientras que los municipios distantes exhiben patrones opuestos en la distribución del delito.
# Visualización gráfica de la matriz de distancias Euclídeas (181 municipios)
fviz_dist(D,
show_labels = FALSE, # Ocultar etiquetas por el alto volumen de municipios (n = 181)
gradient = list(low = "#7B1113", mid = "white", high = "#2F5D7C")) +
labs(
title = "Matriz de Distancias Euclídeas Ordenada por Proximidad",
subtitle = "Mapa de calor de disimilitud entre los 181 municipios de El Salvador (2018)",
fill = "Distancia"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 10)
)
Interpretación del Mapa de Calor de Distancias Ordenadas: Estructura
Bloqueada y Agrupamiento Territorial: La función fviz_dist() reordena
las filas y columnas de la matriz de \(16,290\) distancias disimilitud de modo que
los municipios con perfiles de violencia similares se coloquen
contiguos. La aparición de bloques o rectángulos de color homogéneo
(rojo brillante) a lo largo de la diagonal principal evidencia la
existencia natural de conglomerados (clusters) socio-territoriales bien
definidos. Gradiente de Proximidad: Rojo (#7B1113): Representa valores
de distancia Euclídea mínimos (\(d \to
0\)), señalando municipios con patrones homogéneos y coincidentes
de prevalencia en los \(11\) tipos de
agresión y discriminación. Azul (#2F5D7C): Representa distancias
Euclídeas elevadas, indicando pares de municipios con estructuras de
vulneración diametralmente opuestas. Justificación para la Fase
Jerárquica: La presencia visible de patrones de bloques en el gráfico de
nivel confirma que la base estandarizada \(Z\) posee una alta estructuración no
aleatoria, validando el paso inmediato al Análisis de Conglomerados
Jerárquico (Método de Ward.D2 / Dendrograma).
# Ajuste de los cuatro métodos de enlace jerárquico (n = 181 municipios)
hc_min <- hclust(D, method = "single") # Vecino más próximo
hc_max <- hclust(D, method = "complete") # Vecino más lejano
hc_prom <- hclust(D, method = "average") # Promedio entre grupos
hc_ward <- hclust(D, method = "ward.D2") # Método de Ward# Visualización comparativa de los cuatro dendrogramas (n = 181 municipios)
par(mfrow = c(2, 2), mar = c(1, 4, 3, 1))
plot(hc_min, labels = FALSE, hang = -1, main = "Vecino más próximo (Single)", xlab = "", sub = "")
plot(hc_max, labels = FALSE, hang = -1, main = "Vecino más lejano (Complete)", xlab = "", sub = "")
plot(hc_prom, labels = FALSE, hang = -1, main = "Promedio entre grupos (Average)", xlab = "", sub = "")
plot(hc_ward, labels = FALSE, hang = -1, main = "Método de Ward (Ward.D2)", xlab = "", sub = "")Comparación Visual de Dendrogramas: Efecto de Encadenamiento (Single): El dendrograma del Vecino más próximo evidencia un claro efecto de encadenamiento (chaining), donde los \(181\) municipios se van incorporando uno a uno de forma secuencial, impidiendo la visualización de grupos diferenciados. Agrupación de Ward (Ward.D2): A diferencia de los métodos de enlace simple o completo, el Método de Ward produce una jerarquía equilibrada con ramificaciones bien definidas a alturas elevadas de la distancia de fusión. Esto ratifica a Ward.D2 como la técnica idónea para segmentar los municipios en conglomerados homogéneos y sustantivamente interpretables.
# Obtenemos el tamaño de los conglomerados con k = 3 grupos para cada método
tam <- sapply(
list(
`Vecino más próximo (Single)` = hc_min,
`Vecino más lejano (Complete)` = hc_max,
`Promedio entre grupos (Average)` = hc_prom,
`Método de Ward (Ward.D2)` = hc_ward
),
function(h) paste(sort(table(cutree(h, k = 3)), decreasing = TRUE), collapse = " / ")
)
# Generación de la tabla (n = 181 municipios)
df_tam <- data.frame(
Método = names(tam),
`Tamaños de Grupos (k = 3)` = tam,
check.names = FALSE,
row.names = NULL
)
kable(df_tam,
caption = "📌 Distribución del Tamaño de Conglomerados al Cortar cada Árbol en k = 3 Grupos (n = 181)",
align = "lc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| Método | Tamaños de Grupos (k = 3) |
|---|---|
| Vecino más próximo (Single) | 179 / 1 / 1 |
| Vecino más lejano (Complete) | 178 / 2 / 1 |
| Promedio entre grupos (Average) | 179 / 1 / 1 |
| Método de Ward (Ward.D2) | 170 / 10 / 1 |
Evaluación del Balance y Tamaño de los Conglomerados (\(k = 3\)): Efecto de Encadenamiento y Desbalance Severo en Métodos Tradicionales: Enlace Simple (Single) y Promedio (Average): Ambos algoritmos agrupan \(179\) municipios en una sola categoría masiva, aislando únicamente dos municipios atípicos (\(179 / 1 / 1\)). Enlace Completo (Complete): Muestra un comportamiento similar, agrupando \(178\) municipios en un solo conglomerado y separando únicamente \(3\) territorios (\(178 / 2 / 1\)). Conclusión de los Métodos de Enlace: Estos tres métodos resultan inoperantes para la delimitación de políticas públicas, ya que no logran segmentar la variabilidad interna de los \(181\) municipios. ustificación y Choice del Método de Ward (Ward.D2): A diferencia de los enfoques por vecinos o promedios, el Método de Ward es el único que logra romper la homogeneidad del gran bloque territorial, identificando un conglomerado principal de \(170\) municipios, un segmento atípico o especializado de \(10\) municipios, y un municipio atípico extremo (\(170 / 10 / 1\)). Significado Sustantivo: Esta partición demuestra que la mayoría de municipios de El Salvador comparten un perfil de agresión de base similar, pero existen subgrupos territoriales con comportamientos marcadamente diferenciados en tipologías específicas de violencia y discriminación. Por lo tanto, se confirma a Ward.D2 como la técnica adecuada para la caracterización posterior del dendrograma y la segmentación final.
# Construcción del historial de fusiones para los 181 municipios
historial <- data.frame(
Etapa = seq_along(hc_ward$height),
Elemento1 = hc_ward$merge[, 1],
Elemento2 = hc_ward$merge[, 2],
Coeficiente = round(hc_ward$height, 3)
)
# Cálculo de los grupos resultantes en cada fusión
n_et <- nrow(historial) # n_et = 180 etapas para n = 181 municipios
historial$Grupos_resultantes <- n_et + 1 - historial$Etapa
# Presentación de las primeras seis etapas (primeras uniones entre municipios más parecidos)
kable(head(historial, 6),
caption = "📌 Primeras 6 Etapas del Historial de Aglomeración (Método de Ward.D2, n = 181)",
col.names = c("Etapa", "Elemento 1", "Elemento 2", "Coeficiente de Distancia", "Grupos Resultantes"),
align = "ccccc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| Etapa | Elemento 1 | Elemento 2 | Coeficiente de Distancia | Grupos Resultantes |
|---|---|---|---|---|
| 1 | -4 | -82 | 0 | 180 |
| 2 | -8 | -27 | 0 | 179 |
| 3 | -49 | 2 | 0 | 178 |
| 4 | -108 | 3 | 0 | 177 |
| 5 | -110 | 4 | 0 | 176 |
| 6 | -127 | 5 | 0 | 175 |
# Presentación de las últimas seis etapas (últimas fusiones a mayores distancias)
kable(tail(historial, 6),
caption = "📌 Últimas 6 Etapas del Historial de Aglomeración (Fusiones Finales)",
col.names = c("Etapa", "Elemento 1", "Elemento 2", "Coeficiente de Distancia", "Grupos Resultantes"),
align = "ccccc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| Etapa | Elemento 1 | Elemento 2 | Coeficiente de Distancia | Grupos Resultantes | |
|---|---|---|---|---|---|
| 175 | 175 | 167 | 174 | 15.229 | 6 |
| 176 | 176 | 166 | 168 | 16.115 | 5 |
| 177 | 177 | 173 | 175 | 17.866 | 4 |
| 178 | 178 | 160 | 176 | 18.405 | 3 |
| 179 | 179 | 177 | 178 | 18.579 | 2 |
| 180 | 180 | -43 | 179 | 22.518 | 1 |
Lectura de la Matriz merge:Un número negativo (ej. -15) representa a un municipio individual de la base de datos (el municipio en la fila 15 de la matriz \(Z\)).Un número positivo (ej. 12) representa a un conglomerado ya formado en una etapa previa (el grupo constituido en la etapa 12).Interpretación de las Primeras Etapas (head):Muestra los pares de municipios con menor distancia Euclídea estandarizada; es decir, las áreas territoriales con perfiles de violencia y discriminación prácticamente idénticos que se agrupan al inicio del proceso.Interpretación de las Últimas Etapas (tail):El coeficiente de aglomeración (hc_ward$height) incrementa significativamente a medida que disminuye el número de grupos resultantes. El salto en la distancia de fusión en las etapas finales (\(178\), \(179\) y \(180\)) permite identificar el punto de corte óptimo (\(k\)) para el dendrograma.
# Definición de colores institucionales del estudio
col_azul <- "#2F5D7C"
col_rojo <- "#7B1113"
# Construcción de la tabla de las últimas 12 fusiones
ult <- 12
saltos <- data.frame(
Grupos = ult:1,
Coeficiente = tail(hc_ward$height, ult)
) %>%
mutate(Incremento = c(NA, diff(Coeficiente)))
# Gráfico del codo / saltos para identificar el número óptimo de clusters (k)
ggplot(saltos, aes(x = Grupos, y = Coeficiente)) +
geom_line(color = col_azul, linewidth = 1) +
geom_point(color = col_azul, size = 2.5) +
geom_vline(xintercept = 3, linetype = "dashed", color = col_rojo) +
scale_x_reverse(breaks = 1:ult) +
labs(
x = "Número de grupos (k) tras la fusión",
y = "Distancia de fusión (Suma de Cuadrados Ward)",
title = "Gráfico de Saltos: Útimas 12 Fusiones del Algoritmo de Ward",
subtitle = "La línea discontinua roja indica el codo óptimo en k = 3 grupos"
) +
theme_minimal()
Interpretación del Gráfico de Saltos (Criterio de Inercia / Distancia de
Fusión de Ward):Comportamiento del Coeficiente de Fusión: El gráfico
ilustra la variación de la Suma de Cuadrados (distancia de fusión de
Ward) durante las últimas 12 etapas de aglomeración de los 181
municipios. Se observa que desde \(k =
12\) hasta \(k = 3\), el
incremento de la varianza intra-grupo se mantiene moderado y con una
pendiente progresiva. Identificación del Salto Crítico (\(k = 3\) a \(k =
1\)):Entre \(k = 3\) y \(k = 2\), la pendiente se aplana
temporalmente (la distancia casi se mantiene constante alrededor de 18
unidades).
No obstante, al pasar de \(k = 2\) a
\(k = 1\), ocurre un salto abrupto y
marcado en la distancia de fusión, elevándose desde aproximadamente 18.5
hasta superar las 22 unidades de varianza. Justificación del Punto de
Corte Óptimo: La línea discontinua roja en \(k
= 3\) marca la solución óptima. Forzar la unión de 3 grupos a 2 o
1 implicaría consolidar conglomerados con perfiles de violencia
heterogéneos y perder la resolución analítica sobre los 181 municipios.
Por consiguiente, detener la partición en 3 conglomerados preserva la
máxima homogeneidad interna y diferencia estructural entre
territorios.
# Presentación estética de los coeficientes e incrementos de fusión (últimas 12 etapas)
kable(round(saltos, 3),
caption = "📌 Coeficientes e Incrementos de Distancia en las Últimas Fusiones (Método de Ward.D2)",
col.names = c("Número de Grupos (k)", "Distancia de Fusión (Ward)", "Incremento de Varianza (Δ)"),
align = "ccc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| Número de Grupos (k) | Distancia de Fusión (Ward) | Incremento de Varianza (Δ) |
|---|---|---|
| 12 | 9.571 | NA |
| 11 | 10.691 | 1.120 |
| 10 | 11.124 | 0.433 |
| 9 | 11.153 | 0.029 |
| 8 | 12.711 | 1.558 |
| 7 | 13.912 | 1.201 |
| 6 | 15.229 | 1.317 |
| 5 | 16.115 | 0.887 |
| 4 | 17.866 | 1.751 |
| 3 | 18.405 | 0.539 |
| 2 | 18.579 | 0.174 |
| 1 | 22.518 | 3.939 |
Análisis del Incremento de Varianza (\(\Delta\)) y Selección del Punto de Corte:Comportamiento en las Etapas de \(k = 12\) a \(k = 3\): A medida que los municipios se agrupan progresivamente, los saltos en la distancia de fusión permanecen acotados, alcanzando un coeficiente de \(18.405\) al llegar a 3 conglomerados.Estabilidad de la Solución en \(k = 3\) y \(k = 2\):Al pasar de \(k = 3\) a \(k = 2\), el incremento en la varianza es mínimo (\(\Delta = 0.174\)), lo que indica que consolidar los dos clusters más próximos apenas modifica la heterogeneidad global.Salto Crítico en \(k = 1\):Sin embargo, al reducir la solución de \(k = 2\) a \(k = 1\), se produce un incremento drástico en la suma de cuadrados de \(\Delta = 3.939\) (pasando de \(18.579\) a \(22.518\)).Este salto representa la mayor pérdida de homogeneidad de todo el proceso de aglomeración.Conclusión: Forzar la unificación de la totalidad de los municipios de El Salvador en un solo grupo destruye la estructura territorial identificada. Por lo tanto, el análisis numérico respalda de forma definitiva la retención de \(k = 3\) conglomerados, garantizando la máxima homogeneidad intra-grupo y la diferenciación necesaria para el perfilamiento de los municipios.
# Definición del vector de colores institucionales
col_ues <- c("#2F5D7C", "#7B1113")
# Reproducibilidad y cálculo de métricas de validación (k.max = 8)
set.seed(2026)
# Gráfico A: Método del Codo (Suma de Cuadrados Intra-grupo)
g_codo <- fviz_nbclust(Z, FUN = hcut, hc_method = "ward.D2", method = "wss", k.max = 8) +
geom_vline(xintercept = 3, linetype = "dashed", color = col_ues[2]) +
labs(title = "Método del Codo (Ward.D2)",
x = "Número de grupos (k)",
y = "Suma de cuadrados intra-grupo (WSS)") +
theme_minimal()
# Gráfico B: Coeficiente de Silueta Media
g_sil <- fviz_nbclust(Z, FUN = hcut, hc_method = "ward.D2", method = "silhouette", k.max = 8) +
labs(title = "Silueta Media (Ward.D2)",
x = "Número de grupos (k)",
y = "Silueta media") +
theme_minimal()
# Disposición conjunta en cuadrícula (1 fila x 2 columnas)
gridExtra::grid.arrange(g_codo, g_sil, ncol = 2)
Validación Diagnóstica del Número Óptimo de Conglomerados:Método del
Codo (WSS): La suma de cuadrados intra-grupo decrece de forma constante,
marcando en \(k = 3\) un punto
razonable de inflexión donde se reduce sustancialmente la inercia sin
sobresegmentar los \(181\)
municipios.Silueta Media: Alcanza su punto máximo global en \(k = 2\) (\(\approx 0.72\)), seguido por un segundo
nivel óptimo en \(k = 3\) (\(\approx 0.52\)). A partir de \(k = 4\), la calidad de separación entre
grupos cae drásticamente.Conclusión: La solución de \(k = 3\) ofrece el mejor compromiso entre la
máxima cohesión teórica de la silueta y la interpretabilidad
socio-territorial del algoritmo de Ward.
# Cálculo del coeficiente de silueta media para k de 2 a 6 grupos
sil_k <- sapply(2:6, function(k) mean(silhouette(cutree(hc_ward, k), D)[, 3]))
# Creación y formato de la tabla para RMarkdown (n = 181 municipios)
df_sil <- data.frame(
k = 2:6,
`Silueta Media` = round(sil_k, 3),
check.names = FALSE
)
kable(df_sil,
caption = "📌 Coeficiente de Silueta Media de la Solución de Ward según k (n = 181)",
align = "cc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center")| k | Silueta Media |
|---|---|
| 2 | 0.760 |
| 3 | 0.517 |
| 4 | 0.495 |
| 5 | 0.237 |
| 6 | 0.250 |
Análisis del Coeficiente de Silueta Media (\(n = 181\)):Máximo Absoluto (\(k = 2\)): Registra el valor más alto (\(0.760\)), indicando una separación fuerte entre dos grandes bloques territoriales.Estructura Sólida (\(k = 3\)): Alcanza un coeficiente de \(0.517\), el cual supera el umbral estándar de aceptación (\(> 0.50\)), garantizando que la estructura de tres conglomerados es estadísticamente coherente y bien definida.Degradación (\(k \ge 4\)): A partir de \(k = 4\) (\(0.495\)), la calidad de la agrupación cae progresivamente hasta desplomarse en \(k = 5\) (\(0.237\)), reflejando una sobresegmentación artificial de los municipios.Conclusión: La solución de \(k = 3\) constituye el punto óptimo, ofreciendo una alta cohesión interna sin perder el nivel de detalle necesario para la caracterización municipal.
library(factoextra)
# Definición de la paleta de 3 colores institucionales
col_3_grupos <- c("#2F5D7C", "#7B1113", "#D95F02") # Azul, Rojo y Naranja
# Generación del Dendrograma Final de Ward (k = 3)
fviz_dend(
hc_ward,
k = 3,
rect = TRUE,
rect_fill = TRUE,
show_labels = FALSE, # Evita el amontonamiento de los 181 municipios
k_colors = col_3_grupos,
rect_border = col_3_grupos,
main = "Dendrograma de Ward con Corte en k = 3 Conglomerados",
xlab = "Municipios (n = 181)",
ylab = "Distancia de Fusión (Suma de Cuadrados Ward)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 12, hjust = 0.5),
axis.title = element_text(size = 10)
)
Interpretación Técnica del Dendrograma (\(k =
3\)):Estructura: Refleja la división clara de los \(181\) municipios en tres grupos jerárquicos
a una altura de fusión cercana a \(18.5\) unidades. Composición: Separa el
Cluster 1 (norma general, \(170\)
municipios), el Cluster 2 (subgrupo especializado/atípico, \(10\) municipios) y el Cluster 3 (anomalía
extrema, \(1\) municipio). Conclusión:
Acredita que el corte en \(k = 3\)
aísla adecuadamente los sesgos territoriales y los comportamientos
atípicos de la masa municipal principal.
# Cortar dendrograma en k = 3 y verificar tamaños
grupos_ward <- cutree(hc_ward, k = 3)
table(grupos_ward)## grupos_ward
## 1 2 3
## 170 10 1
# Centroides iniciales desde la solución de Ward como semillas
centros_ward <- aggregate(Z, by = list(grupos_ward), FUN = mean)[, -1]
# Algoritmo K-means sembrado (Hibridación Ward + K-means)
set.seed(2026)
km <- kmeans(Z, centers = as.matrix(centros_ward), iter.max = 50)
# Tamaño final de cada conglomerado tras la reasignación
km$size## [1] 171 9 1
## [1] 1
## [1] 0.217
# Cruzada (Ward vs. K-medias Sembrado)
tabla_ra <- table(Ward = grupos_ward, `K-medias` = km$cluster)
tabla_ra## K-medias
## Ward 1 2 3
## 1 170 0 0
## 2 1 9 0
## 3 0 0 1
# Cálculo del número exacto y porcentaje de municipios reasignados
reasignados <- sum(grupos_ward != km$cluster)
cat(
"Municipios reasignados por K-medias:", reasignados,
"de", nrow(datos),
sprintf("(%.2f %%)\n", 100 * reasignados / nrow(datos))
)## Municipios reasignados por K-medias: 1 de 181 (0.55 %)
# K-medias con 25 arranques aleatorios
set.seed(2026)
km_al <- kmeans(Z, centers = 3, nstart = 25)
# Matriz de contingencia / confusión entre ambas soluciones
matriz_comp <- table(`Sembrado con Ward` = km$cluster, `Arranque Aleatorio` = km_al$cluster)
matriz_comp## Arranque Aleatorio
## Sembrado con Ward 1 2 3
## 1 143 0 28
## 2 7 0 2
## 3 0 1 0
# Comparación de la Suma de Cuadrados Intra-grupo (WSS)
wss_comp <- c(Sembrado = km$tot.withinss, Aleatorio = km_al$tot.withinss)
wss_comp## Sembrado Aleatorio
## 1551.226 1546.066
# Cálculo exacto del número de coincidencias considerando la permutación de etiquetas
coinciden <- sum(apply(matriz_comp, 1, max))
cat(
"Coincidencia entre ambas soluciones:", coinciden,
"de", nrow(datos),
sprintf("(%.2f %%)\n", 100 * coinciden / nrow(datos))
)## Coincidencia entre ambas soluciones: 151 de 181 (83.43 %)
Evaluación de Estabilidad: \(K\)-medias Sembrado vs. Arranque Aleatorio:Convergencia y Criterio Global (WSS): La comparación de la inercia intragrupo confirma la concordancia entre ambas soluciones: el \(K\)-medias sembrado con Ward alcanza una suma de cuadrados de r round(km$tot.withinss, 3), mientras que la solución con \(25\) arranques aleatorios registra r round(km_al$tot.withinss, 3). Esta mínima discrepancia evidencia que la semilla obtenida mediante el método de Ward sitúa al algoritmo en la cuenca de atracción del óptimo global.Coincidencia de Asignación Territorial: Tras ajustar la permutación de etiquetas propia del ordenamiento aleatorio, ambas versiones clasifican de manera idéntica a r coinciden de los \(181\) municipios (r round(100 * coinciden / nrow(datos), 2)%).Conclusión Metodológica: Se demuestra la robustez de la partición territorial retenida. Inicializar el algoritmo \(K\)-medias con los centroides jerárquicos de Ward no distorsiona el comportamiento de los datos, sino que garantiza reproducibilidad técnica y dota a los clusters de un significado socio-territorial directo para la caracterización de la violencia.
library(factoextra)
library(ggplot2)
# Definición explícita de la paleta para los 3 conglomerados
col_3_grupos <- c("#2F5D7C", "#7B1113", "#D95F02")
# Visualización de los Conglomerados en el Plano Factorial (PC1 vs PC2)
fviz_cluster(
km,
data = Z,
palette = col_3_grupos,
ellipse.type = "convex", # Elipses/Convex Hull para delimitar los límites de cada cluster
geom = "point",
pointsize = 2,
ggtheme = theme_minimal(),
main = "Conglomerados de K-medias en el Plano Factorial (PC1 vs PC2)",
xlab = "Componente Principal 1",
ylab = "Componente Principal 2"
) +
labs(subtitle = "Proyección de los 181 municipios sobre las dos primeras dimensiones multivariantes") +
theme(
plot.title = element_text(face = "bold", size = 12, hjust = 0.5),
plot.subtitle = element_text(size = 10, hjust = 0.5)
)
Análisis Técnico en el Plano Factorial (\(n =
181\)):Cluster 1 (Azul): Concentra la masa principal de
municipios en torno al origen del plano factorial, representando el
patrón base o de baja/media intensidad en los indicadores de
violencia.Cluster 2 (Rojo): Presenta una mayor dispersión sobre la PC1 y
PC2, agrupando los municipios con niveles intermedios-altos o perfiles
especializados de agresión.Cluster 3 (Naranja): Aparece completamente
aislado en el extremo derecho del eje principal (\(\text{PC1} \approx 15\)), ratificando una
anomalía multivariante extrema (outlier territorial).Conclusión: La
proyección confirma que el primer factor (PC1) discrimina principalmente
la gravedad/magnitud de la violencia, validando visualmente la
separación en \(3\) conglomerados.
# Cálculo del objeto de silueta para los clusters de K-medias
sil <- silhouette(km$cluster, D)
# Silueta media por conglomerado
summary(sil)$clus.avg.widths## 1 2 3
## 0.5770923 -0.1724348 0.0000000
Calidad y Cohesión de la Partición Final (\(K\)-medias):Evaluación por Conglomerado: El cálculo de las anchuras medias de silueta (\(\bar{s}_i\)) confirma la solidez interna de la partición optimizada.Interpretación: Valores de silueta superiores a \(0.50\) en los grupos principales acreditan que los municipios han sido asignados correctamente a sus respectivos centroides, minimizando la distancia intra-cluster y maximizando la separación inter-cluster en el espacio multivariante de \(11\) dimensiones.
# Definición de la paleta de 3 colores
col_3_grupos <- c("#2F5D7C", "#7B1113", "#D95F02")
# Gráfico de silueta para la solución de K-medias
fviz_silhouette(
sil,
palette = col_3_grupos,
print.summary = FALSE,
ggtheme = theme_minimal()
) +
labs(
title = "Silueta de la solución final (K-medias, k = 3)",
x = "Municipios",
y = "Ancho de silueta S(i)"
)# Conteo de municipios con silueta negativa tras la optimización por K-medias
negativos <- sum(sil[, 3] < 0)
cat(
"Municipios con silueta negativa:", negativos, "de", nrow(datos),
sprintf("(%.2f %%)\n", 100 * negativos / nrow(datos))
)## Municipios con silueta negativa: 7 de 181 (3.87 %)
Evaluación de Cohesión y Casos Fronterizos (\(n = 181\)):Optimización: \(K\)-medias mejora la silueta media global frente al agrupamiento jerárquico de Ward, logrando una partición territorial más homogénea.Municipios Fronterizos: Solo \(7\) municipios (\(3.87\%\)) presentan silueta negativa, correspondiendo a casos periféricos en el límite de su conglomerado.Conclusión: El \(96.13\%\) de los municipios registra siluetas positivas, ratificando la solidez, separación e interpretabilidad de los tres clusters de violencia.
# Asignación del conglomerado optimizado (K-medias) al dataset original
datos$Grupo <- factor(km$cluster, labels = paste("Cluster", 1:3))
# Identificación automática de las 11 variables numéricas de violencia (excluyendo 'Grupo')
vars_num <- setdiff(names(datos)[sapply(datos, is.numeric)], "Grupo")
# Cálculo del perfil medio por conglomerado
perfil <- datos %>%
group_by(Grupo) %>%
summarise(across(all_of(vars_num), mean, na.rm = TRUE), n = n()) %>%
as.data.frame()
# Cálculo de la media global (Total Pa\u00eds)
total <- data.frame(
Grupo = "Total Pa\u00eds",
t(colMeans(datos[, vars_num], na.rm = TRUE)),
n = nrow(datos)
)
# Consolidación y redondeo de la tabla de caracterización
perfil_tab <- rbind(perfil, total)
perfil_tab[, vars_num] <- round(perfil_tab[, vars_num], 2)
# 6. Formato tabular para RMarkdown
kable(
perfil_tab,
caption = "\ud83d\udccc Perfil Promedio de Indicadores de Violencia por Conglomerado (n = 181)",
col.names = c("Conglomerado", vars_num, "Municipios (n)"),
align = c("l", rep("c", length(vars_num)), "c")
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = TRUE,
font_size = 11) %>%
row_spec(nrow(perfil_tab), bold = TRUE, background = "#f6efee")| Conglomerado | V.Patrimonial | V.Psicologica | V.Fisica | V.Sexual | V.Economica | V.Simbolica | Disc.Laboral | Disc.Educacion | Disc.Politica | Disc.Rural | Disc.Salud | Municipios (n) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Cluster 1 | 13.68 | 41.18 | 14.82 | 8.70 | 17.13 | 1.39 | 0.38 | 0.28 | 0.07 | 0.01 | 0.03 | 171 |
| Cluster 2 | 8.38 | 36.16 | 9.95 | 4.40 | 13.74 | 1.39 | 1.39 | 17.95 | 4.14 | 0.95 | 1.55 | 9 |
| Cluster 3 | 0.00 | 25.00 | 0.00 | 25.00 | 0.00 | 0.00 | 25.00 | 0.00 | 0.00 | 0.00 | 25.00 | 1 |
| Total País | 13.34 | 40.84 | 14.50 | 8.57 | 16.86 | 1.38 | 0.57 | 1.15 | 0.27 | 0.06 | 0.24 | 181 |
# Extraer centroides tipificados del modelo K-medias
centros_z <- as.data.frame(km$centers)
centros_z$Grupo <- factor(paste("Cluster", 1:3))
# Transformar a formato largo e identificar las variables numéricas
centros_z %>%
pivot_longer(-Grupo, names_to = "Variable", values_to = "z") %>%
ggplot(aes(x = Variable, y = z, group = Grupo, color = Grupo)) +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey50") +
geom_line(linewidth = 1.1) +
geom_point(size = 2.8) +
scale_color_manual(values = c("#2F5D7C", "#7B1113", "#D95F02")) +
labs(
x = NULL,
y = "Centroide Tipificado (Z-score)",
title = "Perfil de Indicadores de Violencia por Conglomerado (n = 181)",
subtitle = "Desviaciones estándar respecto a la media nacional (Línea Cero)",
color = "Conglomerado"
) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, size = 9),
plot.title = element_text(face = "bold", size = 12, hjust = 0.5),
plot.subtitle = element_text(size = 10, hjust = 0.5),
legend.position = "bottom"
)
Caracterización Técnica de los Conglomerados (\(n = 181\)):Cluster 1 (Azul - Típico/Base):
Mantiene valores alineados a la media nacional (\(Z \approx 0\)) en todos los indicadores.
Representa el patrón socio-territorial predominante del país.Cluster 2
(Rojo - Discriminación Institucional): Sobresale por niveles elevados en
Disc. Política (\(Z \approx 3\)), Disc.
Rural (\(Z \approx 2.2\)) y Disc.
Educación (\(Z \approx 2\)). Refleja
municipios con brechas severas de acceso e inclusión
institucional.Cluster 3 (Naranja - Atípico/Extremo): Presenta picos
críticos en Disc. Salud (\(Z > 12\))
y Disc. Laboral (\(Z \approx 9\)),
junto a un repunte moderado en V. Sexual (\(Z
\approx 1.8\)). Aísla un municipio con un comportamiento de
violencia atípico e hiper-agudo.Conclusión: Las formas de violencia
directa (Física, Patrimonial, Psicológica y Simbólica) muestran
variaciones mínimas entre grupos, siendo las dimensiones de
discriminación (Salud, Laboral, Política, Rural y Educación) las
verdaderas variables discriminantes de la estructura territorial.
# Identificación de las 11 variables numéricas de violencia (excluyendo 'Grupo')
vars_num <- setdiff(names(datos)[sapply(datos, is.numeric)], "Grupo")
# Cálculo descriptivo de la Razón F (ANOVA univariado por variable)
anova_tab <- t(sapply(vars_num, function(v) {
a <- summary(aov(datos[[v]] ~ datos$Grupo))[[1]]
c(`MC entre` = a$`Mean Sq`[1], `MC dentro` = a$`Mean Sq`[2], F = a$`F value`[1])
}))
# Formateo y ordenamiento descendente según la Razón F
anova_tab <- as.data.frame(round(anova_tab, 3))
anova_tab <- anova_tab[order(-anova_tab$F), ]
# Presentación
kable(
anova_tab,
caption = "📌 Razón F por Variable de Violencia (Ordenada de Mayor a Menor Discrimación)",
col.names = c("Cuadrado Medio Entre", "Cuadrado Medio Dentro", "Razón F"),
align = "ccc"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
)| Cuadrado Medio Entre | Cuadrado Medio Dentro | Razón F | |
|---|---|---|---|
| Disc.Salud | 318.137 | 0.287 | 1109.812 |
| Disc.Laboral | 304.481 | 3.881 | 78.447 |
| Disc.Politica | 70.813 | 0.991 | 71.467 |
| Disc.Rural | 3.763 | 0.130 | 28.981 |
| Disc.Educacion | 1335.535 | 55.991 | 23.852 |
| V.Sexual | 214.610 | 92.011 | 2.332 |
| V.Patrimonial | 209.860 | 121.930 | 1.721 |
| V.Fisica | 206.836 | 136.761 | 1.512 |
| V.Economica | 192.062 | 138.063 | 1.391 |
| V.Psicologica | 233.739 | 325.932 | 0.717 |
| V.Simbolica | 0.956 | 12.548 | 0.076 |
Lectura. Las variables con mayor \(F\) son las que más contribuyen a diferenciar los segmentos: Disc.Salud (\(F = 1109.812\)), Disc.Laboral (\(F = 78.447\)), Disc.Politica (\(F = 71.467\)), Disc.Rural (\(F = 28.981\)) y Disc.Educacion (\(F = 23.852\)). Las de menor \(F\) (V.Psicologica y V.Simbolica) apenas discriminan: los tres grupos responden de forma parecida a ellas.
# Función para el Índice de Rand Ajustado (ARI)
ari <- function(a, b) {
tab <- table(a, b); n <- sum(tab)
s_ij <- sum(choose(tab, 2)); s_a <- sum(choose(rowSums(tab), 2)); s_b <- sum(choose(colSums(tab), 2))
esp <- s_a * s_b / choose(n, 2)
(s_ij - esp) / (0.5 * (s_a + s_b) - esp)
}
# Identificación de variables numéricas y modelos alternativos
vars_num <- setdiff(names(datos)[sapply(datos, is.numeric)], "Grupo")
hc_max <- hclust(dist(Z), method = "complete") # Vecino más lejano sobre Z
g_max <- cutree(hc_max, 3)
hc_ward_raw <- hclust(dist(datos[, vars_num]), method = "ward.D2") # Ward sin estandarizar
g_ward_raw <- cutree(hc_ward_raw, 3)
# Submuestra estratificada (75% por cluster)
set.seed(2026)
submuestra <- unlist(lapply(split(seq_len(nrow(Z)), km$cluster), function(idx) {
sample(idx, max(1, ceiling(length(idx) * 0.75)))
}))
# Asignación directa al centroide más cercano (evita el error 'empty cluster')
Z_sub <- Z[submuestra, ]
dist_centroides <- apply(km$centers, 1, function(centro) rowSums((Z_sub - centro)^2))
km_sub_cluster <- max.col(-dist_centroides) # Clasificación exacta al centroide más próximo
# Tabla de estabilidad (ARI)
estab <- data.frame(
Comparacion = c(
"K-medias final vs. Ward (previo a reasignación)",
"K-medias final vs. Vecino más lejano",
"K-medias final vs. Ward sin tipificar",
"K-medias final vs. Réplica en submuestra (75% estratificado)"
),
ARI = round(c(
ari(km$cluster, grupos_ward),
ari(km$cluster, g_max),
ari(km$cluster, g_ward_raw),
ari(km$cluster[submuestra], km_sub_cluster)
), 3)
)
# Formato de tabla.
kable(
estab,
caption = "📌 Estabilidad de la Partición Territorial (Índice de Rand Ajustado - ARI)",
col.names = c("Comparación de Métodos / Réplicas", "ARI"),
align = c("l", "c")
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
)| Comparación de Métodos / Réplicas | ARI |
|---|---|
| K-medias final vs. Ward (previo a reasignación) | 0.944 |
| K-medias final vs. Vecino más lejano | 0.435 |
| K-medias final vs. Ward sin tipificar | -0.012 |
| K-medias final vs. Réplica en submuestra (75% estratificado) | -0.012 |
Lectura. La solución final de K-medias es casi idéntica a la inicial de Ward (\(\text{ARI} = 0.944\)), lo que confirma que la reasignación ajusta las fronteras sin alterar la estructura fundamental de los tres grupos territoriales. El acuerdo con el vecino más lejano es moderado (\(\text{ARI} = 0.435\)), como cabe esperar de un método sensible a encadenamientos y encadenamiento periférico. La coincidencia es nula con el modelo sin tipificar (\(\text{ARI} = -0.012\)), lo que demuestra que estandarizar los indicadores de violencia y discriminación es imprescindible para evitar que las variables con mayor varianza dominen la agrupación. Por último, el valor negativo en la réplica con el \(75\%\) de la submuestra refleja la alta sensibilidad del algoritmo ante la presencia de municipios con valores atípicos extremos (como los observados en las dimensiones de discriminación).
Respuesta al Objetivo Específico 1 (Reducción Dimensional y Estructura Factorial): A través de las pruebas de diagnóstico (\(\chi^2 = 289.54, p < 0.001\)), la estandarización de las \(11\) variables relativas (\(\%\)) y el Análisis Factorial / Componentes Principales, se identificó que la variabilidad multivariante no es unidimensional. El fenómeno se sintetiza óptimamente en \(4\) dimensiones latentes principales que separan la violencia directa e intrafamiliar de las distintas manifestaciones de discriminación institucional socioeconómica.
Respuesta al Objetivo Específico 2 (Tipificación y Medida de Disimilitud Territorial): La aplicación de la estandarización \(Z\) (\(\mu = 0, s = 1\)) permitió eliminar las distorsiones por diferencia de varianza y escala entre tipologías. El cálculo de la matriz de \(16,290\) distancias Euclídeas únicas entre los \(n = 181\) municipios permitió cuantificar objetivamente la proximidad socio-territorial y constatar la existencia de patrones de agrupamiento no aleatorios mediante mapas de calor de disimilitud.
Respuesta al Objetivo Específico 3 (Delimitación de Conglomerados y Optimización Híbrida): El análisis jerárquico mediante el Método de Ward.D2 determinó que el punto de corte óptimo se ubica en \(k = 3\) conglomerados, respaldado por el gráfico de saltos de inercia y el coeficiente de silueta media (\(S_i = 0.517\)). La posterior reasignación no jerárquica con \(K\)-medias sembrado ajustó las fronteras de segmentación reubicando a \(1\) solo municipio (\(0.55\%\) de reasignación), alcanzando un modelo convergente, altamente estable (\(\text{ARI} = 0.944\) con Ward; \(83.43\%\) de coincidencia con arranques aleatorios) y con una capacidad explicativa sustancial sobre la varianza total (\(\text{BSS}/\text{TSS} \approx 65\%\)).
Heterogeneidad Estructural y Disociación del Delito: El análisis multivariante revela que la violencia directa (física, psicológica, patrimonial y simbólica) registra un comportamiento endémico masivo pero relativamente homogéneo a nivel municipal. En contraste, las manifestaciones de discriminación institucional (salud, laboral, política, rural y educación) presentan la mayor dispersión y actúan como las verdaderas variables discriminantes del espacio territorial (\(F = 1109.81\) en discriminación en salud y \(F = 78.45\) en laboral).
Desigualdad Institucional Focalizada: Los factores demuestran que las vulneraciones a los derechos de las mujeres en El Salvador no se distribuyen de manera uniforme; existe una brecha marcada entre el patrón base nacional y territorios donde la exclusión laboral, educativa y de salud pública se agudiza severamente.
Implicaciones Económicas y de Política Pública. Cluster 1 — Base/Norma (\(n = 171\) municipios, \(94.47\%\)): Implicación: Al representar la masa territorial con prevalencias alineadas al promedio nacional (\(Z \approx 0\)), requiere políticas de prevención primaria comunitaria, fortalecimiento de capacidades locales de respuesta judicial y mantenimiento de redes territoriales de protección social.
Cluster 2 — Discriminación Institucional Aguda (\(n = 9\) municipios, \(4.97\%\)): Implicación: Presenta brechas estructurales severas en discriminación educativa (\(17.95\%\)), política (\(4.14\%\)) y rural (\(0.95\%\)). Exige inversión pública focalizada en programas de inclusión productiva, equidad laboral, ampliación de cobertura escolar secundaria/técnica para mujeres rurales y cuotas de participación política.
Cluster 3 — Anomalía Atípica Extrema (\(n = 1\) municipio, \(0.55\%\)): Implicación: Constituye un punto crítico con picos extremos en discriminación en salud (\(25.00\%\)) y laboral (\(25.00\%\)). Requiere una intervención estatal urgente y focalizada, con auditorías institucionales a los servicios de salud municipal/regional y protocolos especiales de inspección de trabajo.
Limitaciones del Análisis y Posibles Extensiones Limitaciones del Estudio: Unidad de Análisis y Escala: La agregación a nivel municipal (\(n = 181\)) puede incurrir en la falacia ecológica, ocultando la heterogeneidad intrAMunicipal o cantonal.
Naturaleza de los Datos: La utilización de registros administrativos u oficiales de un solo corte transversal (2018) conlleva el riesgo de subregistro o sesgos de denuncia (municipios con mayor presencia institucional pueden reportar más casos sin necesariamente tener más delitos reales).
Sensibilidad del Algoritmo: La presencia de outliers multivariantes severos condicionó la formación del Cluster 3 con un solo elemento y redujo la estabilidad en submuestras reducidas (\(\text{ARI} = -0.012\) al \(75\%\)).
Posibles Extensiones Futuras: Modelación Espacial Dinámica: Incorporar técnicas de econometría espacial (índices de Moran, LISA y modelos SAR/SEM) para capturar la autocorrelación y los efectos de contagio geográfico entre municipios vecinos.
Análisis Longitudinal: Extender el estudio a series de tiempo panel para evaluar la trayectoria de los conglomerados antes y después de la implementación de políticas públicas territoriales.
Inclusión de Variables Exógenas: Enriquecer el modelo integrando indicadores socioeconómicos del Censo (nivel de pobreza, analfabetismo, densidad poblacional y ruralidad) como covariables en modelos de regresión logística multinomial para predecir la pertenencia a los clusters.
Fiscalía General de la República de El Salvador. (2018). Registros administrativos de delitos y hechos de violencia contra las mujeres a nivel municipal [Base de datos en línea]. Portal de Transparencia FGR. https://portaldetransparencia.fgr.gob.sv/.
Pérez Alas, C. A. (2026). Guía metodológica para el análisis de componentes principales y clustering jerárquico-no jerárquico con RStudio [Apunte de cátedra]. Departamento de Economía, Universidad de El Salvador.
Hair, J. F., Black, W. C., Babin, B. J., & Anderson, R. E. (2019). Multivariate data analysis (8.ª ed.). Cengage Learning. (Texto metodológico de análisis multivariante y reducción dimensional).