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