1. Librerias:

library(readr)
library(ggplot2)
library(ggmap)
library(sf)
library(dplyr)
library(naniar)
library(viridis)
library(ggrepel)
library(gridExtra)

2. Cargar Datos:

df <- read_csv("Subsidios_De_Vivienda_Asignados_20250918.csv")

gdf_DPTO <- st_read("Departamento/MGN_DPTO_POLITICO.shp", options = "ENCODING=UTF-8")
## options:        ENCODING=UTF-8 
## Reading layer `MGN_DPTO_POLITICO' from data source 
##   `C:\Users\Usuario\Desktop\VisualizaciónDeDatos\Taller_Georeferenciación\Departamento\MGN_DPTO_POLITICO.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 33 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
## Geodetic CRS:  MAGNA-SIRGAS
gdf_MPIO <- st_read("Municipio/MGN_ADM_MPIO_GRAFICO.shp", options = "ENCODING=UTF-8")
## options:        ENCODING=UTF-8 
## Reading layer `MGN_ADM_MPIO_GRAFICO' from data source 
##   `C:\Users\Usuario\Desktop\VisualizaciónDeDatos\Taller_Georeferenciación\Municipio\MGN_ADM_MPIO_GRAFICO.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1121 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
## Geodetic CRS:  WGS 84

3. Exploración Inicial:

glimpse(df)
## Rows: 83,800
## Columns: 9
## $ Departamento                   <chr> "AMAZONAS", "AMAZONAS", "AMAZONAS", "AM…
## $ `Código Divipola Departamento` <dbl> 91, 91, 91, 91, 91, 91, 91, 91, 91, 5, …
## $ Municipio                      <chr> "LETICIA", "LETICIA", "LETICIA", "LETIC…
## $ `Código Divipola Municipio`    <dbl> 91001, 91001, 91001, 91001, 91001, 9100…
## $ Programa                       <chr> "Bolsa Desastres Naturales", "Bolsa Des…
## $ `Año de Asignación`            <dbl> 2008, 2009, 2003, 2003, 2005, 2015, 201…
## $ `Estado de Postulación`        <chr> "Apto con subsidio vencido", "Asignados…
## $ Hogares                        <dbl> 37, 3, 1, 2, 215, 95, 2, 6, 1, 2, 3, 18…
## $ `Valor Asignado`               <chr> "$336,984,900.00", "$18,633,750.00", "$…

Note que la variable valor asignado se ha tomado como tipo chr y ademas en sus registros hay texto con simbolos “$”, comas y puntos, lo cual, necesitamos corregir:

df <- df %>%
  mutate(`Valor Asignado` = gsub("[\\$,]", "", `Valor Asignado`), # quitar $ y comas
         `Valor Asignado` = as.numeric(`Valor Asignado`))
head(df$`Valor Asignado`)
## [1]  336984900   18633750    5280000   12049000   22790000 5315956800

El resultado del proceso de limpieza es una variable de tipo numérico, libre de anomalías, y preparada para su explotación analítica.

gdf_MPIO <- gdf_MPIO %>%
  mutate(
    dpto_ccdgo = sprintf("%02s", dpto_ccdgo),
    mpio_ccdgo = sprintf("%03s", mpio_ccdgo),
    cod_mpio = paste0(dpto_ccdgo, mpio_ccdgo)
  )

df <- df %>%
  mutate(
    cod_dpto = sprintf("%02d", as.integer(`Código Divipola Departamento`)),
    cod_mpio = sprintf("%05d", as.integer(`Código Divipola Municipio`))
  )

Buscamos asegurarnos de que los codigos municipales y departamentales tengan la estructura correcta para hacer el left_join.

4. Datos Faltantes:

vis_miss(df, warn_large_data = FALSE)

La representación gráfica mediante el mapa de calor confirma la ausencia de valores faltantes en la matriz de datos analizada.

5. Mapas por Departamento:

df_dpto_sum <- df %>%
  group_by(cod_dpto) %>%
  summarise(valor_total = sum(`Valor Asignado`, na.rm = TRUE),
            hogares_total = sum(Hogares, na.rm = TRUE))

df_dpto_mean <- df %>%
  group_by(cod_dpto) %>%
  summarise(valor_promedio = mean(`Valor Asignado`, na.rm = TRUE),
            hogares_promedio = mean(Hogares, na.rm = TRUE))

