Instalar paquetes y llamar librerías

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.3     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── 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
library(readr)
library(dplyr)
library(janitor)
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test

Importar la base de datos

df <- read_csv("abarrotes.csv")
## Rows: 200625 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (12): vcClaveTienda, DescGiro, Fecha, Marca, Fabricante, Producto, Nomb...
## dbl   (7): Codigo Barras, PLU, Precio, Ult.Costo, Unidades, F.Ticket, Mts 2
## time  (3): Hora, Hora inicio, Hora cierre
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Exploración de datos

# Para explorar variables de texto 
resumen <- summary(df)
resumen
##  vcClaveTienda        DescGiro         Codigo Barras            PLU        
##  Length:200625      Length:200625      Min.   :8.347e+05   Min.   : 1.00   
##  Class :character   Class :character   1st Qu.:7.501e+12   1st Qu.: 1.00   
##  Mode  :character   Mode  :character   Median :7.501e+12   Median : 1.00   
##                                        Mean   :5.950e+12   Mean   : 2.11   
##                                        3rd Qu.:7.501e+12   3rd Qu.: 1.00   
##                                        Max.   :1.750e+13   Max.   :30.00   
##                                                            NA's   :199188  
##     Fecha               Hora             Marca            Fabricante       
##  Length:200625      Length:200625     Length:200625      Length:200625     
##  Class :character   Class1:hms        Class :character   Class :character  
##  Mode  :character   Class2:difftime   Mode  :character   Mode  :character  
##                     Mode  :numeric                                         
##                                                                            
##                                                                            
##                                                                            
##    Producto             Precio          Ult.Costo         Unidades     
##  Length:200625      Min.   :-147.00   Min.   :  0.38   Min.   : 0.200  
##  Class :character   1st Qu.:  11.00   1st Qu.:  8.46   1st Qu.: 1.000  
##  Mode  :character   Median :  16.00   Median : 12.31   Median : 1.000  
##                     Mean   :  19.42   Mean   : 15.31   Mean   : 1.262  
##                     3rd Qu.:  25.00   3rd Qu.: 19.23   3rd Qu.: 1.000  
##                     Max.   :1000.00   Max.   :769.23   Max.   :96.000  
##                                                                        
##     F.Ticket      NombreDepartamento NombreFamilia      NombreCategoria   
##  Min.   :     1   Length:200625      Length:200625      Length:200625     
##  1st Qu.: 33964   Class :character   Class :character   Class :character  
##  Median :105993   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :193990                                                           
##  3rd Qu.:383005                                                           
##  Max.   :450040                                                           
##                                                                           
##     Estado              Mts 2      Tipo ubicación         Giro          
##  Length:200625      Min.   :47.0   Length:200625      Length:200625     
##  Class :character   1st Qu.:53.0   Class :character   Class :character  
##  Mode  :character   Median :60.0   Mode  :character   Mode  :character  
##                     Mean   :56.6                                        
##                     3rd Qu.:60.0                                        
##                     Max.   :62.0                                        
##                                                                         
##  Hora inicio       Hora cierre      
##  Length:200625     Length:200625    
##  Class1:hms        Class1:hms       
##  Class2:difftime   Class2:difftime  
##  Mode  :numeric    Mode  :numeric   
##                                     
##                                     
## 
tibble(df)
## # A tibble: 200,625 × 22
##    vcClaveTienda DescGiro  `Codigo Barras`   PLU Fecha Hora     Marca Fabricante
##    <chr>         <chr>               <dbl> <dbl> <chr> <time>   <chr> <chr>     
##  1 MX001         Abarrotes   7501020540666    NA 19/0… 08:16:21 NUTR… MEXILAC   
##  2 MX001         Abarrotes   7501032397906    NA 19/0… 08:23:33 DAN … DANONE DE…
##  3 MX001         Abarrotes   7501000112845    NA 19/0… 08:24:33 BIMBO GRUPO BIM…
##  4 MX001         Abarrotes   7501031302741    NA 19/0… 08:24:33 PEPSI PEPSI-COL…
##  5 MX001         Abarrotes   7501026027543    NA 19/0… 08:26:28 BLAN… FABRICA D…
##  6 MX001         Abarrotes   7501020540666    NA 19/0… 08:16:21 NUTR… MEXILAC   
##  7 MX001         Abarrotes   7501032397906    NA 19/0… 08:23:33 DAN … DANONE DE…
##  8 MX001         Abarrotes   7501000112845    NA 19/0… 08:24:33 BIMBO GRUPO BIM…
##  9 MX001         Abarrotes   7501031302741    NA 19/0… 08:24:33 PEPSI PEPSI-COL…
## 10 MX001         Abarrotes   7501026027543    NA 19/0… 08:26:28 BLAN… FABRICA D…
## # ℹ 200,615 more rows
## # ℹ 14 more variables: Producto <chr>, Precio <dbl>, Ult.Costo <dbl>,
## #   Unidades <dbl>, F.Ticket <dbl>, NombreDepartamento <chr>,
## #   NombreFamilia <chr>, NombreCategoria <chr>, Estado <chr>, `Mts 2` <dbl>,
## #   `Tipo ubicación` <chr>, Giro <chr>, `Hora inicio` <time>,
## #   `Hora cierre` <time>
str(df)
## spc_tbl_ [200,625 × 22] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ vcClaveTienda     : chr [1:200625] "MX001" "MX001" "MX001" "MX001" ...
##  $ DescGiro          : chr [1:200625] "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Codigo Barras     : num [1:200625] 7.5e+12 7.5e+12 7.5e+12 7.5e+12 7.5e+12 ...
##  $ PLU               : num [1:200625] NA NA NA NA NA NA NA NA NA NA ...
##  $ Fecha             : chr [1:200625] "19/06/2020" "19/06/2020" "19/06/2020" "19/06/2020" ...
##  $ Hora              : 'hms' num [1:200625] 08:16:21 08:23:33 08:24:33 08:24:33 ...
##   ..- attr(*, "units")= chr "secs"
##  $ Marca             : chr [1:200625] "NUTRI LECHE" "DAN UP" "BIMBO" "PEPSI" ...
##  $ Fabricante        : chr [1:200625] "MEXILAC" "DANONE DE MEXICO" "GRUPO BIMBO" "PEPSI-COLA MEXICANA" ...
##  $ Producto          : chr [1:200625] "Nutri Leche 1 Litro" "DANUP STRAWBERRY P/BEBER 350GR NAL" "Rebanadas Bimbo 2Pz" "Pepsi N.R. 400Ml" ...
##  $ Precio            : num [1:200625] 16 14 5 8 19.5 16 14 5 8 19.5 ...
##  $ Ult.Costo         : num [1:200625] 12.3 14 5 8 15 ...
##  $ Unidades          : num [1:200625] 1 1 1 1 1 1 1 1 1 1 ...
##  $ F.Ticket          : num [1:200625] 1 2 3 3 4 1 2 3 3 4 ...
##  $ NombreDepartamento: chr [1:200625] "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ NombreFamilia     : chr [1:200625] "Lacteos y Refrigerados" "Lacteos y Refrigerados" "Pan y Tortilla" "Bebidas" ...
##  $ NombreCategoria   : chr [1:200625] "Leche" "Yogurt" "Pan Dulce Empaquetado" "Refrescos Plástico (N.R.)" ...
##  $ Estado            : chr [1:200625] "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ Mts 2             : num [1:200625] 60 60 60 60 60 60 60 60 60 60 ...
##  $ Tipo ubicación    : chr [1:200625] "Esquina" "Esquina" "Esquina" "Esquina" ...
##  $ Giro              : chr [1:200625] "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Hora inicio       : 'hms' num [1:200625] 08:00:00 08:00:00 08:00:00 08:00:00 ...
##   ..- attr(*, "units")= chr "secs"
##  $ Hora cierre       : 'hms' num [1:200625] 22:00:00 22:00:00 22:00:00 22:00:00 ...
##   ..- attr(*, "units")= chr "secs"
##  - attr(*, "spec")=
##   .. cols(
##   ..   vcClaveTienda = col_character(),
##   ..   DescGiro = col_character(),
##   ..   `Codigo Barras` = col_double(),
##   ..   PLU = col_double(),
##   ..   Fecha = col_character(),
##   ..   Hora = col_time(format = ""),
##   ..   Marca = col_character(),
##   ..   Fabricante = col_character(),
##   ..   Producto = col_character(),
##   ..   Precio = col_double(),
##   ..   Ult.Costo = col_double(),
##   ..   Unidades = col_double(),
##   ..   F.Ticket = col_double(),
##   ..   NombreDepartamento = col_character(),
##   ..   NombreFamilia = col_character(),
##   ..   NombreCategoria = col_character(),
##   ..   Estado = col_character(),
##   ..   `Mts 2` = col_double(),
##   ..   `Tipo ubicación` = col_character(),
##   ..   Giro = col_character(),
##   ..   `Hora inicio` = col_time(format = ""),
##   ..   `Hora cierre` = col_time(format = "")
##   .. )
##  - attr(*, "problems")=<externalptr>
head(df, n=7)
## # A tibble: 7 × 22
##   vcClaveTienda DescGiro  `Codigo Barras`   PLU Fecha  Hora     Marca Fabricante
##   <chr>         <chr>               <dbl> <dbl> <chr>  <time>   <chr> <chr>     
## 1 MX001         Abarrotes   7501020540666    NA 19/06… 08:16:21 NUTR… MEXILAC   
## 2 MX001         Abarrotes   7501032397906    NA 19/06… 08:23:33 DAN … DANONE DE…
## 3 MX001         Abarrotes   7501000112845    NA 19/06… 08:24:33 BIMBO GRUPO BIM…
## 4 MX001         Abarrotes   7501031302741    NA 19/06… 08:24:33 PEPSI PEPSI-COL…
## 5 MX001         Abarrotes   7501026027543    NA 19/06… 08:26:28 BLAN… FABRICA D…
## 6 MX001         Abarrotes   7501020540666    NA 19/06… 08:16:21 NUTR… MEXILAC   
## 7 MX001         Abarrotes   7501032397906    NA 19/06… 08:23:33 DAN … DANONE DE…
## # ℹ 14 more variables: Producto <chr>, Precio <dbl>, Ult.Costo <dbl>,
## #   Unidades <dbl>, F.Ticket <dbl>, NombreDepartamento <chr>,
## #   NombreFamilia <chr>, NombreCategoria <chr>, Estado <chr>, `Mts 2` <dbl>,
## #   `Tipo ubicación` <chr>, Giro <chr>, `Hora inicio` <time>,
## #   `Hora cierre` <time>
tail(df)
## # A tibble: 6 × 22
##   vcClaveTienda DescGiro `Codigo Barras`   PLU Fecha   Hora     Marca Fabricante
##   <chr>         <chr>              <dbl> <dbl> <chr>   <time>   <chr> <chr>     
## 1 MX005         Depósito   7622210464811    NA 12/07/… 01:08:25 TRID… CADBURY A…
## 2 MX005         Depósito   7622210464811    NA 23/10/… 22:17:37 TRID… CADBURY A…
## 3 MX005         Depósito   7622210464811    NA 10/10/… 20:30:20 TRID… CADBURY A…
## 4 MX005         Depósito   7622210464811    NA 10/10/… 22:40:43 TRID… CADBURY A…
## 5 MX005         Depósito   7622210464811    NA 27/06/… 22:30:19 TRID… CADBURY A…
## 6 MX005         Depósito   7622210464811    NA 26/06/… 23:43:34 TRID… CADBURY A…
## # ℹ 14 more variables: Producto <chr>, Precio <dbl>, Ult.Costo <dbl>,
## #   Unidades <dbl>, F.Ticket <dbl>, NombreDepartamento <chr>,
## #   NombreFamilia <chr>, NombreCategoria <chr>, Estado <chr>, `Mts 2` <dbl>,
## #   `Tipo ubicación` <chr>, Giro <chr>, `Hora inicio` <time>,
## #   `Hora cierre` <time>
# Para explorar variables de texto 
count(df, vcClaveTienda, sort = TRUE)
## # A tibble: 5 × 2
##   vcClaveTienda     n
##   <chr>         <int>
## 1 MX001         96469
## 2 MX004         83455
## 3 MX005         10021
## 4 MX002          6629
## 5 MX003          4051
count(df, DescGiro, sort = TRUE)
## # A tibble: 3 × 2
##   DescGiro        n
##   <chr>       <int>
## 1 Abarrotes  100520
## 2 Carnicería  83455
## 3 Depósito    16650
#count(df, Fecha, sort = TRUE)
#count(df, Hora, sort = TRUE)
#count(df, Marca, sort = TRUE)
#count(df, Fabricante, sort = TRUE)
#count(df, Producto, sort = TRUE)
count(df, Giro, sort = TRUE)
## # A tibble: 2 × 2
##   Giro            n
##   <chr>       <int>
## 1 Abarrotes  183975
## 2 Mini súper  16650
count(df, NombreDepartamento, sort = TRUE)
## # A tibble: 9 × 2
##   NombreDepartamento        n
##   <chr>                 <int>
## 1 Abarrotes            198279
## 2 Bebes e Infantiles     1483
## 3 Ferretería              377
## 4 Farmacia                255
## 5 Vinos y Licores         104
## 6 Papelería                74
## 7 Mercería                 44
## 8 Productos a Eliminar      8
## 9 Carnes                    1
#count(df, NombreFamilia, sort = TRUE)
#count(df, NombreCategoria, sort = TRUE)
count(df, Estado, sort = TRUE)
## # A tibble: 5 × 2
##   Estado           n
##   <chr>        <int>
## 1 Nuevo León   96469
## 2 Sinaloa      83455
## 3 Quintana Roo 10021
## 4 Jalisco       6629
## 5 Chiapas       4051
count(df, Precio, sort = TRUE)
## # A tibble: 206 × 2
##    Precio     n
##     <dbl> <int>
##  1     10 14782
##  2     18 13436
##  3     12 12749
##  4     13 12433
##  5     15  8898
##  6      5  8303
##  7      8  8263
##  8     27  7937
##  9     14  7339
## 10     22  7078
## # ℹ 196 more rows
#count(df, Hora.inicio, sort=TRUE)
#count(df, Hora.cierre, sort=TRUE)
#count(df, Tipo.Ubicación, sort=TRUE)
#count(df, Codigo.Barras, sort=TRUE)
# Generar subtabla de tienda y departamento 
tabyl(df, vcClaveTienda, NombreDepartamento)
##  vcClaveTienda Abarrotes Bebes e Infantiles Carnes Farmacia Ferretería Mercería
##          MX001     95415                515      1      147        245       28
##          MX002      6590                 21      0        4         10        0
##          MX003      4026                 15      0        2          8        0
##          MX004     82234                932      0      102        114       16
##          MX005     10014                  0      0        0          0        0
##  Papelería Productos a Eliminar Vinos y Licores
##         35                    3              80
##          0                    0               4
##          0                    0               0
##         32                    5              20
##          7                    0               0
tabyl(df, Estado, NombreDepartamento)
##        Estado Abarrotes Bebes e Infantiles Carnes Farmacia Ferretería Mercería
##       Chiapas      4026                 15      0        2          8        0
##       Jalisco      6590                 21      0        4         10        0
##    Nuevo León     95415                515      1      147        245       28
##  Quintana Roo     10014                  0      0        0          0        0
##       Sinaloa     82234                932      0      102        114       16
##  Papelería Productos a Eliminar Vinos y Licores
##          0                    0               0
##          0                    0               4
##         35                    3              80
##          7                    0               0
##         32                    5              20
#tabyl(df, Estado, Hora cierre)
#tabyl(df, Estado, Hora inicio)

