1 Introduccion.

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.

2 Objetivos

2.1 ObjetivoGeneral:

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.

2.2 Objetivos Especificos:

  1. Estimar la adecuación muestral de la matriz de correlaciones relativas para validar la factibilidad del Análisis Factorial.

  2. Reducir las 11 variables de violencia y discriminación a un conjunto menor de factores latentes interpretables.

  3. Clasificar y caracterizar los municipios en grupos homogéneos para identificar los perfiles territoriales de riesgo.

3 Metodología para el análisis factorial.

3.1 carga de base de datos a trabajar.

library(readxl)
TiposViolenciaHaciaMujer_2018_26 <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/TiposViolenciaHaciaMujer-2018 26.xlsx")
View(TiposViolenciaHaciaMujer_2018_26)

3.2 Análisis de correlación.

#  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")
Matriz de Correlaciones de Tipos de Violencia y Discriminación
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

3.3 Prueba de Bartlett.

# 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.

3.4 Índice KMO

# Índice KMO aplicado a la matriz de correlación
KMO(cormatrix)
## 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.

3.5 Extracción de factores.

# 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")
📌 Matriz de Cargas Factoriales (PCA sin rotación)
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")
📊 Autovalores y Varianza Explicada por Componente Principal
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.

3.6 Determinación del número de 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.

3.7 Rotación de factores.

# 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")
📌 Cargas factoriales rotadas (Varimax) — Método de Ejes Principales (PA)
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).

3.8 Interpretación de factores.

# 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.

3.9 Validación del modelo.

# 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")
# Extraer las puntuaciones factoriales asignadas a cada municipio
scores <- fa_rot$scores
# 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")
# 4. Visualizar los primeros municipios con sus respectivos puntajes factoriales
head(scores)
##      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")
📌 Primeros 10 municipios con sus Puntuaciones Factoriales (Regression Scores)
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

4 Metodología para el análisis de conglomerados.

#Etapa 1: elección y preparación de las variables.

4.1 Lectura e importación de los datos.

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")
📌 Matriz municipal de tasas relativas (%): Primeros municipios para el Análisis de Conglomerados
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")
📌 Diccionario de Variables: Tipos de Violencia y Discriminación hacia la Mujer (2018)
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

4.2 Depuración: valores perdidos y distribución.

# Verificación de valores perdidos (NA) en la matriz de datos municipal
sum(is.na(datos))
## [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")
📌 Estadísticos Descriptivos de las Tasas Relativas (%) por Municipio (n = 181)
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.

4.3 Correlación entre variables.

#  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

max_corr_abs <- max(abs(R[upper.tri(R)]))
max_corr_abs
## [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.

4.4 Tipificación.

# 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")
📌 Comprobación de Estandarización Z (Medias = 0, Desviación Estándar = 1)
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")
📌 Matriz Z estandarizada: Primeros municipios preparados para la matriz de distancias
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")
📌 Verificación de Medias Estandarizadas (μ = 0) por Variable
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.

5 Etapa 2: medida de asociación.

5.1 Matriz de distancias euclídeas.

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")
📌 Extracto de la Matriz de Distancias Euclídeas entre los primeros 5 municipios
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.

5.2 Ejemplo de calculo manual.

# 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
d_manual <- sqrt(d2_manual)
d_manual                                   # Distancia Euclídea manual
## [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.

5.3 Visualización de la matriz de distancias.

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

6 Etapa 3: técnicas de conglomeración jerárquicas.

6.1 Comparación de cuatro criterios de enlace.

# 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 = "")

par(mfrow = c(1, 1)) # Restablecer la configuración gráfica por defecto

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.

par(mfrow = c(1, 1))
#  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")
📌 Distribución del Tamaño de Conglomerados al Cortar cada Árbol en k = 3 Grupos (n = 181)
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.

6.2 Historial de aglomeración (Ward).

# 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")
📌 Primeras 6 Etapas del Historial de Aglomeración (Método de Ward.D2, n = 181)
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")
📌 Últimas 6 Etapas del Historial de Aglomeración (Fusiones Finales)
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.

6.3 Gráfico de saltos (coeficientes de fusión).

#  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")
📌 Coeficientes e Incrementos de Distancia en las Últimas Fusiones (Método de Ward.D2)
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.

6.4 Método del codo y coeficiente de silueta.

#  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")
📌 Coeficiente de Silueta Media de la Solución de Ward según k (n = 181)
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.

6.5 Dendrograma de Ward y decisión.

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

7 Método no jerárquico: K–medias sembrado con Ward.

# 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
km$iter                  # Número de iteraciones utilizadas hasta lograr la convergencia
## [1] 1
# Proporción de la variabilidad total explicada por los grupos
round(km$betweenss / km$totss, 3)
## [1] 0.217

8 Matriz de Reasignación.

#  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 %)

9 Comparación con K–medias de arranque aleatorio.

#  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.

10 Etapa 4: validación e interpretación.

10.1 Visualización en el plano factorial.

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.

10.2 Coeficiente de silueta.

#  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.

10.3 Perfil de los conglomerados (valores originales).

# 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")
📌 Perfil Promedio de Indicadores de Violencia por Conglomerado (n = 181)
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.

10.4 Relevancia relativa de las variables (ANOVA descriptivo).

#  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"
  )
📌 Razón F por Variable de Violencia (Ordenada de Mayor a Menor Discrimación)
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.

10.5 Estabilidad: ¿cambia la solución con otro método?.

#  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"
  )
📌 Estabilidad de la Partición Territorial (Índice de Rand Ajustado - ARI)
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).

11 Conclusiones.

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.

12 Referencias.

  1. 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/.

  2. 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.

  3. 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).