Las librerías a usar.
library(readr)
library(ggplot2)
library(reshape2)
library(wordcloud)
Loading required package: RColorBrewer
library(DataExplorer)
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
[30m-- [1mAttaching packages[22m --------------------------------------- tidyverse 1.3.0 --[39m
[30m[32mv[30m [34mtibble [30m 2.1.3 [32mv[30m [34mdplyr [30m 0.8.3
[32mv[30m [34mtidyr [30m 1.0.2 [32mv[30m [34mstringr[30m 1.4.0
[32mv[30m [34mpurrr [30m 0.3.3 [32mv[30m [34mforcats[30m 0.4.0[39m
[30m-- [1mConflicts[22m ------------------------------------------ tidyverse_conflicts() --
[31mx[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31mx[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
library(DBI)
library(tibble)
library(RSQLite)
library(dbplyr)
Attaching package: 㤼㸱dbplyr㤼㸲
The following objects are masked from 㤼㸱package:dplyr㤼㸲:
ident, sql
library(magrittr)
Attaching package: 㤼㸱magrittr㤼㸲
The following object is masked from 㤼㸱package:purrr㤼㸲:
set_names
The following object is masked from 㤼㸱package:tidyr㤼㸲:
extract
rm(list=ls())
gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 2296944 122.7 3860925 206.2 3860925 206.2
Vcells 4168522 31.9 8388608 64.0 6249239 47.7
Las Mediciones corresponden a precios de diversos alimentos comercializados en la Ciudad Autónoma de Buenos Aires durante el periodo de Noviembre 2018 a Febrero 2019 a partir de un scrapeo a la página de preciosclaro
Se utilizaron para este trabajo datos de precios, sucursales y productos del programa “Precios Claros”. El proceso de relevamiento de precios fue generado de manera automática mediante la técnica de web crawling
ddbb_precios <- "../_datasets/precios.db"
con <- dbConnect(RSQLite::SQLite(), dbname = ddbb_precios)
(precios <- dbGetQuery(con, "SELECT * FROM precios") %>% as_tibble(.))
#Convierto a fecha y factor
precios$fecha %<>% as.Date(., origin = "1970-01-01")
precios$idProducto %<>% as.factor(.)
precios$idSucursal %<>% as.factor(.)
# Tabla Productos
###############################
(productos <- dbGetQuery(con, "SELECT * FROM productos") %>% as_tibble(.))
#Convierto a factor
productos$id %<>% as.factor(.)
productos$marca %<>% as.factor(.)
# Tabla Sucursales
###############################
(sucursales <- dbGetQuery(con, "SELECT * FROM sucursales") %>% as_tibble(.))
#Convierto a factor
sucursales$id %<>% as.factor(.)
sucursales$sucursalTipo %<>% as.factor(.)
sucursales$comercioRazonSocial %<>% as.factor(.)
sucursales$provincia %<>% as.factor(.)
sucursales$localidad %<>% as.factor(.)
glimpse(sucursales)
Observations: 706
Variables: 9
$ id [3m[38;5;246m<fct>[39m[23m 15-1-480, 3-1-1506, 10-3-675, 3-1-1507, 3-1-29, 10-3-300, 15-1-498, 1...
$ sucursalNombre [3m[38;5;246m<chr>[39m[23m "480 - Saavedra", "GRAL PAZ - NORTE", "Cabildo 4861", "GRAL PAZ - SUR...
$ sucursalTipo [3m[38;5;246m<fct>[39m[23m Autoservicio, Autoservicio, Autoservicio, Autoservicio, Autoservicio,...
$ comercioRazonSocial [3m[38;5;246m<fct>[39m[23m DIA Argentina S.A, Deheza S.A.I.C.F. e I., INC S.A., Deheza S.A.I.C.F...
$ direccion [3m[38;5;246m<chr>[39m[23m "Av Dr. Ricardo Balbin 4881", "San Juan Bautista De La Salle 4356", "...
$ provincia [3m[38;5;246m<fct>[39m[23m AR-C, AR-C, AR-C, AR-C, AR-C, AR-C, AR-C, AR-C, AR-C, AR-C, AR-C, AR-...
$ localidad [3m[38;5;246m<fct>[39m[23m capital federal, capital federal, ciudad autónoma de buenos aires, ca...
$ lat [3m[38;5;246m<dbl>[39m[23m -34.55212, -34.55945, -34.54004, -34.55998, -34.54147, -34.54054, -34...
$ lng [3m[38;5;246m<dbl>[39m[23m -58.49841, -58.50503, -58.47474, -58.50454, -58.47384, -58.47205, -58...
rm(list=ls())
gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 3157955 168.7 4764052 254.5 4764052 254.5
Vcells 9029784 68.9 35626142 271.9 182019909 1388.8
Tengo un par de csv y direcatamente los leo.
precios <- read_csv("./files/Datasets originales/precios.txt.zip")
productos <- read.csv("./files/Datasets adicionales/productos_categoria.csv")
sucursales <- read.csv("./files/Datasets adicionales/sucursales_barrios.csv")
## inner Join
inner join
glimpse(precios)
Observations: 1,584,661
Variables: 5
$ producto [3m[38;5;246m<chr>[39m[23m "7790762052364", "12-1-2800000937881", "77934400...
$ sucursal [3m[38;5;246m<chr>[39m[23m "12-1-44", "12-1-44", "12-1-44", "12-1-44", "12-...
$ precio [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 92.87, 81.99, 70.25, 60.39...
$ fecha [3m[38;5;246m<dttm>[39m[23m 2019-01-15 04:51:28, 2019-01-15 04:51:28, 2019-...
$ medicion [3m[38;5;246m<dbl>[39m[23m 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, ...
glimpse(productos)
Observations: 1,016
Variables: 6
$ X_id..oid [3m[38;5;246m<fct>[39m[23m 5cbc69be7af152186c0cd784, 5cbc69be7af152186c...
$ nombre [3m[38;5;246m<fct>[39m[23m Aceite de Girasol Can?uelas 1.5 Lt, Aceite d...
$ Categoria [3m[38;5;246m<fct>[39m[23m Aceite, Aceite, Aceite, Aceite, Aceite, Acei...
$ marca [3m[38;5;246m<fct>[39m[23m CAÑUELAS, CAÑUELAS, COCINERO, COCINERO, NATU...
$ presentacion [3m[38;5;246m<fct>[39m[23m 1.5 lt, 900.0 cc, 1.5 lt, 900.0 ml, 1.5 lt, ...
$ id [3m[38;5;246m<fct>[39m[23m 7792180001665, 7792180001641, 7790060023684,...
Agregamos la info de los productos al df “precios”. Utilizamos inner join que matchea la columna producto del data frame precios y la columna ID de la columna del data frame productos
data1 <- precios %>% inner_join(productos, by = c("producto" = "id"))
glimpse(data1)
Observations: 1,559,443
Variables: 10
$ producto [3m[38;5;246m<chr>[39m[23m "7790762052364", "12-1-2800000937881", "7793...
$ sucursal [3m[38;5;246m<chr>[39m[23m "12-1-44", "12-1-44", "12-1-44", "12-1-44", ...
$ precio [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 92.87, 81.99, 70.25, 6...
$ fecha [3m[38;5;246m<dttm>[39m[23m 2019-01-15 04:51:28, 2019-01-15 04:51:28, 2...
$ medicion [3m[38;5;246m<dbl>[39m[23m 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,...
$ X_id..oid [3m[38;5;246m<fct>[39m[23m 5cbc69be7af152186c0cd67e, 5cbc69be7af152186c...
$ nombre [3m[38;5;246m<fct>[39m[23m Vino Rosado Seleccion Especial Santa Ana 700...
$ Categoria [3m[38;5;246m<fct>[39m[23m Bebidas con alcohol, Conservas, Bebidas con ...
$ marca [3m[38;5;246m<fct>[39m[23m SANTA ANA, COTO, NIETO SANETINER, BODEGA TRA...
$ presentacion [3m[38;5;246m<fct>[39m[23m 700.0 ml, 81.0 gr, 750.0 cc, 750.0 ml, 642.0...
Creamos un nuevo dataset. Compuesto por ahora 10 variables. entre Precios y productos
Quedan sucursales
glimpse(sucursales)
Observations: 837
Variables: 15
$ X_id..oid [3m[38;5;246m<fct>[39m[23m 5cbc698b7af152186c0cd13f, 5cbc698b7af...
$ sucursalTipo [3m[38;5;246m<fct>[39m[23m Autoservicio, Autoservicio, Autoservi...
$ direccion [3m[38;5;246m<fct>[39m[23m Av Dr. Ricardo Balbin 4881, San Juan ...
$ provincia [3m[38;5;246m<fct>[39m[23m AR-C, AR-C, AR-C, AR-C, AR-C, AR-C, A...
$ banderaId [3m[38;5;246m<int>[39m[23m 1, 1, 3, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1...
$ localidad [3m[38;5;246m<fct>[39m[23m Capital Federal, CAPITAL FEDERAL, Ciu...
$ banderaDescripcion [3m[38;5;246m<fct>[39m[23m Supermercados DIA, DEHEZA S.A.I.C.F. ...
$ lat [3m[38;5;246m<dbl>[39m[23m -34.55212, -34.55945, -34.54004, -34....
$ comercioRazonSocial [3m[38;5;246m<fct>[39m[23m DIA Argentina S.A, Deheza S.A.I.C.F. ...
$ lng [3m[38;5;246m<dbl>[39m[23m -58.49841, -58.50503, -58.47474, -58....
$ sucursalNombre [3m[38;5;246m<fct>[39m[23m 480 - Saavedra, GRAL PAZ - NORTE, Cab...
$ comercioId [3m[38;5;246m<int>[39m[23m 15, 3, 10, 3, 3, 10, 15, 15, 15, 10, ...
$ sucursalId [3m[38;5;246m<int>[39m[23m 480, 1506, 675, 1507, 29, 300, 498, 1...
$ id [3m[38;5;246m<fct>[39m[23m 15-1-480, 3-1-1506, 10-3-675, 3-1-150...
$ barrio [3m[38;5;246m<fct>[39m[23m SAAVEDRA, 0, SAAVEDRA, SAAVEDRA, SAAV...
Agregamos la info de sucursales a “data1”, se crea un nuevo data frame, ver que ya no es necesario data1
data2 <- data1 %>% inner_join(sucursales, by = c("sucursal" = "id"))
glimpse(data2)
Observations: 1,559,443
Variables: 24
$ producto [3m[38;5;246m<chr>[39m[23m "7790762052364", "12-1-2800000937881"...
$ sucursal [3m[38;5;246m<chr>[39m[23m "12-1-44", "12-1-44", "12-1-44", "12-...
$ precio [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 92.87, 81.99, 7...
$ fecha [3m[38;5;246m<dttm>[39m[23m 2019-01-15 04:51:28, 2019-01-15 04:5...
$ medicion [3m[38;5;246m<dbl>[39m[23m 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6...
$ X_id..oid.x [3m[38;5;246m<fct>[39m[23m 5cbc69be7af152186c0cd67e, 5cbc69be7af...
$ nombre [3m[38;5;246m<fct>[39m[23m Vino Rosado Seleccion Especial Santa ...
$ Categoria [3m[38;5;246m<fct>[39m[23m Bebidas con alcohol, Conservas, Bebid...
$ marca [3m[38;5;246m<fct>[39m[23m SANTA ANA, COTO, NIETO SANETINER, BOD...
$ presentacion [3m[38;5;246m<fct>[39m[23m 700.0 ml, 81.0 gr, 750.0 cc, 750.0 ml...
$ X_id..oid.y [3m[38;5;246m<fct>[39m[23m 5cbc698b7af152186c0cd187, 5cbc698b7af...
$ sucursalTipo [3m[38;5;246m<fct>[39m[23m Supermercado, Supermercado, Supermerc...
$ direccion [3m[38;5;246m<fct>[39m[23m Av. Monroe 3284, Av. Monroe 3284, Av....
$ provincia [3m[38;5;246m<fct>[39m[23m AR-C, AR-C, AR-C, AR-C, AR-C, AR-C, A...
$ banderaId [3m[38;5;246m<int>[39m[23m 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
$ localidad [3m[38;5;246m<fct>[39m[23m Belgrano, Belgrano, Belgrano, Belgran...
$ banderaDescripcion [3m[38;5;246m<fct>[39m[23m COTO CICSA, COTO CICSA, COTO CICSA, C...
$ lat [3m[38;5;246m<dbl>[39m[23m -34.56358, -34.56358, -34.56358, -34....
$ comercioRazonSocial [3m[38;5;246m<fct>[39m[23m Coto Centro Integral de Comercializac...
$ lng [3m[38;5;246m<dbl>[39m[23m -58.46841, -58.46841, -58.46841, -58....
$ sucursalNombre [3m[38;5;246m<fct>[39m[23m MONROE , MONROE , MONROE , MONROE , M...
$ comercioId [3m[38;5;246m<int>[39m[23m 12, 12, 12, 12, 12, 12, 12, 12, 12, 1...
$ sucursalId [3m[38;5;246m<int>[39m[23m 44, 44, 44, 44, 44, 44, 44, 44, 44, 4...
$ barrio [3m[38;5;246m<fct>[39m[23m COGHLAN, COGHLAN, COGHLAN, COGHLAN, C...
data2 Mi nuevo dataset tiene ahora 24 variables.
Borramos data1, nos quedamos con data2
rm(data1)
preciosclaros <- select(data2, `producto`, "producto", "nombre", "Categoria", "marca", "presentacion", "precio", "medicion", "sucursal", "sucursalTipo", "banderaDescripcion", "comercioRazonSocial", "direccion", "barrio")
#elimino data2 porque ya no la necesito
rm(data2)
glimpse(preciosclaros)
Observations: 1,559,443
Variables: 13
$ producto [3m[38;5;246m<chr>[39m[23m "7790762052364", "12-1-2800000937881"...
$ nombre [3m[38;5;246m<fct>[39m[23m Vino Rosado Seleccion Especial Santa ...
$ Categoria [3m[38;5;246m<fct>[39m[23m Bebidas con alcohol, Conservas, Bebid...
$ marca [3m[38;5;246m<fct>[39m[23m SANTA ANA, COTO, NIETO SANETINER, BOD...
$ presentacion [3m[38;5;246m<fct>[39m[23m 700.0 ml, 81.0 gr, 750.0 cc, 750.0 ml...
$ precio [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 92.87, 81.99, 7...
$ medicion [3m[38;5;246m<dbl>[39m[23m 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6...
$ sucursal [3m[38;5;246m<chr>[39m[23m "12-1-44", "12-1-44", "12-1-44", "12-...
$ sucursalTipo [3m[38;5;246m<fct>[39m[23m Supermercado, Supermercado, Supermerc...
$ banderaDescripcion [3m[38;5;246m<fct>[39m[23m COTO CICSA, COTO CICSA, COTO CICSA, C...
$ comercioRazonSocial [3m[38;5;246m<fct>[39m[23m Coto Centro Integral de Comercializac...
$ direccion [3m[38;5;246m<fct>[39m[23m Av. Monroe 3284, Av. Monroe 3284, Av....
$ barrio [3m[38;5;246m<fct>[39m[23m COGHLAN, COGHLAN, COGHLAN, COGHLAN, C...
Me quedan las 13 columnas que me importan
Analicemos precios claros como nuestra union entre Precios, productos y sucursales. ¿Que pasa cuando vemos un solo producto?
head(preciosclaros)
sum(is.na(preciosclaros))
[1] 0
sardinillas
sardina <- preciosclaros %>% filter(nombre== "Sardinillas en Aceite Lata Coto 81 Gr" & direccion == "Av. Monroe 3284")
sum(is.na(sardina))
[1] 0
Son 10 mediciones, 1,2,3,4,5,6,7,8,9,10
unique(sardina$medicion)
[1] 6 9 8 5 10 4 2 7 3
Falta la medición 1 y sin embargo, cuando preguntamos si hay nulos no aparece ¿Por qué?
Todas las familias felices se parecen unas a otras, pero cada familia infeliz lo es a su manera» Leon Tolstoi, 1877 escritor de la Guerra y la Paz
Like families, tidy datasets are all alike but every messy dataset is messy in its own way.» Hadley Wickham, 2014 Chief Data Scientist de R Studio
https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html
Valores como columnas Dice Hadley Wickham que esta manera de presentar la data es desordenada pero puede ser muy util. Provee una manera de eficiente de almacenamiento muy eficiente para operaciones computacionales. ***
Long to wide Necesito pasar los precios de productos por sucursal a formato columnar. Cada fila representará un producto de una sucursal con diez columnas asociadas a los precios en cada medición.
glimpse(preciosclaros)
Observations: 1,559,443
Variables: 13
$ producto [3m[38;5;246m<chr>[39m[23m "7790762052364", "12-1-2800000937881"...
$ nombre [3m[38;5;246m<fct>[39m[23m Vino Rosado Seleccion Especial Santa ...
$ Categoria [3m[38;5;246m<fct>[39m[23m Bebidas con alcohol, Conservas, Bebid...
$ marca [3m[38;5;246m<fct>[39m[23m SANTA ANA, COTO, NIETO SANETINER, BOD...
$ presentacion [3m[38;5;246m<fct>[39m[23m 700.0 ml, 81.0 gr, 750.0 cc, 750.0 ml...
$ precio [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 92.87, 81.99, 7...
$ medicion [3m[38;5;246m<dbl>[39m[23m 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6...
$ sucursal [3m[38;5;246m<chr>[39m[23m "12-1-44", "12-1-44", "12-1-44", "12-...
$ sucursalTipo [3m[38;5;246m<fct>[39m[23m Supermercado, Supermercado, Supermerc...
$ banderaDescripcion [3m[38;5;246m<fct>[39m[23m COTO CICSA, COTO CICSA, COTO CICSA, C...
$ comercioRazonSocial [3m[38;5;246m<fct>[39m[23m Coto Centro Integral de Comercializac...
$ direccion [3m[38;5;246m<fct>[39m[23m Av. Monroe 3284, Av. Monroe 3284, Av....
$ barrio [3m[38;5;246m<fct>[39m[23m COGHLAN, COGHLAN, COGHLAN, COGHLAN, C...
pivot_wider()
precioswide <- preciosclaros %>%
pivot_wider(names_from = medicion, names_sep = "_", values_from = precio)
glimpse(precioswide)
Observations: 164,592
Variables: 21
$ producto [3m[38;5;246m<chr>[39m[23m "7790762052364", "12-1-2800000937881"...
$ nombre [3m[38;5;246m<fct>[39m[23m Vino Rosado Seleccion Especial Santa ...
$ Categoria [3m[38;5;246m<fct>[39m[23m Bebidas con alcohol, Conservas, Bebid...
$ marca [3m[38;5;246m<fct>[39m[23m SANTA ANA, COTO, NIETO SANETINER, BOD...
$ presentacion [3m[38;5;246m<fct>[39m[23m 700.0 ml, 81.0 gr, 750.0 cc, 750.0 ml...
$ sucursal [3m[38;5;246m<chr>[39m[23m "12-1-44", "12-1-44", "12-1-44", "12-...
$ sucursalTipo [3m[38;5;246m<fct>[39m[23m Supermercado, Supermercado, Supermerc...
$ banderaDescripcion [3m[38;5;246m<fct>[39m[23m COTO CICSA, COTO CICSA, COTO CICSA, C...
$ comercioRazonSocial [3m[38;5;246m<fct>[39m[23m Coto Centro Integral de Comercializac...
$ direccion [3m[38;5;246m<fct>[39m[23m Av. Monroe 3284, Av. Monroe 3284, Av....
$ barrio [3m[38;5;246m<fct>[39m[23m COGHLAN, COGHLAN, COGHLAN, COGHLAN, C...
$ `6` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 92.87, 81.99, 7...
$ `7` [3m[38;5;246m<dbl>[39m[23m 56.20, 80.59, 215.00, 92.87, 81.99, 7...
$ `9` [3m[38;5;246m<dbl>[39m[23m 56.20, 80.59, 215.00, 92.87, 81.99, 7...
$ `8` [3m[38;5;246m<dbl>[39m[23m 56.20, 80.59, 215.00, 92.87, 81.99, 7...
$ `1` [3m[38;5;246m<dbl>[39m[23m 56.20, NA, 215.00, 85.99, 72.09, 70.2...
$ `3` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 85.99, 72.09, 7...
$ `5` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 85.99, 81.99, 7...
$ `10` [3m[38;5;246m<dbl>[39m[23m 56.20, 80.59, 215.00, 92.87, 81.99, 7...
$ `4` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 85.99, 72.09, 7...
$ `2` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 85.99, 72.09, 7...
head(precioswide)
Tengo desordenadas las mediciones, la intento ordenar pero me pone el 1 y el 10 al lado
precioswide[12:21] %>%
select(sort(names(.)))
Ordenar a lo criollo
precioswide <- select(precioswide, `producto`, "producto", "nombre", "Categoria", "marca", "presentacion", "sucursal", "sucursalTipo", "banderaDescripcion", "comercioRazonSocial", "direccion", "barrio","1","2","3","4","5","6","7","8","9","10")
glimpse(precioswide)
Observations: 164,592
Variables: 21
$ producto [3m[38;5;246m<chr>[39m[23m "7790762052364", "12-1-2800000937881"...
$ nombre [3m[38;5;246m<fct>[39m[23m Vino Rosado Seleccion Especial Santa ...
$ Categoria [3m[38;5;246m<fct>[39m[23m Bebidas con alcohol, Conservas, Bebid...
$ marca [3m[38;5;246m<fct>[39m[23m SANTA ANA, COTO, NIETO SANETINER, BOD...
$ presentacion [3m[38;5;246m<fct>[39m[23m 700.0 ml, 81.0 gr, 750.0 cc, 750.0 ml...
$ sucursal [3m[38;5;246m<chr>[39m[23m "12-1-44", "12-1-44", "12-1-44", "12-...
$ sucursalTipo [3m[38;5;246m<fct>[39m[23m Supermercado, Supermercado, Supermerc...
$ banderaDescripcion [3m[38;5;246m<fct>[39m[23m COTO CICSA, COTO CICSA, COTO CICSA, C...
$ comercioRazonSocial [3m[38;5;246m<fct>[39m[23m Coto Centro Integral de Comercializac...
$ direccion [3m[38;5;246m<fct>[39m[23m Av. Monroe 3284, Av. Monroe 3284, Av....
$ barrio [3m[38;5;246m<fct>[39m[23m COGHLAN, COGHLAN, COGHLAN, COGHLAN, C...
$ `1` [3m[38;5;246m<dbl>[39m[23m 56.20, NA, 215.00, 85.99, 72.09, 70.2...
$ `2` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 85.99, 72.09, 7...
$ `3` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 85.99, 72.09, 7...
$ `4` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 85.99, 72.09, 7...
$ `5` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 85.99, 81.99, 7...
$ `6` [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 92.87, 81.99, 7...
$ `7` [3m[38;5;246m<dbl>[39m[23m 56.20, 80.59, 215.00, 92.87, 81.99, 7...
$ `8` [3m[38;5;246m<dbl>[39m[23m 56.20, 80.59, 215.00, 92.87, 81.99, 7...
$ `9` [3m[38;5;246m<dbl>[39m[23m 56.20, 80.59, 215.00, 92.87, 81.99, 7...
$ `10` [3m[38;5;246m<dbl>[39m[23m 56.20, 80.59, 215.00, 92.87, 81.99, 7...
sum(is.na(precioswide))
[1] 86477
sardinillas
Recordemos que el anterior dataset con la forma larga, donde cada fila tenia una medicion, tenia 0 faltnates. Nuestro nuevo dataset
# Para saber la cantidad exacta de NAs que están presentes en los datos
sum(is.na(precioswide ))
[1] 86477
sum(!complete.cases(precioswide ))
[1] 53170
# Tengo 53170 registros que tienen al menos 1 NA
colnames(precioswide )[colSums(is.na(precioswide )) > 0] # Obtengo las columnas que tienen un al menos NA. Mediciones sin datos.
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
map(precioswide , ~sum(is.na(.)))
$producto
[1] 0
$nombre
[1] 0
$Categoria
[1] 0
$marca
[1] 0
$presentacion
[1] 0
$sucursal
[1] 0
$sucursalTipo
[1] 0
$banderaDescripcion
[1] 0
$comercioRazonSocial
[1] 0
$direccion
[1] 0
$barrio
[1] 0
$`1`
[1] 5891
$`2`
[1] 12734
$`3`
[1] 4801
$`4`
[1] 8327
$`5`
[1] 5297
$`6`
[1] 27193
$`7`
[1] 5628
$`8`
[1] 5162
$`9`
[1] 5216
$`10`
[1] 6228
funModeling::status(precioswide )
#Hago una copia del dataset para trabajar
df<- precioswide
Solo puedo hacer media de valores numericos
numerico<- sapply(df, is.numeric)#Creo funcion para seleccionar tipo
dfnum <- df[numerico] #aplico la funcion
Tener en cuenta que no seria correcto rempalzar por el valor de toda la columna, dado que para la medicion 1 tenemos los precios de distintos productos.
# Sustitución por la media de cada Row
ind <- which(is.na(dfnum), arr.ind=TRUE)
dfnum[ind] <- rowMeans(dfnum, na.rm = TRUE)[ind[,1]]
head(dfnum)
df[numerico] <- dfnum
Ya tengo mi dataset sin NA
sum(is.na(df))
[1] 0
dfomit <- precioswide
# Eliminamos toda la fila por contener un faltante
dfomit <- na.omit(dfomit)
sum(is.na(dfomit))
[1] 0
omit <- nrow(dfomit) #nrow funcion para sumar filas
omit
[1] 111422
Cantidad de filas de mi dataset original
original <- nrow(precioswide )
original
[1] 164592
Un manejo inapropiado de DF en el análisis puede introducir sesgos y puede resultar en conclusiones engañosas.
Efectos de eliminar faltantes Cantidad de rows que elimino, pierdo informacion
original-omit
[1] 53170
(original-omit)/omit
[1] 0.4771948
Perder el 47% de mis filas puede generar mucha distorción.
El periodo de la medicion 1 a la 10 pueden haber sido varios meses, no sería correcta reemplazarla por el promedio de la anterior y de la siguiente? ¿O como segunda opcion el remplazo por el promedio del periodo?
dfremplazo <- precioswide
sum(is.na(precioswide ))
[1] 86477
head(dfremplazo[12:21])
Remplazo los Na de la medicion 1 por los de la 2 dado que no tiene adyacentes
Mi medición 2 se expresa cómo la columna 13, recordar que DF[Indice filas, Indice Columnas]
# Reemplaza los NA en la medición 1 por el valor de la medición 2
i = which(is.na(dfremplazo$`1`)) # Devuelve número de filas con NA
dfremplazo[i,12] = dfremplazo[i,13] # reemplaza los nulos en la primer medición por el valor en la segunda
De la medicion 2 hasta la 9 hago los adyacentes, utilizo el numero de columna
# Reemplaza NA entre la columna 13 y la 20 (valores d las mediciones 2 a 9) por el promedio de sus adyacentes
for (j in 0:7) {
ii = which(is.na(dfremplazo[,13+j]))
dfremplazo[ii,13+j] = (dfremplazo[ii,13+j-1]+dfremplazo[ii,13+j+1])/2
}
Medicion 10 que tenga NA la reemplazo por la 9
# Reemplazo los NA de la medición 10 por el valor de la medición 9
iii = which(is.na(dfremplazo$`10`))
dfremplazo[iii,21] = dfremplazo[iii,20]
NA que me quedan
sum(is.na(dfremplazo))
[1] 32005
¿Cuantas filas tengo de diferencia?
original
[1] 164592
Filas en mi nuevo dataset
reemplazo
[1] 155274
original-reemplazo #difrencia con el dataset original
[1] 9318
(original-reemplazo)/original
[1] 0.05661272
5% de filas menos.
Genero columnas con los precios promedios de cada periodo.
*¿Que pasa con la media cuando hay NA?
# Promedios por periodo y total
dfremplazo =
(
dfremplazo %>%
mutate(periodo1 = rowMeans(select(., "1","2","3"),na.rm
=TRUE), periodo2 = rowMeans(select(., "4","5"),na.rm
=TRUE), periodo3 = rowMeans(select(., "6","7"),na.rm
=TRUE), periodo4 = rowMeans(select(., "8","9","10"),na.rm
=TRUE), promedio = rowMeans(select(., "1","2","3","4","5","6","7","8","9","10"),na.rm
=TRUE))
)
head(dfremplazo)
preciosmedios <- select(dfremplazo, "producto", "nombre", "Categoria", "marca", "presentacion", "sucursal", "sucursalTipo", "banderaDescripcion", "comercioRazonSocial", "direccion", "barrio", "periodo1", "periodo2","periodo3","periodo4","promedio")
glimpse(preciosmedios)
Observations: 164,592
Variables: 16
$ producto [3m[38;5;246m<chr>[39m[23m "7790762052364", "12-1-2800000937881"...
$ nombre [3m[38;5;246m<fct>[39m[23m Vino Rosado Seleccion Especial Santa ...
$ Categoria [3m[38;5;246m<fct>[39m[23m Bebidas con alcohol, Conservas, Bebid...
$ marca [3m[38;5;246m<fct>[39m[23m SANTA ANA, COTO, NIETO SANETINER, BOD...
$ presentacion [3m[38;5;246m<fct>[39m[23m 700.0 ml, 81.0 gr, 750.0 cc, 750.0 ml...
$ sucursal [3m[38;5;246m<chr>[39m[23m "12-1-44", "12-1-44", "12-1-44", "12-...
$ sucursalTipo [3m[38;5;246m<fct>[39m[23m Supermercado, Supermercado, Supermerc...
$ banderaDescripcion [3m[38;5;246m<fct>[39m[23m COTO CICSA, COTO CICSA, COTO CICSA, C...
$ comercioRazonSocial [3m[38;5;246m<fct>[39m[23m Coto Centro Integral de Comercializac...
$ direccion [3m[38;5;246m<fct>[39m[23m Av. Monroe 3284, Av. Monroe 3284, Av....
$ barrio [3m[38;5;246m<fct>[39m[23m COGHLAN, COGHLAN, COGHLAN, COGHLAN, C...
$ periodo1 [3m[38;5;246m<dbl>[39m[23m 56.20000, 76.99000, 215.00000, 85.990...
$ periodo2 [3m[38;5;246m<dbl>[39m[23m 56.20, 76.99, 215.00, 85.99, 77.04, 7...
$ periodo3 [3m[38;5;246m<dbl>[39m[23m 56.20, 78.79, 215.00, 92.87, 81.99, 7...
$ periodo4 [3m[38;5;246m<dbl>[39m[23m 56.20000, 80.59000, 215.00000, 92.870...
$ promedio [3m[38;5;246m<dbl>[39m[23m 56.200, 78.430, 215.000, 89.430, 78.0...
sum(is.na(preciosmedios))
[1] 8935
# puede ver que faltante habia con preciosmedios[!complete.cases(preciosmedios),]
preciosmedios %>% filter(producto==7794000960329)
NA
Mi periodo 4 eran Medicion 8-9-10 correspondientes a febrero
precioswide %>% filter(producto==7794000960329)
preciosmedios <- na.omit(preciosmedios)
Diferencia entre filas del dataset original y el de filas eliminadas
medios <- nrow(preciosmedios) #cantidad de filas
original-medios #difrencia con el dataset original
[1] 5726
(original-medios)/original # que %?
[1] 0.03478905