Este proyecto/demostración está realizado en lenguaje R. Para su construcción se utilizó el entorno de desarrollo R studio y para su presentación en este documento se utilizó el formato R markdown.

En el repositorio de Github de este proyecto encontrarás, los insumos y el código y los productos del código aquí explicados. Esto para facilitar su reproductibilidad. Repositorio Github

Problema a resolver.

Al planear un proyecto, es crucial saber cuál es el grado de viabilidad del mismo así como su impacto social. Para determinar dichas carácteristicas, es necesario saber ¿cuál es el Área de Influencia (AI) del proyecto? y ¿a cuántas personas podría afectar?

Para responder a dichas preguntas nos podemos apoyar en los recursos que nos ofrecen herramientas como Qgis y R, así como datos públicos recopilados de instancias como el Instituto Nacional de Estadítica y Geografía (INEGI) o instituto similares en el caso de otros países.

Esta demostración presupone que el usuario ya ha georeferenciado el área de su proyecto, y que cuenta con un archivo tipo KMZ, SHP, etc. de su proyecto.

Insumos

Las herramientas que se utilizarán para este proyecto son:

Por otro lado, los datos que se requeridos son:

Metodología.

Paso 1: Generar el Área de Influencia.

Suponiendo que ya se cuenta con un archivo KMZ o SHP, de nuestro proyecto se procede a cargar el archivo como una capa en Qgis. Para facilitar nuestro trabajo usaremos el Quick Map Services de Google Satellite para obtener una capa que ayude a ubicar nuestro proyecto, Además, en caso de que estemos usando un archivo KMZ u otro, se transformará a un archivo SHP para facilitar su manipulación. A estas alturas nos debería quedar algo como lo siguiente:

Imagen 1: Área del Proyecto

Fuente: Elaboración propia.

Después, generamos el Área de Influncia del proyecto (AI). Se puede presuponer un AI uniforme, pero en este caso se proyectará una AI con varios nieveles, los cuales abarcarán distintas distancias. Los niveles de la AI serán, Área Núcleo (el proyecto), Zona de Amortiguamiento (500 metros), Área de Influencia Directa (1000 metros), Área de Influencia Indirecta (2000 metros).

Para generar la AI y sus niveles usamos la herramienta Multi Ring Buffer de Qgis en la capa de nuestro proyecto, y configuramos dicha herramienta con los valores deseados. Sin embargo, la nueva capa no mostrará el Área Núcleo. Para obtener una capa que muestre todos los niveles de la AI, usamos la herramienta “Unión” para combinar la capa del proyecto, con la capa generada por el proceso de buffer.

Para un mejor manejo y visualización, modificamos la tabla de atributos de la nueva capa para nombrar cada una de los niveles de la AI. Finalmente, modificamos las etiquetas y colores de cada nivel. Nos debería quedar algo como lo siguiente:

Imagen 2: Área de Influencia del proyecto

Fuente: Elaboración propia.

Notece que en el panel de capas, la capa resulante del buffer es temporal. Como ya cumplió su propósito, la eliminaremos. Además, en dicho panel, también se puede notar el nombre de cada una de las capas del AI.

Paso 2: Identificar las localidades dentro del AI.

Una vez identificada y georeferenciada el AI del proyecto, es necesario identificar a cuántas personas posiblemente afectará. Para ello, primero debemos identificar a cuáles localidades se encuentran en el Área de Influencia, para así, posteriormente averiguar a la población de cada una de esas localidades.

Para identificar las localidades pertinentes haremos uso del Marco Geoestadístico. Censo de Población y Vivienda 2020, Como identificamos que el AI se encuentra tanto en la CDMX como en el Estado de México, usaremos los conjuntos de archivos correspondientes a ambas entidades.

Cada conjunto de archivos nos ofrece una gran variedad de diferntes capas con diferentes características, pero para este proyecto sólo nos interesan la de localidades amanzanadas y la de localidades rurales puntuales.

Cada una de estas capas muestra las localidades de toda la entidad, sin embargo, solo nos interesan las localidades en las que al menos alguna parte se ubique en el AI. Para filtrar las localidades de interés usamos la herramienta de intersección. Finalmente, unimos las capas de localidades amanzanadas en el AI y la de localidades puntuales rurales en el AI. Al finalizar este paso nos quedaría algo como lo siguiente:

Imagen 3: Localidades del AI

Fuente: Elaboración propia.

Notece que en el panel de capas, se pueden observar cuatro capas de localidades en el AI. Esto se debe a que el proyecto se localiza en dos entidaes (CDMX y Edo.Mex), y por cada entidad hay una capa de localidades amanzanadas y otra de localidades rurales puntuales.

