Ubicaciones de tiendas Zara en España

Zara
tienda
ropa
Autor/a
Afiliación

María Negredo Garralaga

Universitat de València

Fecha de publicación

29 de marzo de 2025

Input

El conjunto de datos que vamos a analizar contiene la ubicación de todas las tiendas de Zara en España. Esta información ha sido obtenida a partir de OpenStreetMap (OSM).

OSM es una plataforma colaborativa de acceso público que proporciona datos geoespaciales organizados en diferentes categorías, desde ríos y montañas hasta edificaciones y establecimientos comerciales.

A continuación, se presentan algunos detalles relevantes sobre OSM:

• Fecha de creación: Julio de 2004.

• Licencia de uso: Los datos de OSM están bajo la licencia Open Database License (ODbL), la cual permite su uso y distribución bajo ciertas condiciones, como el reconocimiento de la fuente y la posibilidad de compartir modificaciones realizadas.

• Métodos de extracción de datos: Existen diversas formas de obtener información de OSM, como la descarga directa desde su sitio web, el uso de herramientas de exportación en línea o programas como RStudio.

• Formatos: Los datos de OpenStreetMap pueden encontrarse en distintos formatos, incluyendo GeoJSON, Shapefile, KML y CSV.

Descripción

En lugar de descargar los datos directamente desde la web de OSM, los extraeremos utilizando R mediante una serie de comandos. Para optimizar el proceso, filtraremos la información según etiquetas específicas, donde cada etiqueta representa una categoría diferente. En la web de OSM se pueden consultar todas las etiquetas disponibles en el siguiente enlace:

https://wiki.openstreetmap.org/wiki/Map_features.

Cargamos las librerías necesarias en R:

install.packages("dbscan", repos = "https://cran.rstudio.com/")
Installing package into 'C:/Users/scorp/AppData/Local/R/win-library/4.4'
(as 'lib' is unspecified)
package 'dbscan' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\scorp\AppData\Local\Temp\RtmpSCXgL2\downloaded_packages
Warning: package 'purrr' was built under R version 4.4.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Linking to GEOS 3.12.2, GDAL 3.9.3, PROJ 9.4.1; sf_use_s2() is TRUE
Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright

Vamos a empezar creando una especie de caja que contendrá las coordenadas de España. Estas coordenadas estarán organizadas en un orden específico: primero el Oeste, luego el Sur, después el Este y finalmente el Norte. Esta caja servirá para delimitar el área geográfica de nuestro análisis. Una vez tengamos definida esta caja, vamos a crear un objeto utilizando la librería osmdata, que nos permitirá extraer los datos de los restaurantes dentro de esa área geográfica.

Para filtrar la información y asegurarnos de que obtenemos los datos que realmente nos interesan, añadiremos dos etiquetas específicas: “shop” y “clothes”, que están documentadas en la web de OSM. Esto nos ayudará a centrarnos solo en las tiendas Además, si queremos afinar aún más la búsqueda, podemos incluir el nombre específico de la tienda, lo que nos permitirá localizar exactamente lo que buscamos.

Una vez que hayamos creado este objeto, que en mi caso llamé q1, lo transformamos en un objeto del tipo sf (simple features), lo que nos permitirá manejarlo de forma más sencilla y representar la información geográfica de manera más eficiente.

Spain <- mapSpain::esp_get_country()
bbox_spain <- sf::st_bbox(Spain)
Spain <- st_transform(Spain, crs = 4326)

q1 <- bbox_spain %>%
  osmdata::opq(timeout = 2500) %>%
  osmdata::add_osm_feature("name", "Zara") %>%
  osmdata::add_osm_feature("shop", "clothes")
zara <- osmdata_sf(q1)
zara_sf <- zara$osm_points
dim(zara_sf)
[1] 447  69

Como podemos observar, hemos obtenido un objeto sf con 447 observaciones y 69 variables.

Ahora procedemos a realizar la representación gráfica.

library(leaflet)

