La ciudad de Córdoba es la capital de la provincia argentina que lleva su mismo nombre y su población es la segunda más grande de todo Argentina. Esto la transforma es uno de los centros educativos, culturales, económicos y financieros más importantes del país.
Para conocer un poco más acerca de esta, se ha descargado una base de datos de los barrios de la ciudad con información del Censo Nacional de Población, Hogares y Viviendas 2010, producida por la Dirección de Datos y Análisis Estadísticos de la Municipalidad de Córdoba en base a Dirección General de Estadísticas y Censos de la Provincia de Córdoba. Se encuentra en formato “kml” y a través de un conversor online la trabajaremos en formato “geojson”.
En primer lugar, cargamos las librerias que vamos a utilizar, el data set y a través de summary veremos cómo se compone.
library(tidyverse)
library(sf)
barrios_cba <- st_read("barrios_cordoba.geojson")
## Reading layer `Censo_2010_Barrios' from data source `C:\Users\HP\Documents\PCDPP\CA. DATOS CIUDADES\barrios_cordoba.geojson' using driver `GeoJSON'
## Simple feature collection with 496 features and 13 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -64.31011 ymin: -31.52506 xmax: -64.05606 ymax: -31.3073
## Geodetic CRS: WGS 84
summary(barrios_cba)
## Name description descriptio altitudeMo
## Length:496 Length:496 Length:496 Length:496
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## NOMBRE_BAR SUP_HA_MOD COD_BA_14 Poblacion
## Length:496 Min. : 0.00 Min. : 0.0 Length:496
## Class :character 1st Qu.: 14.45 1st Qu.:114.8 Class :character
## Mode :character Median : 28.39 Median :234.5 Mode :character
## Mean : 67.47 Mean :235.6
## 3rd Qu.: 59.51 3rd Qu.:358.2
## Max. :2479.34 Max. :484.0
## Hombres Mujeres X.Poblacion Hogares
## Length:496 Length:496 Length:496 Length:496
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## NBI.hogares. geometry
## Length:496 MULTIPOLYGON :496
## Class :character epsg:4326 : 0
## Mode :character +proj=long...: 0
##
##
##
head(barrios_cba)
## Simple feature collection with 6 features and 13 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -64.27762 ymin: -31.39601 xmax: -64.10076 ymax: -31.34022
## Geodetic CRS: WGS 84
## Name description descriptio altitudeMo NOMBRE_BAR
## 1 483-ZEPA <NA> <NA> <NA> ZEPA
## 2 482-YOFRE SUD <NA> <NA> <NA> YOFRE SUD
## 3 481-YOFRE NORTE <NA> <NA> <NA> YOFRE NORTE
## 4 480-YOFRE I <NA> <NA> <NA> YOFRE I
## 5 479-YOFRE H <NA> <NA> <NA> YOFRE H
## 6 473-VILLA SOLFERINO <NA> <NA> <NA> VILLA SOLFERINO
## SUP_HA_MOD COD_BA_14 Poblacion Hombres Mujeres X.Poblacion Hogares
## 1 26.54 483 1,061 527 534 0.08% 255
## 2 46.17 482 5,126 2,444 2,682 0.39% 1,543
## 3 73.63 481 6,935 3,224 3,711 0.52% 2,180
## 4 27.87 480 2,631 1,249 1,382 0.20% 791
## 5 125.97 479 1,789 880 909 0.13% 508
## 6 12.89 473 664 309 355 0.05% 198
## NBI.hogares. geometry
## 1 36 MULTIPOLYGON (((-64.10183 -...
## 2 55 MULTIPOLYGON (((-64.13187 -...
## 3 60 MULTIPOLYGON (((-64.13327 -...
## 4 33 MULTIPOLYGON (((-64.13125 -...
## 5 29 MULTIPOLYGON (((-64.12438 -...
## 6 5 MULTIPOLYGON (((-64.27761 -...
Como se puede ver, los datos de muchas de las columnas son considerados como caracteres pero algunos de ellos son factores y otros numéricos. Por lo tanto, debemos configurar cada columna por separado según tipo de dato, además, vemos que la columna “X.Población” contiene el signo del porcentaje, por lo que procederemos a crear una nueva columna sólo con los valores numéricos. A su vez, ocultaremos algunas columnas que no nos interesan en este momento.
barrios_cba$Name <- factor(barrios_cba$Name)
barrios_cba$NOMBRE_BAR <- factor(barrios_cba$NOMBRE_BAR)
barrios_cba <- (barrios_cba) %>%
mutate(Por_pob=substr(X.Poblacion, 1, 4)) %>%
select(-X.Poblacion, -description, -descriptio, -altitudeMo) %>%
transform(Poblacion= as.numeric(Poblacion), Hombres = as.numeric(Hombres),
Mujeres = as.numeric(Mujeres), Hogares = as.numeric(Hogares),
NBI.hogares. = as.numeric(NBI.hogares.), Por_pob = as.numeric(Por_pob))
summary(barrios_cba)
## Name NOMBRE_BAR
## 127-COUNTRY ALTOS DEL CHATEAU: 2 COUNTRY ALTOS DEL CHATEAU: 2
## 0-CAMPING GRL SAN MARTIN : 1 1 DE MAYO : 1
## 0-CIRCUNVALACION : 1 2 DE SEPTIEMBRE : 1
## 0-CIUDAD DE LAS ARTES : 1 20 DE JUNIO : 1
## 0-CIUDAD UNIVERSITARIA : 1 23 DE ABRIL : 1
## 0-DIPAS : 1 25 DE MAYO : 1
## (Other) :489 (Other) :489
## SUP_HA_MOD COD_BA_14 Poblacion Hombres
## Min. : 0.00 Min. : 0.0 Min. : 13.0 Min. : 12.0
## 1st Qu.: 14.45 1st Qu.:114.8 1st Qu.:311.0 1st Qu.:239.5
## Median : 28.39 Median :234.5 Median :526.0 Median :451.0
## Mean : 67.47 Mean :235.6 Mean :535.8 Mean :476.0
## 3rd Qu.: 59.51 3rd Qu.:358.2 3rd Qu.:776.0 3rd Qu.:711.2
## Max. :2479.34 Max. :484.0 Max. :982.0 Max. :999.0
## NA's :339 NA's :204
## Mujeres Hogares NBI.hogares. Por_pob
## Min. : 1.0 Min. : 2.0 Min. : 0.00 Min. :0.0000
## 1st Qu.:245.0 1st Qu.:180.0 1st Qu.: 5.00 1st Qu.:0.0600
## Median :447.0 Median :334.0 Median : 18.00 Median :0.1200
## Mean :477.8 Mean :376.5 Mean : 48.53 Mean :0.2093
## 3rd Qu.:694.5 3rd Qu.:541.0 3rd Qu.: 51.00 3rd Qu.:0.2400
## Max. :999.0 Max. :988.0 Max. :982.00 Max. :2.7900
## NA's :222 NA's :131 NA's :21 NA's :20
## geometry
## MULTIPOLYGON :496
## epsg:4326 : 0
## +proj=long...: 0
##
##
##
##
head(barrios_cba)
## Simple feature collection with 6 features and 10 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -64.27762 ymin: -31.39601 xmax: -64.10076 ymax: -31.34022
## Geodetic CRS: WGS 84
## Name NOMBRE_BAR SUP_HA_MOD COD_BA_14 Poblacion Hombres
## 1 483-ZEPA ZEPA 26.54 483 NA 527
## 2 482-YOFRE SUD YOFRE SUD 46.17 482 NA NA
## 3 481-YOFRE NORTE YOFRE NORTE 73.63 481 NA NA
## 4 480-YOFRE I YOFRE I 27.87 480 NA NA
## 5 479-YOFRE H YOFRE H 125.97 479 NA 880
## 6 473-VILLA SOLFERINO VILLA SOLFERINO 12.89 473 664 309
## Mujeres Hogares NBI.hogares. Por_pob geometry
## 1 534 255 36 0.08 MULTIPOLYGON (((-64.10183 -...
## 2 NA NA 55 0.39 MULTIPOLYGON (((-64.13187 -...
## 3 NA NA 60 0.52 MULTIPOLYGON (((-64.13327 -...
## 4 NA 791 33 0.20 MULTIPOLYGON (((-64.13125 -...
## 5 909 508 29 0.13 MULTIPOLYGON (((-64.12438 -...
## 6 355 198 5 0.05 MULTIPOLYGON (((-64.27761 -...
Finalmente, contamos con un data set de 11 columnas, cuyas variables son:
* Name: nombre del barrio y su código.
* NOMBRE_BAR: nombre del barrio.
* SUP_HA_MOD: superficie del polígono (barrio).
* COD_BA_14: ID del barrio.
* Poblacion: total de habitantes dentro del barrio.
* Hombres: total de varones dentro del barrio.
* Mujeres: total de mujeres dentro del barrio.
* NBI.hogares: cantidad de hogares con Necesidades Básicas Insatisfechas (NBI).
* Por_pob: proporción de habitantes del barrio en relación al total de habitantes de la Ciudad de Córdoba.
* geometry: ubicación geográfica del barrio.
Ahora, intentaremos graficar el mapa de la ciudad de Córdoba con sus barrios y hogares con NBA e identificar las zonas más carenciadas.
ggplot(barrios_cba)+
geom_sf(aes(fill= NBI.hogares.), color= "black")+
labs(title= "Barrios de la ciudad de Córdoba con Hogares con NBI",
caption = "Fuente: Dirección de Datos y Análisis Estadísticos de la Municipalidad de Córdoba",
fill= "Hogares con NBI")+
scale_fill_distiller(palette = "Spectral")
Se puede ver claramente que la mayor proporción de hogares con NBI se encuentran en los barrios de la periferia y más alejados del centro de la ciudad. Se podría suponer que una causa de esta distribución es la política habitacional aplicada por el Gobierno de la Provincia de Córdoba hace unos años atrás mediante la construcción de los famosos “Barrios Ciudad” para las familias que vivían en villas céntricas, cuyos terrenos de gran valor eran condicionados por la industria inmobiliaria y desarrollista de la ciudad. A su vez,en el extremo noroeste de la ciudad vemos que predomina el color azul, esto se debe a que en esta zona se ubican barrios residenciales en donde viven las familias con mayores ingresos económicos de la ciudad.Lo mimso sucede hacia el centro sur, en esa zona proliferan barrios cerrados para familias de clase media-alta.
Para esta segunda tarea se trabajará con un listado de Jardines Municipales de la ciudad de Córdoba extraído del sitio web de Gobierno Abierto de la Municipalidad de Córdoba.
jardines_mun <- read.csv("jardines_municipales.csv", stringsAsFactors = TRUE)
summary(jardines_mun)
## Nº JARDIN.MATRNAL DIRECCION
## 1 : 1 : 1 : 1
## 10 : 1 ARCO IRIS : 1 AV. VUCETICH ESQ. LUMINE: 1
## 11 : 1 ARROZ CON LECHE: 1 BIELSA S/N : 1
## 12 : 1 AYUDA MUTUA : 1 BUFFA ESQ. OB MERCADILLO: 1
## 13 : 1 BICHTO DE LUZ : 1 CHIRINO DE POSADAS 4627 : 1
## 14 : 1 CAFFERATA : 1 COLORADO Y MACACHIN : 1
## (Other):33 (Other) :33 (Other) :33
## BARRIO LATITUD LONGITUD
## CENTRO : 3 : 1 : 1
## PUEYRREDÓN : 2 -31,31359: 1 -64,08459: 1
## : 1 -31,31648: 1 -64,0894 : 1
## ALLENDE PARQUE : 1 -31,32344: 1 -64,09925: 1
## ALTO ALBERDI : 1 -31,32866: 1 -64,10417: 1
## AMPLIACION AMERICA: 1 -31,33344: 1 -64,13173: 1
## (Other) :30 (Other) :33 (Other) :33
A través del resumen de la variables vemos que tanto longitud como latitud son identificadas como factores y no como números. Esto se debe a que el separador de decimales es una “,” (coma) y no un “.” (punto), por lo tanto, trabajaremos en el reemplazo de la coma por punto en ambas columnas a tavés de la función gsub y en su definición como variables numéricas.
jardines_mun$LATITUD <- gsub(",",".",jardines_mun$LATITUD)
jardines_mun$LONGITUD <- gsub(",",".",jardines_mun$LONGITUD)
jardines_mun <- (jardines_mun) %>%
transform(LATITUD = as.numeric(LATITUD), LONGITUD = as.numeric(LONGITUD))%>%
filter(!is.na(LATITUD))
summary(jardines_mun)
## Nº JARDIN.MATRNAL DIRECCION
## 1 : 1 ARCO IRIS : 1 AV. VUCETICH ESQ. LUMINE: 1
## 10 : 1 ARROZ CON LECHE: 1 BIELSA S/N : 1
## 11 : 1 AYUDA MUTUA : 1 BUFFA ESQ. OB MERCADILLO: 1
## 12 : 1 BICHTO DE LUZ : 1 CHIRINO DE POSADAS 4627 : 1
## 13 : 1 CAFFERATA : 1 COLORADO Y MACACHIN : 1
## 14 : 1 CAPERUCITA ROJA: 1 COMPTON 5740 : 1
## (Other):32 (Other) :32 (Other) :32
## BARRIO LATITUD LONGITUD
## CENTRO : 3 Min. :-31.49 Min. :-64.28
## PUEYRREDÓN : 2 1st Qu.:-31.45 1st Qu.:-64.23
## ALLENDE PARQUE : 1 Median :-31.42 Median :-64.20
## ALTO ALBERDI : 1 Mean :-31.41 Mean :-64.19
## AMPLIACION AMERICA: 1 3rd Qu.:-31.37 3rd Qu.:-64.15
## CABILDO : 1 Max. :-31.31 Max. :-64.08
## (Other) :29
Ahora sí nuestro data set está listo para empezar a trabajar la unión espacial y la representación de sus datos en el mapa de la ciudad de Córdoba. Tal como se puede ver, este data set contiene los nombres de los diferentes jardines, su dirección, barrio y datos georreferenciales como la latitud y longitud. Para lograr graficarlos en un mapa coroplético de la ciudad de Córdoba, tendremos que obtener su ubicación dentro de los polígonos de los diferentes barrios. Para ello, crearemos un nuevo archivo con la extensión “geojson” a partir de “jardines_mun.csv” y lo guardaremos en la carpeta del proyecto.
jardines_geo1 <- st_as_sf(jardines_mun, coords = c("LONGITUD", "LATITUD"), crs = 4326)
Como vemos a través del siguiente gráfico, cada uno de los jardines ocupa un punto dentro del mapa de barrios de la ciudad de Córdoba.
ggplot()+
geom_sf(data = barrios_cba)+
geom_sf(data = jardines_geo1)
Ahora a través de la función “st_join” asignaremos a cada uno de los registros georeferenciados de los jardines municipales su unidad geográfica extraida del data set “barrios_cba.geojson” y lo guardaremos en una nueva variable “jardines_geo2”.
jardines_geo2 <- st_join(jardines_geo1, barrios_cba)
summary(jardines_geo2)
## Nº JARDIN.MATRNAL DIRECCION
## 1 : 1 ARCO IRIS : 1 AV. VUCETICH ESQ. LUMINE: 1
## 10 : 1 ARROZ CON LECHE: 1 BIELSA S/N : 1
## 11 : 1 AYUDA MUTUA : 1 BUFFA ESQ. OB MERCADILLO: 1
## 12 : 1 BICHTO DE LUZ : 1 CHIRINO DE POSADAS 4627 : 1
## 13 : 1 CAFFERATA : 1 COLORADO Y MACACHIN : 1
## 14 : 1 CAPERUCITA ROJA: 1 COMPTON 5740 : 1
## (Other):32 (Other) :32 (Other) :32
## BARRIO Name
## CENTRO : 3 175-GENERAL PUEYRREDON: 2
## PUEYRREDÓN : 2 182-GUEMES : 2
## ALLENDE PARQUE : 1 12-ALBERDI : 1
## ALTO ALBERDI : 1 150-EL CABILDO : 1
## AMPLIACION AMERICA: 1 154-EL QUEBRACHO : 1
## CABILDO : 1 172-GENERAL BUSTOS : 1
## (Other) :29 (Other) :30
## NOMBRE_BAR SUP_HA_MOD COD_BA_14 Poblacion
## GENERAL PUEYRREDON : 2 Min. : 5.59 Min. : 12.0 Min. :314.0
## GUEMES : 2 1st Qu.: 34.55 1st Qu.:176.8 1st Qu.:408.8
## ALBERDI : 1 Median : 64.02 Median :264.0 Median :503.5
## AMPLIACION PANAMERICANO: 1 Mean :122.30 Mean :267.5 Mean :503.5
## ARGUELLO NORTE : 1 3rd Qu.:169.47 3rd Qu.:367.8 3rd Qu.:598.2
## BELLA VISTA : 1 Max. :702.25 Max. :452.0 Max. :693.0
## (Other) :30 NA's :36
## Hombres Mujeres Hogares NBI.hogares.
## Min. :159.0 Min. :155.0 Min. : 88.0 Min. : 5.0
## 1st Qu.:540.0 1st Qu.:448.0 1st Qu.:471.8 1st Qu.: 25.0
## Median :793.0 Median :842.0 Median :537.5 Median : 87.0
## Mean :680.3 Mean :647.1 Mean :528.6 Mean :185.8
## 3rd Qu.:879.0 3rd Qu.:867.0 3rd Qu.:604.8 3rd Qu.:268.0
## Max. :964.0 Max. :903.0 Max. :933.0 Max. :858.0
## NA's :29 NA's :31 NA's :24 NA's :1
## Por_pob geometry
## Min. :0.0200 POINT :38
## 1st Qu.:0.1700 epsg:4326 : 0
## Median :0.3500 +proj=long...: 0
## Mean :0.6126
## 3rd Qu.:0.8175
## Max. :2.4600
##
Como vemos, la unión fue exitosa. Ahora cada uno de los registros de los jardines municipales del data set “jardines_geo2” tiene asignada la geometría de la unidad geográfica a la cual pertenece. A continuación, graficaremos los barrios de la ciudad de Córdoba coloreados por la cantidad de jardines municipales, pero para ello debemos:
jardines_geo2 <- jardines_geo2 %>%
group_by(NOMBRE_BAR)%>%
summarise(cantidad=n())
head(jardines_geo2)
## Simple feature collection with 6 features and 2 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: -64.24641 ymin: -31.48904 xmax: -64.17603 ymax: -31.33344
## Geodetic CRS: WGS 84
## # A tibble: 6 x 3
## NOMBRE_BAR cantidad geometry
## <fct> <int> <POINT [°]>
## 1 ALBERDI 1 (-64.19406 -31.41105)
## 2 AMPLIACION PANAMERICANO 1 (-64.182 -31.36742)
## 3 ARGUELLO NORTE 1 (-64.24641 -31.33344)
## 4 BELLA VISTA 1 (-64.19616 -31.42819)
## 5 CENTRO 1 (-64.17603 -31.42082)
## 6 EL CABILDO 1 (-64.23461 -31.48904)
jardines_geo2 <- jardines_geo2 %>%
st_set_geometry(NULL)
head(jardines_geo2)
## # A tibble: 6 x 2
## NOMBRE_BAR cantidad
## <fct> <int>
## 1 ALBERDI 1
## 2 AMPLIACION PANAMERICANO 1
## 3 ARGUELLO NORTE 1
## 4 BELLA VISTA 1
## 5 CENTRO 1
## 6 EL CABILDO 1
barrios_cba <- left_join(barrios_cba, jardines_geo2, "NOMBRE_BAR")
Ahora si podremos graficar nuestro mapa coroplético de la ciudad de Córdoba, coloreando cada uno de los barrios según la densidad de jardines municipales presentes en su territorio.
ggplot()+
geom_sf(data=barrios_cba, aes(fill=cantidad/SUP_HA_MOD), color="black", alpha = 0.75)+
labs(title = "Distribución de los jardines Municipales en los barrios de Córdoba",
fill = "Cantidad / Sup. barrial",
caption = "Portal Gobierno Abierto, Mun. de Córdoba (Argentina)")+
scale_fill_distiller(palette = "Spectral")
Vemos que la presencia de los jardines muncipales es sólo en algunos barrios de la ciudad de Córdoba, los cuales son los más populares de la ciudad: al sureste en la zona de Barrio Libertador, al medio barrio Centro, Alberdi, Pueyrredón, Talleres Oeste, al noreste barrio los Boulevares, etc. Si comparamos este mapa con el de la tarea anterior de Hogares con NBI podemos ver que coinciden los barrios con mayor presencia con aquellos con NBI.
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(reshape2)
##
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
Esta tercer tarea implica el uso de una data set que contenga tango fechas como coordenadas. Dentro del portal de datos abiertos de la ciudad de Córdoba no se encontró ningún data set que cumpliera con esos requisitos, por lo que se ha cambiado de ciudad. Ahora trabajaremos con la capital de Alemania, Berlín.
En primer lugar cargaremos el data set que contiene datos geométricos de los doce distritos de la ciudad.
berlin <- st_read("Bundestagswahlkeise-2013-Berlin.geojson")
## Reading layer `Bundestagswahlkeise-2013-Berlin' from data source `C:\Users\HP\Documents\PCDPP\CA. DATOS CIUDADES\Bundestagswahlkeise-2013-Berlin.geojson' using driver `GeoJSON'
## Simple feature collection with 12 features and 13 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 13.08835 ymin: 52.33824 xmax: 13.76114 ymax: 52.67547
## Geodetic CRS: WGS 84
head(berlin)
## Simple feature collection with 6 features and 13 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 13.08835 ymin: 52.38722 xmax: 13.52302 ymax: 52.67547
## Geodetic CRS: WGS 84
## BUW E_MAIL Erstell Flaeche Gebiets
## 1 075 rbs@statistik-bbb.de 2013-03-22 3946.945 15.02.2013
## 2 076 rbs@statistik-bbb.de 2013-03-22 9669.393 15.02.2013
## 3 077 rbs@statistik-bbb.de 2013-03-22 8931.999 15.02.2013
## 4 078 rbs@statistik-bbb.de 2013-03-22 9951.904 15.02.2013
## 5 079 rbs@statistik-bbb.de 2013-03-22 10255.388 15.02.2013
## 6 080 rbs@statistik-bbb.de 2013-03-22 5705.243 15.02.2013
## Lizenz Name_BUW OBJECTID
## 1 CC-BY 3.0 Namensnennung <NA> 1
## 2 CC-BY 3.0 Namensnennung <NA> 2
## 3 CC-BY 3.0 Namensnennung <NA> 3
## 4 CC-BY 3.0 Namensnennung <NA> 4
## 5 CC-BY 3.0 Namensnennung <NA> 5
## 6 CC-BY 3.0 Namensnennung <NA> 6
## Projektion Quelle
## 1 WGS 84 Web Mercator (Auxiliary Sphere) Amt für Statistik Berlin-Brandenburg
## 2 WGS 84 Web Mercator (Auxiliary Sphere) Amt für Statistik Berlin-Brandenburg
## 3 WGS 84 Web Mercator (Auxiliary Sphere) Amt für Statistik Berlin-Brandenburg
## 4 WGS 84 Web Mercator (Auxiliary Sphere) Amt für Statistik Berlin-Brandenburg
## 5 WGS 84 Web Mercator (Auxiliary Sphere) Amt für Statistik Berlin-Brandenburg
## 6 WGS 84 Web Mercator (Auxiliary Sphere) Amt für Statistik Berlin-Brandenburg
## Quelle_URL Shape_STAr Shape_STLe
## 1 www.statistik-berlin-brandenburg.de 39469452 35540.69
## 2 www.statistik-berlin-brandenburg.de 96693935 63677.57
## 3 www.statistik-berlin-brandenburg.de 89319989 52032.14
## 4 www.statistik-berlin-brandenburg.de 99519038 69933.14
## 5 www.statistik-berlin-brandenburg.de 102553879 62894.18
## 6 www.statistik-berlin-brandenburg.de 57052427 36255.86
## geometry
## 1 POLYGON ((13.38455 52.56774...
## 2 POLYGON ((13.47906 52.67393...
## 3 POLYGON ((13.28655 52.66008...
## 4 POLYGON ((13.20397 52.5874,...
## 5 POLYGON ((13.19391 52.47109...
## 6 POLYGON ((13.29512 52.52965...
Como vemos nuestro data set contiene información que no es útil para nuestro análisis y en lugar de los nombre de los distritos contiene códigos. A continuación, haremos los cambios necesarios para ajustar el data set.
berlin$BUW <- gsub("075", "Mitte", berlin$BUW)
berlin$BUW <- gsub("083", "Friedrichshain.Kreuzberg", berlin$BUW)
berlin$BUW <- gsub("086", "Lichtenberg", berlin$BUW)
berlin$BUW <- gsub("085", "Marzahn.Hellersdorf", berlin$BUW)
berlin$BUW <- gsub("084", "Treptow.Kopenick", berlin$BUW)
berlin$BUW <- gsub("082", "Neukoelln", berlin$BUW)
berlin$BUW <- gsub("081", "Tempelhof.Schoeneberg", berlin$BUW)
berlin$BUW <- gsub("080", "Charlottenburg.Wilmersdorf", berlin$BUW)
berlin$BUW <- gsub("079", "Steglitz.Zehlendorf", berlin$BUW)
berlin$BUW <- gsub("078", "Spandau", berlin$BUW)
berlin$BUW <- gsub("077", "Reinickendorf", berlin$BUW)
berlin$BUW <- gsub("076", "Pankow", berlin$BUW)
ggplot(berlin)+
geom_sf()+
geom_sf_text(aes(label=BUW), size = 2)
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
3) Traducimos al español los nombres de las columnas que vamos a usar y eliminamos aquellas que no tendremos en cuenta.
berlin <-(berlin)%>%
rename(Distrito = BUW, superficie = Flaeche)%>%
select(-E_MAIL, -Erstell, -Gebiets, -Lizenz, -Name_BUW, -OBJECTID, -Projektion, -Quelle, -Quelle_URL,
-Shape_STAr, -Shape_STLe)
poblacion_berlin <- read.csv("poblacion_berlin.csv", encoding = "UTF-8")
summary(poblacion_berlin)
## X.U.FEFF.distrito población
## Length:12 Min. :245197
## Class :character 1st Qu.:272759
## Mode :character Median :302134
## Mean :314124
## 3rd Qu.:345440
## Max. :409335
poblacion_berlin <- rename(poblacion_berlin, Distrito = X.U.FEFF.distrito, poblacion = población)
berlin <- left_join(berlin, poblacion_berlin, "Distrito")
Ya listo nuestro data set de distritos pasaremos a trabajar con el data set de “Covid_19” el cual contiene datos de la cantidad de casos registrados día por día en cada uno de los distritos.
covid_19 <- read.csv("Covid_19_berlin.csv", sep = ";")
head(covid_19)
## Datum Marzahn.Hellersdorf Mitte Neukoelln Tempelhof.Schoeneberg
## 1 2020-03-03 1 3 1 1
## 2 2020-03-04 0 0 0 0
## 3 2020-03-05 0 4 0 0
## 4 2020-03-06 0 1 0 1
## 5 2020-03-07 0 0 0 0
## 6 2020-03-08 0 1 0 0
## Friedrichshain.Kreuzberg Pankow Reinickendorf Charlottenburg.Wilmersdorf
## 1 0 0 0 0
## 2 2 1 0 0
## 3 2 2 2 0
## 4 0 1 0 2
## 5 0 0 0 1
## 6 1 0 0 7
## Spandau Lichtenberg Steglitz.Zehlendorf Treptow.Koepenick
## 1 0 0 0 0
## 2 0 0 0 0
## 3 0 0 0 0
## 4 0 0 0 0
## 5 0 0 0 0
## 6 2 0 0 0
En nuestro data set cada columna es un distrito y contienen la cantidad de casos para cada día desde el 03 de marzo del 2020 hasta el 05 de junio del 2021. Para llevar a cabo las tareas solicitadas en el curso necesitamos que las columnas de nuestro data set sean: Fecha, Distrito y Cantidad de Casos.
covid_19 <- covid_19 %>%
gather(key = "Distrito", value = "Cantidad", Marzahn.Hellersdorf:Treptow.Koepenick) %>%
rename(Fecha = Datum)
head(covid_19)
## Fecha Distrito Cantidad
## 1 2020-03-03 Marzahn.Hellersdorf 1
## 2 2020-03-04 Marzahn.Hellersdorf 0
## 3 2020-03-05 Marzahn.Hellersdorf 0
## 4 2020-03-06 Marzahn.Hellersdorf 0
## 5 2020-03-07 Marzahn.Hellersdorf 0
## 6 2020-03-08 Marzahn.Hellersdorf 0
str(covid_19)
## 'data.frame': 5520 obs. of 3 variables:
## $ Fecha : chr "2020-03-03" "2020-03-04" "2020-03-05" "2020-03-06" ...
## $ Distrito: chr "Marzahn.Hellersdorf" "Marzahn.Hellersdorf" "Marzahn.Hellersdorf" "Marzahn.Hellersdorf" ...
## $ Cantidad: int 1 0 0 0 0 0 1 1 0 1 ...
Como se puede ver los datos de la columna Fecha están configurados como caracteres y para poder manipularlos y hacer el análisis temporal debemos pasarlos a formato fecha.
covid_19 <- mutate(covid_19, Fecha=ymd(Fecha))
str(covid_19)
## 'data.frame': 5520 obs. of 3 variables:
## $ Fecha : Date, format: "2020-03-03" "2020-03-04" ...
## $ Distrito: chr "Marzahn.Hellersdorf" "Marzahn.Hellersdorf" "Marzahn.Hellersdorf" "Marzahn.Hellersdorf" ...
## $ Cantidad: int 1 0 0 0 0 0 1 1 0 1 ...
Ahora a través de un gráfico de líneas podríamos divisar la evolución de los casos de covid en Berlín.
ggplot(covid_19 %>%
group_by(Fecha)%>%
summarise(cantidad=sum(Cantidad)))+
geom_line(aes(x=Fecha, y=cantidad))+
labs(title = "Evolución diaria de los casos de COVID-19 en Berlín",
subtitle = "Marzo 2020 - Julio 2021",
y = "Cantidad de casos")
El gráfico nos muestra que se produjeron dos picos de aumento de casos, un primer pico durante los meses del otoño - invierno y el segundo durante la primavera. Para quitar un poco de ruido y lograr un gráfico más claro que nos permita sacar una conclusión, haremos un análisis mes por mes.
covid_19 <- covid_19 %>%
mutate(mes = month(Fecha, label = TRUE), año = year(Fecha))
ggplot(covid_19 %>%
group_by(mes, año)%>%
summarise(cantidad=sum(Cantidad)))+
geom_bar(aes(x=mes, weight=cantidad))+
labs(title = "Evolución mensual de los casos de COVID-19 en Berlín",
subtitle = "Marzo 2020 - Junio 2021",
x = "Mes",
y = "Cantidad de casos")+
facet_wrap(~año)
## `summarise()` has grouped output by 'mes'. You can override using the `.groups` argument.
Los casos de COVID-19 aumentaron significativamente a partir del mes de octubre del 2020 alcanzando su pico en noviembre de ese mismo año. En febrero del 2021 los casos disminuyen pero no vuelve a ser la misma cantidad previa a la escalada de octubre 2020. Sin embargo, en marzo 2021 repuntan hasta lograr un nuevo pico en abril 2021 y luego disminuyen. Tengamos en cuenta que el mes de junio 2021 no puede ser considerado como una disminución significativa, ya que sólo poseemos 5 días de registros de ese mes.
Ahora quizás podemos preguntarnos si la curva de evolución mensual de los casos se mantiene constante en todos los distritos de la ciudad.
covid_19 <- covid_19 %>%
mutate(mes2 = format(Fecha, "%Y-%m"))%>%
mutate(año=as.factor(año))
ggplot(covid_19 %>%
group_by(mes2, año, Distrito)%>%
summarise(cantidad=sum(Cantidad)))+
geom_bar(aes(x = mes2, weight = cantidad, fill=año))+
labs(title = "Evolución de los casos de COVID-19 en los distritos de Berlín",
subtitle = "Marzo 2020 - Junio 2021",
x = "Mes",
y = "Cantidad de casos")+
facet_wrap(~Distrito)+
theme(axis.text.x = element_text(colour = "gray25",size = 7, angle = 90))
## `summarise()` has grouped output by 'mes2', 'año'. You can override using the `.groups` argument.
La curva no se replica exactamente igual en cada uno de los distritos pero si se mantiene el aumento considerable de los casos dentro de los mismos períodos del año. Ahora podremos preguntarnos cuáles son las zonas de Berlín más afectadas por el COVID-19.
covid_19_2 <- covid_19 %>%
group_by(Distrito, mes2, año)%>%
summarise(cantidad=sum(Cantidad))
covid_19_2 <- left_join(covid_19_2, berlin, "Distrito")
library(ggmap)
covid_19_2 <- st_as_sf(covid_19_2)
ggplot(covid_19_2 %>%
group_by(Distrito, poblacion)%>%
summarise(cantidad=sum(cantidad)))+
geom_sf(aes(fill=cantidad/poblacion))+
labs(title = "Impacto del COVID-19 en los diferentes distritos de Berlín",
subtitle = "Marzo 2020 - Junio 2021",
fill = "Cant. de casos s/ total población")+
geom_sf_text(aes(label=Distrito), size = 2.5, color="white")+
scale_fill_gradient(low = "peachpuff1", high = "brown4")
Como podemos ver las zonas con mayor cantidad de casos con respecto a la población total son Neukoelln, Mitte, Sapandau. Luego son seguidos por Reinkendorf, Friederichshain - Kreuzberg y Tempelhof-Schoeneberg; en un tercer grupo podemos decir que se encuentran Lichtenberg, Marzahn - Hellersdorf, y Charlottenburg - Wilmersdorf; y por último, con menor proporción de casos Steglitz-Zehlendorf y Pankow. Al desconocer la características más socio-culturales de estos distritos no es posible descifrar algunas causas que expliquen el fenómeno.
A continuación, veremos si desde el comienzo de la pandemia fueron estos distritos siempre los más afectados por el COVID-19.
ggplot(covid_19_2 %>%
group_by(Distrito, poblacion, mes2)%>%
summarise(cantidad=sum(cantidad)))+
geom_sf(aes(fill=cantidad/poblacion))+
facet_wrap(~mes2)+
scale_fill_gradient(low = "peachpuff1", high = "brown4")+
theme(axis.text.x = element_text(colour = "gray25",size = 6, angle = 90))
Como se puede ver desde marzo hasta septiembre del 2020 la evolución de los casos de COVID-19 se mantuvo pareja en todos los distritos. A partir de octubre el mapa se empieza a oscurecer y algunos distritos como Keukoelln, Mitte y Friederichshain - Kreuzberg comienzan a tomar la delantera en la escalada de casos en relación a sus cantidad de población. Los meses siguientes, el mapa se oscurece aún más de forma uniforme y luego se empieza a aclarar, también con cierta uniformidad; la cual no se observa cuando vemos el mapa de los datos agregados a lo largo de los 15 meses de pandemia.