Si quieres, puedes utilizar las herramientas de composición para transformar esto en un mapa para integrarlo a algún reporte. El mapa seríal algo parecido a lo siguiente:

Imagen 4: Mapa de las localidades del AI

Fuente: Elaboración propia.

La herramienta de composición de Qgis nos permite agregar muchos elementos a nuestros mapas, como rosas de los vientos, logotipos, escalas, etc. Sin embargo, por simplicidad omití esos detalles. También se pueden mostrar las etiquetas de las localidades, sin embargo, debido a que son muchas, los nombres se veían amontonados, como en este paso no es necesario mostrar los nombres, obté por dejarlo de esta manera.

Paso 3: Limpiar las base de datos de las localidades.

Ahora sólo falta identificar cuántas personas viven en esas localidades. Para ello, conviene recordar que cada una de las capas cargadas en Qgis tiene asociada una tabla de atributos, las cual muestra diversos datos de interés de las geometrías contenidas en la capa, o datos ue nos permiten identificar los elementos contenidos en la capa. En este caso, nos interesa los datos que nos permitan la identificación de las localidades que se encuentran dentro del AI. Así pues, descargaremos cada una de las tablas de atributos de las cuatro capas que contienen localidades, en formato csv (también puede ser en formato xlm).

Cuando inspeccionamos las tablas nos damos cuenta de que contienen datos de interés sobre las localidades dentro del AI, sin embargo, no viene el dato que más nos interesa, el número depersonas que habitan en dichas localaidades. Para resolver esto, usaremos el Sistema de Consulta de Integración Territorial, Entorno Urbano y Localidad.(SCITEL) donde bajaremos las bases correspondientes tanto para la CDMX y el Edo.Mex.

Para este punto podríamos armarnos de paciencia y buscar cada una de las localidades del AI en las tablas que bajamos del SCITEL y ver su población total. Sin embargo, por más pacientes que seamos quizá no tengamos tanto tiempo. Por lo cual, podemos usar la tecnología para acelerar el proceso.

Como primer paso debemos pensar en qué necesitamos hacer, y los insumos que tenemos. En este caso, lo que queremos hacer es una tabla de todas las localidades del AI, y su población total. Estos datos están repartidos en seis tablas diferentes. Entonces, para lograr nuestro objetivo harémos tres pasos, primero, unificaremos las tablas de atributos de las capas de Qgis para obtener una tabla con todas las localidades del AI, segundo, unificaremos las tablas obtenidas del SCITEl con los datos de todas las las localidades en CDMX y Edo.Mex, y tercero filtraremos la tabla de SCITEL para quedarnos con sólo las localidades del AI.

Paso 3.1: Carga y limpieza de las bases de datos de las localidades del AI.

Para lograr nuestro objetivo, harémos uso de R y de R studio, comenzamos cargando las librerias que usaremos para preparar los datos.

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library (readr)

Después, cargamos las bases de datos resultantes de las localidades del AI

