Contexto del proyecto

Este proyecto realiza un análisis georreferenciado de la mortalidad en el departamento de Antioquia, a partir de registros municipales de defunciones ocurridas en varios años. El trabajo combina datos estadísticos (número de casos de defunción y tasa de mortalidad por mil habitantes) con herramientas de análisis espacial en R, permitiendo visualizar patrones y diferencias entre municipios y subregiones.

A lo largo del informe se desarrollan:

  • Mapas coropléticos para observar la distribución espacial de las tasas de mortalidad y del número absoluto de defunciones.

  • Gráficos de barras y análisis estadísticos para identificar los municipios y subregiones con mayores y menores promedios.

  • Pruebas de normalidad y análisis de outliers que complementan la interpretación de la variable TasaXMilHabitantes.

Objetivo del análisis

El objetivo de este trabajo es integrar y analizar la información de mortalidad en el departamento de Antioquia de manera espacial, utilizando herramientas de georreferenciación en R.

A partir de los datos de defunciones y de la tasa de mortalidad por cada mil habitantes en cada municipio, junto con las geometrías oficiales de los límites municipales, se busca:

  • Visualizar la distribución espacial de la mortalidad en los municipios de Antioquia.

  • Identificar patrones territoriales que puedan reflejar diferencias en las condiciones de salud, acceso a servicios médicos o características demográficas.

  • Generar mapas coropléticos y otras representaciones gráficas que faciliten la comprensión de las áreas con mayor o menor riesgo de mortalidad.

Fuente del dataset

Los datos utilizados en este proyecto provienen del portal oficial de Datos Abiertos de Colombia.

https://www.datos.gov.co/Salud-y-Protecci-n-Social/Mortalidad-General-en-el-departamento-de-Antioquia/fuc4-tvui/about_data

Lectura del dataset

ruta_dataset <- "C:/Users/johan/Downloads/Mortalidad_General_en_el_departamento_de_Antioquia_desde_2005_20250915.csv"
dataset <- read.csv(ruta_dataset, header = TRUE, stringsAsFactors = FALSE)

ruta_shapefile <- "C:/Users/johan/Downloads/MGN2021_MPIO_POLITICO/MGN_MPIO_POLITICO.shp"
dataset_shapefile <- sf::st_read(ruta_shapefile)
## Reading layer `MGN_MPIO_POLITICO' from data source 
##   `C:\Users\johan\Downloads\MGN2021_MPIO_POLITICO\MGN_MPIO_POLITICO.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1121 features and 12 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
## Geodetic CRS:  MAGNA-SIRGAS

Variables

Vamos a trabajar con un dataset que contiene el número de casos y la tasa anual (por mil habitantes) de mortalidad general en el departamento de Antioquia, desde el año 2005 hasta 2021.

A continuación se describen las variables incluidas en el dataset de mortalidad en Antioquia:

  • NombreMunicipio: Nombre con el que se identifica a cada municipio que hace parte de la jurisdicción territorial del departamento de Antioquia.

  • CodigoMunicipio: Código alfanumérico de cinco (5) dígitos que identifica de manera única a cada municipio dentro de la división política y administrativa de Colombia (DIVIPOLA).

  • Ubicacion: Coordenadas de latitud y longitud que permiten ubicar el centro geográfico de cada municipio en el mapa.

  • NombreRegion: Nombre de la subregión a la que pertenece el municipio. Las subregiones son divisiones territoriales internas del departamento de Antioquia.

  • CodigoRegion: Identificador de la subregión correspondiente al municipio. Cada subregión de Antioquia cuenta con un código único.

  • Año: Año de referencia para los datos de casos de mortalidad y la tasa de mortalidad reportada en la fila.

  • NumeroCasos: Número de casos de defunción ocurridos en el municipio durante el año indicado.

  • TasaXMilHabitantes: Tasa de mortalidad que expresa el número de fallecimientos por cada mil habitantes en el municipio para el año correspondiente.


suppressWarnings({

library(dplyr)
library(tibble)
library(sf)
library(ggplot2)
library(ggpubr)
library(RColorBrewer)
library(stats)
library(knitr)
library(kableExtra)
options(warn = -1)
        
})
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Linking to GEOS 3.13.0, GDAL 3.10.1, PROJ 9.5.1; sf_use_s2() is TRUE
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows

Dataset Antioquia

Estructura general

