Escuelas públicas de Montevideo

Análisis geográfico de datos

Ciencias de Datos II, agosto de 2023

Posgrado de Big Data e Inteligencia Territorial
Virginia Recagno

Introducción

El país de los viejos, le dicen algunos. Actualmente Uruguay está en período censal. Según el último realizado en 2011, casi 3,3 millones de personas poblaban el país y casi la mitad -1.320.000- residían en Montevideo. Se esperaba que para este censo el país superara los 3,5 millones de habitantes, sin embargo, el director del Instituto Nacional de Estadística, indicó que no se llegará a las proyecciones y aseguró que el país vive, desde 2020, el fenómeno llamado “transición demográfica”. En este sentido, dijo que “ya no vamos a discutir qué escuelas se deben abrir, sino cuáles cerrar”. En el último censo eran 83.000 los niñxs que asisitían a escuelas públicas; hoy son 77.000 y la cifra va en descenso

El objetivo de este trabajo es visualizar y analizar la distribución de escuelas públicas por Montevideo, en función de sus ocho municipios, para ver si existe alguna correlación entre la densidad de escuelas y la densidad de población en diferentes áreas. En particular, interesa tener en cuenta la cantidad de escuelas con equipos multidisciplinarios y analizar su distribución geográfica. Y por último se analizará la distancia al Planetario de la ciudad un punto de visita común para todxs los escolares del país.

Preparación de datos para el análisis

En primer lugar cargo las librerías que voy a utilizar: tidyverse, sf, ggmap, leaflet, tidygeocoder y osrm.

#install.packages("tidyverse")
library(tidyverse)
#install.packages("sf")
library(sf)
#install.packages("ggmap")
library(ggmap)
#install.packages("leaflet")
library(leaflet)
#install.packages("tidygeocoder")
library(tidygeocoder)
#install.packages("osrm")
library(osrm)

Análisis de datos tradicionales

Cargo también el dataset escuelas desde la página de Datos Abiertos del gobierno uruguayo. Se trata de un archivo CSV.

CEIP <- read.csv("data/CEIP.csv",
                 stringsAsFactors = TRUE, 
                 encoding = "UTF-8")

Con un summary hago un primer análisis a ver qué información contiene el dataset:

summary(CEIP)
##    Rule         Subsistema                 Nombre         NUmero      
##  Mode:logical   DGEIP:2267                    :1077   Min.   :  1.00  
##  NA's:2267                   JOSE PEDRO VARELA:  17   1st Qu.: 33.00  
##                              NO TIENE         :  17   Median : 71.00  
##                              AGUSTIN FERREIRO :  16   Mean   : 93.58  
##                              CLEMENTE ESTABLE :  16   3rd Qu.:117.00  
##                              DIONISIO DIAZ    :  15   Max.   :398.00  
##                              (Other)          :1109                   
##      Area               Tipo.de.educaciOn             Turno     
##  RURAL :1053   ESCUELA COMÚN     :1969    RURAL          :1041  
##  URBANA:1214   ESCUELA ESPECIAL  :  81    DOBLE TURNO    : 557  
##                JARDÍN DE INFANTES: 217    TIEMPO COMPLETO: 286  
##                                           VESPERTINO     : 125  
##                                           MATUTINO       : 107  
##                                           ESPECIAL       :  84  
##                                           (Other)        :  67  
##              DirecciOn    NUmero.de.puerta     TelEfono   
##                   : 202   S/N    :1546             : 489  
##  CMNO. VECINAL    :  22          :  14     22001169:   2  
##  18 DE JULIO      :  16   10     :   5     22152476:   2  
##  JOSE PEDRO VARELA:  14   120    :   4     22161681:   2  
##  19 DE ABRIL      :  10   772    :   4     22221079:   2  
##  LAVALLEJA        :   8   1194   :   3     22223427:   2  
##  (Other)          :1995   (Other): 691     (Other) :1768  
##                        Mail           Departamento 
##                          : 501   MONTEVIDEO : 342  
##  nestor1575@gmail.com    :   3   CANELONES  : 283  
##  elebast@hotmail.com     :   2   TACUAREMBÓ : 141  
##  lologramos22@hotmail.com:   2   COLONIA    : 133  
##  milton1063@hotmail.com  :   2   RIVERA     : 128  
##  patry2809@hotmail.com   :   2   CERRO LARGO: 116  
##  (Other)                 :1755   (Other)    :1124  
##                            Localidad               Paraje.o.barrio X.Comparte.
##  ZONA RURAL (Seleccionar Paraje):850   PAYSANDU            :  17   NO:1995    
##  MONTEVIDEO                     :342   LA PALOMA TOMKINSON :  14   SÍ: 272    
##  RIVERA                         : 43                       :  13              
##  PAYSANDU                       : 41   CASABO PAJAS BLANCAS:  13              
##  SALTO                          : 41   CERRO               :  13              
##  TACUAREMBO                     : 32   FLORIDA             :  13              
##  (Other)                        :918   (Other)             :2184              
##                CategorIa   Primer.nivel.de.educaciOn.que.ofrece
##  UNIDOCENTE         :734         :  81                         
##  CON MAESTRO A CARGO:310   1     : 131                         
##  COMÚN              :272   3 AÑOS:1021                         
##  DE TIEMPO COMPLETO :229   4 AÑOS:1004                         
##  APRENDER           :220   5 AÑOS:  30                         
##  JARDÍN COMÚN       :121                                       
##  (Other)            :381                                       
##  Ultimo.nivel.de.educaciOn.que.ofrece Tiene.comedor Tiene.copa.de.leche
##        :  81                            :   5         :   8            
##  1     :   3                          NO: 266       NO: 886            
##  2     :  12                          SÍ:1996       SÍ:1373            
##  3     :   1                                                           
##  4 AÑOS:   1                                                           
##  5 AÑOS: 200                                                           
##  6     :1969                                                           
##  Tiene.equipo.multidisciplinario Con.clases.especiales Horario       
##    :  27                         NO:1956               Mode:logical  
##  NO:2127                         SÍ: 311               NA's:2267     
##  SÍ: 113                                                             
##                                                                      
##                                                                      
##                                                                      
##                                                                      
##  Tiene.maestro.de.apoyo Tiene.maestro.de.apoyo.Ceibal Tiene.maestro.comunitario
##  Min.   :0.00000        Min.   : 0.0000                 :  20                  
##  1st Qu.:0.00000        1st Qu.: 0.0000               NO:1940                  
##  Median :0.00000        Median : 0.0000               SÍ: 307                  
##  Mean   :0.08866        Mean   : 0.2616                                        
##  3rd Qu.:0.00000        3rd Qu.: 0.0000                                        
##  Max.   :3.00000        Max.   :17.0000                                        
##                                                                                
##  Maestro.mAs.maestro Maestro.de.trayectorias.protegidas Profesores.especiales
##  Min.   :0.00000     Min.   :0.000000                   Min.   : 0.000       
##  1st Qu.:0.00000     1st Qu.:0.000000                   1st Qu.: 0.000       
##  Median :0.00000     Median :0.000000                   Median : 0.000       
##  Mean   :0.06087     Mean   :0.002647                   Mean   : 1.367       
##  3rd Qu.:0.00000     3rd Qu.:0.000000                   3rd Qu.: 2.000       
##  Max.   :3.00000     Max.   :1.000000                   Max.   :19.000       
##                                                                              
##  Bilingüe         MatrIcula Alumnos.por.docente    N..Aulas     
##  Mode:logical   Min.   :0   Min.   :0           Min.   : 0.000  
##  NA's:2267      1st Qu.:0   1st Qu.:0           1st Qu.: 1.000  
##                 Median :0   Median :0           Median : 4.000  
##                 Mean   :0   Mean   :0           Mean   : 5.654  
##                 3rd Qu.:0   3rd Qu.:0           3rd Qu.: 8.000  
##                 Max.   :0   Max.   :0           Max.   :25.000  
##                                                                 
##  Grupos.por.nivel Cantidad.de.docentes.total   Foto         Novedades     
##  Mode:logical     Mode:logical               Mode:logical   Mode:logical  
##  NA's:2267        NA's:2267                  NA's:2267      NA's:2267     
##                                                                           
##                                                                           
##                                                                           
##                                                                           
##                                                                           
##  Tamaño.medio.de.grupo.de.educaciOn.Inicial N..de.Aulas     Foto.1       
##  Mode:logical                               Mode:logical   Mode:logical  
##  NA's:2267                                  NA's:2267      NA's:2267     
##                                                                          
##                                                                          
##                                                                          
##                                                                          
##                                                                          
##  Novedades.1         RUEE        
##  Mode:logical   Min.   :1101002  
##  NA's:2267      1st Qu.:1103161  
##                 Median :1108070  
##                 Mean   :1108712  
##                 3rd Qu.:1114062  
##                 Max.   :1119091  
## 