loc_pun_cdmx <- read_csv("C:/Users/javal/OneDrive/Desktop/Portafolio 9/01_Qgis_poblacion_AI/proyecto/bases_de_datos/loc_punt_ai_cdmx.csv")
## Rows: 17 Columns: 31
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (9): CVEGEO, CVE_ENT, CVE_MUN, CVE_LOC, CVE_AGEB, NOMGEO, PLANO, Name, ...
## dbl  (8): CVE_MZA, tessellate, extrude, visibility, mrb_dist, tessella_1, ex...
## lgl (14): descriptio, timestamp, begin, end, altitudeMo, drawOrder, icon, de...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(loc_pun_cdmx)
## # A tibble: 6 × 31
##   CVEGEO  CVE_ENT CVE_MUN CVE_LOC CVE_AGEB CVE_MZA NOMGEO PLANO Name  descriptio
##   <chr>   <chr>   <chr>   <chr>   <chr>      <dbl> <chr>  <chr> <chr> <lgl>     
## 1 090090… 09      009     0301    0100         800 El Te… Croq… Área… NA        
## 2 090090… 09      009     0302    0100         800 Ejido… No    Área… NA        
## 3 090090… 09      009     0303    0100         800 Arbol… Si    Área… NA        
## 4 090090… 09      009     0304    0100         800 Emili… Croq… Área… NA        
## 5 090090… 09      009     0381    0100         800 El Sa… No    Área… NA        
## 6 090110… 09      011     0069    1198         800 San M… Croq… Zona… NA        
## # ℹ 21 more variables: timestamp <lgl>, begin <lgl>, end <lgl>,
## #   altitudeMo <lgl>, tessellate <dbl>, extrude <dbl>, visibility <dbl>,
## #   drawOrder <lgl>, icon <lgl>, mrb_dist <dbl>, Name_2 <chr>,
## #   descript_1 <lgl>, timestamp_ <lgl>, begin_2 <lgl>, end_2 <lgl>,
## #   altitude_1 <lgl>, tessella_1 <dbl>, extrude_2 <dbl>, visibili_1 <dbl>,
## #   drawOrder_ <lgl>, icon_2 <lgl>
loc_pun_edomex <- read_csv("C:/Users/javal/OneDrive/Desktop/Portafolio 9/01_Qgis_poblacion_AI/proyecto/bases_de_datos/loc_ punt_ai_edomex.csv")
## Rows: 10 Columns: 31
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (6): CVE_MUN, CVE_LOC, NOMGEO, PLANO, Name, Name_2
## dbl (11): CVEGEO, CVE_ENT, CVE_AGEB, CVE_MZA, tessellate, extrude, visibilit...
## lgl (14): descriptio, timestamp, begin, end, altitudeMo, drawOrder, icon, de...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(loc_pun_edomex)
## # A tibble: 6 × 31
##    CVEGEO CVE_ENT CVE_MUN CVE_LOC CVE_AGEB CVE_MZA NOMGEO PLANO Name  descriptio
##     <dbl>   <dbl> <chr>   <chr>      <dbl>   <dbl> <chr>  <chr> <chr> <lgl>     
## 1 1.50e15      15 025     0052        1042     800 Ranch… Croq… Área… NA        
## 2 1.50e15      15 025     0053        1042     800 Ranch… Si    Zona… NA        
## 3 1.50e15      15 025     0058        1042     800 Ranch… Si    Área… NA        
## 4 1.50e15      15 025     0069        1042     800 Ranch… Croq… Área… NA        
## 5 1.50e15      15 025     0109        1042     800 Santa… Croq… Área… NA        
## 6 1.50e15      15 025     0121        1042     800 Barri… Si    Área… NA        
## # ℹ 21 more variables: timestamp <lgl>, begin <lgl>, end <lgl>,
## #   altitudeMo <lgl>, tessellate <dbl>, extrude <dbl>, visibility <dbl>,
## #   drawOrder <lgl>, icon <lgl>, mrb_dist <dbl>, Name_2 <chr>,
## #   descript_1 <lgl>, timestamp_ <lgl>, begin_2 <lgl>, end_2 <lgl>,
## #   altitude_1 <lgl>, tessella_1 <dbl>, extrude_2 <dbl>, visibili_1 <dbl>,
## #   drawOrder_ <lgl>, icon_2 <lgl>
loc_aman_cdmx <- read_csv("C:/Users/javal/OneDrive/Desktop/Portafolio 9/01_Qgis_poblacion_AI/proyecto/bases_de_datos/loc_aman_ai_cdmx.csv")
## Rows: 13 Columns: 29
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (8): Name, Name_2, CVEGEO, CVE_ENT, CVE_MUN, CVE_LOC, NOMGEO, AMBITO
## dbl  (7): tessellate, extrude, visibility, mrb_dist, tessella_1, extrude_2, ...
## lgl (14): descriptio, timestamp, begin, end, altitudeMo, drawOrder, icon, de...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
tail(loc_aman_cdmx)
## # A tibble: 6 × 29
##   Name            descriptio timestamp begin end   altitudeMo tessellate extrude
##   <chr>           <lgl>      <lgl>     <lgl> <lgl> <lgl>           <dbl>   <dbl>
## 1 Área de Influe… NA         NA        NA    NA    NA                  1       0
## 2 Área de Influe… NA         NA        NA    NA    NA                  1       0
## 3 Área de Influe… NA         NA        NA    NA    NA                  1       0
## 4 Área de Influe… NA         NA        NA    NA    NA                  1       0
## 5 Área Núcleo     NA         NA        NA    NA    NA                 NA      NA
## 6 Área Núcleo     NA         NA        NA    NA    NA                 NA      NA
## # ℹ 21 more variables: visibility <dbl>, drawOrder <lgl>, icon <lgl>,
## #   mrb_dist <dbl>, Name_2 <chr>, descript_1 <lgl>, timestamp_ <lgl>,
## #   begin_2 <lgl>, end_2 <lgl>, altitude_1 <lgl>, tessella_1 <dbl>,
## #   extrude_2 <dbl>, visibili_1 <dbl>, drawOrder_ <lgl>, icon_2 <lgl>,
## #   CVEGEO <chr>, CVE_ENT <chr>, CVE_MUN <chr>, CVE_LOC <chr>, NOMGEO <chr>,
## #   AMBITO <chr>
loc_aman_edomex <- read_csv("C:/Users/javal/OneDrive/Desktop/Portafolio 9/01_Qgis_poblacion_AI/proyecto/bases_de_datos/loc_aman_ai_edomex.csv")
## Rows: 21 Columns: 29
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (6): Name, Name_2, CVE_MUN, CVE_LOC, NOMGEO, AMBITO
## dbl  (9): tessellate, extrude, visibility, mrb_dist, tessella_1, extrude_2, ...
## lgl (14): descriptio, timestamp, begin, end, altitudeMo, drawOrder, icon, de...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
tail (loc_aman_edomex)
## # A tibble: 6 × 29
##   Name            descriptio timestamp begin end   altitudeMo tessellate extrude
##   <chr>           <lgl>      <lgl>     <lgl> <lgl> <lgl>           <dbl>   <dbl>
## 1 Área de Influe… NA         NA        NA    NA    NA                  1       0
## 2 Área de Influe… NA         NA        NA    NA    NA                  1       0
## 3 Área de Influe… NA         NA        NA    NA    NA                  1       0
## 4 Área de Influe… NA         NA        NA    NA    NA                  1       0
## 5 Área Núcleo     NA         NA        NA    NA    NA                 NA      NA
## 6 Área Núcleo     NA         NA        NA    NA    NA                 NA      NA
## # ℹ 21 more variables: visibility <dbl>, drawOrder <lgl>, icon <lgl>,
## #   mrb_dist <dbl>, Name_2 <chr>, descript_1 <lgl>, timestamp_ <lgl>,
## #   begin_2 <lgl>, end_2 <lgl>, altitude_1 <lgl>, tessella_1 <dbl>,
## #   extrude_2 <dbl>, visibili_1 <dbl>, drawOrder_ <lgl>, icon_2 <lgl>,
## #   CVEGEO <dbl>, CVE_ENT <dbl>, CVE_MUN <chr>, CVE_LOC <chr>, NOMGEO <chr>,
## #   AMBITO <chr>

