EJERCICIO FINAL

Base de datos correspondiente a productos de supermercado:

library(readr)

library(tidyverse) # para manejo de bases de datos
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.5     ✓ dplyr   1.0.6
## ✓ tibble  3.1.2     ✓ stringr 1.4.0
## ✓ tidyr   1.1.3     ✓ forcats 0.5.0
## ✓ purrr   0.3.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(janitor) # para limpiar bases de datos
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(visdat) # crea visualizaciones de datos exploratorios preliminares 

library(naniar) # visualizacion y tratamiento de datos perdidos

library(GGally) # matriz de graficos ggplot para analisis exploratorio
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2

Lectura de base de datos

# Carga de datos 

productos<- read_csv("~/OneDrive/Amor Estudio/DATA SCIENCE/Cursos/Sociedad Ecuatoriana Estadistica/Limpieza de datos SEE/Trabajo final/Datos/productos-de-supermercados-sample.csv")
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   supermarket = col_character(),
##   category = col_character(),
##   name = col_character(),
##   description = col_character(),
##   price = col_double(),
##   reference_price = col_double(),
##   reference_unit = col_character(),
##   insert_date = col_datetime(format = "")
## )

Exploración

# Datos

productos %>% glimpse()
## Rows: 500,000
## Columns: 8
## $ supermarket     <chr> "mercadona-es", "mercadona-es", "mercadona-es", "carre…
## $ category        <chr> "postres_y_yogures_yogures_liquidos", "bodega_licores"…
## $ name            <chr> "Bebida láctea sin lactosa de fresa Hacendado", "Gineb…
## $ description     <chr> "Pack-4", "Botella", "Tarrina", "Pack 4x120 G.", "10 U…
## $ price           <dbl> 1.40, 10.75, 1.09, 2.08, 4.60, 13.95, 7.02, 5.25, 1.90…
## $ reference_price <dbl> 2.19, 15.36, 2.18, 4.33, 0.46, 0.28, 11.90, 7.00, 1.90…
## $ reference_unit  <chr> "kg", "L", "kg", "kg", "ud", "lavado", "kg", "€/l.", "…
## $ insert_date     <dttm> 2020-12-23 00:00:00, 2020-11-06 12:00:00, 2020-09-23 …
productos %>% head()
## # A tibble: 6 x 8
##   supermarket  category  name   description price reference_price reference_unit
##   <chr>        <chr>     <chr>  <chr>       <dbl>           <dbl> <chr>         
## 1 mercadona-es postres_… Bebid… Pack-4       1.4             2.19 kg            
## 2 mercadona-es bodega_l… Gineb… Botella     10.8            15.4  L             
## 3 mercadona-es charcute… Queso… Tarrina      1.09            2.18 kg            
## 4 carrefour-es la_despe… Yogur… Pack 4x120…  2.08            4.33 kg            
## 5 carrefour-es la_despe… Helad… 10 Ud.       4.6             0.46 ud            
## 6 carrefour-es limpieza… Deter… NA          14.0             0.28 lavado        
## # … with 1 more variable: insert_date <dttm>

Tidyverse

# Filtrado de variables

productos %>% filter(supermarket=='mercadona-es') %>% head()
## # A tibble: 6 x 8
##   supermarket  category  name   description price reference_price reference_unit
##   <chr>        <chr>     <chr>  <chr>       <dbl>           <dbl> <chr>         
## 1 mercadona-es postres_… Bebid… Pack-4       1.4             2.19 kg            
## 2 mercadona-es bodega_l… Gineb… Botella     10.8            15.4  L             
## 3 mercadona-es charcute… Queso… Tarrina      1.09            2.18 kg            
## 4 mercadona-es carne_co… Chule… Bandeja      7.02           11.9  kg            
## 5 mercadona-es postres_… Bífid… Pack-8       1.9             1.9  kg            
## 6 mercadona-es azucar_c… Choco… Tableta      0.75            5    kg            
## # … with 1 more variable: insert_date <dttm>
productos %>% 
  mutate(`Categoria_Precio` = case_when(`price`<=2 ~ "Bajo",between(price, 2, 5) ~ "Medio", T ~ "Alto")) %>% 
  select(`Categoria_Precio`)
## # A tibble: 500,000 x 1
##    Categoria_Precio
##    <chr>           
##  1 Bajo            
##  2 Alto            
##  3 Bajo            
##  4 Medio           
##  5 Medio           
##  6 Alto            
##  7 Alto            
##  8 Alto            
##  9 Bajo            
## 10 Medio           
## # … with 499,990 more rows
# Agrupación y sumarizado

productos %>% 
  group_by(supermarket) %>% 
  summarise(`Valor total` = sum(`price`, na.rm = T)) %>% 
  head()
## # A tibble: 3 x 2
##   supermarket  `Valor total`
##   <chr>                <dbl>
## 1 carrefour-es      1485771.
## 2 dia-es             381379.
## 3 mercadona-es       756101.
productos %>% 
  group_by(supermarket) %>% 
  summarise(`Valor total` = sum(`price`, na.rm = T)) %>% 
  slice_sample(n=3)
## # A tibble: 3 x 2
##   supermarket  `Valor total`
##   <chr>                <dbl>
## 1 carrefour-es      1485771.
## 2 dia-es             381379.
## 3 mercadona-es       756101.
# Cruces