head(dataset, 5)
##   NombreMunicipio CodigoMunicipio                   Ubicacion NombreRegion
## 1       Abejorral            5002  POINT (-75.427045 5.79145)      ORIENTE
## 2        Abriaquí            5004  POINT (-76.064563 6.63197)    OCCIDENTE
## 3      Alejandría            5021 POINT (-75.141258 6.376923)      ORIENTE
## 4           Amagá            5030  POINT (-75.703216 6.04063)     SUROESTE
## 5          Amalfi            5031 POINT (-75.075028 6.907385)     NORDESTE
##   CodigoRegion  Año NumeroCasos TasaXMilHabitantes
## 1            7 2005         146                7.2
## 2            6 2005          13                4.8
## 3            7 2005          27                7.1
## 4            8 2005         137                5.0
## 5            4 2005         112                5.5

Dataset filtrado

dataset_final <- dataset[, c("NombreMunicipio", "CodigoMunicipio", "NombreRegion",
                             "Año", "NumeroCasos", "TasaXMilHabitantes")]
head(dataset_final, 5)
##   NombreMunicipio CodigoMunicipio NombreRegion  Año NumeroCasos
## 1       Abejorral            5002      ORIENTE 2005         146
## 2        Abriaquí            5004    OCCIDENTE 2005          13
## 3      Alejandría            5021      ORIENTE 2005          27
## 4           Amagá            5030     SUROESTE 2005         137
## 5          Amalfi            5031     NORDESTE 2005         112
##   TasaXMilHabitantes
## 1                7.2
## 2                4.8
## 3                7.1
## 4                5.0
## 5                5.5

Naturaleza de las variables

cat("Número de observaciones (filas):", nrow(dataset_final), "\n")
## Número de observaciones (filas): 2125
cat("Número de variables (columnas):", ncol(dataset_final), "\n")
## Número de variables (columnas): 6
str(dataset_final)
## 'data.frame':    2125 obs. of  6 variables:
##  $ NombreMunicipio   : chr  "Abejorral" "Abriaquí" "Alejandría" "Amagá" ...
##  $ CodigoMunicipio   : int  5002 5004 5021 5030 5031 5034 5036 5038 5040 5044 ...
##  $ NombreRegion      : chr  "ORIENTE" "OCCIDENTE" "ORIENTE" "SUROESTE" ...
##  $ Año               : int  2005 2005 2005 2005 2005 2005 2005 2005 2005 2005 ...
##  $ NumeroCasos       : int  146 13 27 137 112 230 43 55 84 37 ...
##  $ TasaXMilHabitantes: num  7.2 4.8 7.1 5 5.5 5.5 5.6 4.4 5.6 5 ...

Dimensión del dataset

  • Filas (observaciones): 2125
    Cada fila representa un registro único de mortalidad asociado a un municipio y a un año específico del departamento de Antioquia.

  • Columnas (variables): 6
    Son los atributos que describen cada registro: identificación del municipio, año, número de defunciones, tasa de mortalidad, entre otros.

Naturaleza de las variables

Variable Tipo Descripción
NombreMunicipio Texto (character) Nombre oficial de cada municipio.
CodigoMunicipio Entero (integer) Código numérico de 5 dígitos que identifica de manera única cada municipio (DIVIPOLA).
NombreRegion Texto (character) Nombre de las subregiones del departamento.
Año Entero (integer) Año de referencia del registro de mortalidad.
NumeroCasos Entero (integer) Número de casos de defunción ocurridos en el municipio durante el año correspondiente.
TasaXMilHabitantes Numérico continuo (double) Tasa de mortalidad que indica el número de fallecimientos por cada mil habitantes.

porcentaje de nulos

total <- nrow(dataset_final)
null_counts <- colSums(is.na(dataset_final))
null_percent <- (null_counts / total) * 100

missing_summary <- data.frame(
  Nulos = null_counts,
  `Porcentaje (%)` = round(null_percent, 2)
)

print(missing_summary)
##                    Nulos Porcentaje....
## NombreMunicipio        0              0
## CodigoMunicipio        0              0
## NombreRegion           0              0
## Año                    0              0
## NumeroCasos            0              0
## TasaXMilHabitantes     0              0

Interpretación

  • Ninguna de las variables contiene valores nulos, por lo que el dataset está completo al 100 %.
  • Este resultado garantiza que no es necesario aplicar técnicas de imputación o limpieza por datos faltantes, y que se puede proceder directamente a los análisis estadísticos y geoespaciales.

Exploración de categorías de la variable NombreMunicipio

col <- "NombreMunicipio"

num_cats <- length(unique(dataset[[col]]))