En la columna Tipo.de.educaciOn se presentan, además de escuelas “comunes”, escuelas “especiales” y jardines de infantes, por tanto me voy a quedar solo con las escuelas “comunes”, y de Montevideo.

escuelas <- CEIP %>% 
  filter(Tipo.de.educaciOn == "ESCUELA COMÚN" & Departamento == "MONTEVIDEO") 
dim(escuelas)
## [1] 242  42

Hay un total de 242 escuelas públicas en Montevideo.

colnames(escuelas) <- toupper(colnames(escuelas))

Ahora voy a ver qué columnas tiene este dataset.

colnames(escuelas)
##  [1] "RULE"                                      
##  [2] "SUBSISTEMA"                                
##  [3] "NOMBRE"                                    
##  [4] "NUMERO"                                    
##  [5] "AREA"                                      
##  [6] "TIPO.DE.EDUCACION"                         
##  [7] "TURNO"                                     
##  [8] "DIRECCION"                                 
##  [9] "NUMERO.DE.PUERTA"                          
## [10] "TELEFONO"                                  
## [11] "MAIL"                                      
## [12] "DEPARTAMENTO"                              
## [13] "LOCALIDAD"                                 
## [14] "PARAJE.O.BARRIO"                           
## [15] "X.COMPARTE."                               
## [16] "CATEGORIA"                                 
## [17] "PRIMER.NIVEL.DE.EDUCACION.QUE.OFRECE"      
## [18] "ULTIMO.NIVEL.DE.EDUCACION.QUE.OFRECE"      
## [19] "TIENE.COMEDOR"                             
## [20] "TIENE.COPA.DE.LECHE"                       
## [21] "TIENE.EQUIPO.MULTIDISCIPLINARIO"           
## [22] "CON.CLASES.ESPECIALES"                     
## [23] "HORARIO"                                   
## [24] "TIENE.MAESTRO.DE.APOYO"                    
## [25] "TIENE.MAESTRO.DE.APOYO.CEIBAL"             
## [26] "TIENE.MAESTRO.COMUNITARIO"                 
## [27] "MAESTRO.MAS.MAESTRO"                       
## [28] "MAESTRO.DE.TRAYECTORIAS.PROTEGIDAS"        
## [29] "PROFESORES.ESPECIALES"                     
## [30] "BILINGÜE"                                  
## [31] "MATRICULA"                                 
## [32] "ALUMNOS.POR.DOCENTE"                       
## [33] "N..AULAS"                                  
## [34] "GRUPOS.POR.NIVEL"                          
## [35] "CANTIDAD.DE.DOCENTES.TOTAL"                
## [36] "FOTO"                                      
## [37] "NOVEDADES"                                 
## [38] "TAMAÑO.MEDIO.DE.GRUPO.DE.EDUCACION.INICIAL"
## [39] "N..DE.AULAS"                               
## [40] "FOTO.1"                                    
## [41] "NOVEDADES.1"                               
## [42] "RUEE"

Las columnas NOMBRE y NUMERO hacen referencia a su denominación, AREA determina si es urbana o rural. DIRECCION, NUMERO.DE.PUERTA, DEPARTAMENTO y LOCALIDAD indican su dirección, departamento y localidad que usaremos para mapearlas. Hay dos columnas (TELEFONO y MAIL) que hacen referencia a su contacto y luego hay una serie de variables sobre su caracterización como cantidad de aulas, si incluye almuerzo y/o merienda y si cuenta con equipo multidisciplinario entre otros.

summary(escuelas)
##    RULE         SUBSISTEMA                           NOMBRE        NUMERO     
##  Mode:logical   DGEIP:242                               : 57   Min.   :  2.0  
##  NA's:242                   GRUPO ESCOLAR F. SANGUINETTI:  2   1st Qu.: 70.5  
##                             GRUPO ESCOLAR MARIA NOYA    :  2   Median :152.5  
##                             JOSE ROGER BALET            :  2   Mean   :171.7  
##                             ABRAHAM LINCOLN             :  1   3rd Qu.:270.8  
##                             ALBERT EINSTEIN             :  1   Max.   :385.0  
##                             (Other)                     :177                  
##      AREA              TIPO.DE.EDUCACION             TURNO   
##  RURAL :  0   ESCUELA COMÚN     :242     DOBLE TURNO    :69  
##  URBANA:242   ESCUELA ESPECIAL  :  0     TIEMPO COMPLETO:56  
##               JARDÍN DE INFANTES:  0     MATUTINO       :53  
##                                          VESPERTINO     :52  
##                                          EXTENDIDO      :12  
##                                          ESPECIAL       : 0  
##                                          (Other)        : 0  
##                 DIRECCION   NUMERO.DE.PUERTA     TELEFONO  
##  CMNO. MALDONADO     :  5   S/N    : 25              : 23  
##  LUIS BATLLE BERRES  :  5   1109   :  2      22001169:  2  
##  AV. MILLAN          :  4   1194   :  2      22152476:  2  
##  8 DE OCTUBRE        :  3   1296   :  2      22161681:  2  
##  CARLOS MARIA RAMIREZ:  3   1361   :  2      22221079:  2  
##  CMNO. CIBILS        :  3   1424   :  2      22223427:  2  
##  (Other)             :219   (Other):207      (Other) :209  
##                                                   MAIL          DEPARTAMENTO
##                                                     : 14   MONTEVIDEO :242  
##  131republicadechile@gmail.com                      :  1   ARTIGAS    :  0  
##  155melillayfauquet@gmail.com letiisi1974gmail.com  :  1   CANELONES  :  0  
##  163escuelagalicia@gmail.com frugoneblanca@gmail.com:  1   CERRO LARGO:  0  
##  169escuela@gmail.com                               :  1   COLONIA    :  0  
##  185escuela@gmail.com                               :  1   DURAZNO    :  0  
##  (Other)                                            :223   (Other)    :  0  
##                       LOCALIDAD                 PARAJE.O.BARRIO X.COMPARTE.
##  MONTEVIDEO                :242   LA PALOMA TOMKINSON   : 11    NO:131     
##                            :  0   CASABO PAJAS BLANCAS  :  9    SÍ:111     
##  18 DE JULIO               :  0   CERRO                 :  9               
##  18 DE JULIO (PUEBLO NUEVO):  0   MANGA                 :  9               
##  19 DE ABRIL               :  0   CASAVALLE             :  8               
##  19 DE JUNIO               :  0   MAROÑAS PARQUE GUARANI:  7               
##  (Other)                   :  0   (Other)               :189               
##                   CATEGORIA  PRIMER.NIVEL.DE.EDUCACION.QUE.OFRECE
##  APRENDER              :85         :  0                          
##  COMÚN                 :67   1     : 59                          
##  DE TIEMPO COMPLETO    :55   3 AÑOS: 29                          
##  DE PRÁCTICA           :18   4 AÑOS:146                          
##  TIEMPO EXTENDIDO      : 8   5 AÑOS:  8                          
##  HABILITADA DE PRÁCTICA: 4                                       
##  (Other)               : 5                                       
##  ULTIMO.NIVEL.DE.EDUCACION.QUE.OFRECE TIENE.COMEDOR TIENE.COPA.DE.LECHE
##        :  0                             :  0          :  0             
##  1     :  0                           NO: 75        NO: 95             
##  2     :  0                           SÍ:167        SÍ:147             
##  3     :  0                                                            
##  4 AÑOS:  0                                                            
##  5 AÑOS:  0                                                            
##  6     :242                                                            
##  TIENE.EQUIPO.MULTIDISCIPLINARIO CON.CLASES.ESPECIALES HORARIO       
##    :  0                          NO:169                Mode:logical  
##  NO:231                          SÍ: 73                NA's:242      
##  SÍ: 11                                                              
##                                                                      
##                                                                      
##                                                                      
##                                                                      
##  TIENE.MAESTRO.DE.APOYO TIENE.MAESTRO.DE.APOYO.CEIBAL TIENE.MAESTRO.COMUNITARIO
##  Min.   :0.0000         Min.   :0.0000                  :  0                   
##  1st Qu.:0.0000         1st Qu.:0.0000                NO:148                   
##  Median :0.0000         Median :0.0000                SÍ: 94                   
##  Mean   :0.3058         Mean   :0.2934                                         
##  3rd Qu.:1.0000         3rd Qu.:0.0000                                         
##  Max.   :2.0000         Max.   :4.0000                                         
##                                                                                
##  MAESTRO.MAS.MAESTRO MAESTRO.DE.TRAYECTORIAS.PROTEGIDAS PROFESORES.ESPECIALES
##  Min.   :0.00000     Min.   :0.000000                   Min.   : 1.000       
##  1st Qu.:0.00000     1st Qu.:0.000000                   1st Qu.: 1.000       
##  Median :0.00000     Median :0.000000                   Median : 2.000       
##  Mean   :0.07851     Mean   :0.004132                   Mean   : 2.876       
##  3rd Qu.:0.00000     3rd Qu.:0.000000                   3rd Qu.: 3.000       
##  Max.   :3.00000     Max.   :1.000000                   Max.   :13.000       
##                                                                              
##  BILINGÜE         MATRICULA ALUMNOS.POR.DOCENTE    N..AULAS    GRUPOS.POR.NIVEL
##  Mode:logical   Min.   :0   Min.   :0           Min.   : 0.0   Mode:logical    
##  NA's:242       1st Qu.:0   1st Qu.:0           1st Qu.: 9.0   NA's:242        
##                 Median :0   Median :0           Median :13.0                   
##                 Mean   :0   Mean   :0           Mean   :13.1                   
##                 3rd Qu.:0   3rd Qu.:0           3rd Qu.:16.0                   
##                 Max.   :0   Max.   :0           Max.   :25.0                   
##                                                                                
##  CANTIDAD.DE.DOCENTES.TOTAL   FOTO         NOVEDADES     
##  Mode:logical               Mode:logical   Mode:logical  
##  NA's:242                   NA's:242       NA's:242      
##                                                          
##                                                          
##                                                          
##                                                          
##                                                          
##  TAMAÑO.MEDIO.DE.GRUPO.DE.EDUCACION.INICIAL N..DE.AULAS     FOTO.1       
##  Mode:logical                               Mode:logical   Mode:logical  
##  NA's:242                                   NA's:242       NA's:242      
##                                                                          
##                                                                          
##                                                                          
##                                                                          
##                                                                          
##  NOVEDADES.1         RUEE        
##  Mode:logical   Min.   :1101002  
##  NA's:242       1st Qu.:1101070  
##                 Median :1101152  
##                 Mean   :1101172  
##                 3rd Qu.:1101271  
##                 Max.   :1101385  
## 