# Tienda 1 es Nuevo León, abre a las 8 y cierra a las 22
# Tienda 2 es Jalisco, abre a las 9 y cierra a las 22
# Tienda 3 es Chiapas, abre a las 7 y cierra a las 23
# Tienda 4 es Sinaloa, abre a las 7 y cierra a las 23
# Tienda 5 es Quintana Roo, abre a las 8 y cierra a las 21

Observaciones

  1. PLU casi no tiene registros
  2. La fecha no tiene formato adecuado
  3. El precio tiene valores negativos
  4. La hora no tiene formato adecuado

Limpieza de datos

Técnica 1. Remover valores irrelevantes

# Eliminar columnas 
df1 <- df
#df1 <- subset(df1, select = -c(Codigo.Barras, PLU))
# Eliminar renglones 
df2 <- df1 
df2 <- df2[df2$Precio > 0,]
summary(df2$Precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.50   11.00   16.00   19.45   25.00 1000.00

Técnica 2. Remover valores repetidos

# ¿Cuántos renglones duplicados tenemos?
df2[duplicated(df2),]
## # A tibble: 5 × 22
##   vcClaveTienda DescGiro  `Codigo Barras`   PLU Fecha  Hora     Marca Fabricante
##   <chr>         <chr>               <dbl> <dbl> <chr>  <time>   <chr> <chr>     
## 1 MX001         Abarrotes   7501020540666    NA 19/06… 08:16:21 NUTR… MEXILAC   
## 2 MX001         Abarrotes   7501032397906    NA 19/06… 08:23:33 DAN … DANONE DE…
## 3 MX001         Abarrotes   7501000112845    NA 19/06… 08:24:33 BIMBO GRUPO BIM…
## 4 MX001         Abarrotes   7501031302741    NA 19/06… 08:24:33 PEPSI PEPSI-COL…
## 5 MX001         Abarrotes   7501026027543    NA 19/06… 08:26:28 BLAN… FABRICA D…
## # ℹ 14 more variables: Producto <chr>, Precio <dbl>, Ult.Costo <dbl>,
## #   Unidades <dbl>, F.Ticket <dbl>, NombreDepartamento <chr>,
## #   NombreFamilia <chr>, NombreCategoria <chr>, Estado <chr>, `Mts 2` <dbl>,
## #   `Tipo ubicación` <chr>, Giro <chr>, `Hora inicio` <time>,
## #   `Hora cierre` <time>
sum(duplicated(df2))
## [1] 5
# Eliminar renglones duplicados
df3 <- df2
df3 <- distinct(df3)

Técnica 3. Corregir errores tipográficos y similares

# Precios en absoluto
df4 <- df1
df4$Precio <- abs(df4$Precio)
summary(df4$Precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.50   11.00   16.00   19.45   25.00 1000.00
# No se va a utilizar en este ejercicio


# Cantidades en enteros
df5 <- df1
df5$Unidades <- ceiling(df5$Unidades)
summary(df5$Unidades)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   1.000   1.262   1.000  96.000
# No se va a utilizar en este ejercicio

Técnica 4. Convertir tipos de datos

# Convertir de Caracter a fecha
df6 <- df3
df6$Fecha <- as.Date(df6$Fecha, format = "%d/%m/%Y")
str(df6)
## tibble [200,473 × 22] (S3: tbl_df/tbl/data.frame)
##  $ vcClaveTienda     : chr [1:200473] "MX001" "MX001" "MX001" "MX001" ...
##  $ DescGiro          : chr [1:200473] "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Codigo Barras     : num [1:200473] 7.5e+12 7.5e+12 7.5e+12 7.5e+12 7.5e+12 ...
##  $ PLU               : num [1:200473] NA NA NA NA NA NA NA NA NA NA ...
##  $ Fecha             : Date[1:200473], format: "2020-06-19" "2020-06-19" ...
##  $ Hora              : 'hms' num [1:200473] 08:16:21 08:23:33 08:24:33 08:24:33 ...
##   ..- attr(*, "units")= chr "secs"
##  $ Marca             : chr [1:200473] "NUTRI LECHE" "DAN UP" "BIMBO" "PEPSI" ...
##  $ Fabricante        : chr [1:200473] "MEXILAC" "DANONE DE MEXICO" "GRUPO BIMBO" "PEPSI-COLA MEXICANA" ...
##  $ Producto          : chr [1:200473] "Nutri Leche 1 Litro" "DANUP STRAWBERRY P/BEBER 350GR NAL" "Rebanadas Bimbo 2Pz" "Pepsi N.R. 400Ml" ...
##  $ Precio            : num [1:200473] 16 14 5 8 19.5 9.5 11 9.5 23.5 12 ...
##  $ Ult.Costo         : num [1:200473] 12.3 14 5 8 15 ...
##  $ Unidades          : num [1:200473] 1 1 1 1 1 1 1 1 1 1 ...
##  $ F.Ticket          : num [1:200473] 1 2 3 3 4 4 4 4 4 5 ...
##  $ NombreDepartamento: chr [1:200473] "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ NombreFamilia     : chr [1:200473] "Lacteos y Refrigerados" "Lacteos y Refrigerados" "Pan y Tortilla" "Bebidas" ...
##  $ NombreCategoria   : chr [1:200473] "Leche" "Yogurt" "Pan Dulce Empaquetado" "Refrescos Plástico (N.R.)" ...
##  $ Estado            : chr [1:200473] "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ Mts 2             : num [1:200473] 60 60 60 60 60 60 60 60 60 60 ...
##  $ Tipo ubicación    : chr [1:200473] "Esquina" "Esquina" "Esquina" "Esquina" ...
##  $ Giro              : chr [1:200473] "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Hora inicio       : 'hms' num [1:200473] 08:00:00 08:00:00 08:00:00 08:00:00 ...
##   ..- attr(*, "units")= chr "secs"
##  $ Hora cierre       : 'hms' num [1:200473] 22:00:00 22:00:00 22:00:00 22:00:00 ...
##   ..- attr(*, "units")= chr "secs"
# Convertir de caracter a hora
df7 <- df6
df7$Hora <- as.POSIXct(df7$Hora, format = "%H:%M:%S")
df7$Hora <- format(df7$Hora, "%H")
df7$Hora <- as.integer(df7$Hora)
str(df7)
## tibble [200,473 × 22] (S3: tbl_df/tbl/data.frame)
##  $ vcClaveTienda     : chr [1:200473] "MX001" "MX001" "MX001" "MX001" ...
##  $ DescGiro          : chr [1:200473] "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Codigo Barras     : num [1:200473] 7.5e+12 7.5e+12 7.5e+12 7.5e+12 7.5e+12 ...
##  $ PLU               : num [1:200473] NA NA NA NA NA NA NA NA NA NA ...
##  $ Fecha             : Date[1:200473], format: "2020-06-19" "2020-06-19" ...
##  $ Hora              : int [1:200473] 8 8 8 8 8 8 8 8 8 15 ...
##  $ Marca             : chr [1:200473] "NUTRI LECHE" "DAN UP" "BIMBO" "PEPSI" ...
##  $ Fabricante        : chr [1:200473] "MEXILAC" "DANONE DE MEXICO" "GRUPO BIMBO" "PEPSI-COLA MEXICANA" ...
##  $ Producto          : chr [1:200473] "Nutri Leche 1 Litro" "DANUP STRAWBERRY P/BEBER 350GR NAL" "Rebanadas Bimbo 2Pz" "Pepsi N.R. 400Ml" ...
##  $ Precio            : num [1:200473] 16 14 5 8 19.5 9.5 11 9.5 23.5 12 ...
##  $ Ult.Costo         : num [1:200473] 12.3 14 5 8 15 ...
##  $ Unidades          : num [1:200473] 1 1 1 1 1 1 1 1 1 1 ...
##  $ F.Ticket          : num [1:200473] 1 2 3 3 4 4 4 4 4 5 ...
##  $ NombreDepartamento: chr [1:200473] "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ NombreFamilia     : chr [1:200473] "Lacteos y Refrigerados" "Lacteos y Refrigerados" "Pan y Tortilla" "Bebidas" ...
##  $ NombreCategoria   : chr [1:200473] "Leche" "Yogurt" "Pan Dulce Empaquetado" "Refrescos Plástico (N.R.)" ...
##  $ Estado            : chr [1:200473] "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ Mts 2             : num [1:200473] 60 60 60 60 60 60 60 60 60 60 ...
##  $ Tipo ubicación    : chr [1:200473] "Esquina" "Esquina" "Esquina" "Esquina" ...
##  $ Giro              : chr [1:200473] "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Hora inicio       : 'hms' num [1:200473] 08:00:00 08:00:00 08:00:00 08:00:00 ...
##   ..- attr(*, "units")= chr "secs"
##  $ Hora cierre       : 'hms' num [1:200473] 22:00:00 22:00:00 22:00:00 22:00:00 ...
##   ..- attr(*, "units")= chr "secs"
tabyl(df7, Estado, Hora)
##        Estado    0   1  2 3   7    8    9   10   11   12   13   14   15   16
##       Chiapas    0   0  0 0   0   15  355  456  492  640  546  483  338  105
##       Jalisco    0   0  0 0   0    0  102  380  416  434  449  411  526  511
##    Nuevo León 3312 518 57 2   0 1532 2782 3460 4241 5059 4857 4599 4801 5755
##  Quintana Roo  387 164  1 0   0    0    0   41   85  256  395  543  661  778
##       Sinaloa    0   0  0 0 598 2720 3881 4651 5102 5401 5224 5316 4859 3970
##    17   18   19   20   21   22   23
##    88   88   81  186  147   27    4
##   548  515  505  622  721  467   22
##  6350 6455 7369 8649 9722 9296 7501
##   969  757  965 1118 1219 1053  629
##  5111 6208 7158 8317 8783 5837  319

Técnica 5. Valores Faltantes

# Cuántos NA tengo en la base de datos?
sum(is.na(df7))
## [1] 199036
sum(is.na(df))
## [1] 199188
# Cuántos NA tengo por variable?
sapply(df,function(x) sum(is.na(x)))
##      vcClaveTienda           DescGiro      Codigo Barras                PLU 
##                  0                  0                  0             199188 
##              Fecha               Hora              Marca         Fabricante 
##                  0                  0                  0                  0 
##           Producto             Precio          Ult.Costo           Unidades 
##                  0                  0                  0                  0 
##           F.Ticket NombreDepartamento      NombreFamilia    NombreCategoria 
##                  0                  0                  0                  0 
##             Estado              Mts 2     Tipo ubicación               Giro 
##                  0                  0                  0                  0 
##        Hora inicio        Hora cierre 
##                  0                  0
# Borrar todos los registros con NA de la tabla
df8 <- df
df8 <- na.omit(df8)
# Reemplazar NA con CEROS
df9 <- df
df9[is.na(df)] <- 0
summary(df9$PLU)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##  0.00000  0.00000  0.00000  0.01513  0.00000 30.00000
# Reemplazar los NA con PROMEDIO
df10 <- df
df10$PLU[is.na(df10$PLU)]<-mean(df10$PLU, na.rm=TRUE) 
summary(df10$PLU)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.112   2.112   2.112   2.112  30.000

Técnica 6. Método Estadístico

df11 <- df7
boxplot(df11$Precio, horizontal = TRUE)

boxplot(df11$Unidades, horizontal = TRUE)

# <span style="color: red;">Agregar columnas</span>

df11$Dia_de_la_Semana <- wday(df11$Fecha)
summary(df11)
##  vcClaveTienda        DescGiro         Codigo Barras            PLU        
##  Length:200473      Length:200473      Min.   :8.347e+05   Min.   : 1.00   
##  Class :character   Class :character   1st Qu.:7.501e+12   1st Qu.: 1.00   
##  Mode  :character   Mode  :character   Median :7.501e+12   Median : 1.00   
##                                        Mean   :5.950e+12   Mean   : 2.11   
##                                        3rd Qu.:7.501e+12   3rd Qu.: 1.00   
##                                        Max.   :1.750e+13   Max.   :30.00   
##                                                            NA's   :199036  
##      Fecha                 Hora          Marca            Fabricante       
##  Min.   :2020-05-01   Min.   : 0.00   Length:200473      Length:200473     
##  1st Qu.:2020-06-06   1st Qu.:13.00   Class :character   Class :character  
##  Median :2020-07-11   Median :17.00   Mode  :character   Mode  :character  
##  Mean   :2020-07-18   Mean   :16.23                                        
##  3rd Qu.:2020-08-29   3rd Qu.:20.00                                        
##  Max.   :2020-11-11   Max.   :23.00                                        
##                                                                            
##    Producto             Precio          Ult.Costo         Unidades     
##  Length:200473      Min.   :   0.50   Min.   :  0.38   Min.   : 0.200  
##  Class :character   1st Qu.:  11.00   1st Qu.:  8.46   1st Qu.: 1.000  
##  Mode  :character   Median :  16.00   Median : 12.31   Median : 1.000  
##                     Mean   :  19.45   Mean   : 15.31   Mean   : 1.261  
##                     3rd Qu.:  25.00   3rd Qu.: 19.23   3rd Qu.: 1.000  
##                     Max.   :1000.00   Max.   :769.23   Max.   :96.000  
##                                                                        
##     F.Ticket      NombreDepartamento NombreFamilia      NombreCategoria   
##  Min.   :     1   Length:200473      Length:200473      Length:200473     
##  1st Qu.: 33978   Class :character   Class :character   Class :character  
##  Median :106035   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :194101                                                           
##  3rd Qu.:383065                                                           
##  Max.   :450040                                                           
##                                                                           
##     Estado              Mts 2      Tipo ubicación         Giro          
##  Length:200473      Min.   :47.0   Length:200473      Length:200473     
##  Class :character   1st Qu.:53.0   Class :character   Class :character  
##  Mode  :character   Median :60.0   Mode  :character   Mode  :character  
##                     Mean   :56.6                                        
##                     3rd Qu.:60.0                                        
##                     Max.   :62.0                                        
##                                                                         
##  Hora inicio       Hora cierre       Dia_de_la_Semana
##  Length:200473     Length:200473     Min.   :1.000   
##  Class1:hms        Class1:hms        1st Qu.:2.000   
##  Class2:difftime   Class2:difftime   Median :4.000   
##  Mode  :numeric    Mode  :numeric    Mean   :3.911   
##                                      3rd Qu.:6.000   
##                                      Max.   :7.000   
## 
df11$Subtotal <- df11$Precio * df11$Unidades
summary(df11)
##  vcClaveTienda        DescGiro         Codigo Barras            PLU        
##  Length:200473      Length:200473      Min.   :8.347e+05   Min.   : 1.00   
##  Class :character   Class :character   1st Qu.:7.501e+12   1st Qu.: 1.00   
##  Mode  :character   Mode  :character   Median :7.501e+12   Median : 1.00   
##                                        Mean   :5.950e+12   Mean   : 2.11   
##                                        3rd Qu.:7.501e+12   3rd Qu.: 1.00   
##                                        Max.   :1.750e+13   Max.   :30.00   
##                                                            NA's   :199036  
##      Fecha                 Hora          Marca            Fabricante       
##  Min.   :2020-05-01   Min.   : 0.00   Length:200473      Length:200473     
##  1st Qu.:2020-06-06   1st Qu.:13.00   Class :character   Class :character  
##  Median :2020-07-11   Median :17.00   Mode  :character   Mode  :character  
##  Mean   :2020-07-18   Mean   :16.23                                        
##  3rd Qu.:2020-08-29   3rd Qu.:20.00                                        
##  Max.   :2020-11-11   Max.   :23.00                                        
##                                                                            
##    Producto             Precio          Ult.Costo         Unidades     
##  Length:200473      Min.   :   0.50   Min.   :  0.38   Min.   : 0.200  
##  Class :character   1st Qu.:  11.00   1st Qu.:  8.46   1st Qu.: 1.000  
##  Mode  :character   Median :  16.00   Median : 12.31   Median : 1.000  
##                     Mean   :  19.45   Mean   : 15.31   Mean   : 1.261  
##                     3rd Qu.:  25.00   3rd Qu.: 19.23   3rd Qu.: 1.000  
##                     Max.   :1000.00   Max.   :769.23   Max.   :96.000  
##                                                                        
##     F.Ticket      NombreDepartamento NombreFamilia      NombreCategoria   
##  Min.   :     1   Length:200473      Length:200473      Length:200473     
##  1st Qu.: 33978   Class :character   Class :character   Class :character  
##  Median :106035   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :194101                                                           
##  3rd Qu.:383065                                                           
##  Max.   :450040                                                           
##                                                                           
##     Estado              Mts 2      Tipo ubicación         Giro          
##  Length:200473      Min.   :47.0   Length:200473      Length:200473     
##  Class :character   1st Qu.:53.0   Class :character   Class :character  
##  Mode  :character   Median :60.0   Mode  :character   Mode  :character  
##                     Mean   :56.6                                        
##                     3rd Qu.:60.0                                        
##                     Max.   :62.0                                        
##                                                                         
##  Hora inicio       Hora cierre       Dia_de_la_Semana    Subtotal     
##  Length:200473     Length:200473     Min.   :1.000    Min.   :   1.0  
##  Class1:hms        Class1:hms        1st Qu.:2.000    1st Qu.:  12.0  
##  Class2:difftime   Class2:difftime   Median :4.000    Median :  18.0  
##  Mode  :numeric    Mode  :numeric    Mean   :3.911    Mean   :  24.3  
##                                      3rd Qu.:6.000    3rd Qu.:  27.0  
##                                      Max.   :7.000    Max.   :2496.0  
## 
df11$Utilidad <- df11$Precio - df11$Ult.Costo
summary(df11)
##  vcClaveTienda        DescGiro         Codigo Barras            PLU        
##  Length:200473      Length:200473      Min.   :8.347e+05   Min.   : 1.00   
##  Class :character   Class :character   1st Qu.:7.501e+12   1st Qu.: 1.00   
##  Mode  :character   Mode  :character   Median :7.501e+12   Median : 1.00   
##                                        Mean   :5.950e+12   Mean   : 2.11   
##                                        3rd Qu.:7.501e+12   3rd Qu.: 1.00   
##                                        Max.   :1.750e+13   Max.   :30.00   
##                                                            NA's   :199036  
##      Fecha                 Hora          Marca            Fabricante       
##  Min.   :2020-05-01   Min.   : 0.00   Length:200473      Length:200473     
##  1st Qu.:2020-06-06   1st Qu.:13.00   Class :character   Class :character  
##  Median :2020-07-11   Median :17.00   Mode  :character   Mode  :character  
##  Mean   :2020-07-18   Mean   :16.23                                        
##  3rd Qu.:2020-08-29   3rd Qu.:20.00                                        
##  Max.   :2020-11-11   Max.   :23.00                                        
##                                                                            
##    Producto             Precio          Ult.Costo         Unidades     
##  Length:200473      Min.   :   0.50   Min.   :  0.38   Min.   : 0.200  
##  Class :character   1st Qu.:  11.00   1st Qu.:  8.46   1st Qu.: 1.000  
##  Mode  :character   Median :  16.00   Median : 12.31   Median : 1.000  
##                     Mean   :  19.45   Mean   : 15.31   Mean   : 1.261  
##                     3rd Qu.:  25.00   3rd Qu.: 19.23   3rd Qu.: 1.000  
##                     Max.   :1000.00   Max.   :769.23   Max.   :96.000  
##                                                                        
##     F.Ticket      NombreDepartamento NombreFamilia      NombreCategoria   
##  Min.   :     1   Length:200473      Length:200473      Length:200473     
##  1st Qu.: 33978   Class :character   Class :character   Class :character  
##  Median :106035   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :194101                                                           
##  3rd Qu.:383065                                                           
##  Max.   :450040                                                           
##                                                                           
##     Estado              Mts 2      Tipo ubicación         Giro          
##  Length:200473      Min.   :47.0   Length:200473      Length:200473     
##  Class :character   1st Qu.:53.0   Class :character   Class :character  
##  Mode  :character   Median :60.0   Mode  :character   Mode  :character  
##                     Mean   :56.6                                        
##                     3rd Qu.:60.0                                        
##                     Max.   :62.0                                        
##                                                                         
##  Hora inicio       Hora cierre       Dia_de_la_Semana    Subtotal     
##  Length:200473     Length:200473     Min.   :1.000    Min.   :   1.0  
##  Class1:hms        Class1:hms        1st Qu.:2.000    1st Qu.:  12.0  
##  Class2:difftime   Class2:difftime   Median :4.000    Median :  18.0  
##  Mode  :numeric    Mode  :numeric    Mean   :3.911    Mean   :  24.3  
##                                      3rd Qu.:6.000    3rd Qu.:  27.0  
##                                      Max.   :7.000    Max.   :2496.0  
##                                                                       
##     Utilidad      
##  Min.   :  0.000  
##  1st Qu.:  2.310  
##  Median :  3.230  
##  Mean   :  4.141  
##  3rd Qu.:  5.420  
##  Max.   :230.770  
## 

Exportar la base de datos limpia

bd_limpia <- df11
write.csv(bd_limpia, file="abarrotes_bd_limpia.csv", row.names = FALSE)

Conclusión

2 Se realizó un análisis exhaustivo de la base de datos de abarrotes proporcionada, incluyendo limpieza, transfromación y generación de nuevas variables. Se exploró la base de datos para identificar variables con NA, valores negativos, formatos incorrectos y otras inconsistencias. Finalmente se encontraron patrones y tendencias en ventas, precios, productos y clientes.

LS0tCnRpdGxlOiAiQWJhcnJvdGVzIgphdXRob3I6ICJQYXVsZXR0ZSBNdHogICBBMDE3NDc1MzUiCmRhdGU6ICIyMDI0LTAzLTEzIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRSAKICAgIHRoZW1lOiBjb3NtbyAKLS0tCgohW10oL1VzZXJzL3BhdWxldHRlbS5hLi9EZXNrdG9wL01hbmlwdWxhY2lvzIFuIGRlIGRhdG9zIGZlYi9veHhvLnBuZykKCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHJlZDsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMgPC9zcGFuPgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoamFuaXRvcikKYGBgCgojIDxzcGFuIHN0eWxlID0gImNvbG9yOiB5ZWxsb3c7Ij5JbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPgpgYGB7cn0KZGYgPC0gcmVhZF9jc3YoImFiYXJyb3Rlcy5jc3YiKQpgYGAKCgojIDxzcGFuIHN0eWxlID0gImNvbG9yOiByZWQ7Ij5FeHBsb3JhY2nDs24gZGUgZGF0b3M8L3NwYW4+CgpgYGB7cn0KIyBQYXJhIGV4cGxvcmFyIHZhcmlhYmxlcyBkZSB0ZXh0byAKcmVzdW1lbiA8LSBzdW1tYXJ5KGRmKQpyZXN1bWVuCgp0aWJibGUoZGYpCnN0cihkZikKaGVhZChkZiwgbj03KQp0YWlsKGRmKQoKIyBQYXJhIGV4cGxvcmFyIHZhcmlhYmxlcyBkZSB0ZXh0byAKY291bnQoZGYsIHZjQ2xhdmVUaWVuZGEsIHNvcnQgPSBUUlVFKQpjb3VudChkZiwgRGVzY0dpcm8sIHNvcnQgPSBUUlVFKQojY291bnQoZGYsIEZlY2hhLCBzb3J0ID0gVFJVRSkKI2NvdW50KGRmLCBIb3JhLCBzb3J0ID0gVFJVRSkKI2NvdW50KGRmLCBNYXJjYSwgc29ydCA9IFRSVUUpCiNjb3VudChkZiwgRmFicmljYW50ZSwgc29ydCA9IFRSVUUpCiNjb3VudChkZiwgUHJvZHVjdG8sIHNvcnQgPSBUUlVFKQpjb3VudChkZiwgR2lybywgc29ydCA9IFRSVUUpCmNvdW50KGRmLCBOb21icmVEZXBhcnRhbWVudG8sIHNvcnQgPSBUUlVFKQojY291bnQoZGYsIE5vbWJyZUZhbWlsaWEsIHNvcnQgPSBUUlVFKQojY291bnQoZGYsIE5vbWJyZUNhdGVnb3JpYSwgc29ydCA9IFRSVUUpCmNvdW50KGRmLCBFc3RhZG8sIHNvcnQgPSBUUlVFKQpjb3VudChkZiwgUHJlY2lvLCBzb3J0ID0gVFJVRSkKI2NvdW50KGRmLCBIb3JhLmluaWNpbywgc29ydD1UUlVFKQojY291bnQoZGYsIEhvcmEuY2llcnJlLCBzb3J0PVRSVUUpCiNjb3VudChkZiwgVGlwby5VYmljYWNpw7NuLCBzb3J0PVRSVUUpCiNjb3VudChkZiwgQ29kaWdvLkJhcnJhcywgc29ydD1UUlVFKQpgYGAKYGBge3J9CgojIEdlbmVyYXIgc3VidGFibGEgZGUgdGllbmRhIHkgZGVwYXJ0YW1lbnRvIAp0YWJ5bChkZiwgdmNDbGF2ZVRpZW5kYSwgTm9tYnJlRGVwYXJ0YW1lbnRvKQp0YWJ5bChkZiwgRXN0YWRvLCBOb21icmVEZXBhcnRhbWVudG8pCiN0YWJ5bChkZiwgRXN0YWRvLCBIb3JhIGNpZXJyZSkKI3RhYnlsKGRmLCBFc3RhZG8sIEhvcmEgaW5pY2lvKQoKIyBUaWVuZGEgMSBlcyBOdWV2byBMZcOzbiwgYWJyZSBhIGxhcyA4IHkgY2llcnJhIGEgbGFzIDIyCiMgVGllbmRhIDIgZXMgSmFsaXNjbywgYWJyZSBhIGxhcyA5IHkgY2llcnJhIGEgbGFzIDIyCiMgVGllbmRhIDMgZXMgQ2hpYXBhcywgYWJyZSBhIGxhcyA3IHkgY2llcnJhIGEgbGFzIDIzCiMgVGllbmRhIDQgZXMgU2luYWxvYSwgYWJyZSBhIGxhcyA3IHkgY2llcnJhIGEgbGFzIDIzCiMgVGllbmRhIDUgZXMgUXVpbnRhbmEgUm9vLCBhYnJlIGEgbGFzIDggeSBjaWVycmEgYSBsYXMgMjEKYGBgCgpPYnNlcnZhY2lvbmVzIAoKMS4gUExVIGNhc2kgbm8gdGllbmUgcmVnaXN0cm9zIAoyLiBMYSBmZWNoYSBubyB0aWVuZSBmb3JtYXRvIGFkZWN1YWRvIAozLiBFbCBwcmVjaW8gdGllbmUgdmFsb3JlcyBuZWdhdGl2b3MgCjQuIExhIGhvcmEgbm8gdGllbmUgZm9ybWF0byBhZGVjdWFkbyAKCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHllbGxvdzsiPkxpbXBpZXphIGRlIGRhdG9zPC9zcGFuPgojIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogcmVkOyI+VMOpY25pY2EgMS4gUmVtb3ZlciB2YWxvcmVzIGlycmVsZXZhbnRlczwvc3Bhbj4KCmBgYHtyfQojIEVsaW1pbmFyIGNvbHVtbmFzIApkZjEgPC0gZGYKI2RmMSA8LSBzdWJzZXQoZGYxLCBzZWxlY3QgPSAtYyhDb2RpZ28uQmFycmFzLCBQTFUpKQojIEVsaW1pbmFyIHJlbmdsb25lcyAKZGYyIDwtIGRmMSAKZGYyIDwtIGRmMltkZjIkUHJlY2lvID4gMCxdCnN1bW1hcnkoZGYyJFByZWNpbykKYGBgCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+VMOpY25pY2EgMi4gUmVtb3ZlciB2YWxvcmVzIHJlcGV0aWRvczwvc3Bhbj4KYGBge3J9CiMgwr9DdcOhbnRvcyByZW5nbG9uZXMgZHVwbGljYWRvcyB0ZW5lbW9zPwpkZjJbZHVwbGljYXRlZChkZjIpLF0Kc3VtKGR1cGxpY2F0ZWQoZGYyKSkKCiMgRWxpbWluYXIgcmVuZ2xvbmVzIGR1cGxpY2Fkb3MKZGYzIDwtIGRmMgpkZjMgPC0gZGlzdGluY3QoZGYzKQoKYGBgCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VMOpY25pY2EgMy4gQ29ycmVnaXIgZXJyb3JlcyB0aXBvZ3LDoWZpY29zIHkgc2ltaWxhcmVzPC9zcGFuPgoKYGBge3J9CiMgUHJlY2lvcyBlbiBhYnNvbHV0bwpkZjQgPC0gZGYxCmRmNCRQcmVjaW8gPC0gYWJzKGRmNCRQcmVjaW8pCnN1bW1hcnkoZGY0JFByZWNpbykKIyBObyBzZSB2YSBhIHV0aWxpemFyIGVuIGVzdGUgZWplcmNpY2lvCgoKIyBDYW50aWRhZGVzIGVuIGVudGVyb3MKZGY1IDwtIGRmMQpkZjUkVW5pZGFkZXMgPC0gY2VpbGluZyhkZjUkVW5pZGFkZXMpCnN1bW1hcnkoZGY1JFVuaWRhZGVzKQojIE5vIHNlIHZhIGEgdXRpbGl6YXIgZW4gZXN0ZSBlamVyY2ljaW8KCgpgYGAKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiB5ZWxsb3c7Ij5Uw6ljbmljYSA0LiBDb252ZXJ0aXIgdGlwb3MgZGUgZGF0b3M8L3NwYW4+CmBgYHtyfQojIENvbnZlcnRpciBkZSBDYXJhY3RlciBhIGZlY2hhCmRmNiA8LSBkZjMKZGY2JEZlY2hhIDwtIGFzLkRhdGUoZGY2JEZlY2hhLCBmb3JtYXQgPSAiJWQvJW0vJVkiKQpzdHIoZGY2KQoKIyBDb252ZXJ0aXIgZGUgY2FyYWN0ZXIgYSBob3JhCmRmNyA8LSBkZjYKZGY3JEhvcmEgPC0gYXMuUE9TSVhjdChkZjckSG9yYSwgZm9ybWF0ID0gIiVIOiVNOiVTIikKZGY3JEhvcmEgPC0gZm9ybWF0KGRmNyRIb3JhLCAiJUgiKQpkZjckSG9yYSA8LSBhcy5pbnRlZ2VyKGRmNyRIb3JhKQpzdHIoZGY3KQp0YWJ5bChkZjcsIEVzdGFkbywgSG9yYSkKYGBgCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VMOpY25pY2EgNS4gVmFsb3JlcyBGYWx0YW50ZXM8L3NwYW4+CmBgYHtyfQojIEN1w6FudG9zIE5BIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/CnN1bShpcy5uYShkZjcpKQpzdW0oaXMubmEoZGYpKQojIEN1w6FudG9zIE5BIHRlbmdvIHBvciB2YXJpYWJsZT8Kc2FwcGx5KGRmLGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCiMgQm9ycmFyIHRvZG9zIGxvcyByZWdpc3Ryb3MgY29uIE5BIGRlIGxhIHRhYmxhCmRmOCA8LSBkZgpkZjggPC0gbmEub21pdChkZjgpCiMgUmVlbXBsYXphciBOQSBjb24gQ0VST1MKZGY5IDwtIGRmCmRmOVtpcy5uYShkZildIDwtIDAKc3VtbWFyeShkZjkkUExVKQojIFJlZW1wbGF6YXIgbG9zIE5BIGNvbiBQUk9NRURJTwpkZjEwIDwtIGRmCmRmMTAkUExVW2lzLm5hKGRmMTAkUExVKV08LW1lYW4oZGYxMCRQTFUsIG5hLnJtPVRSVUUpIApzdW1tYXJ5KGRmMTAkUExVKQoKYGBgCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VMOpY25pY2EgNi4gTcOpdG9kbyBFc3RhZMOtc3RpY288L3NwYW4+CmBgYHtyfQpkZjExIDwtIGRmNwpib3hwbG90KGRmMTEkUHJlY2lvLCBob3Jpem9udGFsID0gVFJVRSkKYm94cGxvdChkZjExJFVuaWRhZGVzLCBob3Jpem9udGFsID0gVFJVRSkKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5BZ3JlZ2FyIGNvbHVtbmFzPC9zcGFuPgoKZGYxMSREaWFfZGVfbGFfU2VtYW5hIDwtIHdkYXkoZGYxMSRGZWNoYSkKc3VtbWFyeShkZjExKQogICAgCmRmMTEkU3VidG90YWwgPC0gZGYxMSRQcmVjaW8gKiBkZjExJFVuaWRhZGVzCnN1bW1hcnkoZGYxMSkKCmRmMTEkVXRpbGlkYWQgPC0gZGYxMSRQcmVjaW8gLSBkZjExJFVsdC5Db3N0bwpzdW1tYXJ5KGRmMTEpCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkV4cG9ydGFyIGxhIGJhc2UgZGUgZGF0b3MgbGltcGlhPC9zcGFuPgpgYGB7cn0KYmRfbGltcGlhIDwtIGRmMTEKd3JpdGUuY3N2KGJkX2xpbXBpYSwgZmlsZT0iYWJhcnJvdGVzX2JkX2xpbXBpYS5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+Q29uY2x1c2nDs248L3NwYW4+CjIKU2UgcmVhbGl6w7MgdW4gYW7DoWxpc2lzIGV4aGF1c3Rpdm8gZGUgbGEgYmFzZSBkZSBkYXRvcyBkZSBhYmFycm90ZXMgcHJvcG9yY2lvbmFkYSwgaW5jbHV5ZW5kbyBsaW1waWV6YSwgdHJhbnNmcm9tYWNpw7NuIHkgZ2VuZXJhY2nDs24gZGUgbnVldmFzIHZhcmlhYmxlcy4gU2UgZXhwbG9yw7MgbGEgYmFzZSBkZSBkYXRvcyBwYXJhIGlkZW50aWZpY2FyIHZhcmlhYmxlcyBjb24gTkEsIHZhbG9yZXMgbmVnYXRpdm9zLCBmb3JtYXRvcyBpbmNvcnJlY3RvcyB5IG90cmFzIGluY29uc2lzdGVuY2lhcy4gRmluYWxtZW50ZSBzZSBlbmNvbnRyYXJvbiBwYXRyb25lcyB5IHRlbmRlbmNpYXMgZW4gdmVudGFzLCBwcmVjaW9zLCBwcm9kdWN0b3MgeSBjbGllbnRlcy4gCg==