gdf_DPTO <- gdf_DPTO %>%
  mutate(cod_dpto = sprintf("%02d", as.integer(DPTO_CCDGO)))

mapa_total <- gdf_DPTO %>% left_join(df_dpto_sum, by = "cod_dpto")
mapa_promedio <- gdf_DPTO %>% left_join(df_dpto_mean, by = "cod_dpto")

centroides_total <- st_centroid(mapa_total)
centroides_promedio <- st_centroid(mapa_promedio)

5.1. Mapa Hogares Totales por Departamento:

ggplot(mapa_total) +
  geom_sf(aes(fill = hogares_total), color = "white") +
  geom_text_repel(data = centroides_total,
                  aes(x = st_coordinates(geometry)[,1],
                      y = st_coordinates(geometry)[,2],
                      label = DPTO_CNMBR),
                  size = 3, color = "black") +
  scale_fill_viridis(option = "plasma", trans = "log", na.value = "grey90") +
  theme_void() +
  labs(title = "Total de Hogares por Departamento", fill = "Hogares (log)")

En el mapa podemos observar que los departamentos con mas hogares que recibieron subsidios de Vivienda son: Antioquia, Cundinamarca, Bogota, Cordoba, Atlantico y Valle del Cauca. Lo cual es algo que se espera dado que son territorios muy poblados y urbanos.

Tambien encontramos que los departamentos con menos hogares que recibieron subsidios de vivienda son: Vaupés, Guainia, Amazonas y Vichada. Lo cual tambien tiene sentido dado que son regiones Amazónicas y de baja densidad poblacional.

5.2. Mapa Valor Promedio Asignado por Departamento:

ggplot(mapa_promedio) +
  geom_sf(aes(fill = valor_promedio), color = "white") +
  geom_text_repel(data = centroides_promedio,
                  aes(x = st_coordinates(geometry)[,1],
                      y = st_coordinates(geometry)[,2],
                      label = DPTO_CNMBR),
                  size = 3, color = "black") +
  scale_fill_viridis(option = "plasma", trans = "log", na.value = "grey90") +
  theme_void() +
  labs(title = "Valor Promedio Asignado por Registro", fill = "Promedio (log)")

En el mapa podemos observar que los departamentos con mayor valor promedio asignado son Guainía, Vichada, Amazonas, Choco y Putumayo. Esto puede deverse a programas focalizados o a inversiones especificas de alto costo en territorios donde la población es baja.

Por otro lado, Departamentos como Cundinamarca, Bogotá D.C., Antioquia y Santander en promedio reciben un valor inferior, lo cual podria estar asociado al número de beneficiarios.

5.3. Conclusiones de los Mapas:

La comparación de ambos mapas muestra un patrón claro: los departamentos con mayor número de hogares, como Antioquia, Bogotá y Valle del Cauca, tienden a tener un menor valor promedio asignado por registro, ya que los recursos deben distribuirse entre una población numerosa; en contraste, departamentos con pocos hogares, como Vichada, Guainía y Amazonas, exhiben promedios mucho más altos por registro, lo que sugiere que, aunque su población es reducida, reciben asignaciones más elevadas por unidad, posiblemente como mecanismo de compensación por el aislamiento geográfico o los mayores costos logísticos asociados.

6. Otras Graficas:

6.1. Histogramas:

hist1 <- ggplot(df, aes(x = `Valor Asignado`)) +
  geom_histogram(bins = 50, fill = "steelblue", color = "white", alpha = 0.7) +
  scale_x_log10() +
  labs(title = "Distribución de Valor Asignado",
       x = "Valor Asignado (log)", y = "Frecuencia") +
  theme_minimal()

hist2 <- ggplot(df, aes(x = Hogares)) +
  geom_histogram(bins = 50, fill = "darkgreen", color = "white", alpha = 0.7) +
  scale_x_log10() +
  labs(title = "Distribución de Hogares",
       x = "Número de Hogares (log)", y = "Frecuencia") +
  theme_minimal()

gridExtra::grid.arrange(hist1, hist2, ncol = 2)