Observamos que las tablas tienen demasiadas variables, por lo cual, solo nos quedamos con las variables relacionadas con la identificación de las localidades. Para saber cuáles sirven y cuáles no, podemos explorar las tablas obtenidas del SCITEL, y quedarnos con las variables que todas las tablas tienen en común y que sirven para identificar de manera única a las localidades. Así pues, nos quedamos con las siguientes variables: clave geográfica (CVEGEO), clave de la entidad (CVE_ENT), clave del municipio(CVE_MUN), clave de la localidad (CVE_LOC) y nombre de la localidad (NOMGEO).

loc_aman_cdmx <- loc_aman_cdmx [,24:28]
loc_aman_edomex <- loc_aman_edomex [, 24:28]
loc_pun_cdmx <-  loc_pun_cdmx [, 1:7]
loc_pun_edomex <- loc_pun_edomex [, 1:7]

De esta manera las bases quedarían algo como lo siguiente:

head (loc_aman_cdmx)
## # A tibble: 6 × 5
##   CVEGEO    CVE_ENT CVE_MUN CVE_LOC NOMGEO             
##   <chr>     <chr>   <chr>   <chr>   <chr>              
## 1 090110011 09      011     0011    San Andrés Mixquic 
## 2 090110024 09      011     0024    San Nicolás Tetelco
## 3 090090300 09      009     0300    San Nicolás Tetelco
## 4 090110011 09      011     0011    San Andrés Mixquic 
## 5 090110024 09      011     0024    San Nicolás Tetelco
## 6 090090300 09      009     0300    San Nicolás Tetelco

Como las columnas CVE_AGEB y CVE_MZA de las bases de las localidades puntuales estorban, las quitamos.

loc_pun_cdmx <-  loc_pun_cdmx [, -6]
loc_pun_edomex <- loc_pun_edomex [,-6]
loc_pun_cdmx <-  loc_pun_cdmx [, -5]
loc_pun_edomex <- loc_pun_edomex [,-5]

Paso 3.2: Unificación de las bases de las localidades en el AI

Como felizmente, para todas las bases de las localidade del AI, las columnas y su orden concuerdan, juntamos las cuatro bases de datos.También quitamos la columna de CVEGEO, pues no aporta mucho para este proyecto.

localidades_ai <- rbind(loc_pun_edomex,loc_pun_edomex,loc_aman_cdmx,loc_aman_edomex)

localidades_ai <- localidades_ai[, -1]

tail(localidades_ai)
## # A tibble: 6 × 4
##   CVE_ENT CVE_MUN CVE_LOC NOMGEO                  
##   <chr>   <chr>   <chr>   <chr>                   
## 1 15      025     0020    Santa Catarina Ayotzingo
## 2 15      025     0080    Caserío de Cortés       
## 3 15      025     0107    Guadalupana [Granja]    
## 4 15      122     0006    El Triángulo            
## 5 15      025     0010    San Juan Tezompa        
## 6 15      025     0058    Rancho Nuevo San Miguel

