libs <- c("tidyverse", "sf", "mapSpain", "osmdata", "ggspatial", "leaflet", "prettymapr", "prettydoc", "spatstat", "sp", "splancs" ,"tidygeocoder", "readxl")
installed_libs <- libs %in% rownames(installed.packages())
if (any(installed_libs == F)) {install.packages(libs[!installed_libs])}
invisible(lapply(libs, library, character.only = T))
rm(libs, installed_libs)
Datos de las farmacias de Pamplona
Input
En la Administración Electrónica de Navarra , se pueden encontrar los datos de las farmacias de Pamplona y de toda la provincia de Navarra, disponible en este enlace. Estos datos se encuentran en la sección de salud, dentro del apartado de ciudadanía. Además de la información sobre las farmacias, en esta sección también se puede acceder a detalles sobre hospitales y farmacias de guardia.
Este documento se enfoca en las farmacias existentes en toda la provincia de Navarra, específicamente identificadas como “Farmacias abiertas al público”. La base de datos incluye variables como Zona Básica, localidad, dirección, titular y código.
Es importante destacar que aunque los datos no están disponibles para descarga directa, se pueden copiar y pegar fácilmente en hojas de cálculo como Excel desde la fuente mencionada.
Descripción
Instalamos paquetes y cargamos librerías:
Leemos el conjunto de datos y filtramos por Pamplona:
farmacias_navarra <- read_excel("data/farmacias_navarra.xlsx")
farmacias_pamplona <- farmacias_navarra %>% filter(farmacias_navarra$Localidad == "Pamplona")
head(farmacias_pamplona)
# A tibble: 6 × 5
`Zona básica` Localidad Dirección Titular Código
<chr> <chr> <chr> <chr> <chr>
1 Azpilagaña Pamplona Calle San Juan Bosco 11 Aguirre Redondo… F00212
2 Azpilagaña Pamplona Calle Miguel Astráin 15 Aranaz Flamariq… F00412
3 Azpilagaña Pamplona Calle Alfonso el Batallador 9 Beñaran/Lashera… F00682
4 Azpilagaña Pamplona Calle Buenaventura Iñiguez 16 Bengoechea Marc… F00163
5 Azpilagaña Pamplona Calle Abejeras 47 Funes Barbarin,… F00612
6 Azpilagaña Pamplona Calle Iturrama 13 Garcia Diaz, Ana F00196
Como podemos ver en la base de datos, no contamos con las coordenadas geográficas de las farmacias. Para abordar esta limitación, utilizamos el geocoding, una técnica que nos proporcionará tanto la longitud como la latitud de cada una de las ubicaciones de las farmacias.
crds <- geo(street = paste(farmacias_pamplona$Dirección),
city = farmacias_pamplona$Localidad,
country = rep("Spain",nrow(farmacias_pamplona)))
Passing 211 addresses to the Nominatim single address geocoder
Query completed in: 214.9 seconds
En el dataset crds
, se observa una cantidad significativa de datos faltantes, los cuales corresponden a casos en los que el proceso de geocodificación no pudo ubicar correctamente las direcciones proporcionadas.
En concreto, tenemos un total de 21 valores faltantes
Tratamiento
Se ha detectado que en la base de datos con la que vamos a trabajar, crds
, hay 21 valores faltantes. Aunque parecen ser pocos, para un estudio espacial pueden ser muy necesarios. A continuación vemos todos las farmacias de las cuales no disponemos de coordenas.
# A tibble: 21 × 5
street city country lat long
<chr> <chr> <chr> <dbl> <dbl>
1 Calle Rinaldi 25 Pamplona Spain NA NA
2 Plaza Conde Oliveto 1 Pamplona Spain NA NA
3 Calle Jose Alonso 2 bajo local 2 Pamplona Spain NA NA
4 Plaza Ezcaba 13 Pamplona Spain NA NA
5 Calle Paseo Donantes de Sangre 25 Pamplona Spain NA NA
6 Calle Grupo Urdánoz 2 Pamplona Spain NA NA
7 Calle Malón de Echaide 9 Pamplona Spain NA NA
8 Calle Puente Miluce 2 Pamplona Spain NA NA
9 Calle Pintor Paret 5 Pamplona Spain NA NA
10 Avenida Carlos III 63 Pamplona Spain NA NA
# ℹ 11 more rows
Una opción sería eliminarlos, pero debido a la posible importancia uq epeudan tener vamos a ponerlos manualmente con los datos sacados de google maps.
# Definir las coordenadas manuales para las filas específicas
coordenadas_manuales <- list(
fila_12 = c(42.80674379553961, -1.6480299896529003),
fila_23 = c(42.81291463734093, -1.6435954359198524),
fila_24 = c(42.81530944387845, -1.648806047323351),
fila_40 = c(42.82870642838886, -1.6266716782437158),
filas_44=c(42.835371695786634, -1.628685389651506),
filas_60=c(42.799686029886495, -1.6753156166405574),
filas_73=c(42.80904181533022, -1.667347176159103),
filas_75=c(42.805846654552376, -1.6746564626656264),
filas_76=c(42.80812989756959, -1.6613897338300516),
filas_84=c(42.81112933774674, -1.6365967338299148),
filas_90=c( 42.81532066197641, -1.641577647564586),
filas_95=c(42.81262659865285, -1.6382941338298247),
filas_103=c(42.806323439176865, -1.6575222301338834),
filas_125=c(42.81633295117738, -1.6169081473233082),
filas_148=c(42.80123252536089, -1.6394610184886271),
filas_171=c(42.80905763429486, -1.6549702724628779),
filas_173=c(42.82658737022206, -1.650490816639263),
filas_176=c(42.82028666472282, -1.6688895800945691),
filas_184=c(42.83392570075721, -1.679330330132578),
filas_203=c( 42.81381679953136, -1.6589519319816806),
filas_208=c(42.814107487679095, -1.6623370761588538)
)
# Asignar las coordenadas manualmente a las filas correspondientes en crds
crds[c(12, 23, 24, 40, 44, 60, 73, 75, 76, 84, 90, 95, 103, 125, 148, 171, 173, 176, 184, 203, 208), c("lat", "long")] <- do.call(rbind, coordenadas_manuales)
Output
El dataset resultante es esencialmente el mismo que el anterior, pero ahora no contiene valores NA. Podemos verificar que ya no hay valores faltantes:
# Verificar si hay valores NA en las coordenadas en crds
if (any(is.na(crds$lat)) || any(is.na(crds$long))) {
print("Hay valores NA en las coordenadas en crds.")
} else {
print("No hay valores NA en las coordenadas en crds.")
}
[1] "No hay valores NA en las coordenadas en crds."
A pesar de los cambios realizados, el dataset sigue siendo de la clase data.frame, ya que estos ajustes se realizaron antes del cambio del sistema de referencia de coordenadas (CRS) y de la conversión a sf.
Ahora, ya podemos representar todos los puntos de las farmacias en el mapa:
mapa <- leaflet(data =crds) %>%
addTiles() %>%
addCircleMarkers(~crds$long, ~crds$lat,
radius = 5,
color = "#CD6090",
fillOpacity = 0.5, popup = ~street
)
mapa
#Guardamos los datos anteriores en un archivo xlsx:
ruta <- "crds.xlsx"
write.xlsx(crds, file = ruta)
El fichero generado con el procedimiento descrito anteriormente se puede descargar, en formato xlsx de aquí.
Proyecto de Innovación Educativa Emergente (PIEE-2737007)