zara_sf %>%
  leaflet() %>%
  addTiles() %>%
  addPolygons(data = Spain, color = "gray", weight = 1, opacity = 0.5, fillOpacity = 0.1) %>%  # Mapa de España
  addCircles(
    lng = ~st_coordinates(geometry)[, 1],  # Coordenada X (longitud)
    lat = ~st_coordinates(geometry)[, 2],  # Coordenada Y (latitud)
    radius = 6,                           # Tamaño del círculo
    color = "blue",                       # Color del borde
    fillColor = "blue",                   # Color de relleno
    fillOpacity = 0.5,                    # Opacidad del relleno
    stroke = TRUE,                        # Mostrar borde
    weight = 1,                           # Grosor del borde
    popup = ~paste("<b>Repsol</b><br>", "Ubicación: ", name)  # Pop-up con el nombre de la ubicación
  ) %>%
  setView(lng = mean(bbox_spain[c("xmin", "xmax")]), lat = mean(bbox_spain[c("ymin", "ymax")]), zoom = 6)  # Centrado en España

En el gráfico observamos que, en lugar de obtener solo las ubicaciones de las tiendas en España, también han aparecido resultados de Francia y Portugal. Esto no es lo que buscábamos, así que vamos a solucionarlo. Ajustaremos los parámetros necesarios para asegurarnos de que solo se muestren las tiendas dentro de España, excluyendo cualquier otra ubicación.

zaraspain <- zara_sf %>%
  st_intersection(Spain)
Warning: attribute variables are assumed to be spatially constant throughout
all geometries

Tratamiento

Para solucionar este problema y asegurarnos de obtener solo las ubicaciones de las tiendas Zara en España, vamos a crear un objeto llamado “spain_ccaa” con los datos y coordenadas específicas de cada Comunidad Autónoma. Esto lo haremos utilizando la librería “MapSpain”. Después, realizamos una intersección entre los datos iniciales y este nuevo objeto “spain_ccaa” para eliminar las tiendas Zara que se encuentran fuera de España.

spain_ccaa <- mapSpain::esp_get_ccaa(epsg="4326")

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)"],
        MEMBER["World Geodetic System 1984 (G2296)"],
        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(zara_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]]

Vamos que los dos CRS coinciden por lo que podemos hacer la intersección sin ningún problema.

spain2 <- spain_ccaa %>% group_by(codauto) %>% summarise()
zaradef <- st_intersection(zara_sf,spain2)
Warning: attribute variables are assumed to be spatially constant throughout
all geometries
dim(zaradef)
[1] 247  70

Una vez ya hemos hecho la intersección ya vemos que se han reducido el número de observaciones. Antes encontrabamos 447 y ahora obtenemos 247. Vamos a proceder a volver a graficar con este resultado.

zaradef %>%
  leaflet::leaflet() %>%
  leaflet::addTiles() %>%
  leaflet::addCircles()

Al buscar por internet, he encontrado que hay prácticamente el mismo número de tiendas Zara que los resultados obtenidos, aunque el número es un poco más bajo. Sin embargo, creo que nuestros datos están actualizados, ya que al comprobar las tiendas de Zara en mi ciudad (Zaragoza), he notado que aquellas que cerraron hace poco no eaparecen en el gráfico. En concreto, una tienda que cerró hace poco más de un año no aparece en los resultados. Esto sugiere que los datos de OSM están bastante actualizados, mientras que los datos que encontré en internet pueden ser más generales y estar menos actualizados.

Output

En resumen, hemos logrado extraer y filtrar de manera efectiva los datos de las tiendas Zara en España utilizando OSM. A lo largo del proceso, hemos solucionado diversos inconvenientes, como la aparición de ubicaciones fuera de España, y hemos confirmado que los datos de OSM están actualizados y son bastante precisos. La intersección entre los datos obtenidos y las coordenadas de las comunidades autónomas nos ha permitido obtener una representación fiable de las tiendas dentro del territorio español. Gracias a estos ajustes, podemos concluir que no es necesario aplicar técnicas adicionales como el clustering, ya que los datos obtenidos no presentan duplicados ni inconsistencias. De esta forma, hemos conseguido un análisis preciso y eficiente para nuestro objetivo. A continuación, procedemos a guardar los datos en un fichero tipo “GDPKG”

sf::st_write(zaradef, "zaraspain.gpkg", delete_layer = TRUE)

El fichero generado con este procedimiento se puede descargar de aquí.



Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394