Todo parece bien, aunque si inspeccionaamos la base nos daremos cuenta de que hay muchas observaciones que se repiten, entonces las quitamos. Lo cual, nos deja con 23 observaciones, o localidades dentro del AI.

localidades_ai <-unique(localidades_ai)

localidades_ai
## # A tibble: 23 × 4
##    CVE_ENT CVE_MUN CVE_LOC NOMGEO                 
##    <chr>   <chr>   <chr>   <chr>                  
##  1 15      025     0052    Rancho Nuevo           
##  2 15      025     0053    Rancho San Miguel      
##  3 15      025     0058    Rancho Nuevo San Miguel
##  4 15      025     0069    Rancho San Jorge       
##  5 15      025     0109    Santa Anita [Granja]   
##  6 15      025     0121    Barrio de Guadalupe    
##  7 15      025     0123    Camino al Monte        
##  8 15      122     0003    Comalchica             
##  9 15      122     0005    Santa Cruz             
## 10 15      122     0006    El Triángulo           
## # ℹ 13 more rows

Paso 3.3: Carga y limpieza de las bases de datos del SCITEL.

Ahora solo falta unir las bases del SCITEL donde tenemos la información sobre la población de todas las localidades de la CDMX y el Edo.Mex.

scitel_cdmx <- read_csv("C:/Users/javal/OneDrive/Desktop/Portafolio 9/01_Qgis_poblacion_AI/proyecto/bases_de_datos/ITER_09CSV20.csv")
## Rows: 666 Columns: 286
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (282): ENTIDAD, NOM_ENT, MUN, NOM_MUN, LOC, NOM_LOC, LONGITUD, LATITUD, ...
## dbl   (4): ALTITUD, POBTOT, VIVTOT, TVIVHAB
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(scitel_cdmx)
## # A tibble: 6 × 286
##   ENTIDAD NOM_ENT    MUN   NOM_MUN LOC   NOM_LOC LONGITUD LATITUD ALTITUD POBTOT
##   <chr>   <chr>      <chr> <chr>   <chr> <chr>   <chr>    <chr>     <dbl>  <dbl>
## 1 09      Ciudad de… 000   Total … 0000  Total …  <NA>     <NA>        NA 9.21e6
## 2 09      Ciudad de… 000   Total … 9998  Locali…  <NA>     <NA>        NA 3.2 e2
## 3 09      Ciudad de… 000   Total … 9999  Locali…  <NA>     <NA>        NA 3.64e2
## 4 09      Ciudad de… 002   Azcapo… 0000  Total …  <NA>     <NA>        NA 4.32e5
## 5 09      Ciudad de… 002   Azcapo… 0001  Azcapo… "99°11'… "19°29…    2244 4.32e5
## 6 09      Ciudad de… 003   Coyoac… 0000  Total …  <NA>     <NA>        NA 6.14e5
## # ℹ 276 more variables: POBFEM <chr>, POBMAS <chr>, P_0A2 <chr>, P_0A2_F <chr>,
## #   P_0A2_M <chr>, P_3YMAS <chr>, P_3YMAS_F <chr>, P_3YMAS_M <chr>,
## #   P_5YMAS <chr>, P_5YMAS_F <chr>, P_5YMAS_M <chr>, P_12YMAS <chr>,
## #   P_12YMAS_F <chr>, P_12YMAS_M <chr>, P_15YMAS <chr>, P_15YMAS_F <chr>,
## #   P_15YMAS_M <chr>, P_18YMAS <chr>, P_18YMAS_F <chr>, P_18YMAS_M <chr>,
## #   P_3A5 <chr>, P_3A5_F <chr>, P_3A5_M <chr>, P_6A11 <chr>, P_6A11_F <chr>,
## #   P_6A11_M <chr>, P_8A14 <chr>, P_8A14_F <chr>, P_8A14_M <chr>, …
scitel_edomex <- read_csv("C:/Users/javal/OneDrive/Desktop/Portafolio 9/01_Qgis_poblacion_AI/proyecto/bases_de_datos/ITER_15CSV20.csv")
## Rows: 5136 Columns: 286
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (282): NOM_ENT, MUN, NOM_MUN, LOC, NOM_LOC, LONGITUD, LATITUD, ALTITUD, ...
## dbl   (4): ENTIDAD, POBTOT, VIVTOT, TVIVHAB
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
tail(scitel_edomex)
## # A tibble: 6 × 286
##   ENTIDAD NOM_ENT MUN   NOM_MUN   LOC   NOM_LOC  LONGITUD LATITUD ALTITUD POBTOT
##     <dbl> <chr>   <chr> <chr>     <chr> <chr>    <chr>    <chr>   <chr>    <dbl>
## 1      15 México  125   Tonanitla 0003  Colonia… "99°03'… "19°40… 2247       306
## 2      15 México  125   Tonanitla 0004  Colonia… "99°03'… "19°41… 2237       520
## 3      15 México  125   Tonanitla 0005  Valle V… "99°02'… "19°41… 2239       299
## 4      15 México  125   Tonanitla 0006  San Bar… "99°03'… "19°39… 2254         9
## 5      15 México  125   Tonanitla 0007  Villas … "99°04'… "19°40… 2241      2601
## 6      15 México  125   Tonanitla 9998  Localid…  <NA>     <NA>   <NA>         9
## # ℹ 276 more variables: POBFEM <chr>, POBMAS <chr>, P_0A2 <chr>, P_0A2_F <chr>,
## #   P_0A2_M <chr>, P_3YMAS <chr>, P_3YMAS_F <chr>, P_3YMAS_M <chr>,
## #   P_5YMAS <chr>, P_5YMAS_F <chr>, P_5YMAS_M <chr>, P_12YMAS <chr>,
## #   P_12YMAS_F <chr>, P_12YMAS_M <chr>, P_15YMAS <chr>, P_15YMAS_F <chr>,
## #   P_15YMAS_M <chr>, P_18YMAS <chr>, P_18YMAS_F <chr>, P_18YMAS_M <chr>,
## #   P_3A5 <chr>, P_3A5_F <chr>, P_3A5_M <chr>, P_6A11 <chr>, P_6A11_F <chr>,
## #   P_6A11_M <chr>, P_8A14 <chr>, P_8A14_F <chr>, P_8A14_M <chr>, …