Algunos insights:

  • Todos las escuelas son urbanas.

  • El barrio con más escuelas es La Paloma seguido por Casabó-Pajas Blancas, Cerro y Manga.

  • La mayoría son escuelas “Aprender” seguidas por las “comunes”.

Hay variables que dejaron de ser relevantes por su cantidad de NA o porque al elegir el deparamento, entonces las voy a eliminar.

escuelas <- escuelas %>% 
  select(-c(RULE, SUBSISTEMA, AREA, TIPO.DE.EDUCACION, DEPARTAMENTO, LOCALIDAD, HORARIO, BILINGÜE, MATRICULA, ALUMNOS.POR.DOCENTE, GRUPOS.POR.NIVEL, CANTIDAD.DE.DOCENTES.TOTAL, FOTO, NOVEDADES, TAMAÑO.MEDIO.DE.GRUPO.DE.EDUCACION.INICIAL, N..AULAS, FOTO.1))

Visualización de algunos datos:

ggplot(escuelas)+
  geom_bar(aes(x=(TIENE.COMEDOR), fill=TIENE.COPA.DE.LECHE)) +
  labs(title = "Cantidad de escuelas públicas con servicio de alimentación",
       subtitle = "Montevideo, Uruguay",
       caption= "Fuente: CEIP",
       fill= "Con merienda",
       x="Con almuerzo",
       y="") +
  scale_fill_viridis_d() + 
  guides(fill=guide_legend(title.position = "top", nrow=1)) +
  ylim(c(0, 200)) +
  theme(plot.margin = margin(0.25, 0.5, 0.25, 0.5, "cm"),
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.25, linetype = 'solid', colour = "gray80"),
        panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), 
        axis.title = element_text(colour = "gray35",size = 8), 
        axis.text.x = element_text(colour = "gray25",size = 6, angle = 90), 
        axis.text.y = element_text(colour = "gray25",size = 6))
## Warning: The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

La mayoría de las escuelas cuentan con almuerzo, y de las que no lo hacen, son menos de la mitad las que ofrecen merienda.

Análisis de datos espaciales

Voy a cargar el dataset de municipios de Montevideo y explorar el contenido.

municipios <- st_read("data/montevideo_municipios.geojson", 
                      stringsAsFactors=TRUE)
## Reading layer `montevideo_municipios' from data source 
##   `/Volumes/USB/TrabajoFinal_CDDG_Virginia_Recagno/data/montevideo_municipios.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 8 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -56.4314 ymin: -34.93815 xmax: -56.02395 ymax: -34.70192
## Geodetic CRS:  WGS 84
summary(municipios)
##       GID          MUNICIPIO    AREA_HA               geometry
##  Min.   :33.00   A      :1   Min.   : 1148   MULTIPOLYGON :8  
##  1st Qu.:34.75   B      :1   1st Qu.: 1605   epsg:4326    :0  
##  Median :36.50   C      :1   Median : 5599   +proj=long...:0  
##  Mean   :36.50   CH     :1   Mean   : 6563                    
##  3rd Qu.:38.25   D      :1   3rd Qu.:10012                    
##  Max.   :40.00   E      :1   Max.   :14380                    
##                  (Other):2

Ahora, una primera visualización del dataset espacial.

ggplot(municipios) +
  geom_sf()

Agrego los datos poblacionales por municipio y con este dato realizo dos mapas coropléticos: uno con la población por municipio, y otro con la densidad poblacional por municipio.

municipios$MUNICIPIO 
## [1] G  D  F  E  CH B  C  A 
## Levels: A B C CH D E F G
municipios <- municipios %>% 
  mutate(POBLACION = c(151302, 168937, 153395, 181153, 159528, 148952, 147577, 207911))
ggplot()+
  geom_sf(data = municipios, aes(fill = POBLACION), color = NA) +
  geom_sf_text(data=municipios, aes(label = MUNICIPIO), size=2, color = "white") +
  labs(title="Población por municipio",
       subtitle = "Montevideo, Uruguay",
       fill="Cantidad de residentes", 
       caption= "Fuente: Censo 2011",
       x="",
       y="") +
  scale_fill_viridis_c(alpha = 0.9) +
  guides(fill=guide_legend(title.position = "top")) +
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", linewidth = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        legend.position="right", 
        legend.title=element_text(size=10, face = "bold"), 
        legend.text=element_text(size=7), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=7), 
        axis.text = element_blank(), 
        axis.ticks = element_blank()) 
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

Los municipios con mayor cantidad de residentes son el “B” y el “C” y el de menor, el “A”.

ggplot()+
  geom_sf(data = municipios, aes(fill = POBLACION/AREA_HA), color = NA) +
  geom_sf_text(data=municipios, aes(label = MUNICIPIO), size=2, color = "white") +
  labs(title="Población por hectárea, por municipio",
       subtitle = "Montevideo, Uruguay",
       fill="Densidad poblacional", 
       caption= "Fuente: Censo 2011",
       x="",
       y="") +
  scale_fill_viridis_c(alpha = 0.9) +
  guides(fill=guide_legend(title.position = "top")) +
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        legend.position="right", 
        legend.title=element_text(size=10, face = "bold"), 
        legend.text=element_text(size=7), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=7), 
        axis.text = element_blank(), 
        axis.ticks = element_blank()) 
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

