A través de diferentes consultas a la API de la plataforma “Precios Claros” del gobierno nacional, intentaremos calcular el precio promedio de la Coca Cola de 2.25 litros a nivel nacional.
library(jsonlite)
library(tidyverse)
Para comenzar, consultamos el precio de la Coca Cola para una sóla sucursal:
coca_cola <- fromJSON("https://d3e6htiiul5ek9.cloudfront.net/prod/producto?limit=30&id_producto=7790895000997&array_sucursales=15-1-5248")
glimpse(coca_cola)
## List of 7
## $ status : int 200
## $ totalPagina : int 1
## $ producto :List of 15
## ..$ precio_unitario_bulto_min_sin_iva: NULL
## ..$ precio_bulto_min_con_iva : NULL
## ..$ precio_unitario_bulto_max_sin_iva: NULL
## ..$ marca : chr "COCA COLA"
## ..$ precio_bulto_max_sin_iva : NULL
## ..$ id : chr "7790895000997"
## ..$ precio_bulto_min_sin_iva : NULL
## ..$ precioMax : num 205
## ..$ precio_unitario_bulto_max_con_iva: NULL
## ..$ precioMin : num 205
## ..$ nombre : chr "Coca Cola Sabor Original 2.25 Lt"
## ..$ precio_unitario_bulto_min_con_iva: NULL
## ..$ precio_bulto_max_con_iva : NULL
## ..$ presentacion : chr "2.25 lt"
## ..$ cantSucursalesDisponible : int 1
## $ maxLimitPermitido : int 50
## $ sucursalesConProducto: int 1
## $ total : int 2244
## $ sucursales :'data.frame': 1 obs. of 15 variables:
## ..$ banderaId : int 1
## ..$ unidad_venta : chr ""
## ..$ lat : chr "-34.6041648"
## ..$ lng : chr "-58.4586699"
## ..$ sucursalNombre : chr "5248 - LA PATERNAL"
## ..$ id : chr "5248"
## ..$ sucursalTipo : chr "Autoservicio"
## ..$ provincia : chr "AR-C"
## ..$ preciosProducto :'data.frame': 1 obs. of 7 variables:
## .. ..$ promo1 :'data.frame': 1 obs. of 4 variables:
## .. ..$ precio_unitario_con_iva: chr ""
## .. ..$ precioLista : num 205
## .. ..$ precio_unitario_sin_iva: chr ""
## .. ..$ promo2 :'data.frame': 1 obs. of 4 variables:
## .. ..$ precio_bulto_sin_iva : chr ""
## .. ..$ precio_bulto_con_iva : chr ""
## ..$ actualizadoHoy : logi TRUE
## ..$ direccion : chr "Paysandu 1816"
## ..$ banderaDescripcion : chr "Supermercados DIA"
## ..$ localidad : chr "CAPITAL FEDERAL"
## ..$ comercioRazonSocial: chr "DIA Argentina S.A"
## ..$ comercioId : int 15
Como podemos ver, la consulta nos trajo toda la información que hay para ese producto en esa sucursal y lo más importante es que tanto el precioMax como el precioMin coinciden y podemos usar una de estas dos variables para calcular el precio promedio de la Coca Cola en Argentina. Para esto, deberíamos consultar el precio de este producto en todas las sucursales de Argentina. Como en clase ya habíamos generado un data frame de sucursales, aprovecharemos esta información para mapear a través del id de cada sucursal el precio de este producto en particular:
sucursales <- read.csv("sucursales.csv")
##precios <- map(sucursales$id,function(sucursal_id){
## print(which(sucursales$id==sucursal_id))
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/producto?limit=30&id_producto=7790895000997&array_sucursales=",sucursal_id,sep="")
## resultado <- fromJSON(consulta)
## resultado$producto$precioMax
## })
Como resultado del mapeo, obtenemos una lista de listas con los precios de la Coca Cola de 2.25 litros para cada sucursal de Argentina. Para poder calcular el precio promedio, transformaremos la lista en un data frame:
##precios_lista <- do.call(rbind,precios)
## write.csv(precios_lista,"precios_coca.csv")
Una vez listo el data frame calculamos el precio promedio a través de la función summary.
precios_lista <- read.csv("precios_coca.csv")
precios_lista <- rename(precios_lista, precio=V1)
summary(precios_lista)
## X precio
## Min. : 1.0 Min. :135.0
## 1st Qu.: 528.2 1st Qu.:183.8
## Median :1055.5 Median :193.4
## Mean :1055.5 Mean :194.6
## 3rd Qu.:1582.8 3rd Qu.:198.2
## Max. :2110.0 Max. :326.0
Para calcular el precio promedio de este producto a nivel provincial, incorporaremos el precio de la Coca Cola en cada una de las sucursales al data frame sucursales, realizamos algunas modificaciones necesarias y agrupamos por provincias.
##sucursales$precio_coca <- precios
##sucursales$precio_coca <- gsub("NULL", "", sucursales$precio_coca)
##sucursales <- transform(sucursales, precio_coca = as.numeric(precio_coca))
##precios_prov <- (sucursales) %>%
## filter(!is.na (sucursales$precio_coca)) %>%
## group_by(provincia) %>%
## summarise(mean(precio_coca))
Nos encontramos que los nombres de las provincias están escritos con una especie de codificación, al ser 22 valores guardamos este objeto en un csv y hacemos los ajustes manuales en Excel.
##write.csv(precios_prov, "precios_prov.csv")
precios_prov <- read.csv("precios_prov.csv")
glimpse(precios_prov)
## Rows: 22
## Columns: 3
## $ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1~
## $ provincia <chr> "Salta", "Buenos Aires", "Ciudad Autónoma de Buenos ~
## $ mean.precio_coca. <dbl> 169.9679, 191.8769, 202.5343, 184.2239, 171.1500, 17~
level_order <- precios_prov %>%
arrange(mean.precio_coca.) %>%
pull(provincia)
ggplot(precios_prov %>%
arrange(mean.precio_coca.))+
geom_bar(aes(x=factor(provincia,levels=level_order), weight=mean.precio_coca.), fill="blue")+
labs(title = "Precio promedio de la Coca Cola de 2.25 litros en las provincicas de Argentina",
x = "Provincia",
y = "Precio Promedio",
caption = "Fuente: Precios Claros")+
theme(axis.text.x = element_text(colour = "gray25",size = 8, angle = 90))
Como podemos el precio promedio más bajo de la Coca Cola podemos encontrarlo en Tucumán y otras provincias del NOA, NEA y de Cuyo. En cambio el precio promedio más elevado para este mismo producto lo encontramos en Santa Fe y Córdoba.
En la clase se realizó un scrapeo para obtener un listado de precios de los productos de la página web Precios Claros.
load(url("https://github.com/martinmontane/martinmontane.github.io/raw/master/listaPreciosXSucursal.RData"))
listaPreciosXSucursal <- bind_rows(listaPreciosXSucursal)
listaPreciosXSucursal <- listaPreciosXSucursal <- listaPreciosXSucursal %>% select(-c(3,7))
listaPreciosXSucursal <- listaPreciosXSucursal %>% rename(precio=precioMin)
A continuación, se pretende asociar los productos a sus categorías. Para ello, tenemos que:
categorias <- fromJSON("https://d3e6htiiul5ek9.cloudfront.net/prod/categorias")
categorias <- bind_rows(categorias)
cat_general <- filter(categorias$categorias, nivel == 1)
cat_general
## nivel categoriaRequerida nombre
## 1 1 NA ALIMENTOS CONGELADOS
## 2 1 NA ALMACÉN
## 3 1 NA BEBIDAS CON ALCOHOL
## 4 1 NA BEBIDAS SIN ALCOHOL
## 5 1 NA BEBÉS
## 6 1 NA ELECTRODOMÉSTICOS Y EQUIPAMIENTO PARA EL HOGAR
## 7 1 NA FRESCOS
## 8 1 NA LIMPIEZA
## 9 1 NA MASCOTAS
## 10 1 NA MATERIALES PARA LA CONSTRUCCIÓN
## 11 1 NA PERFUMERÍA y CUIDADO PERSONAL
## 12 1 NA SIN CATEGORÍA
## productos id padres
## 1 5045 01
## 2 51943 02
## 3 10054 04
## 4 5558 05
## 5 3237 03
## 6 5060 50
## 7 44372 06
## 8 15984 07
## 9 2091 08
## 10 5434 70
## 11 27351 09
## 12 34292 99
Categoría 01
##offset_01 <- seq(0,5045, by=50)
##lista_01 <- map(offset_01,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=01&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_01 <- bind_rows(lista_01)
##productos_01 <- mutate(productos_01, categoria = 01)
##write.csv(productos_01, "productos_01.csv")
productos_01 <- read.csv("productos_01.csv")
Categoría 02
##offset_02 <- seq(0,51943, by=50)
##lista_02 <- map(offset_02,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=02&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_02 <- bind_rows(lista_02)
##productos_02 <- mutate(productos_02, categoria = 02)
##write.csv(productos_02, "productos_02.csv")
productos_02 <- read.csv("productos_02.csv")
Categoría 03
##offset_03 <- seq(0,3237, by=50)
##lista_03 <- map(offset_03,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=03&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_03 <- bind_rows(lista_03)
##productos_03 <- mutate(productos_03, categoria = 03)
##write.csv(productos_03, "productos_03.csv")
productos_03 <- read.csv("productos_03.csv")
productos_03 <- transform (productos_03,id = as.character(id))
Categoría 04
##offset_04 <- seq(0,10054, by=50)
##lista_04 <- map(offset_04,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=04&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_04 <- bind_rows(lista_04)
##productos_04 <- mutate(productos_04, categoria = 04)
##write.csv(productos_04, "productos_04.csv")
productos_04 <- read.csv("productos_04.csv")
productos_04 <- transform (productos_04,id = as.character(id))
Categoría 05
##offset_05 <- seq(0,5558, by=50)
##lista_05 <- map(offset_05,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=05&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_05 <- bind_rows(lista_05)
##productos_05 <- mutate(productos_05, categoria = 05)
##write.csv(productos_05, "productos_05.csv")
productos_05 <- read.csv("productos_05.csv")
Categoría 06
##offset_06 <- seq(0,44372, by=50)
##lista_06 <- map(offset_06,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=06&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_06 <- bind_rows(lista_06)
##productos_06 <- mutate(productos_06, categoria = 06)
##write.csv(productos_06, "productos_06.csv")
productos_06 <- read.csv("productos_06.csv")
Categoría 07
##offset_07 <- seq(0,15984, by=50)
##lista_07 <- map(offset_07,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=07&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_07 <- bind_rows(lista_07)
##productos_07 <- mutate(productos_07, categoria = 07)
##write.csv(productos_07, "productos_07.csv")
productos_07 <- read.csv("productos_07.csv")
productos_07 <- transform (productos_07,id = as.character(id))
Categoría 08
##offset_08 <- seq(0,2091, by=50)
##lista_08 <- map(offset_08,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=08&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_08 <- bind_rows(lista_08)
##productos_08 <- mutate(productos_08, categoria = 08)
##write.csv(productos_08, "productos_08.csv")
productos_08 <- read.csv("productos_08.csv")
productos_08 <- transform (productos_08,id = as.character(id))
Categoría 09
##offset_09 <- seq(0,27351, by=50)
##lista_09 <- map(offset_09,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=09&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_09 <- bind_rows(lista_09)
##productos_09 <- mutate(productos_09, categoria = 09)
##write.csv(productos_09, "productos_09.csv")
productos_09 <- read.csv("productos_09.csv")
productos_09 <- transform (productos_09,id = as.character(id))
Categoría 50
##offset_50 <- seq(0,5060, by=50)
##lista_50 <- map(offset_50,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=50&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_50 <- bind_rows(lista_50)
##productos_50 <- mutate(productos_50, categoria = 50)
##write.csv(productos_50, "productos_50.csv")
productos_50 <- read.csv("productos_50.csv")
productos_50 <- transform (productos_50,id = as.character(id))
Categoría 70
##offset_70 <- seq(0,5434, by=50)
##lista_70 <- map(offset_70,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=70&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_70 <- bind_rows(lista_70)
##productos_70 <- mutate(productos_70, categoria = 70)
##write.csv(productos_70, "productos_70.csv")
productos_70 <- read.csv("productos_70.csv")
productos_70 <- transform (productos_70,id = as.character(id))
Categoría 99
##offset_99 <- seq(0,34292, by=50)
##lista_99 <- map(offset_99,function(offsetNumber){
## cat("offset: ",offsetNumber,"\r")
## consulta <- paste("https://d3e6htiiul5ek9.cloudfront.net/prod/productos?&array_sucursales=15-1-5248,12-1-2,10-3-396,15-1-5232,15-1-52,15-1-24,23-1-6220,24-2-267,15-1-371,24-2-135,10-1-219,12-1-103,15-1-475,15-1-473,9-3-5263,10-3-420,15-1-492,15-1-302,24-2-140,19-1-00082,23-1-6224,10-3-687,24-2-123,15-1-627,10-3-539,15-1-490,15-1-540,15-1-588,10-3-561,10-3-622&limit=50&sort=-cant_sucursales_disponible&id_categoria=99&offset=",offsetNumber)
## resultado <- fromJSON(consulta)
## resultado$productos
##})
##productos_99 <- bind_rows(lista_99)
##productos_99 <- mutate(productos_99, categoria = 99)
##write.csv(productos_99, "productos_99.csv")
productos_99 <- read.csv("productos_99.csv")
Unimos todos los data frames en uno
productos_total <- bind_rows(productos_01, productos_02, productos_03, productos_04,
productos_05, productos_06, productos_07, productos_08,
productos_09, productos_50, productos_70, productos_99)
productos_cat <- merge(listaPreciosXSucursal, productos_total, by="id", all.x = TRUE)
productos_cat <- transform(productos_cat, categoria = as.factor(categoria))
print(summary(productos_cat$categoria))
## 1 3 4 5 6 7 8 9 50 99 NA's
## 6057 7157 27561 22163 11473 40221 4538 65356 160 49 366097
Como resultado del trabajo realizado vemos que no se le asignó categoría al 66% de los productos. Esto puede ser porque el escrapreo se realizó sobre las sucursales cercanas a mi ubicación. Temía que esto pudiera ocurrir y quizás hubiese sido mejor hacer un escrapeo de los productos por categoría por cada una de las sucursales cargadas en Precios Claros, ya que tenía un listado de las sucursales pero eso implicaba mayor complejidad en el código.