tabla1 = productos %>% 
  group_by(supermarket) %>% 
  summarise(`Valor total`=sum(`price`, na.rm = T))

tabla1
## # A tibble: 3 x 2
##   supermarket  `Valor total`
##   <chr>                <dbl>
## 1 carrefour-es      1485771.
## 2 dia-es             381379.
## 3 mercadona-es       756101.
tabla2 =productos   %>% 
  group_by(supermarket) %>% 
  summarise(`Categorias`= n())

tabla2
## # A tibble: 3 x 2
##   supermarket  Categorias
##   <chr>             <int>
## 1 carrefour-es     294307
## 2 dia-es           105990
## 3 mercadona-es      99703
tabla1 %>% 
  left_join(tabla2 %>% slice_head(n=2))
## Joining, by = "supermarket"
## # A tibble: 3 x 3
##   supermarket  `Valor total` Categorias
##   <chr>                <dbl>      <int>
## 1 carrefour-es      1485771.     294307
## 2 dia-es             381379.     105990
## 3 mercadona-es       756101.         NA

Grafos

productos %>% select(price, supermarket) %>% ggpairs()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

****

Limpieza de datos.

# Descripción del tipo de variables
productos %>% vis_dat(warn_large_data = F)

# Datos perdidos
productos %>% vis_miss(warn_large_data = F)

Correlaciones

productos %>% gg_miss_upset()

Pivotaje de variables

# Transformación columnas a filas

productos %>% 
  group_by(supermarket) %>% 
 summarise(Precios = sum(price, na.rm = T),
           Referenciales = sum(reference_price, na.rm = T)) %>% 
  pivot_longer(cols = -c(supermarket), names_to = "Totales", values_to = "Referenciales") %>% 
  pivot_wider(names_from = c(Totales), values_from = c(Referenciales), values_fill = 0) %>% 
head()
## # A tibble: 3 x 3
##   supermarket   Precios Referenciales
##   <chr>           <dbl>         <dbl>
## 1 carrefour-es 1485771.      7931286.
## 2 dia-es        381379.      3244377.
## 3 mercadona-es  756101.       693193.
library(qicharts) # Isolation forest
## qicharts will no longer be maintained. Please consider moving to qicharts2: https://anhoej.github.io/qicharts2/.
set.seed(6)
Items_Vendidos<-sample(1000:5000, size = 500000, replace = TRUE)
productos<-cbind(productos,Items_Vendidos)
head(productos)
##    supermarket                                         category
## 1 mercadona-es               postres_y_yogures_yogures_liquidos
## 2 mercadona-es                                   bodega_licores
## 3 mercadona-es      charcuteria_y_quesos_queso_untable_y_fresco
## 4 carrefour-es la_despensa_yogures_y_postres_yogures_desnatados
## 5 carrefour-es                       la_despensa_helados_bombon
## 6 carrefour-es  limpieza_y_hogar_cuidado_de_la_ropa_detergentes
##                                                                                   name
## 1                                         Bebida láctea sin lactosa de fresa Hacendado
## 2                                                        Ginebra 15 botanicals Blumara
## 3                             Queso fresco batido desnatado Hacendado 0% materia grasa
## 4 Yogur bífidus desnatado con lima y limón Danone Activia pack de 4 unidades de 120 g.
## 5                                         Helado After Dinner Magnum sin gluten 10 ud.
## 6                                        Detergente líquido Actilift Ariel 50 lavados.
##     description price reference_price reference_unit         insert_date
## 1        Pack-4  1.40            2.19             kg 2020-12-23 00:00:00
## 2       Botella 10.75           15.36              L 2020-11-06 12:00:00
## 3       Tarrina  1.09            2.18             kg 2020-09-23 16:06:00
## 4 Pack 4x120 G.  2.08            4.33             kg 2020-10-10 00:00:00
## 5        10 Ud.  4.60            0.46             ud 2020-10-15 00:00:00
## 6          <NA> 13.95            0.28         lavado 2021-01-24 00:00:00
##   Items_Vendidos
## 1           3868
## 2           1009
## 3           1940
## 4           1333
## 5           4767
## 6           3659
# graficamos
qic(Items_Vendidos, chart = 'i')

# Introducimos un punto atípico en el punto 18
Items_Vendidos[18] <- 5002
Items_Vendidos[2000] <- 8000
Items_Vendidos[100000] <- 9000
Items_Vendidos[200000] <- 10000
Items_Vendidos[312500] <- 20000
Items_Vendidos[200] <- 7000

qic(Items_Vendidos, chart = 'i')

# conteo del numero de atipicos
qic(Items_Vendidos,
    x     = supermarket ,
    data  = productos,
    chart = 'c',
    main  = 'Atipicos por sucursal',
    ylab  = 'Valores',
    xlab  = 'Sucursal')

Reducción de dimensión (columnas).

library(FactoMineR) 
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
pca_res = PCA(productos %>% select(where(is.numeric)), scale.unit = T)

pca_res %>% fviz_screeplot()

pca_res %>% fviz_pca_biplot()

pca_res = PCA(productos%>% 
                slice(1:100000) %>% 
                select(where(is.numeric)), scale.unit = T)

pca_res %>% fviz_screeplot()

pca_res %>% fviz_pca_biplot()

Imputación de datos

productos_imputados= productos %>% 
  select(where(is.numeric)) %>% 
  impute_mean_all()

productos_imputados %>% vis_miss(warn_large_data = F)