Sin embargo, los de mayor densidad poblacional son el “CH” y el “B”, mientras que el de menor es el “G”, seguido muy de cerca por el “A”.

Geolocalización múltiple

En los datos están la calle (DIRECCION) y altura (NUMERO.DE.PUERTA), entonces voy a utilizar paste() para sumarle estas columnas y hacer la información lo más precisa posible para georeferenciarla.

escuelas <- escuelas %>% 
  mutate(DIRECCION = paste(DIRECCION, NUMERO.DE.PUERTA, ", Montevideo, Uruguay")) %>% 
  select(-NUMERO.DE.PUERTA)

El resultado:

head(escuelas$DIRECCION)
## [1] "COLONIA 1194 , Montevideo, Uruguay"     
## [2] "ECHEVERRIA 588 , Montevideo, Uruguay"   
## [3] "CANELONES 2095 , Montevideo, Uruguay"   
## [4] "GUAYABOS 1741 , Montevideo, Uruguay"    
## [5] "URUGUAY 1467 , Montevideo, Uruguay"     
## [6] "JUAN ARTEAGA 4066 , Montevideo, Uruguay"

Voy a chequear algunas direcciones que no se pueden geolocalizar, y en dicho caso, voy a buscarlas en OpenStreetMap y SIGANEP para corregirlas y volver a correr la geolocalización.