Los histogramas muestran que la mayoría de los subsidios asignados se concentran en valores de entre 10 y 100 millones de pesos, con pocos casos extremos de montos muy bajos o muy altos, lo que refleja una distribución sesgada hacia la derecha con valores atípicos elevados; en cuanto al número de hogares, la gran mayoría de registros corresponde a subsidios individuales para un solo hogar, mientras que son mucho menos frecuentes los casos colectivos que agrupan a decenas o cientos de beneficiarios, lo que indica que el sistema de subsidios está diseñado principalmente para atender a hogares de manera individual, aunque también contempla asignaciones masivas en proyectos específicos.

6.2. Diagramas de Barras Apiladas:

df_depto_prog <- df %>%
  group_by(Departamento, Programa) %>%
  summarise(valor_total = sum(`Valor Asignado`, na.rm = TRUE))

ggplot(df_depto_prog, aes(x = reorder(Departamento, -valor_total),
                          y = valor_total, fill = Programa)) +
  geom_bar(stat = "identity") +
  labs(title = "Recursos asignados por departamento y programa",
       x = "Departamento", y = "Valor Total Asignado") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90))

El gráfico muestra la distribución de los recursos asignados por departamento y programa de subsidios de vivienda, donde se observa que los departamentos con mayores montos son Valle del Cauca, Atlántico, Bogotá D.C., Antioquia y Cundinamarca, reflejando la alta concentración de recursos en territorios densamente poblados; en contraste, departamentos amazónicos y de baja densidad como Vaupés, Guainía, Amazonas y Vichada reciben montos muy bajos. Además, se evidencia que programas como “Mi Casa Ya” y la Vivienda Gratuita (Fase I y II) son los que más recursos concentran en la mayoría de departamentos, mientras que otros programas específicos como “Bolsa Esfuerzo Territorial” o “Bolsa Desplazados” aparecen en menor proporción, lo que sugiere que la política de vivienda se orienta principalmente a programas masivos de cobertura nacional, complementados con bolsas focalizadas en poblaciones vulnerables o territorios específicos.

df_estado <- df %>%
  group_by(`Estado de Postulación`) %>%
  summarise(casos = n())

ggplot(df_estado, aes(x = reorder(`Estado de Postulación`, -casos),
                      y = casos, fill = `Estado de Postulación`)) +
  geom_bar(stat = "identity") +
  labs(title = "Distribución de Estados de Postulación",
       x = "Estado", y = "Número de Registros") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

El gráfico de distribución de estados de postulación muestra que la gran mayoría de registros corresponden a “Asignados”, lo que indica que el grueso de los hogares logró acceder efectivamente al subsidio; en contraste, otros estados como “Apto con subsidio vencido”, “Asignado con aplicación en Mi Casa Ya”, “Perdida de ejecutoriedad” o diferentes tipos de “Renuncia” y “Restitución” aparecen en proporciones mucho menores. Esto evidencia que, aunque existen procesos de depuración, rechazos o pérdida del beneficio, representan solo una fracción reducida frente al volumen total de asignaciones efectivas, lo que refleja una tendencia positiva en la materialización de los subsidios, aunque con ciertos retos administrativos asociados a la gestión de casos especiales y a la restitución de recursos.

6.3. Diagrama de Disperción:

ggplot(df, aes(x = Hogares, y = `Valor Asignado`)) +
  geom_point(alpha = 0.4, color = "steelblue") +
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  scale_x_log10() +
  scale_y_log10() +
  labs(title = "Relación entre Hogares y Valor Asignado con Tendencia",
       x = "Número de Hogares (log)", y = "Valor Asignado (log)") +
  theme_minimal()

El gráfico de dispersión refuerza la conclusión obtenida a partir de los mapas: se observa una clara relación positiva entre el número de hogares y el valor total asignado, lo que confirma que los departamentos con más beneficiarios concentran mayores montos en conjunto. Sin embargo, al contrastarlo con la comparación regional, también se evidencia que en territorios con poblaciones numerosas como Antioquia, Bogotá o Valle del Cauca, el valor promedio por registro tiende a ser menor, pues los recursos deben repartirse entre muchos hogares, mientras que en departamentos con pocos beneficiarios, como Vichada, Guainía o Amazonas, los montos por hogar resultan proporcionalmente más altos. Esto sugiere que, aunque existe una tendencia general de más hogares = más recursos, la distribución per cápita es desigual y responde tanto a la magnitud poblacional como a factores contextuales, como los costos logísticos o la necesidad de compensar el aislamiento geográfico.