Ubicaciones de McDonald’s en España
Input
El conjunto de datos a tratar contiene la ubicación de todos los restaurantes Mc Donald’s existentes en España. Dichos datos se han extraído de OpenStreetMaps (OSM).
OSM es un proyecto colaborativo accesible a todo el público, el cual ofrece datos geoespaciales agrupados por distintas temáticas, desde ríos y montañas hasta edificios y negocios específicos.
A continuación se muestra otra información de interés sobre OSM:
. Fecha de creación: julio 2004
· Licencia de uso: Los datos obtenidos de OSM están sujetos a la Open Database License (ODbL), que permite el uso y distribución de los datos con ciertas condiciones, como el reconocimiento de la fuente y la compartición de las modificaciones realizadas.
· Métodos de extracción de datos: Los datos de OpenStreetMap (OSM) se pueden extraer de diferentes maneras: directamente desde la web, utilizando servicios de exportación en línea, a través de programas como RStudio…
· Formatos: Los conjuntos de datos de OpenStreetMap (OSM) puenden estar disponibles en varios formatos, entre los cuales se incluyen GeoJSON, Shapefile, KML y CSV.
Descripcion
En vez de exportar directamente los datos del sitio web, se extraerán en R a través de una serie de comandos. Para facilitar proceso, se realizará un filtrado de los datos de OSM a partir de unas etiquetas. Cada etiqueta representa una temática distinta. En la wiki de OSM se puede acceder a todas ellas: https://wiki.openstreetmap.org/wiki/Map_features.
Cargamos las librerías necesarias en R:
Ya podemos comenzar. Vamos a crear una “caja” con las coordenadas de España en el siguiente orden: Oeste/Sur/Este/Norte. A continuación, crearemos un objeto a partir de la librería “osmdata” donde extraeremos los datos de cada restaurante. Para filtrar y obtener los datos que queremos, añadiremos las etiquetas “amenity” y “fast_food” encontradas en la wiki de OSM. Además, podemos filtrar por el nombre del restaurante. Yo tuve problemas en esta parte dado que no sabía como estaba registrado el nombre de Mc Donald’s, pues al principio lo escribí sin espacio y sin tilde. Sin embargo, descubrí que puedes poner el asterisco (*) cuando no estés segura de qué nomenclatura específica tiene en osm. De esta forma, te aparecerán todas las opciones. Tras crear este objeto que he llamado “q1”, lo transformamos en objeto sf para facilitar la representación.
bbox_spain <- c(-10, 30, 5, 46) # coordenadas España
q1 <- bbox_spain %>%
osmdata::opq(timeout = 2500) %>%
osmdata::add_osm_feature("name", "McDonald's") %>%
osmdata::add_osm_feature("amenity", "fast_food")
McDonalds <- osmdata_sf(q1)
McDonalds_sf <- McDonalds$osm_points
dim(McDonalds_sf)
[1] 5468 131
Como vemos, hemos obtenido un objeto sf con 5452 observaciones y 133 variables. Vamos a hacer una representación inicial de los datos:
En el mapa vemos que hay observaciones fuera de los límites de España: en Portugal, Francia e incluso África.
Tratamiento
Hay que tener en cuenta que con las coordenadas que hemos puesto para España, también salen puntos para Portugal y Francia. Para solventar este inconveniente y quedarnos únicamente con los Mc Donald’s de España, crearemos un objeto nombrado “spain_ccaa” con los datos y coordenadas específicas de cada Comunidad Autónoma. Esto lo hacemos con la librería “MapSpain”. Además, yo personalmente he quitado las islas (tanto Canarias como Baleares), Ceuta y Melilla por comodidad. Tras esto, se hace una intersección entre los datos que teníamos antes con este nuevo objeto “spain_ccaa” para descartar aquellos McDonald’s que estén fuera de España. En esta parte he tenido un inconveniente: me daba un error a la hora de hacer la intersección. Dicho error se debía a que ambos objetos (McDonalds_sf y spain_ccaa) no tienen el mismo crs o sistema de coordenadas. Por ello, modifiqué el código a la hora de crear “spain_ccaa” para que adoptara el mismo crs obtenido con osmdata:
spain_ccaa <- mapSpain::esp_get_ccaa(epsg="4326")
spain_ccaa <- spain_ccaa %>% filter(!codauto %in% c("04", "05", "18", "19"))
st_crs(spain_ccaa)
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]]
st_crs(McDonalds_sf)
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)"],
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]]
# vemos que ambos csr coinciden, es correcto hacer la intersección
spain2 <- spain_ccaa %>% group_by(codauto) %>% summarise()
def_mac <- st_intersection(McDonalds_sf,spain2)
Warning: attribute variables are assumed to be spatially constant throughout
all geometries
dim(def_mac)
[1] 1897 132
Ahora vemos que se ha reducido el número de observaciones: tenemos 1885 restaurantes Mc Donald’s y antes salían 5492.
Representemos de nuevo los datos
¿Tiene esto sentido? En la página web de Mc Donald’s España se indica que hay al rededor de 500 restaurantes. ¿Cómo es posible que hayamos obtenido 1885 observaciones?
Esto puede deberse a que existen datos duplicados. Es probable que diferentes usuarios realicen ediciones/importaciones de datos en la misma área sin estar al tanto de las contribuciones de otros, lo que puede resultar en datos duplicados.
Para paliar este problema, realizaremos clusters que unifiquen aquellas observaciones que se encuentren muy juntas. Utilizaremos un valor épsilon de 0.001, el cual equivale a una distancia aproximada de 110 metros (no tiene sentido que existan dos restaurantes Mc Donald’s en la misma calle y, si encontramos este caso en nuestra base de datos, los uniremos en un mismo cluster).
Adjuntando el paquete: 'dbscan'
The following object is masked from 'package:stats':
as.dendrogram
coords <- sf::st_coordinates(def_mac)
cluster <- dbscan(coords, eps = 0.001, minPts = 1)
clusters <- cluster$cluster
etiquetas <- as.factor(clusters)
def_mac$cluster <- etiquetas
datos_sin_dup <- def_mac[!duplicated(def_mac$cluster), ]
Output
class(datos_sin_dup)
[1] "sf" "data.frame"
dim(datos_sin_dup)
[1] 470 133
Hemos obtenido un nuevo objeto sf con 470 observaciones. Esto ya tiene sentido.
Vamos a representar nuestros datos definitivos:
Ya no hay datos fuera de los límites de España y además ya no hay presencia de duplicados.
A continuación guardaremos los datos en un fichero tipo “GPKG”.
sf::st_write(datos_sin_dup, "McDonalds_spain.gpkg")
El fichero resultante queda disponible para su descarga aquí.
Proyecto de Innovación Educativa Emergente (PIEE-2737007)