escuelas <- escuelas %>% 
  mutate(DIRECCION = ifelse(DIRECCION == "GUAYABOS 1741 , Montevideo, Uruguay", "GUAYABO 1741 , Montevideo, Uruguay", DIRECCION)) %>%  
  mutate(DIRECCION = ifelse(DIRECCION == "VICENTE BASAGOITI 3921 , Montevideo, Uruguay", "VICENTE BASAGOITY 3919 , Montevideo, Uruguay", DIRECCION)) %>% 
  mutate(DIRECCION = ifelse(DIRECCION == "JUAN M. GUTIERREZ 3475 , Montevideo, Uruguay", "JUAN MARIA GUTIERREZ 3475 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "AV. GRAL. FLORES 3013 , Montevideo, Uruguay", " 
AVENIDA GENERAL FLORES 3013 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "JUAN MARÌA ABRIOT 4119 , Montevideo, Uruguay", "Cayetano Moretti 4120, Montevideo, uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "ING. JOSE SERRATO 3609 , Montevideo, Uruguay", "INGENIERO JOSE SERRATO 3609 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "CHAYOS ESQ. PIRINEOS 4846 , Montevideo, Uruguay", "CHAYOS 4846 , Montevideo, Uruguay", DIRECCION)) %>%   
  mutate(DIRECCION = ifelse(DIRECCION == "AV. LUIS A. DE HERRERA 3406 , Montevideo, Uruguay", "AV. LUIS ALBERTO DE HERRERA 3406 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "JOSE MARIA SILVA 4340 , Montevideo, Uruguay", "DOCTOR JOSÉ MARÍA SILVA 4340 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "CARLOS LINNEO ESQ. J. BELLONI S/N , Montevideo, Uruguay", "CARLOS LINNEO 4114 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "LEANDRO GOMEZ CONT. RUTA 8 S/N , Montevideo, Uruguay", "LEANDRO GOMEZ 3635, Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "ETIOPIA ESQ. SENEGAL S/N , Montevideo, Uruguay", "ETIOPIA 2651, Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "CMNO. LAS TROPAS S/N , Montevideo, Uruguay", "CAMINO DE LAS TROPAS 2750 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "CMNO. MALDONADO - RUTA 8 KM 21 S/N , Montevideo, Uruguay", "RUTA 8 BRIGADIER GENERAL JUAN ANTONIO LAVALLEJA 11421 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "PEDRO C. BAUZA 4178 , Montevideo, Uruguay", "PEDRO CELESTINO BAUZÁ 4178 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "SAN NICOLAS ESQ. SIRIA 1296 , Montevideo, Uruguay", "SAN NICOLAS 1284 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "ALDAMA ESQ. ORTEGA 5555 , Montevideo, Uruguay", "JOSÉ ALDAMA Y ORTEGA 5555 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "DR. OVIDIO DECROLY 5071 , Montevideo, Uruguay", "DOCTOR DECROLY 5071 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "CMNO. CANOPE 3951 , Montevideo, Uruguay", "CANOPE 4010, Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "GALERIA COMERCIAL 6051 , Montevideo, Uruguay", "Complejo Habitacional Millan y Lecocq, Montevideo", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "BVAR. APARICIO SARAVIA 3300 , Montevideo, Uruguay", "BULEVAR APARICIO SARAVIA 3300 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "IGUA ESQ. HIPOLITO IRIGOYEN S/N , Montevideo, Uruguay", "IGUA 4488 , Montevideo, Uruguay", DIRECCION)) %>% 
    mutate(DIRECCION = ifelse(DIRECCION == "STA. CRUZ DE LA SIERRA ESQ. VIZCAYA S/N , Montevid", "VIZCAYA 4521, Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "CARLOS A. LOPEZ 8370 , Montevideo, Uruguay", "CAMINO CARLOS A. LÓPEZ 8370 , Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "CMNO. CIBLIS 4420 , Montevideo, Uruguay", "AVENIDA CIBILS 4420 , Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "CONTINUACION DR. MARTIRENE 4970 , Montevideo, Uruguay", "DOCTOR JOSÉ MARTIRENÉ 4970 , Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "AV. DA COSTA S/N , Montevideo, Uruguay", "VEHICULAR/PEATONAL, Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "CONT. JOSE MARIA GUERRA S/N , Montevideo, Uruguay", "JOSÉ MARÍA GUERRA 3325 , Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "CMNO. MALDONADO ESQ. MILAN 5912 , Montevideo, Uruguay", "CAMINO MALDONADO 5912 , Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "GRAL. FLORES 4848 , Montevideo, Uruguay", "GENERAL FLORES 4844 , Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "PADRE PEDRO KRAEMER 6100 , Montevideo, Uruguay", "CAMINO PEDRO S. KRAEMER 6100 , Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "SANTIN C. ROSSI 4750 , Montevideo, Uruguay", "SANTIN CARLOS ROSSI 4750 , Montevideo, Uruguay", DIRECCION)) %>%  
    mutate(DIRECCION = ifelse(DIRECCION == "CMNO. BUFFFA 2563 , Montevideo, Uruguay", "CMNO. BUFFA 2563 , Montevideo, Uruguay", DIRECCION))

Con Sys.sleep() se suspende la ejecución de funciones durante un intervalo de tiempo específico, para este caso, un segundo.

Sys.sleep(1)

Y ahora, mediante geocode() voy a georeferenciarlas.

escuelas <- escuelas %>%
  geocode(address = DIRECCION, 
          method = "osm")
## Passing 190 addresses to the Nominatim single address geocoder
## Query completed in: 191.5 seconds

El resultado:

head(escuelas)
## # A tibble: 6 × 26
##   NOMBRE       NUMERO TURNO DIRECCION TELEFONO MAIL  PARAJE.O.BARRIO X.COMPARTE.
##   <fct>         <int> <fct> <chr>     <fct>    <fct> <fct>           <fct>      
## 1 REPUBLICA A…      2 VESP… COLONIA … "290070… "esc… CENTRO          SÍ         
## 2 FRANCIA           3 VESP… ECHEVERR… ""       ""    PUNTA CARRETAS  SÍ         
## 3 ARTIGAS           4 TIEM… CANELONE… "240249… "esc… CORDON          NO         
## 4 JOSE PEDRO …      5 DOBL… GUAYABO … "240862… "esc… CORDON          NO         
## 5 ESTADOS UNI…      6 DOBL… URUGUAY … "240825… "esc… CORDON          NO         
## 6 ROSA MARINO       7 MATU… JUAN ART… "22 15 … "esc… CERRITO         SÍ         
## # ℹ 18 more variables: CATEGORIA <fct>,
## #   PRIMER.NIVEL.DE.EDUCACION.QUE.OFRECE <fct>,
## #   ULTIMO.NIVEL.DE.EDUCACION.QUE.OFRECE <fct>, TIENE.COMEDOR <fct>,
## #   TIENE.COPA.DE.LECHE <fct>, TIENE.EQUIPO.MULTIDISCIPLINARIO <fct>,
## #   CON.CLASES.ESPECIALES <fct>, TIENE.MAESTRO.DE.APOYO <int>,
## #   TIENE.MAESTRO.DE.APOYO.CEIBAL <int>, TIENE.MAESTRO.COMUNITARIO <fct>,
## #   MAESTRO.MAS.MAESTRO <int>, MAESTRO.DE.TRAYECTORIAS.PROTEGIDAS <int>, …
filas_con_NA <- escuelas %>%
  filter(is.na(long) | is.na(lat))
escuelas <- escuelas %>%
  filter(!is.na(long))

Mapa interactivo

Con leaflet() georeferencio las escuelas públicas de Montevideo en un mapa:

leaflet(escuelas) %>%
  addProviderTiles(providers$CartoDB.Positron) %>% 
  addMarkers(lng = ~long, lat = ~lat,
             popup = ~paste("Escuela No. ", NUMERO, " - ", NOMBRE))

Unir datos por sus ubicaciones espaciales

Para ver la cantidad de escuelas públicas por municipio voy a tener que cruzar el dataset escuelas con el dataset municipios, para esto voy a usar la función st_join(), pero antes convertir escuelas a un dataset geográfico.

escuelas_geo <- escuelas %>% 
    st_as_sf(coords = c("long", "lat"), crs = 4326)
class(escuelas_geo)
## [1] "sf"         "tbl_df"     "tbl"        "data.frame"

Veamos si se agregó el campo “geometry”:

head(escuelas_geo)
## Simple feature collection with 6 features and 24 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -56.1907 ymin: -34.91623 xmax: -56.16097 ymax: -34.85338
## Geodetic CRS:  WGS 84
## # A tibble: 6 × 25
##   NOMBRE       NUMERO TURNO DIRECCION TELEFONO MAIL  PARAJE.O.BARRIO X.COMPARTE.
##   <fct>         <int> <fct> <chr>     <fct>    <fct> <fct>           <fct>      
## 1 REPUBLICA A…      2 VESP… COLONIA … "290070… "esc… CENTRO          SÍ         
## 2 FRANCIA           3 VESP… ECHEVERR… ""       ""    PUNTA CARRETAS  SÍ         
## 3 ARTIGAS           4 TIEM… CANELONE… "240249… "esc… CORDON          NO         
## 4 JOSE PEDRO …      5 DOBL… GUAYABO … "240862… "esc… CORDON          NO         
## 5 ESTADOS UNI…      6 DOBL… URUGUAY … "240825… "esc… CORDON          NO         
## 6 ROSA MARINO       7 MATU… JUAN ART… "22 15 … "esc… CERRITO         SÍ         
## # ℹ 17 more variables: CATEGORIA <fct>,
## #   PRIMER.NIVEL.DE.EDUCACION.QUE.OFRECE <fct>,
## #   ULTIMO.NIVEL.DE.EDUCACION.QUE.OFRECE <fct>, TIENE.COMEDOR <fct>,
## #   TIENE.COPA.DE.LECHE <fct>, TIENE.EQUIPO.MULTIDISCIPLINARIO <fct>,
## #   CON.CLASES.ESPECIALES <fct>, TIENE.MAESTRO.DE.APOYO <int>,
## #   TIENE.MAESTRO.DE.APOYO.CEIBAL <int>, TIENE.MAESTRO.COMUNITARIO <fct>,
## #   MAESTRO.MAS.MAESTRO <int>, MAESTRO.DE.TRAYECTORIAS.PROTEGIDAS <int>, …

Efectivamente, se trata de un dataset espacial:

ggplot()+
  geom_sf(data=escuelas_geo) +
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90")) 

Ahora voy a cruzarlos. Entonces, voy a utilizar st_filter() para filtrar espacialmente y chequear que solo queden las escuelas de Montevideo.

escuelas_geo <- st_filter(escuelas_geo, municipios)
dim(escuelas_geo)
## [1] 236  25

Efetivamente, todas pertenecían a Montevideo.

ggplot()+
  geom_sf(data=municipios)+
  geom_sf(data=escuelas_geo, alpha=0.75, show.legend = FALSE) +
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90")) 

Ahora entonces, hacer la unión espacial con st_join().

escuelas_geo <- st_join(escuelas_geo, municipios)
summary(escuelas_geo)
##                           NOMBRE        NUMERO                  TURNO   
##                              : 54   Min.   :  2.0   DOBLE TURNO    :67  
##  GRUPO ESCOLAR F. SANGUINETTI:  2   1st Qu.: 67.5   MATUTINO       :53  
##  GRUPO ESCOLAR MARIA NOYA    :  2   Median :149.5   TIEMPO COMPLETO:52  
##  JOSE ROGER BALET            :  2   Mean   :168.4   VESPERTINO     :52  
##  ABRAHAM LINCOLN             :  1   3rd Qu.:267.2   EXTENDIDO      :12  
##  ALBERT EINSTEIN             :  1   Max.   :385.0   ESPECIAL       : 0  
##  (Other)                     :174                   (Other)        : 0  
##   DIRECCION             TELEFONO  
##  Length:236                 : 22  
##  Class :character   22001169:  2  
##  Mode  :character   22152476:  2  
##                     22161681:  2  
##                     22221079:  2  
##                     22223427:  2  
##                     (Other) :204  
##                                                   MAIL    
##                                                     : 13  
##  131republicadechile@gmail.com                      :  1  
##  155melillayfauquet@gmail.com letiisi1974gmail.com  :  1  
##  163escuelagalicia@gmail.com frugoneblanca@gmail.com:  1  
##  169escuela@gmail.com                               :  1  
##  185escuela@gmail.com                               :  1  
##  (Other)                                            :218  
##                PARAJE.O.BARRIO X.COMPARTE.                  CATEGORIA 
##  LA PALOMA TOMKINSON   : 10    NO:126      APRENDER              :83  
##  CASABO PAJAS BLANCAS  :  9    SÍ:110      COMÚN                 :67  
##  CERRO                 :  9                DE TIEMPO COMPLETO    :51  
##  MANGA                 :  9                DE PRÁCTICA           :18  
##  MAROÑAS PARQUE GUARANI:  7                TIEMPO EXTENDIDO      : 8  
##  NUEVO PARIS           :  7                HABILITADA DE PRÁCTICA: 4  
##  (Other)               :185                (Other)               : 5  
##  PRIMER.NIVEL.DE.EDUCACION.QUE.OFRECE ULTIMO.NIVEL.DE.EDUCACION.QUE.OFRECE
##        :  0                                 :  0                          
##  1     : 57                           1     :  0                          
##  3 AÑOS: 29                           2     :  0                          
##  4 AÑOS:142                           3     :  0                          
##  5 AÑOS:  8                           4 AÑOS:  0                          
##                                       5 AÑOS:  0                          
##                                       6     :236                          
##  TIENE.COMEDOR TIENE.COPA.DE.LECHE TIENE.EQUIPO.MULTIDISCIPLINARIO
##    :  0          :  0                :  0                         
##  NO: 75        NO: 94              NO:225                         
##  SÍ:161        SÍ:142              SÍ: 11                         
##                                                                   
##                                                                   
##                                                                   
##                                                                   
##  CON.CLASES.ESPECIALES TIENE.MAESTRO.DE.APOYO TIENE.MAESTRO.DE.APOYO.CEIBAL
##  NO:166                Min.   :0.0000         Min.   :0.0000               
##  SÍ: 70                1st Qu.:0.0000         1st Qu.:0.0000               
##                        Median :0.0000         Median :0.0000               
##                        Mean   :0.3008         Mean   :0.2966               
##                        3rd Qu.:1.0000         3rd Qu.:0.0000               
##                        Max.   :2.0000         Max.   :4.0000               
##                                                                            
##  TIENE.MAESTRO.COMUNITARIO MAESTRO.MAS.MAESTRO
##    :  0                    Min.   :0.00000    
##  NO:145                    1st Qu.:0.00000    
##  SÍ: 91                    Median :0.00000    
##                            Mean   :0.08051    
##                            3rd Qu.:0.00000    
##                            Max.   :3.00000    
##                                               
##  MAESTRO.DE.TRAYECTORIAS.PROTEGIDAS PROFESORES.ESPECIALES N..DE.AULAS   
##  Min.   :0.000000                   Min.   : 1.000        Mode:logical  
##  1st Qu.:0.000000                   1st Qu.: 1.000        NA's:236      
##  Median :0.000000                   Median : 2.000                      
##  Mean   :0.004237                   Mean   : 2.856                      
##  3rd Qu.:0.000000                   3rd Qu.: 3.000                      
##  Max.   :1.000000                   Max.   :13.000                      
##                                                                         
##  NOVEDADES.1         RUEE                  geometry        GID       
##  Mode:logical   Min.   :1101002   POINT        :236   Min.   :33.00  
##  NA's:236       1st Qu.:1101068   epsg:4326    :  0   1st Qu.:34.00  
##                 Median :1101150   +proj=long...:  0   Median :36.00  
##                 Mean   :1101168                       Mean   :36.57  
##                 3rd Qu.:1101267                       3rd Qu.:39.00  
##                 Max.   :1101385                       Max.   :40.00  
##                                                                      
##    MUNICIPIO     AREA_HA        POBLACION     
##  A      :55   Min.   : 1148   Min.   :147577  
##  F      :43   1st Qu.: 2683   1st Qu.:151302  
##  D      :32   Median : 8559   Median :159528  
##  G      :31   Mean   : 8496   Mean   :169922  
##  C      :23   3rd Qu.:14240   3rd Qu.:181153  
##  E      :20   Max.   :14380   Max.   :207911  
##  (Other):32

A cada registro se le unió una columna del nombre del municipio con el que se solapa.

ggplot()+
  geom_sf(data=municipios)+
  geom_sf(data=escuelas_geo, aes(color=MUNICIPIO), alpha=0.75, show.legend = FALSE) +
  geom_sf_text(data=municipios, aes(label = MUNICIPIO), size=2, color = "black") +
  labs(title="Escuelas por municipio",
       subtitle = "Montevideo, Uruguay",
       color="Municipio", 
       caption= "Fuente: CEIP",
       x="",
       y="") +
  scale_color_viridis_d(alpha = 0.9) +
  guides(fill=guide_legend(title.position = "top", ncol=2)) +
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        legend.key.size = unit(0.3, "cm"),
        legend.key.width = unit(0.4,"cm"), 
        legend.position="right", 
        legend.direction = "horizontal", 
        legend.title=element_text(size=10, face = "bold"), 
        legend.text=element_text(size=7), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), 
        axis.text = element_blank(), 
        axis.ticks = element_blank()) 
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

Mapa coroplético de cantidad de escuelas por municipio

Primero agrupo por municipio para sacar la cantidad de escuelas.

cant_esc <- escuelas_geo %>%
  group_by(MUNICIPIO) %>%
  summarise(cant_esc=n())
head(cant_esc)
## Simple feature collection with 6 features and 2 fields
## Geometry type: MULTIPOINT
## Dimension:     XY
## Bounding box:  xmin: -56.35536 ymin: -34.91949 xmax: -56.04477 ymax: -34.75529
## Geodetic CRS:  WGS 84
## # A tibble: 6 × 3
##   MUNICIPIO cant_esc                                                    geometry
##   <fct>        <int>                                            <MULTIPOINT [°]>
## 1 A               55 ((-56.26294 -34.8908), (-56.25009 -34.89168), (-56.25241 -…
## 2 B               14 ((-56.21029 -34.90924), (-56.1907 -34.90496), (-56.18593 -…
## 3 C               23 ((-56.20115 -34.87381), (-56.1858 -34.87627), (-56.18365 -…
## 4 CH              18 ((-56.15902 -34.88882), (-56.16265 -34.88557), (-56.15092 …
## 5 D               32 ((-56.14908 -34.86556), (-56.15398 -34.87858), (-56.14433 …
## 6 E               20 ((-56.13552 -34.87432), (-56.11971 -34.87477), (-56.14566 …

Ahora voy a transformar cant_esc en un dataset tradicional, con la función st_set_geometry() :

cant_esc <- cant_esc %>%
  st_set_geometry(NULL)

Al tener solo dos columnas, sin geometría, voy a poder realizar un left_join():

municipios <- left_join(municipios, cant_esc, by="MUNICIPIO")

Ahora sí, el mapa coroplético que estaba buscando:

ggplot()+
  geom_sf(data=municipios, aes(fill=cant_esc)) + 
  geom_sf_text(data=municipios, aes(label = MUNICIPIO), size=2, color = "white") +
  labs(title="Cantidad de escuelas por municipio",
       subtitle = "Montevideo, Uruguay",
       fill="", 
       caption= "Fuente: CEIP",
       x="",
       y="") +
  scale_fill_viridis_c(alpha = 0.9) +
  guides(fill=guide_legend(title.position = "top", ncol=1)) +
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        legend.position="right", 
        legend.direction = "horizontal", 
        legend.title=element_text(size=10, face = "bold"), 
        legend.text=element_text(size=7), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), 
        axis.text = element_blank(), 
        axis.ticks = element_blank()) 
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