Vemos que son muchas observaciones, pero también muchas variables. Así que procedemos a limpiar la base para solo quedarnos con las variables que nos interesan, a saber las variales equivalentes a las que tenemos en la base unificada de las localidades de la AI + la variable donde viene la población.

En este punto, notamos que hay otras variables que podrían interesarnos, como el la población de mujeres o por disintos grupos de edad. Si nos interesa, podemos conservar dichas variables. Para fines de este proyecto sólo nos quedaremos con la variable de población total.

scitel_cdmx <- scitel_cdmx %>% 
  select(ENTIDAD, MUN, LOC, NOM_LOC, LOC, POBTOT)

scitel_edomex <- scitel_edomex %>% 
  select(ENTIDAD, MUN, LOC, NOM_LOC, LOC, POBTOT)

Ambas bases lucirían de las siguiente forma

head(scitel_cdmx)
## # A tibble: 6 × 5
##   ENTIDAD MUN   LOC   NOM_LOC                       POBTOT
##   <chr>   <chr> <chr> <chr>                          <dbl>
## 1 09      000   0000  Total de la Entidad          9209944
## 2 09      000   9998  Localidades de una vivienda      320
## 3 09      000   9999  Localidades de dos viviendas     364
## 4 09      002   0000  Total del Municipio           432205
## 5 09      002   0001  Azcapotzalco                  432205
## 6 09      003   0000  Total del Municipio           614447
tail(scitel_edomex)
## # A tibble: 6 × 5
##   ENTIDAD MUN   LOC   NOM_LOC                     POBTOT
##     <dbl> <chr> <chr> <chr>                        <dbl>
## 1      15 125   0003  Colonia PEMEX                  306
## 2      15 125   0004  Colonia las Chinampas          520
## 3      15 125   0005  Valle Verde                    299
## 4      15 125   0006  San Bartolo                      9
## 5      15 125   0007  Villas de Tonanitla           2601
## 6      15 125   9998  Localidades de una vivienda      9

Paso 3.4: Unificación de las bases del SCITEL.

Finalmente, unimos ambas bases de datos del SCTIEL, de manera similar a lo que hicimos con las bases de las localidades del AI.

localidades_scitel <- rbind(scitel_cdmx, scitel_edomex)

head (localidades_scitel)
## # A tibble: 6 × 5
##   ENTIDAD MUN   LOC   NOM_LOC                       POBTOT
##   <chr>   <chr> <chr> <chr>                          <dbl>
## 1 09      000   0000  Total de la Entidad          9209944
## 2 09      000   9998  Localidades de una vivienda      320
## 3 09      000   9999  Localidades de dos viviendas     364
## 4 09      002   0000  Total del Municipio           432205
## 5 09      002   0001  Azcapotzalco                  432205
## 6 09      003   0000  Total del Municipio           614447

Paso 4: Unimos ambas tablas.