categorias <- data.frame(
  `Categorías únicas de NombreMunicipio` = sort(unique(dataset[[col]]))
)

cat("Número de categorías en la variable", col, ":", num_cats, "\n\n")
## Número de categorías en la variable NombreMunicipio : 125
cat("Listado de categorías:\n")
## Listado de categorías:
print(categorias, row.names = FALSE)
##  Categorías.únicas.de.NombreMunicipio
##                             Abejorral
##                              Abriaquí
##                            Alejandría
##                                 Amagá
##                                Amalfi
##                                 Andes
##                           Angelópolis
##                             Angostura
##                                 Anorí
##                                  Anzá
##                              Apartadó
##                             Arboletes
##                               Argelia
##                               Armenia
##                               Barbosa
##                                 Bello
##                               Belmira
##                               Betania
##                               Betulia
##                               Briceño
##                              Buriticá
##                               Cáceres
##                               Caicedo
##                                Caldas
##                            Campamento
##                           Cañasgordas
##                              Caracolí
##                             Caramanta
##                                Carepa
##                              Carolina
##                              Caucasia
##                             Chigorodó
##                              Cisneros
##                        Ciudad Bolívar
##                               Cocorná
##                            Concepción
##                             Concordia
##                            Copacabana
##                               Dabeiba
##                             Donmatías
##                               Ebéjico
##                              El Bagre
##                  El Carmen de Viboral
##                              El Peñol
##                             El Retiro
##                          El Santuario
##                            Entrerríos
##                              Envigado
##                              Fredonia
##                              Frontino
##                               Giraldo
##                             Girardota
##                           Gómez Plata
##                               Granada
##                             Guadalupe
##                                Guarne
##                               Guatapé
##                             Heliconia
##                              Hispania
##                                Itagüí
##                               Ituango
##                                Jardín
##                                Jericó
##                               La Ceja
##                           La Estrella
##                            La Pintada
##                              La Unión
##                              Liborina
##                                 Maceo
##                             Marinilla
##                              Medellín
##                            Montebello
##                               Murindó
##                                Mutatá
##                                Nariño
##                                 Nechí
##                               Necoclí
##                                 Olaya
##                                 Peque
##                           Pueblorrico
##                         Puerto Berrío
##                           Puerto Nare
##                        Puerto Triunfo
##                              Remedios
##                              Rionegro
##                           Sabanalarga
##                              Sabaneta
##                                Salgar
##                San Andrés de Cuerquia
##                            San Carlos
##                         San Francisco
##                          San Jerónimo
##                San José de La Montaña
##                     San Juan de Urabá
##                              San Luis
##             San Pedro de Los Milagros
##                    San Pedro de Urabá
##                            San Rafael
##                             San Roque
##                           San Vicente
##                         Santa Bárbara
##                 Santa Fe de Antioquia
##                    Santa Rosa de Osos
##                         Santo Domingo
##                               Segovia
##                                Sonsón
##                              Sopetrán
##                               Támesis
##                                Tarazá
##                                 Tarso
##                              Titiribí
##                                Toledo
##                                 Turbo
##                               Uramita
##                                 Urrao
##                              Valdivia
##                            Valparaíso
##                               Vegachí
##                               Venecia
##                      Vigía del Fuerte
##                                  Yalí
##                               Yarumal
##                               Yolombó
##                                 Yondó
##                              Zaragoza

Exploración de categorías de la variable Año

col <- "Año"

num_cats <- length(unique(dataset[[col]]))

categorias <- data.frame(
  `Categorías únicas de Año` = sort(unique(dataset[[col]]))
)

cat("Número de categorías en la variable", col, ":", num_cats, "\n\n")
## Número de categorías en la variable Año : 17
cat("Listado de categorías:\n")
## Listado de categorías:
print(categorias, row.names = FALSE)
##  Categorías.únicas.de.Año
##                      2005
##                      2006
##                      2007
##                      2008
##                      2009
##                      2010
##                      2011
##                      2012
##                      2013
##                      2014
##                      2015
##                      2016
##                      2017
##                      2018
##                      2019
##                      2020
##                      2021

Estadistica descriptiva de NumeroCasos