El “B” es el que presenta mayor cantidad de escuelas, y el que menos, el “A”.

Mapa base + coroplético de escuelas por población

Ahora voy a realizar otro mapa coroplético de un ratio de cantidad de escuelas por municipio en función de su población, con el agregado de mapa base.

Para esto voy a usar ggmap() y por ende empiezo por construir las coordenadas de Montevideo.

bbox_MVD <- st_bbox(municipios)
bbox_MVD
##      xmin      ymin      xmax      ymax 
## -56.43140 -34.93815 -56.02395 -34.70192

Hago el ajuste para pasar del formato tipo “bbox” a numérico:

bbox_MVD <- as.numeric(bbox_MVD)

Con get_stamenmap() voy a descargar de internet el “mapa base”. En este caso, un mapa de tipo “toner-lite”.

mapa_MVD <- get_stamenmap(bbox = bbox_MVD,
                           maptype = "toner-lite",
                           zoom=12)
## ℹ Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL.
ggmap(mapa_MVD)

Y ahora le sumo el mapa coroplético que quería realizar:

ggmap(mapa_MVD)+
  geom_sf(data=municipios, aes(fill=cant_esc/POBLACION*10000), color=NA, inherit.aes=FALSE, alpha=0.8)+
  labs(title = "Escuelas por municipio en función de su población",
       subtitle = "Montevideo, Uruguay",
       fill = "Escuelas cada 10.000 personas",
       caption= "Fuente: CEIP", 
       x="",
       y="") +
  scale_fill_viridis_c(breaks=seq(0, 5, 0.5), alpha = 0.9) +
  guides(fill=guide_legend(title.position = "top")) +
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        legend.key.size = unit(0.3, "cm"),
        legend.key.width = unit(0.4,"cm"), 
        legend.position="bottom", 
        legend.direction = "horizontal", 
        legend.title=element_text(size=10, face = "bold"), 
        legend.text=element_text(size=7), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), 
        axis.text = element_blank(), 
        axis.ticks = element_blank()) 
## Coordinate system already present. Adding new coordinate system, which will
## replace the existing one.

Ahora podemos ver que en función de su población, el municipio con mayor escuelas es el “B” y el que tiene menos, el “F”.

Mapa facetado por escuelas que incluyen equipos multidisciplinarios

ggplot(escuelas_geo) +
  geom_point(aes(x=TIENE.EQUIPO.MULTIDISCIPLINARIO, y=POBLACION)) +
  labs(title = "Escuelas con equipos multidisciplinarios",
       subtitle = "Montevideo, Uruguay",
       caption= "Fuente: CEIP", 
       x="Cuenta con equipo multidisciplinario",
       y="Población") +
  scale_fill_viridis_c(alpha = 0.9) +
  guides(fill=guide_legend(title.position = "top")) +
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        legend.key.size = unit(0.3, "cm"),
        legend.key.width = unit(0.4,"cm"), 
        legend.position="bottom", 
        legend.direction = "horizontal", 
        legend.title=element_text(size=10, face = "bold"), 
        legend.text=element_text(size=7), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), 
        axis.ticks = element_blank()) 

La ajudicación de los equipos multidisciplinarios a las escuelas no depende de lo poblado que esté el municipio. Voy a ver entonces la distribución geográfica.