Ahora solo queda unir la dos tablas resultantes para saber la población de las localidades del AI. Para ello, exiten varias opciones, como por ejemplo, buscar manualmente cada una de las localidades. O, podríamos utuluizar la función left_join(), pues nos permite unir dos bases de datos, a partir de una o vatias columnas en común, pero conservando todas las observaciones de una tabla y eliminando las observaciones que no tengn correspondencia de la segunda. En este caso, nos interesa conservar todos los valores de la base de localidades del AI, y eliminar todas las otras observaciones de la tabla unificada del SCITEL.

Para que el left_join() funcione, las dos bases que queremos unir, deben coincidir en las columnas que identifican a cada observación. Sin embargo, hay muchas observaciones que tienen un nombre igual, pero un municipio diferente, o casos similares. Por lo cual, la manera de identificar a cada observación única es tomando en cuenta todas las columnas de la base de localidades. Por eso conservamos esas columnas.

Paraa que nuestro left_join() funcione, los nombres de las variables de las bases a unir deben coincidir, asi que renombraremos las columnas de la base de localaidades AI (aunque bien puede ser las variables de la otra base)

localidades_ai <- localidades_ai %>% 
  rename(ENTIDAD = CVE_ENT, MUN = CVE_MUN, LOC =  CVE_LOC, NOM_LOC = NOMGEO)

head(localidades_ai)
## # A tibble: 6 × 4
##   ENTIDAD MUN   LOC   NOM_LOC                
##   <chr>   <chr> <chr> <chr>                  
## 1 15      025   0052  Rancho Nuevo           
## 2 15      025   0053  Rancho San Miguel      
## 3 15      025   0058  Rancho Nuevo San Miguel
## 4 15      025   0069  Rancho San Jorge       
## 5 15      025   0109  Santa Anita [Granja]   
## 6 15      025   0121  Barrio de Guadalupe

Una vez hecho esto hacemos una nueva base donde indique la población total de las localidades del AI. Como nos interesa quedarnos solo con las observaciones de esta base, la “ponemos a la izquerda”. Para que los resultaos sean más comprensibles ordenamos las observaciones de manera descendente en función de la población que tienen.

poblacion <- left_join(localidades_ai, localidades_scitel, by = c ("ENTIDAD", "MUN", "LOC", "NOM_LOC")) %>% 
  arrange(desc(POBTOT))

poblacion
## # A tibble: 23 × 5
##    ENTIDAD MUN   LOC   NOM_LOC                  POBTOT
##    <chr>   <chr> <chr> <chr>                     <dbl>
##  1 09      009   0011  San Antonio Tecómitl      27768
##  2 15      025   0019  San Pablo Atlazalpan      18751
##  3 09      011   0011  San Andrés Mixquic        13910
##  4 15      025   0010  San Juan Tezompa          13127
##  5 15      025   0020  Santa Catarina Ayotzingo  11126
##  6 15      025   0016  San Mateo Huitzilzingo     9554
##  7 09      011   0024  San Nicolás Tetelco        4919
##  8 15      025   0011  San Lorenzo Chimalpa       4684
##  9 09      009   0300  San Nicolás Tetelco        4078
## 10 09      011   0104  San Ignacio de Loyola       856
## # ℹ 13 more rows

Es importante mencionar que hay ocasiones en las que algunas localaidades no aparecen en la base de SCITEL. Esto se debe a que no tienen población registrada. En este paso, dichas localidades saldrán con un NA en la columna de población.

Y listo, tenemos nuestra tabla con las localidades del AI y su población. Ya solo falta presentar el resultado.

Paso 5: Visualizar el resultado.

Ahora por fin tenemos los insumos que queríamos, a saber, un mapa del Área de Influencia (AI) de nuestro proyecto y una base de datos que nos muestra el nombre y lo población de las localidades que se encuentran en la AI.

Sin embargo, a pesar de que ya tenemos los datos, quizá debemos integrarlos a un reporte con un formato bien definido. Si bien podemos pegar y copiar los datos al procesador de texto que estemos usndo para hacer el reporte, también tenemos la opción de generar una tabla desde R.

Para ello, primero elminaremos las observaciones de las localidades para las cuales no hay una población registrada. Si bien, no es nuestro caso, creo conveniente dejar registrado el código con el que podemos lograr esto.

localidades_con_pob <- na.omit(poblacion)
localidades_con_pob
## # A tibble: 23 × 5
##    ENTIDAD MUN   LOC   NOM_LOC                  POBTOT
##    <chr>   <chr> <chr> <chr>                     <dbl>
##  1 09      009   0011  San Antonio Tecómitl      27768
##  2 15      025   0019  San Pablo Atlazalpan      18751
##  3 09      011   0011  San Andrés Mixquic        13910
##  4 15      025   0010  San Juan Tezompa          13127
##  5 15      025   0020  Santa Catarina Ayotzingo  11126
##  6 15      025   0016  San Mateo Huitzilzingo     9554
##  7 09      011   0024  San Nicolás Tetelco        4919
##  8 15      025   0011  San Lorenzo Chimalpa       4684
##  9 09      009   0300  San Nicolás Tetelco        4078
## 10 09      011   0104  San Ignacio de Loyola       856
## # ℹ 13 more rows