summary(dataset$NumeroCasos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     5.0    42.0    82.0   253.1   157.0 21917.0

Interpretación

La variable NumeroCasos corresponde al número absoluto de defunciones por municipio y año. El promedio es de 253 defunciones, pero con una alta dispersión (desviación estándar ≈1.237), lo que refleja fuertes diferencias entre municipios. El 50 % de los registros tiene 82 casos o menos, mientras que el valor máximo (≈21.900) evidencia la presencia de outliers, asociados a municipios de gran tamaño como Medellín. Estos datos muestran una distribución marcadamente sesgada a la derecha, donde pocos municipios concentran la mayor parte de las muertes.

Estadistica descriptiva de TasaXMilHabitantes

summary(dataset$TasaXMilHabitantes)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.800   4.100   4.800   5.007   5.700  13.700

Interpretación

  • En promedio, los municipios registran 5 fallecimientos por cada mil habitantes, con una dispersión moderada (desviación estándar ≈ 1.4).

  • La mediana de 4.8 es cercana a la media, lo que sugiere una distribución relativamente simétrica para la mayoría de los casos.

  • El rango intercuartílico (Q3 – Q1) es de 1.6, lo que indica que el 50 % central de los municipios presenta tasas entre 4.1 y 5.7 muertes por mil habitantes.

  • El mínimo de 0.8 corresponde a municipios con mortalidad muy baja, mientras que el máximo de 13.7 es considerablemente superior al promedio, evidenciando la presencia de municipios con mortalidad anormalmente alta (posibles outliers) que ameritan revisión específica.

En conjunto, estos resultados indican que la mayor parte de los municipios de Antioquia se concentra alrededor de una mortalidad cercana a 5 muertes por mil habitantes, aunque existen algunos casos con tasas mucho más elevadas que pueden influir en la planificación en salud pública.

Distribución de TasaXMilHabitantes

ggplot(dataset, aes(x = TasaXMilHabitantes)) +
  geom_histogram(bins = 20, color = "black", fill = "skyblue", aes(y = ..density..)) +
  geom_density(color = "darkblue", linewidth = 1) +
  labs(
    x = "Tasa de mortalidad (por mil habitantes)",
    y = "Densidad",
    title = "Distribución de Tasa de Mortalidad"
  ) +
  theme_minimal()

data <- dataset$TasaXMilHabitantes

sh <- shapiro.test(data)
cat("Estadístico Shapiro-Wilk:", round(sh$statistic, 4), "\n")
## Estadístico Shapiro-Wilk: 0.96
cat("p-valor:", round(sh$p.value, 4), "\n")
## p-valor: 0
if (sh$p.value > 0.05) {
  cat("No se rechaza H0: los datos siguen una distribución normal.\n")
} else {
  cat("Se rechaza H0: los datos no siguen una distribución normal.\n")
}
## Se rechaza H0: los datos no siguen una distribución normal.

Evaluación de normalidad de la variable TasaXMilHabitantes

Se elaboró un histograma de la tasa de mortalidad con una curva de densidad ajustada.
La distribución muestra una forma acampanada aproximada, aunque con ligera asimetría hacia la derecha (cola larga en valores altos).
Esto sugiere que, si bien la mayor parte de los municipios se concentra entre 4 y 6 muertes por mil habitantes, existen casos con tasas elevadas que alejan los datos de una distribución normal perfecta.

Prueba analítica: Shapiro–Wilk

Se aplicó la prueba de Shapiro–Wilk para comprobar de manera estadística la hipótesis de normalidad:

Estadístico p-valor
0.9600 0.0000

Con un p-valor < 0.05, se rechaza la hipótesis nula de normalidad.
Esto confirma que la variable no sigue una distribución normal.

Analisis de outliers

ggplot(dataset, aes(x = TasaXMilHabitantes)) +
  geom_boxplot(
    fill = "skyblue",
    color = "black",
    outlier.size = 3,
    outlier.colour = "black",
    lwd = 1,
    median.colour = "red",
    median.lwd = 1.2
  ) +
  labs(
    title = "Boxplot de Tasa de Mortalidad (por mil habitantes)",
    x = "",
    y = ""
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

Análisis de outliers en la tasa de mortalidad

Se elaboró un boxplot para identificar valores atípicos en la variable TasaXMilHabitantes (número de fallecimientos por cada mil habitantes). Los principales hallazgos son:

  • Distribución central:
    La mayor parte de los municipios se encuentra entre los cuartiles 25 % y 75 %, es decir, entre aproximadamente 4.1 y 5.7 muertes por mil habitantes.
    La mediana (línea roja) se ubica cerca de 4.8, lo que coincide con el análisis descriptivo previo.

  • Outliers (valores atípicos):
    Se observan puntos aislados a ambos lados del diagrama:

    • En el extremo inferior, algunos municipios presentan tasas ligeramente inferiores a 2 muertes por mil habitantes, reflejando mortalidad muy baja.
    • En el extremo superior, varios municipios superan el rango típico, con tasas que alcanzan e incluso superan 12 muertes por mil habitantes, lo cual indica mortalidad inusualmente alta.
  • Implicaciones:
    Estos valores atípicos pueden estar asociados a poblaciones muy pequeñas, donde pocos casos elevan la tasa, o a situaciones específicas como brotes de enfermedad, problemas de acceso a salud o envejecimiento poblacional.

Dataset Shapefile

Para el análisis espacial de la mortalidad en Antioquia se empleó un shapefile de límites municipales descargado desde el Geoportal del DANE (Departamento Administrativo Nacional de Estadística).
Este archivo cartográfico contiene la representación oficial y actualizada de la división político-administrativa de Colombia, incluyendo:

  • Geometrías (polígonos):
    De cada municipio, necesarias para la visualización geográfica en mapas.

  • Atributos de identificación:
    Como el código único DIVIPOLA (MPIO_CDPMP) y el nombre del municipio (MPIO_CNMBR), que permiten relacionar las geometrías con las bases de datos estadísticos.

El shapefile constituye la capa base geográfica que, al integrarse con la información de mortalidad, posibilita la creación de mapas coropléticos, la identificación de patrones espaciales y el análisis georreferenciado de las tasas de mortalidad en el departamento de Antioquia.

Estructura general

head(dataset_shapefile, 3)
## Simple feature collection with 3 features and 12 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -76.18451 ymin: 5.664284 xmax: -75.26793 ymax: 6.754439
## Geodetic CRS:  MAGNA-SIRGAS
##   DPTO_CCDGO MPIO_CCDGO MPIO_CDPMP DPTO_CNMBR MPIO_CNMBR MPIO_CRSLC MPIO_NAREA
## 1         05        001      05001  ANTIOQUIA   MEDELLÍN       1965   374.8129
## 2         05        002      05002  ANTIOQUIA  ABEJORRAL       1814   507.1411
## 3         05        004      05004  ANTIOQUIA   ABRIAQUÍ       1912   296.8940
##   MPIO_CSMBL MPIO_VGNC MPIO_TIPO Shape_Leng Shape_Area
## 1          4      2021 MUNICIPIO  1.0325459 0.03060592
## 2          4      2021 MUNICIPIO  1.1585038 0.04138390
## 3          4      2021 MUNICIPIO  0.8121832 0.02424826
##                         geometry
## 1 MULTIPOLYGON (((-75.66974 6...
## 2 MULTIPOLYGON (((-75.46938 5...
## 3 MULTIPOLYGON (((-76.08351 6...

Dataset filtrado

dataset_final_shapefile <- dataset_shapefile[, c("MPIO_CDPMP", "MPIO_CNMBR", "Shape_Leng", "Shape_Area", "geometry")]
head(dataset_final_shapefile, 3)
## Simple feature collection with 3 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -76.18451 ymin: 5.664284 xmax: -75.26793 ymax: 6.754439
## Geodetic CRS:  MAGNA-SIRGAS
##   MPIO_CDPMP MPIO_CNMBR Shape_Leng Shape_Area                       geometry
## 1      05001   MEDELLÍN  1.0325459 0.03060592 MULTIPOLYGON (((-75.66974 6...
## 2      05002  ABEJORRAL  1.1585038 0.04138390 MULTIPOLYGON (((-75.46938 5...
## 3      05004   ABRIAQUÍ  0.8121832 0.02424826 MULTIPOLYGON (((-76.08351 6...
cat("Número de observaciones (filas):", nrow(dataset_final_shapefile), "\n")
## Número de observaciones (filas): 1121
cat("Número de variables (columnas):", ncol(dataset_final_shapefile), "\n")
## Número de variables (columnas): 5
str(dataset_final_shapefile)
## Classes 'sf' and 'data.frame':   1121 obs. of  5 variables:
##  $ MPIO_CDPMP: chr  "05001" "05002" "05004" "05021" ...
##  $ MPIO_CNMBR: chr  "MEDELLÍN" "ABEJORRAL" "ABRIAQUÍ" "ALEJANDRÍA" ...
##  $ Shape_Leng: num  1.033 1.159 0.812 0.705 0.445 ...
##  $ Shape_Area: num  0.03061 0.04138 0.02425 0.01053 0.00687 ...
##  $ geometry  :sfc_MULTIPOLYGON of length 1121; first list element: List of 1
##   ..$ :List of 1
##   .. ..$ : num [1:8417, 1:2] -75.7 -75.7 -75.7 -75.7 -75.7 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA
##   ..- attr(*, "names")= chr [1:4] "MPIO_CDPMP" "MPIO_CNMBR" "Shape_Leng" "Shape_Area"

Homogeneización de tipos de datos

Con el fin de realizar correctamente la unión entre la base de datos de mortalidad y el shapefile de límites municipales, se unificó el tipo de dato de las columnas que contienen el código del municipio.

dataset_final$CodigoMunicipio <- as.integer(dataset_final$CodigoMunicipio)
dataset_final_shapefile$MPIO_CDPMP <- as.integer(dataset_final_shapefile$MPIO_CDPMP)

Integración de la información estadística y geográfica

Una vez estandarizados los tipos de datos de las claves de unión, se integraron los datos de mortalidad con la cartografía de límites municipales.

df_merge <- dataset_final_shapefile %>%
  inner_join(dataset_final, by = c("MPIO_CDPMP" = "CodigoMunicipio"))
head(df_merge, 3)
## Simple feature collection with 3 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -75.71929 ymin: 6.163823 xmax: -75.47226 ymax: 6.373761
## Geodetic CRS:  MAGNA-SIRGAS
##   MPIO_CDPMP MPIO_CNMBR Shape_Leng Shape_Area NombreMunicipio    NombreRegion
## 1       5001   MEDELLÍN   1.032546 0.03060592        Medellín VALLE DE ABURRA
## 2       5001   MEDELLÍN   1.032546 0.03060592        Medellín VALLE DE ABURRA
## 3       5001   MEDELLÍN   1.032546 0.03060592        Medellín VALLE DE ABURRA
##    Año NumeroCasos TasaXMilHabitantes                       geometry
## 1 2005       11099                5.0 MULTIPOLYGON (((-75.66974 6...
## 2 2006       11612                5.6 MULTIPOLYGON (((-75.66974 6...
## 3 2007       11535                5.5 MULTIPOLYGON (((-75.66974 6...
class(df_merge)
## [1] "sf"         "data.frame"

inner_join() vs merge()

Para integrar la base de mortalidad con el shapefile se utiliza inner_join() de dplyr en lugar de la función merge() de base R.

Razón principal: preservación de la geometría

  • Los objetos espaciales (sf) poseen una columna especial llamada geometry, que debe conservar la clase sfc para ser interpretada correctamente en gráficos (geom_sf).
  • Al emplear merge() de base R, el resultado se convierte en un simple data.frame, de modo que la columna geometry deja de ser un objeto espacial y se transforma en una lista o en texto.
    Como consecuencia, geom_sf() no puede reconocer la geometría y produce errores.
  • En cambio, inner_join() respeta la estructura del objeto sf y mantiene intacta la columna geometry y la clase sf, lo que permite continuar con el análisis geoespacial y la creación de mapas sin pasos adicionales.

En resumen, inner_join() asegura que la información geográfica se preserve a lo largo del proceso de unión de datos, evitando errores y garantizando que el resultado pueda ser graficado directamente con geom_sf().

Mapa base de Antioquia – Municipios

Se generó un mapa base que representa los límites municipales de Antioquia a partir del GeoDataFrame previamente creado.

En esta visualización se muestran únicamente las geometrías de los municipios con relleno blanco y bordes negros, con el objetivo de verificar si el merge fue exitoso.

ggplot(df_merge) +
  geom_sf(fill = "white", color = "black", linewidth = 0.5) +
  labs(title = "Mapa de Antioquia - Municipios") +
  theme_void() +
  theme(plot.title = element_text(size = 30, hjust = 0.5))

Distribución espacial de la tasa de mortalidad en Antioquia

Realizamos un mapa coroplético que muestra la variable TasaXMilHabitantes, indicadora del número de fallecimientos por cada mil habitantes en cada municipio de Antioquia.

library(ggplot2)

ggplot(df_merge) +
  geom_sf(aes(fill = TasaXMilHabitantes), color = "black", linewidth = 0.3) +
  scale_fill_distiller(palette = "Reds", direction = 1) +
  labs(
    title = "Mortalidad en Antioquia por municipio",
    fill = "Tasa por mil hab."
  ) +
  theme_void() +
  theme(
    plot.title = element_text(size = 20, hjust = 0.5),
    legend.title = element_text(size = 18),   # título de la leyenda
    legend.text  = element_text(size = 18),   # números de la escala
    legend.key.height = unit(2.5, "cm"),      # altura de cada bloque de color
    legend.key.width  = unit(1, "cm")         # ancho de cada bloque de color
  )

Interpretación del mapa de mortalidad en Antioquia

El mapa coroplético muestra la tasa de mortalidad por mil habitantes en cada municipio de Antioquia.
La escala de colores en tonos rojos permite identificar patrones espaciales relevantes:

  • Predominio de valores intermedios:
    La mayoría de los municipios presentan tasas entre 4 y 6 muertes por mil habitantes, lo que coincide con la media y la mediana observadas en el análisis descriptivo.

  • Municipios con tasas elevadas:
    Zonas con color rojo más oscuro superan las 8 muertes por mil habitantes e incluso alcanzan valores cercanos a 12–13 muertes por mil habitantes.

  • Municipios con tasas bajas:
    Áreas en tonos más claros (blanco–rosado) reflejan tasas menores a 4 muertes por mil habitantes, lo que puede indicar poblaciones más jóvenes, buenas condiciones sanitarias o años con baja incidencia de enfermedades graves.

Municipios con mayor promedio de mortalidad

top5 <- df_merge %>%
  group_by(NombreMunicipio) %>%
  summarise(TasaXMilHabitantes = mean(TasaXMilHabitantes, na.rm = TRUE)) %>%
  arrange(desc(TasaXMilHabitantes)) %>%
  slice_head(n = 10)

ggplot(top5, aes(x = TasaXMilHabitantes,
                 y = reorder(NombreMunicipio, TasaXMilHabitantes))) +
  geom_col(fill = "firebrick") +
  labs(
    title = "Top 5 municipios con mayor promedio de tasa de mortalidad",
    x = NULL,
    y = NULL
  ) +
  theme_minimal(base_size = 20) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

Análisis del Top de municipios con mayor promedio de tasa de mortalidad

El gráfico presenta los municipios de Antioquia con los mayores promedios de la variable TasaXMilHabitantes.

  • Cisneros y Valdivia encabezan la lista, con promedios cercanos a 8 muertes por mil habitantes, lo que los ubica claramente por encima del promedio departamental (~5 muertes por mil).

  • Tarazá, Carolina y Puerto Berrío también se destacan con valores superiores a 7 muertes por mil habitantes, reflejando mortalidad relativamente alta de manera constante a lo largo de los años.

  • Aunque otros municipios como Jardín, Caracolí, Venecia, Ciudad Bolívar y Angelópolis también registran tasas elevadas, sus promedios se sitúan en un rango ligeramente menor (alrededor de 6 a 7 muertes por mil habitantes).

Municipios con menor promedio de mortalidad

top5bajos <- df_merge %>%
  group_by(NombreMunicipio) %>%
  summarise(TasaXMilHabitantes = mean(TasaXMilHabitantes, na.rm = TRUE)) %>%
  arrange(TasaXMilHabitantes) %>%
  slice_head(n = 5)

ggplot(top5bajos, aes(x = TasaXMilHabitantes,
                      y = reorder(NombreMunicipio, TasaXMilHabitantes))) +
  geom_col(fill = "steelblue") +
  labs(
    title = "Top 5 municipios con menor promedio de tasa de mortalidad",
    x = NULL,
    y = NULL
  ) +
  theme_minimal(base_size = 28) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

Análisis del Top de municipios con menor promedio de tasa de mortalidad

  • Vigía del Fuerte registra el promedio más bajo, cercano a 1.6 muertes por mil habitantes, lo que lo sitúa muy por debajo del promedio departamental (~5).

  • Murindó presenta un valor ligeramente superior (~2.5), seguido por San Juan de Urabá, Peque y Arboletes, cuyos promedios se ubican entre 3.0 y 3.5 muertes por mil habitantes.

  • Estos valores son significativamente inferiores al rango intercuartílico principal (4.1 – 5.7) observado en el análisis descriptivo.

Promedio de mortalidad por subregión en Antioquia

region_promedio <- df_merge %>%
  st_drop_geometry() %>%
  group_by(NombreRegion) %>%
  summarise(TasaXMilHabitantes = mean(TasaXMilHabitantes, na.rm = TRUE))

gdf_regiones <- df_merge %>%
  group_by(NombreRegion) %>%
  summarise(geometry = st_union(geometry)) %>%
  left_join(region_promedio, by = "NombreRegion")

gdf_regiones <- gdf_regiones %>%
  mutate(centroid = st_centroid(geometry))

ggplot() +
  geom_sf(
    data = gdf_regiones,
    aes(fill = TasaXMilHabitantes),
    color = "black",
    linewidth = 0.5
  ) +
  scale_fill_distiller(
    palette = "YlOrRd",
    direction = 1,
    name = "Promedio de tasa de mortalidad\n(muertes por mil habitantes)"
  ) +
  geom_sf_text(
    data = gdf_regiones,
    aes(label = NombreRegion, geometry = centroid),
    size = 5,
    fontface = "bold",
    color = "black"
  ) +
  labs(
    title = "Promedio de mortalidad por subregión en Antioquia"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
    legend.title = element_text(size = 16),
    legend.text  = element_text(size = 14),
    legend.key.height = unit(2.5, "cm"),
    legend.key.width  = unit(1, "cm")
  )

El mapa coroplético presenta el promedio de la tasa de mortalidad (muertes por mil habitantes) calculado para cada subregión del departamento de Antioquia. La intensidad del color —de amarillo claro a rojo oscuro— indica el nivel del promedio de mortalidad: las tonalidades más oscuras corresponden a las subregiones con valores más altos.

Se observa que las subregiones Suroeste, Magdalena Medio y Valle de Aburrá se destacan con las tonalidades más intensas, lo que evidencia que allí se concentra un mayor promedio de mortalidad en comparación con otras regiones. Este comportamiento puede estar asociado a factores como mayor urbanización, densidad poblacional, envejecimiento de la población o diferencias en el acceso a los servicios de salud.

En contraste, subregiones como Urabá y, en menor medida, Occidente y Oriente presentan colores más claros, reflejando un promedio de mortalidad más bajo.

Casos de defunción por municipio

ggplot(df_merge) +
  geom_sf(
    aes(fill = NumeroCasos),
    color = "black",
    linewidth = 0.3
  ) +
  scale_fill_distiller(
    palette = "OrRd",
    direction = 1,
    name = "Número de casos de defunción"
  ) +
  labs(
    title = "Número de casos de defunción por municipio"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
    legend.title = element_text(size = 16),
    legend.text  = element_text(size = 14),
    legend.key.height = unit(2.5, "cm"),
    legend.key.width  = unit(1, "cm")
  )

El mapa coroplético representa el número total de defunciones registradas en cada municipio de Antioquia durante los años del 2005 hasta 2021. La intensidad del color varía desde tonos claros (menor número de casos) hasta rojos oscuros (mayor número de casos).

Se observa que:

  • Medellín se destaca de forma muy marcada con el color más intenso, lo cual confirma su posición como el municipio con mayor cantidad absoluta de defunciones en todo el departamento. Este resultado se asocia a su alta densidad poblacional y concentración urbana, factores que naturalmente elevan el número de muertes totales.

  • La mayoría de los demás municipios presentan tonalidades claras, lo que refleja cantidades absolutas de defunciones considerablemente menores en comparación con Medellín.

Municipios con mayor numero de defunciones

top10_casos <- df_merge %>%
  st_drop_geometry() %>%
  group_by(NombreMunicipio) %>%
  summarise(NumeroCasos = sum(NumeroCasos, na.rm = TRUE)) %>%
  arrange(desc(NumeroCasos)) %>%
  slice_head(n = 10)

ggplot(top10_casos, aes(x = NumeroCasos,
                        y = reorder(NombreMunicipio, NumeroCasos))) +
  geom_col(fill = "firebrick") +
  labs(
    title = "Top 10 municipios con mayor número de defunciones",
    x = "Número total de defunciones",
    y = "Municipio"
  ) +
  theme_minimal(base_size = 20) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.y = element_text(size = 16)
  )

Interpretación

El gráfico de barras muestra los diez municipios de Antioquia con el mayor número absoluto de defunciones durante todos los años Se observa que Medellín encabeza el ranking de manera destacada, superando ampliamente a los demás municipios. Este comportamiento se relaciona con su alta concentración poblacional, ya que una mayor población implica un mayor número total de muertes, incluso cuando la tasa de mortalidad relativa (por cada mil habitantes) no sea la más alta.

En un segundo nivel se encuentran municipios como Bello, Itagüí y Envigado, que junto con Medellín hacen parte del Área Metropolitana del Valle de Aburrá, región densamente poblada y con alta actividad económica. Otros municipios que completan el top 10 son Rionegro, Turbo, Apartadó, Caucasia, Caldas y Copacabana, los cuales, pese a tener poblaciones más pequeñas, registran una cantidad absoluta de defunciones significativa por su rol como centros regionales.