ggmap(mapa_MVD) +
  geom_sf(data=municipios, aes(fill=cant_esc), color=NA, inherit.aes=FALSE, alpha=0.8)+
  geom_point(data = escuelas, 
             aes(x = long, y = lat, color = TIENE.EQUIPO.MULTIDISCIPLINARIO), alpha=0.75)+
  labs(title = "Escuelas con equipos multidisciplinarios por municipio",
       subtitle = "Montevideo, Uruguay",
       fill = "Cantidad de escuelas",
       color = "Equipo multidisciplinario",
       caption= "Fuente: CEIP", 
       x="",
       y="") +
  scale_color_manual(values = c("black", "white")) +
  scale_fill_viridis_c(breaks=seq(0, 5, 0.5), alpha = 0.9) +
  facet_wrap(~TIENE.EQUIPO.MULTIDISCIPLINARIO, ncol=2)+
  guides(fill=guide_legend(title.position = "top")) +
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        legend.key.size = unit(0.3, "cm"),
        legend.key.width = unit(0.4,"cm"), 
        legend.position="bottom", 
        legend.direction = "horizontal", 
        legend.title=element_text(size=10, face = "bold"), 
        legend.text=element_text(size=7), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), 
        axis.text = element_blank(), 
        axis.ticks = element_blank()) 
## Coordinate system already present. Adding new coordinate system, which will
## replace the existing one.

esc_con_EM <- escuelas %>%
  filter(TIENE.EQUIPO.MULTIDISCIPLINARIO == "SÍ") %>%
  count()

De las 11 con equipo multidisciplinario, no reconozco que exista a nivel geográfico una razón para su distribución.

Análisis de distancias: Isócronas al Planetario de Montevideo

El Planetario de Montevideo es una de los lugares con más valor académico y lúdico, el cual es visitado en horario curricular por todes les niñes en etapa escolar. Además del Planetario, en las inmediaciones se encuentran una reserva natural (ex-zoologico) y un parque de juegos con canchas deportivas. Voy entonces a calcular la distancia al Planetario desde varios puntos de la ciudad.

Primero voy a hacer una geolocalización simple del Planetario de Montevideo:

planetario <- geo(address = "Avenida General Rivera 3245, Montevideo, Uruguay",
                  method = "osm")
## Passing 1 address to the Nominatim single address geocoder
## Query completed in: 1 seconds
planetario
## # A tibble: 1 × 3
##   address                                            lat  long
##   <chr>                                            <dbl> <dbl>
## 1 Avenida General Rivera 3245, Montevideo, Uruguay -34.9 -56.1

Ahora voy a ver qué zonas se encuentran a menos de 40 minutos en auto.

isocrona <- osrmIsochrone(loc = c(planetario$long, planetario$lat),
                     breaks = seq(from=0,to=40,by=5),
                     res = 35,
                     osrm.profile = "car")
isocrona
## Simple feature collection with 8 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -56.43498 ymin: -34.96895 xmax: -55.83196 ymax: -34.64335
## Geodetic CRS:  WGS 84
##   id isomin isomax                       geometry
## 1  1      0      5 MULTIPOLYGON (((-56.11886 -...
## 2  2      5     10 MULTIPOLYGON (((-56.14528 -...
## 3  3     10     15 MULTIPOLYGON (((-56.06073 -...
## 4  4     15     20 MULTIPOLYGON (((-56.06073 -...
## 5  5     20     25 MULTIPOLYGON (((-56.06073 -...
## 6  6     25     30 MULTIPOLYGON (((-56.06073 -...
## 7  7     30     35 MULTIPOLYGON (((-56.14528 -...
## 8  8     35     40 MULTIPOLYGON (((-56.22983 -...

Lo pruebo en un mapa:

ggplot()+
  geom_sf(data=isocrona, aes(fill=isomax), color=NA)+
  scale_fill_viridis_c(direction=-1)+
  labs(fill="Minutos en auto (Máx)")+
   theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        legend.key.size = unit(0.3, "cm"),
        legend.key.width = unit(0.4,"cm"), 
        legend.position="bottom", 
        legend.direction = "horizontal", 
        legend.title=element_text(size=10, face = "bold"), 
        legend.text=element_text(size=7), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), 
        axis.text = element_blank(), 
        axis.ticks = element_blank()) 

Ahora, un mapa interactivo con la ubicación del Planetario:

leaflet(isocrona) %>%
  addProviderTiles(providers$CartoDB.Positron) %>% 
  addPolygons(fillColor = ~colorBin("viridis", domain = isocrona$isomax)(isomax),
  color = NA,
  fillOpacity = 0.5) %>%
  addMarkers(data=planetario)
## Assuming "long" and "lat" are longitude and latitude, respectively

Ahora lo voy a cruzar espacialmente para poder ver las escuelas.

st_crs(isocrona)
## Coordinate Reference System:
##   User input: EPSG:4326 
##   wkt:
## GEOGCRS["WGS 84",
##     ENSEMBLE["World Geodetic System 1984 ensemble",
##         MEMBER["World Geodetic System 1984 (Transit)"],
##         MEMBER["World Geodetic System 1984 (G730)"],
##         MEMBER["World Geodetic System 1984 (G873)"],
##         MEMBER["World Geodetic System 1984 (G1150)"],
##         MEMBER["World Geodetic System 1984 (G1674)"],
##         MEMBER["World Geodetic System 1984 (G1762)"],
##         MEMBER["World Geodetic System 1984 (G2139)"],
##         ELLIPSOID["WGS 84",6378137,298.257223563,
##             LENGTHUNIT["metre",1]],
##         ENSEMBLEACCURACY[2.0]],
##     PRIMEM["Greenwich",0,
##         ANGLEUNIT["degree",0.0174532925199433]],
##     CS[ellipsoidal,2],
##         AXIS["geodetic latitude (Lat)",north,
##             ORDER[1],
##             ANGLEUNIT["degree",0.0174532925199433]],
##         AXIS["geodetic longitude (Lon)",east,
##             ORDER[2],
##             ANGLEUNIT["degree",0.0174532925199433]],
##     USAGE[
##         SCOPE["Horizontal component of 3D system."],
##         AREA["World."],
##         BBOX[-90,-180,90,180]],
##     ID["EPSG",4326]]
escuelas_geo <- escuelas %>%
  st_as_sf(coords=c("long", "lat"), crs=4326)

El siguiente chunk que desactiva el uso de la biblioteca ‘s2’ en el paquete ‘sf’. Esto significa que las operaciones espaciales en ‘sf’ se realizarán utilizando métodos alternativos en lugar de los proporcionados por ‘s2’ (biblioteca C++) para evitar errores relacionados con las proyecciones.

sf_use_s2(FALSE)
## Spherical geometry (s2) switched off

Ahora si, la intersección.

