Preus a les gasolineres d’Espanya

Quinen preus fixen les gasolineres per cada producte al llarg del temps?

Published

February 11, 2024

Quina informació hi ha al Geoportal?

  • On s’ón’ubiquen els punts de recàrrega?
  • Quin carburant ofereixen?
  • Quin preu cobren? Com canvia al llarg del temps?
  • Quin horari obre?
  • És d’autoservei?
  • És una cooperativa?
  • Qui n’és el propietari?
  • Existeixen portals similars a Europa

Com obtenim les dades?

Connexió amb la API

Cal connectarnos a la API del geoportal per obtenir les dades que ens interessen. Descarregarem en format .json, que R llegirà com llista. Finalment apilarem totes les observacions en una taula.

El geoportal ofereix múltiples APIs que donen accés a diferent informació (Servicios REST). Estem interessats en l’evolució dels preus de cada producte així que utilitzem la següent estructura:

Part comú: Sempre serà la mateixa

https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/

Part Específica: Escollirem i parametritzarem en funció de l’informació que volem

EstacionesTerrestresHist/FiltroProvinciaProducto/{FECHA}/{IDPROVINCIA}/{IDPRODUCTO}

Exemple en R

Utilitzarem les següents llibreries d’R:

suppressWarnings(suppressMessages({
  library(dplyr)
  library(purrr)
  library(httr2)
}))

Estem interessats en el preu de la gasolina 95 E5. Ens centrem en la província de Barcelona i volem l’informació del dia anterior. Els productes i províncies tenen codis associats, codificarem la data en format dd-mm-yy:

data <- format(Sys.Date() - 1, "%d-%m-%Y")
producte <- "01"
provincies <- set_names(
  c("08", "17", "25", "43"), 
  c("barcelona", "girona", "lleida", "tarragona")
)

Construim l’url per cada província:

base_url <- provincies %>% 
  map(\(prov) paste0(
    "https://sedeaplicaciones.minetur.gob.es/",
    "ServiciosRESTCarburantes/PreciosCarburantes/",
    "EstacionesTerrestresHist/FiltroProvinciaProducto/",
    data, "/", prov, "/", producte
))

Demanem l’informació, la convertim en llista i l’apilem en una taula per cada província:

response <- map(base_url, \(url) req_perform(request(url)))

tbl <- response %>% 
  map(\(resp){
    resp_body_json(resp)[["ListaEESSPrecio"]] %>% 
      map(\(json) as_tibble(list_flatten(json))) %>% 
      bind_rows() %>% 
      mutate(PrecioProducto = as.numeric(sub(",", ".", PrecioProducto)))
  })

Fem una ullada als preus:

with(list_c(tbl), boxplot(PrecioProducto ~ Provincia, xlab = "", ylab = ""))

hist(list_c(tbl)[["PrecioProducto"]], breaks = 30, main = "", xlab = "", ylab = "")

Més enllà

  • Mapa de preus de gasolineres