Posteriormente, como queremos que nuestra tabla muestre la población total de la AI, apalicamos una suma, y agregamos dicha suma como una observación a la base que queremos hacer tabla, es decir a la base de las localidades con población registrada del AI.

poblacion_total <- sum(localidades_con_pob$POBTOT)

localidades_con_pob <- localidades_con_pob %>% 
  add_row(
    !!names(localidades_con_pob)[4] := "Total:",
    !!names (localidades_con_pob)[5] := poblacion_total
  )

tail(localidades_con_pob)
## # A tibble: 6 × 5
##   ENTIDAD MUN   LOC   NOM_LOC              POBTOT
##   <chr>   <chr> <chr> <chr>                 <dbl>
## 1 09      009   0303  Arboledas               183
## 2 15      025   0052  Rancho Nuevo            166
## 3 15      122   0003  Comalchica              119
## 4 15      025   0109  Santa Anita [Granja]     71
## 5 15      025   0069  Rancho San Jorge         41
## 6 <NA>    <NA>  <NA>  Total:               112378

Como en las primeras tres columnas salieron NA’s los sustituimos por espacios en blanco.

localidades_con_pob <- localidades_con_pob %>% 
  mutate_all(~ifelse(is.na(.), "", .))

tail(localidades_con_pob)
## # A tibble: 6 × 5
##   ENTIDAD MUN   LOC    NOM_LOC              POBTOT
##   <chr>   <chr> <chr>  <chr>                 <dbl>
## 1 "09"    "009" "0303" Arboledas               183
## 2 "15"    "025" "0052" Rancho Nuevo            166
## 3 "15"    "122" "0003" Comalchica              119
## 4 "15"    "025" "0109" Santa Anita [Granja]     71
## 5 "15"    "025" "0069" Rancho San Jorge         41
## 6 ""      ""    ""     Total:               112378

Finalmente hacemos nuestra bonita tabla. Hay muchas herramientas que nos permitirían hacer esto, pero en esta ocasión elegiré la libreria kableExtra

library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.2.3
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
tabla <- kable(localidades_con_pob, format = "html") %>% 
  kable_styling() %>% 
  row_spec(0, bold = T, background = "#daff33") %>% 
  row_spec(24, bold = T)

tabla
ENTIDAD MUN LOC NOM_LOC POBTOT
09 009 0011 San Antonio Tecómitl 27768
15 025 0019 San Pablo Atlazalpan 18751
09 011 0011 San Andrés Mixquic 13910
15 025 0010 San Juan Tezompa 13127
15 025 0020 Santa Catarina Ayotzingo 11126
15 025 0016 San Mateo Huitzilzingo 9554
09 011 0024 San Nicolás Tetelco 4919
15 025 0011 San Lorenzo Chimalpa 4684
09 009 0300 San Nicolás Tetelco 4078
09 011 0104 San Ignacio de Loyola 856
15 025 0080 Caserío de Cortés 556
15 025 0121 Barrio de Guadalupe 528
15 122 0005 Santa Cruz 419
15 025 0053 Rancho San Miguel 388
15 025 0123 Camino al Monte 353
15 122 0006 El Triángulo 278
15 025 0107 Guadalupana [Granja] 259
15 025 0058 Rancho Nuevo San Miguel 244
09 009 0303 Arboledas 183
15 025 0052 Rancho Nuevo 166
15 122 0003 Comalchica 119
15 025 0109 Santa Anita [Granja] 71
15 025 0069 Rancho San Jorge 41
Total: 112378

Y listo, ya tenemos una tabla que podemos utilizar en nuestro reporte. Por su puesto puedes modificar los colores de las columnas, modificar sus nombres, o el tipo de letra que se usa, agrerar más columnas, etc., lo que necesites. Pero eso ya es a tu criterio.

Conclusiones.

Hasta este punto hemos cumplido nuestro objetivo, tenemos un mapa que nos indica el Área de Influencia de nustro proyecto, asi como sus diferentes niveles, y tenemos una tabla que nos indica cuales localidades se encuentran en el AI, y su población correspondiente.

Por su puesto el usuario puede hacer las modificaciones correspondientes, como por ejemplo, modificar los encabezados de las columnas, o que en lugar del código dela entidad aprezca el nombre de la entidad o del municipio, o recuperar más datos de las tablas del SCITEL. Sin embargo, eso queda para ejercicio del lector.