escuelas_geo <- st_intersection(escuelas_geo, isocrona)
## although coordinates are longitude/latitude, st_intersection assumes that they
## are planar
## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries
escuelas_geo
## Simple feature collection with 236 features and 27 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -56.35536 ymin: -34.91949 xmax: -56.04477 ymax: -34.75495
## Geodetic CRS:  WGS 84
## # A tibble: 236 × 28
##    NOMBRE      NUMERO TURNO DIRECCION TELEFONO MAIL  PARAJE.O.BARRIO X.COMPARTE.
##  * <fct>        <int> <fct> <chr>     <fct>    <fct> <fct>           <fct>      
##  1 "JOAQUIN M…     13 MATU… ABACU 21… "248122… ross… LA BLANQUEADA   SÍ         
##  2 "BRASIL"        17 EXTE… AV. BRAS… "270821… escu… POCITOS         NO         
##  3 "SIMON BOL…     32 MATU… SIMON BO… "270728… deag… POCITOS         SÍ         
##  4 "REPUBLICA…     35 TIEM… MELITON … "262240… escu… BUCEO           NO         
##  5 "AUSTRIA"       48 VESP… ABACU 21… "248122… esc4… LA BLANQUEADA   SÍ         
##  6 "REPUBLICA…     51 MATU… JULIO CE… "262257… escu… PQUE BATLLE VI… SÍ         
##  7 ""              83 VESP… SIMON BO… "270728… alba… POCITOS         SÍ         
##  8 "DR. JUAN …     98 VESP… JULIO CE… "262257… escu… PQUE BATLLE VI… SÍ         
##  9 "HECTOR FI…    100 EXTE… AV. RICA… "248020… escu… PQUE BATLLE VI… NO         
## 10 "MANUEL BE…    120 EXTE… COMODORO… ""       esc1… PQUE BATLLE VI… NO         
## # ℹ 226 more rows
## # ℹ 20 more variables: CATEGORIA <fct>,
## #   PRIMER.NIVEL.DE.EDUCACION.QUE.OFRECE <fct>,
## #   ULTIMO.NIVEL.DE.EDUCACION.QUE.OFRECE <fct>, TIENE.COMEDOR <fct>,
## #   TIENE.COPA.DE.LECHE <fct>, TIENE.EQUIPO.MULTIDISCIPLINARIO <fct>,
## #   CON.CLASES.ESPECIALES <fct>, TIENE.MAESTRO.DE.APOYO <int>,
## #   TIENE.MAESTRO.DE.APOYO.CEIBAL <int>, TIENE.MAESTRO.COMUNITARIO <fct>, …
summary(escuelas_geo)
##                           NOMBRE        NUMERO                  TURNO   
##                              : 54   Min.   :  2.0   DOBLE TURNO    :67  
##  GRUPO ESCOLAR F. SANGUINETTI:  2   1st Qu.: 67.5   MATUTINO       :53  
##  GRUPO ESCOLAR MARIA NOYA    :  2   Median :149.5   TIEMPO COMPLETO:52  
##  JOSE ROGER BALET            :  2   Mean   :168.4   VESPERTINO     :52  
##  ABRAHAM LINCOLN             :  1   3rd Qu.:267.2   EXTENDIDO      :12  
##  ALBERT EINSTEIN             :  1   Max.   :385.0   ESPECIAL       : 0  
##  (Other)                     :174                   (Other)        : 0  
##   DIRECCION             TELEFONO  
##  Length:236                 : 22  
##  Class :character   22001169:  2  
##  Mode  :character   22152476:  2  
##                     22161681:  2  
##                     22221079:  2  
##                     22223427:  2  
##                     (Other) :204  
##                                                   MAIL    
##                                                     : 13  
##  131republicadechile@gmail.com                      :  1  
##  155melillayfauquet@gmail.com letiisi1974gmail.com  :  1  
##  163escuelagalicia@gmail.com frugoneblanca@gmail.com:  1  
##  169escuela@gmail.com                               :  1  
##  185escuela@gmail.com                               :  1  
##  (Other)                                            :218  
##                PARAJE.O.BARRIO X.COMPARTE.                  CATEGORIA 
##  LA PALOMA TOMKINSON   : 10    NO:126      APRENDER              :83  
##  CASABO PAJAS BLANCAS  :  9    SÍ:110      COMÚN                 :67  
##  CERRO                 :  9                DE TIEMPO COMPLETO    :51  
##  MANGA                 :  9                DE PRÁCTICA           :18  
##  MAROÑAS PARQUE GUARANI:  7                TIEMPO EXTENDIDO      : 8  
##  NUEVO PARIS           :  7                HABILITADA DE PRÁCTICA: 4  
##  (Other)               :185                (Other)               : 5  
##  PRIMER.NIVEL.DE.EDUCACION.QUE.OFRECE ULTIMO.NIVEL.DE.EDUCACION.QUE.OFRECE
##        :  0                                 :  0                          
##  1     : 57                           1     :  0                          
##  3 AÑOS: 29                           2     :  0                          
##  4 AÑOS:142                           3     :  0                          
##  5 AÑOS:  8                           4 AÑOS:  0                          
##                                       5 AÑOS:  0                          
##                                       6     :236                          
##  TIENE.COMEDOR TIENE.COPA.DE.LECHE TIENE.EQUIPO.MULTIDISCIPLINARIO
##    :  0          :  0                :  0                         
##  NO: 75        NO: 94              NO:225                         
##  SÍ:161        SÍ:142              SÍ: 11                         
##                                                                   
##                                                                   
##                                                                   
##                                                                   
##  CON.CLASES.ESPECIALES TIENE.MAESTRO.DE.APOYO TIENE.MAESTRO.DE.APOYO.CEIBAL
##  NO:166                Min.   :0.0000         Min.   :0.0000               
##  SÍ: 70                1st Qu.:0.0000         1st Qu.:0.0000               
##                        Median :0.0000         Median :0.0000               
##                        Mean   :0.3008         Mean   :0.2966               
##                        3rd Qu.:1.0000         3rd Qu.:0.0000               
##                        Max.   :2.0000         Max.   :4.0000               
##                                                                            
##  TIENE.MAESTRO.COMUNITARIO MAESTRO.MAS.MAESTRO
##    :  0                    Min.   :0.00000    
##  NO:145                    1st Qu.:0.00000    
##  SÍ: 91                    Median :0.00000    
##                            Mean   :0.08051    
##                            3rd Qu.:0.00000    
##                            Max.   :3.00000    
##                                               
##  MAESTRO.DE.TRAYECTORIAS.PROTEGIDAS PROFESORES.ESPECIALES N..DE.AULAS   
##  Min.   :0.000000                   Min.   : 1.000        Mode:logical  
##  1st Qu.:0.000000                   1st Qu.: 1.000        NA's:236      
##  Median :0.000000                   Median : 2.000                      
##  Mean   :0.004237                   Mean   : 2.856                      
##  3rd Qu.:0.000000                   3rd Qu.: 3.000                      
##  Max.   :1.000000                   Max.   :13.000                      
##                                                                         
##  NOVEDADES.1         RUEE               id            isomin     
##  Mode:logical   Min.   :1101002   Min.   :1.000   Min.   : 0.00  
##  NA's:236       1st Qu.:1101068   1st Qu.:2.750   1st Qu.: 8.75  
##                 Median :1101150   Median :3.000   Median :10.00  
##                 Mean   :1101168   Mean   :3.492   Mean   :12.46  
##                 3rd Qu.:1101267   3rd Qu.:4.000   3rd Qu.:15.00  
##                 Max.   :1101385   Max.   :7.000   Max.   :30.00  
##                                                                  
##      isomax               geometry  
##  Min.   : 5.00   POINT        :236  
##  1st Qu.:13.75   epsg:4326    :  0  
##  Median :15.00   +proj=long...:  0  
##  Mean   :17.46                      
##  3rd Qu.:20.00                      
##  Max.   :35.00                      
## 
ggplot()+
  geom_bar(data=escuelas_geo, aes(x=as.factor(isomax)), fill="turquoise4")+
  labs(title="Distancia entre el Planetario y las escuelas públicas",
        subtitle = "Montevideo, Uruguay",
       caption= "Fuente: CEIP", 
       x="Distancia máxima por auto (en minutos)",
       y="Cantidad de escuelas")+
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), 
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), 
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), 
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), 
        title=element_text(size=12, face = "bold"), 
        legend.key.size = unit(0.3, "cm"),
        legend.key.width = unit(0.4,"cm"), 
        legend.position="bottom", 
        legend.direction = "horizontal", 
        legend.title=element_text(size=10, face = "bold"), 
        legend.text=element_text(size=7), 
        plot.caption=element_text(face = "italic", colour = "gray35",size=6))

Algunas conclusiones: - Solo una escuela se encuentra a menos de 5 minutos en auto. - La mayor cantidad de escuelas se encuentran entre 20 y 30 minutos en auto.

Ahora sí, en el mapa interactivo final:

leaflet(isocrona) %>%
  addProviderTiles(providers$CartoDB.DarkMatter) %>% 
  addPolygons(fillColor = ~colorBin("viridis", domain = isocrona$isomax)(isomax),
  color = NA,
  fillOpacity = 0.5) %>%
  addMarkers(data=planetario,
             popup = "Planetario de Montevideo") %>%
  addCircles(data=escuelas_geo,
             popup = ~paste("Escuela No. ", NUMERO, " - ", NOMBRE),
             color = "black")
## Assuming "long" and "lat" are longitude and latitude, respectively

Conclusiones Finales

Si bien se pudo determinar una concordancia entre la densidad poblacional y la cantidad de escuelas públicas en función de los municipios, fue simplemente a efectos del ejercicio de las herramientas usadas en la materia. Para que el análisis cobre sentido debería haber contado la población en edad escolar pero no pude obtener dicho dato por municipios para poder realizar el ejercicio de manera adecuada.