Importar base de datos

df <- read.csv("/Users/carosuarez/Downloads/abarrotes (1).csv")

Entender la base de datos

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   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##    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     
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 
#install.packages("tidyverse")
library(tidyverse) # Visualizr los primeros 10 rengones de la tabla
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ 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
tibble(df) # Visualiza los primeros 10 renglones de la tabla.
## # A tibble: 200,625 × 22
##    vcClaveTienda DescGiro  Codigo.Barras   PLU Fecha      Hora  Marca Fabricante
##    <chr>         <chr>             <dbl> <int> <chr>      <chr> <chr> <chr>     
##  1 MX001         Abarrotes 7501020540666    NA 19/06/2020 08:1… NUTR… MEXILAC   
##  2 MX001         Abarrotes 7501032397906    NA 19/06/2020 08:2… DAN … DANONE DE…
##  3 MX001         Abarrotes 7501000112845    NA 19/06/2020 08:2… BIMBO GRUPO BIM…
##  4 MX001         Abarrotes 7501031302741    NA 19/06/2020 08:2… PEPSI PEPSI-COL…
##  5 MX001         Abarrotes 7501026027543    NA 19/06/2020 08:2… BLAN… FABRICA D…
##  6 MX001         Abarrotes 7501020540666    NA 19/06/2020 08:1… NUTR… MEXILAC   
##  7 MX001         Abarrotes 7501032397906    NA 19/06/2020 08:2… DAN … DANONE DE…
##  8 MX001         Abarrotes 7501000112845    NA 19/06/2020 08:2… BIMBO GRUPO BIM…
##  9 MX001         Abarrotes 7501031302741    NA 19/06/2020 08:2… PEPSI PEPSI-COL…
## 10 MX001         Abarrotes 7501026027543    NA 19/06/2020 08:2… BLAN… FABRICA D…
## # ℹ 200,615 more rows
## # ℹ 14 more variables: Producto <chr>, Precio <dbl>, Ult.Costo <dbl>,
## #   Unidades <dbl>, F.Ticket <int>, NombreDepartamento <chr>,
## #   NombreFamilia <chr>, NombreCategoria <chr>, Estado <chr>, Mts.2 <int>,
## #   Tipo.ubicación <chr>, Giro <chr>, Hora.inicio <chr>, Hora.cierre <chr>
str(df) # Visualiza en texto las variables, su tipo y ejemplos.
## 'data.frame':    200625 obs. of  22 variables:
##  $ vcClaveTienda     : chr  "MX001" "MX001" "MX001" "MX001" ...
##  $ DescGiro          : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Codigo.Barras     : num  7.5e+12 7.5e+12 7.5e+12 7.5e+12 7.5e+12 ...
##  $ PLU               : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Fecha             : chr  "19/06/2020" "19/06/2020" "19/06/2020" "19/06/2020" ...
##  $ Hora              : chr  "08:16:21" "08:23:33" "08:24:33" "08:24:33" ...
##  $ Marca             : chr  "NUTRI LECHE" "DAN UP" "BIMBO" "PEPSI" ...
##  $ Fabricante        : chr  "MEXILAC" "DANONE DE MEXICO" "GRUPO BIMBO" "PEPSI-COLA MEXICANA" ...
##  $ Producto          : chr  "Nutri Leche 1 Litro" "DANUP STRAWBERRY P/BEBER 350GR NAL" "Rebanadas Bimbo 2Pz" "Pepsi N.R. 400Ml" ...
##  $ Precio            : num  16 14 5 8 19.5 16 14 5 8 19.5 ...
##  $ Ult.Costo         : num  12.3 14 5 8 15 ...
##  $ Unidades          : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ F.Ticket          : int  1 2 3 3 4 1 2 3 3 4 ...
##  $ NombreDepartamento: chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ NombreFamilia     : chr  "Lacteos y Refrigerados" "Lacteos y Refrigerados" "Pan y Tortilla" "Bebidas" ...
##  $ NombreCategoria   : chr  "Leche" "Yogurt" "Pan Dulce Empaquetado" "Refrescos Plástico (N.R.)" ...
##  $ Estado            : chr  "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ Mts.2             : int  60 60 60 60 60 60 60 60 60 60 ...
##  $ Tipo.ubicación    : chr  "Esquina" "Esquina" "Esquina" "Esquina" ...
##  $ Giro              : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Hora.inicio       : chr  "08:00" "08:00" "08:00" "08:00" ...
##  $ Hora.cierre       : chr  "22:00" "22:00" "22:00" "22:00" ...
head(df, n=7) # Muestra los primeros 6 renglones de la tabla.
##   vcClaveTienda  DescGiro Codigo.Barras PLU      Fecha     Hora
## 1         MX001 Abarrotes  7.501021e+12  NA 19/06/2020 08:16:21
## 2         MX001 Abarrotes  7.501032e+12  NA 19/06/2020 08:23:33
## 3         MX001 Abarrotes  7.501000e+12  NA 19/06/2020 08:24:33
## 4         MX001 Abarrotes  7.501031e+12  NA 19/06/2020 08:24:33
## 5         MX001 Abarrotes  7.501026e+12  NA 19/06/2020 08:26:28
## 6         MX001 Abarrotes  7.501021e+12  NA 19/06/2020 08:16:21
## 7         MX001 Abarrotes  7.501032e+12  NA 19/06/2020 08:23:33
##                        Marca                 Fabricante
## 1                NUTRI LECHE                    MEXILAC
## 2                     DAN UP           DANONE DE MEXICO
## 3                      BIMBO                GRUPO BIMBO
## 4                      PEPSI        PEPSI-COLA MEXICANA
## 5 BLANCA NIEVES (DETERGENTE) FABRICA DE JABON LA CORONA
## 6                NUTRI LECHE                    MEXILAC
## 7                     DAN UP           DANONE DE MEXICO
##                             Producto Precio Ult.Costo Unidades F.Ticket
## 1                Nutri Leche 1 Litro   16.0     12.31        1        1
## 2 DANUP STRAWBERRY P/BEBER 350GR NAL   14.0     14.00        1        2
## 3                Rebanadas Bimbo 2Pz    5.0      5.00        1        3
## 4                   Pepsi N.R. 400Ml    8.0      8.00        1        3
## 5      Detergente Blanca Nieves 500G   19.5     15.00        1        4
## 6                Nutri Leche 1 Litro   16.0     12.31        1        1
## 7 DANUP STRAWBERRY P/BEBER 350GR NAL   14.0     14.00        1        2
##   NombreDepartamento          NombreFamilia           NombreCategoria
## 1          Abarrotes Lacteos y Refrigerados                     Leche
## 2          Abarrotes Lacteos y Refrigerados                    Yogurt
## 3          Abarrotes         Pan y Tortilla     Pan Dulce Empaquetado
## 4          Abarrotes                Bebidas Refrescos Plástico (N.R.)
## 5          Abarrotes     Limpieza del Hogar                Lavandería
## 6          Abarrotes Lacteos y Refrigerados                     Leche
## 7          Abarrotes Lacteos y Refrigerados                    Yogurt
##       Estado Mts.2 Tipo.ubicación      Giro Hora.inicio Hora.cierre
## 1 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 2 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 3 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 4 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 5 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 6 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 7 Nuevo León    60        Esquina Abarrotes       08:00       22:00
tail(df) # Muestra los ultimos 6 renglones de la tabla.
##        vcClaveTienda DescGiro Codigo.Barras PLU      Fecha     Hora
## 200620         MX005 Depósito   7.62221e+12  NA 12/07/2020 01:08:25
## 200621         MX005 Depósito   7.62221e+12  NA 23/10/2020 22:17:37
## 200622         MX005 Depósito   7.62221e+12  NA 10/10/2020 20:30:20
## 200623         MX005 Depósito   7.62221e+12  NA 10/10/2020 22:40:43
## 200624         MX005 Depósito   7.62221e+12  NA 27/06/2020 22:30:19
## 200625         MX005 Depósito   7.62221e+12  NA 26/06/2020 23:43:34
##                    Marca    Fabricante                          Producto Precio
## 200620 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200621 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200622 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200623 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200624 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200625 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
##        Ult.Costo Unidades F.Ticket NombreDepartamento NombreFamilia
## 200620      6.92        1   103100          Abarrotes      Dulcería
## 200621      6.92        1   116598          Abarrotes      Dulcería
## 200622      6.92        1   114886          Abarrotes      Dulcería
## 200623      6.92        1   114955          Abarrotes      Dulcería
## 200624      6.92        1   101121          Abarrotes      Dulcería
## 200625      6.92        1   100879          Abarrotes      Dulcería
##        NombreCategoria       Estado Mts.2 Tipo.ubicación       Giro Hora.inicio
## 200620 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200621 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200622 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200623 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200624 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200625 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
##        Hora.cierre
## 200620       21:00
## 200621       21:00
## 200622       21:00
## 200623       21:00
## 200624       21:00
## 200625       21:00
# install.packages("janitor")

library(janitor) # Libreria para explorar y limpiar datos.
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(dplyr) # Libreria para manipular datos.

count(df,vcClaveTienda,sort=TRUE)
##   vcClaveTienda     n
## 1         MX001 96469
## 2         MX004 83455
## 3         MX005 10021
## 4         MX002  6629
## 5         MX003  4051
count(df,DescGiro,sort=TRUE)
##     DescGiro      n
## 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,NombreDepartamento,sort=TRUE)
##     NombreDepartamento      n
## 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)
##         Estado     n
## 1   Nuevo León 96469
## 2      Sinaloa 83455
## 3 Quintana Roo 10021
## 4      Jalisco  6629
## 5      Chiapas  4051
count(df,Tipo.ubicación,sort=TRUE)
##   Tipo.ubicación      n
## 1        Esquina 189945
## 2        Rotonda   6629
## 3   Entre calles   4051
count(df,Giro,sort=TRUE)
##         Giro      n
## 1  Abarrotes 183975
## 2 Mini súper  16650
count(df,Hora.inicio,sort=TRUE)
##   Hora.inicio      n
## 1       08:00 106490
## 2       07:00  87506
## 3       09:00   6629
count(df,Hora.cierre,sort=TRUE)
##   Hora.cierre      n
## 1       22:00 103098
## 2       23:00  87506
## 3       21:00  10021
# 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.inicio)
##        Estado 07:00 08:00 09:00
##       Chiapas  4051     0     0
##       Jalisco     0     0  6629
##    Nuevo León     0 96469     0
##  Quintana Roo     0 10021     0
##       Sinaloa 83455     0     0
tabyl(df,Estado,Hora.cierre)
##        Estado 21:00 22:00 23:00
##       Chiapas     0     0  4051
##       Jalisco     0  6629     0
##    Nuevo León     0 96469     0
##  Quintana Roo 10021     0     0
##       Sinaloa     0     0 83455
# Tienda 1 es Nuevo León, abre a las 8 cierra a las 22
# Tienda 2 es Jalisco, abre a las 9 cierra a las 22
# Tienda 3 es Chiapas, abre a las 7 cierra a las 23
# Tienda 4 es Sinaloa, abre a las 7 cierra a las 23
# Tienda 5 es Quintana Roo, abre a las 8 cierra a las 21

Instalar paquetes y llamar librerias

#install.packages("lubridate")
library(lubridate)
#install.packages("plyr")
library(plyr)
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
## 
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
## 
##     arrange, count, desc, failwith, id, mutate, rename, summarise,
##     summarize
## The following object is masked from 'package:purrr':
## 
##     compact
#install.packages("Matrix")
library(Matrix)
## 
## Attaching package: 'Matrix'
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
#install.packages("arules")
library(arules)
## 
## Attaching package: 'arules'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
#install.packages("arulesViz")
library(arulesViz)
#install.packages("datasets")
library(datasets)

Observaciones:

  1. PLU casi no tiene registros.

  2. El formato de 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(PLU,Codigo.Barras))

# 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), ]
##    vcClaveTienda  DescGiro      Fecha     Hora                      Marca
## 6          MX001 Abarrotes 19/06/2020 08:16:21                NUTRI LECHE
## 7          MX001 Abarrotes 19/06/2020 08:23:33                     DAN UP
## 8          MX001 Abarrotes 19/06/2020 08:24:33                      BIMBO
## 9          MX001 Abarrotes 19/06/2020 08:24:33                      PEPSI
## 10         MX001 Abarrotes 19/06/2020 08:26:28 BLANCA NIEVES (DETERGENTE)
##                    Fabricante                           Producto Precio
## 6                     MEXILAC                Nutri Leche 1 Litro   16.0
## 7            DANONE DE MEXICO DANUP STRAWBERRY P/BEBER 350GR NAL   14.0
## 8                 GRUPO BIMBO                Rebanadas Bimbo 2Pz    5.0
## 9         PEPSI-COLA MEXICANA                   Pepsi N.R. 400Ml    8.0
## 10 FABRICA DE JABON LA CORONA      Detergente Blanca Nieves 500G   19.5
##    Ult.Costo Unidades F.Ticket NombreDepartamento          NombreFamilia
## 6      12.31        1        1          Abarrotes Lacteos y Refrigerados
## 7      14.00        1        2          Abarrotes Lacteos y Refrigerados
## 8       5.00        1        3          Abarrotes         Pan y Tortilla
## 9       8.00        1        3          Abarrotes                Bebidas
## 10     15.00        1        4          Abarrotes     Limpieza del Hogar
##              NombreCategoria     Estado Mts.2 Tipo.ubicación      Giro
## 6                      Leche Nuevo León    60        Esquina Abarrotes
## 7                     Yogurt Nuevo León    60        Esquina Abarrotes
## 8      Pan Dulce Empaquetado Nuevo León    60        Esquina Abarrotes
## 9  Refrescos Plástico (N.R.) Nuevo León    60        Esquina Abarrotes
## 10                Lavandería Nuevo León    60        Esquina Abarrotes
##    Hora.inicio Hora.cierre
## 6        08:00       22:00
## 7        08:00       22:00
## 8        08:00       22:00
## 9        08:00       22:00
## 10       08:00       22:00
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
df$Precio<-abs(df4$Precio)
summary(df4$Precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -147.00   11.00   16.00   19.42   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. Corregir errores tipográficos y similares

df6<-df3
df6$Fecha <- as.Date(df6$Fecha, format="%d/%m/%Y")
str(df6)
## 'data.frame':    200473 obs. of  20 variables:
##  $ vcClaveTienda     : chr  "MX001" "MX001" "MX001" "MX001" ...
##  $ DescGiro          : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Fecha             : Date, format: "2020-06-19" "2020-06-19" ...
##  $ Hora              : chr  "08:16:21" "08:23:33" "08:24:33" "08:24:33" ...
##  $ Marca             : chr  "NUTRI LECHE" "DAN UP" "BIMBO" "PEPSI" ...
##  $ Fabricante        : chr  "MEXILAC" "DANONE DE MEXICO" "GRUPO BIMBO" "PEPSI-COLA MEXICANA" ...
##  $ Producto          : chr  "Nutri Leche 1 Litro" "DANUP STRAWBERRY P/BEBER 350GR NAL" "Rebanadas Bimbo 2Pz" "Pepsi N.R. 400Ml" ...
##  $ Precio            : num  16 14 5 8 19.5 9.5 11 9.5 23.5 12 ...
##  $ Ult.Costo         : num  12.3 14 5 8 15 ...
##  $ Unidades          : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ F.Ticket          : int  1 2 3 3 4 4 4 4 4 5 ...
##  $ NombreDepartamento: chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ NombreFamilia     : chr  "Lacteos y Refrigerados" "Lacteos y Refrigerados" "Pan y Tortilla" "Bebidas" ...
##  $ NombreCategoria   : chr  "Leche" "Yogurt" "Pan Dulce Empaquetado" "Refrescos Plástico (N.R.)" ...
##  $ Estado            : chr  "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ Mts.2             : int  60 60 60 60 60 60 60 60 60 60 ...
##  $ Tipo.ubicación    : chr  "Esquina" "Esquina" "Esquina" "Esquina" ...
##  $ Giro              : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Hora.inicio       : chr  "08:00" "08:00" "08:00" "08:00" ...
##  $ Hora.cierre       : chr  "22:00" "22:00" "22:00" "22:00" ...
# 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)
## 'data.frame':    200473 obs. of  20 variables:
##  $ vcClaveTienda     : chr  "MX001" "MX001" "MX001" "MX001" ...
##  $ DescGiro          : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Fecha             : Date, format: "2020-06-19" "2020-06-19" ...
##  $ Hora              : int  8 8 8 8 8 8 8 8 8 15 ...
##  $ Marca             : chr  "NUTRI LECHE" "DAN UP" "BIMBO" "PEPSI" ...
##  $ Fabricante        : chr  "MEXILAC" "DANONE DE MEXICO" "GRUPO BIMBO" "PEPSI-COLA MEXICANA" ...
##  $ Producto          : chr  "Nutri Leche 1 Litro" "DANUP STRAWBERRY P/BEBER 350GR NAL" "Rebanadas Bimbo 2Pz" "Pepsi N.R. 400Ml" ...
##  $ Precio            : num  16 14 5 8 19.5 9.5 11 9.5 23.5 12 ...
##  $ Ult.Costo         : num  12.3 14 5 8 15 ...
##  $ Unidades          : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ F.Ticket          : int  1 2 3 3 4 4 4 4 4 5 ...
##  $ NombreDepartamento: chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ NombreFamilia     : chr  "Lacteos y Refrigerados" "Lacteos y Refrigerados" "Pan y Tortilla" "Bebidas" ...
##  $ NombreCategoria   : chr  "Leche" "Yogurt" "Pan Dulce Empaquetado" "Refrescos Plástico (N.R.)" ...
##  $ Estado            : chr  "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ Mts.2             : int  60 60 60 60 60 60 60 60 60 60 ...
##  $ Tipo.ubicación    : chr  "Esquina" "Esquina" "Esquina" "Esquina" ...
##  $ Giro              : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Hora.inicio       : chr  "08:00" "08:00" "08:00" "08:00" ...
##  $ Hora.cierre       : chr  "22:00" "22:00" "22:00" "22:00" ...
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] 0
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)

Agregar columnas

df11$Dia_de_la_Semana <- wday(df11$Fecha)
summary(df11)
##  vcClaveTienda        DescGiro             Fecha                 Hora      
##  Length:200473      Length:200473      Min.   :2020-05-01   Min.   : 0.00  
##  Class :character   Class :character   1st Qu.:2020-06-06   1st Qu.:13.00  
##  Mode  :character   Mode  :character   Median :2020-07-11   Median :17.00  
##                                        Mean   :2020-07-18   Mean   :16.23  
##                                        3rd Qu.:2020-08-29   3rd Qu.:20.00  
##                                        Max.   :2020-11-11   Max.   :23.00  
##     Marca            Fabricante          Producto             Precio       
##  Length:200473      Length:200473      Length:200473      Min.   :   0.50  
##  Class :character   Class :character   Class :character   1st Qu.:  11.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :  16.00  
##                                                           Mean   :  19.45  
##                                                           3rd Qu.:  25.00  
##                                                           Max.   :1000.00  
##    Ult.Costo         Unidades         F.Ticket      NombreDepartamento
##  Min.   :  0.38   Min.   : 0.200   Min.   :     1   Length:200473     
##  1st Qu.:  8.46   1st Qu.: 1.000   1st Qu.: 33978   Class :character  
##  Median : 12.31   Median : 1.000   Median :106035   Mode  :character  
##  Mean   : 15.31   Mean   : 1.261   Mean   :194101                     
##  3rd Qu.: 19.23   3rd Qu.: 1.000   3rd Qu.:383065                     
##  Max.   :769.23   Max.   :96.000   Max.   :450040                     
##  NombreFamilia      NombreCategoria       Estado              Mts.2     
##  Length:200473      Length:200473      Length:200473      Min.   :47.0  
##  Class :character   Class :character   Class :character   1st Qu.:53.0  
##  Mode  :character   Mode  :character   Mode  :character   Median :60.0  
##                                                           Mean   :56.6  
##                                                           3rd Qu.:60.0  
##                                                           Max.   :62.0  
##  Tipo.ubicación         Giro           Hora.inicio        Hora.cierre       
##  Length:200473      Length:200473      Length:200473      Length:200473     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Dia_de_la_Semana
##  Min.   :1.000   
##  1st Qu.:2.000   
##  Median :4.000   
##  Mean   :3.911   
##  3rd Qu.:6.000   
##  Max.   :7.000
df11$Subtotal <- df11$Precio * df11$Unidades
summary(df11)
##  vcClaveTienda        DescGiro             Fecha                 Hora      
##  Length:200473      Length:200473      Min.   :2020-05-01   Min.   : 0.00  
##  Class :character   Class :character   1st Qu.:2020-06-06   1st Qu.:13.00  
##  Mode  :character   Mode  :character   Median :2020-07-11   Median :17.00  
##                                        Mean   :2020-07-18   Mean   :16.23  
##                                        3rd Qu.:2020-08-29   3rd Qu.:20.00  
##                                        Max.   :2020-11-11   Max.   :23.00  
##     Marca            Fabricante          Producto             Precio       
##  Length:200473      Length:200473      Length:200473      Min.   :   0.50  
##  Class :character   Class :character   Class :character   1st Qu.:  11.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :  16.00  
##                                                           Mean   :  19.45  
##                                                           3rd Qu.:  25.00  
##                                                           Max.   :1000.00  
##    Ult.Costo         Unidades         F.Ticket      NombreDepartamento
##  Min.   :  0.38   Min.   : 0.200   Min.   :     1   Length:200473     
##  1st Qu.:  8.46   1st Qu.: 1.000   1st Qu.: 33978   Class :character  
##  Median : 12.31   Median : 1.000   Median :106035   Mode  :character  
##  Mean   : 15.31   Mean   : 1.261   Mean   :194101                     
##  3rd Qu.: 19.23   3rd Qu.: 1.000   3rd Qu.:383065                     
##  Max.   :769.23   Max.   :96.000   Max.   :450040                     
##  NombreFamilia      NombreCategoria       Estado              Mts.2     
##  Length:200473      Length:200473      Length:200473      Min.   :47.0  
##  Class :character   Class :character   Class :character   1st Qu.:53.0  
##  Mode  :character   Mode  :character   Mode  :character   Median :60.0  
##                                                           Mean   :56.6  
##                                                           3rd Qu.:60.0  
##                                                           Max.   :62.0  
##  Tipo.ubicación         Giro           Hora.inicio        Hora.cierre       
##  Length:200473      Length:200473      Length:200473      Length:200473     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Dia_de_la_Semana    Subtotal     
##  Min.   :1.000    Min.   :   1.0  
##  1st Qu.:2.000    1st Qu.:  12.0  
##  Median :4.000    Median :  18.0  
##  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             Fecha                 Hora      
##  Length:200473      Length:200473      Min.   :2020-05-01   Min.   : 0.00  
##  Class :character   Class :character   1st Qu.:2020-06-06   1st Qu.:13.00  
##  Mode  :character   Mode  :character   Median :2020-07-11   Median :17.00  
##                                        Mean   :2020-07-18   Mean   :16.23  
##                                        3rd Qu.:2020-08-29   3rd Qu.:20.00  
##                                        Max.   :2020-11-11   Max.   :23.00  
##     Marca            Fabricante          Producto             Precio       
##  Length:200473      Length:200473      Length:200473      Min.   :   0.50  
##  Class :character   Class :character   Class :character   1st Qu.:  11.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :  16.00  
##                                                           Mean   :  19.45  
##                                                           3rd Qu.:  25.00  
##                                                           Max.   :1000.00  
##    Ult.Costo         Unidades         F.Ticket      NombreDepartamento
##  Min.   :  0.38   Min.   : 0.200   Min.   :     1   Length:200473     
##  1st Qu.:  8.46   1st Qu.: 1.000   1st Qu.: 33978   Class :character  
##  Median : 12.31   Median : 1.000   Median :106035   Mode  :character  
##  Mean   : 15.31   Mean   : 1.261   Mean   :194101                     
##  3rd Qu.: 19.23   3rd Qu.: 1.000   3rd Qu.:383065                     
##  Max.   :769.23   Max.   :96.000   Max.   :450040                     
##  NombreFamilia      NombreCategoria       Estado              Mts.2     
##  Length:200473      Length:200473      Length:200473      Min.   :47.0  
##  Class :character   Class :character   Class :character   1st Qu.:53.0  
##  Mode  :character   Mode  :character   Mode  :character   Median :60.0  
##                                                           Mean   :56.6  
##                                                           3rd Qu.:60.0  
##                                                           Max.   :62.0  
##  Tipo.ubicación         Giro           Hora.inicio        Hora.cierre       
##  Length:200473      Length:200473      Length:200473      Length:200473     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Dia_de_la_Semana    Subtotal         Utilidad      
##  Min.   :1.000    Min.   :   1.0   Min.   :  0.000  
##  1st Qu.:2.000    1st Qu.:  12.0   1st Qu.:  2.310  
##  Median :4.000    Median :  18.0   Median :  3.230  
##  Mean   :3.911    Mean   :  24.3   Mean   :  4.141  
##  3rd Qu.:6.000    3rd Qu.:  27.0   3rd Qu.:  5.420  
##  Max.   :7.000    Max.   :2496.0   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

Se llevó a cabo un análisis sobre la base de datos que fue suministrada sobre los productos de abarrotes, lo cual implicó un minucioso proceso de renovación, depuración y la formación de variables adicionales. Nos adentramos a la estructura de la base de datos proporcionada, para poder identificar valores faltantes dentro de las variables, formatos erróneos, registros negativos o en general alguna irregularidad que pudiera dañar la integridad de la base datos. Después de este análisis logramos distinguir las tendencias y los patrones en los productos, en sus consumidores y en sus ventas.

LS0tCnRpdGxlOiAnIkFiYXJyb3RlcyInCmF1dGhvcjogIkNhcm9saW5hIFN1w6FyZXogQTAwODM3OTIyIgpkYXRlOiAiMjAyNC0wMy0wNCIKb3V0cHV0OiAgCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogY29zbW8KLS0tCiFbXSgvVXNlcnMvY2Fyb3N1YXJlei9Eb3dubG9hZHMvMzYwNDg2NTE2LnBuZykKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JbXBvcnRhciBiYXNlIGRlIGRhdG9zPC9zcGFuPgoKYGBge3J9CmRmIDwtIHJlYWQuY3N2KCIvVXNlcnMvY2Fyb3N1YXJlei9Eb3dubG9hZHMvYWJhcnJvdGVzICgxKS5jc3YiKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5FbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPgoKYGBge3J9CnJlc3VtZW4gPC0gc3VtbWFyeShkZikKcmVzdW1lbgoKI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCmxpYnJhcnkodGlkeXZlcnNlKSAjIFZpc3VhbGl6ciBsb3MgcHJpbWVyb3MgMTAgcmVuZ29uZXMgZGUgbGEgdGFibGEKCnRpYmJsZShkZikgIyBWaXN1YWxpemEgbG9zIHByaW1lcm9zIDEwIHJlbmdsb25lcyBkZSBsYSB0YWJsYS4Kc3RyKGRmKSAjIFZpc3VhbGl6YSBlbiB0ZXh0byBsYXMgdmFyaWFibGVzLCBzdSB0aXBvIHkgZWplbXBsb3MuCmhlYWQoZGYsIG49NykgIyBNdWVzdHJhIGxvcyBwcmltZXJvcyA2IHJlbmdsb25lcyBkZSBsYSB0YWJsYS4KdGFpbChkZikgIyBNdWVzdHJhIGxvcyB1bHRpbW9zIDYgcmVuZ2xvbmVzIGRlIGxhIHRhYmxhLgpgYGAKYGBge3J9CiMgaW5zdGFsbC5wYWNrYWdlcygiamFuaXRvciIpCgpsaWJyYXJ5KGphbml0b3IpICMgTGlicmVyaWEgcGFyYSBleHBsb3JhciB5IGxpbXBpYXIgZGF0b3MuCmxpYnJhcnkoZHBseXIpICMgTGlicmVyaWEgcGFyYSBtYW5pcHVsYXIgZGF0b3MuCgpjb3VudChkZix2Y0NsYXZlVGllbmRhLHNvcnQ9VFJVRSkKY291bnQoZGYsRGVzY0dpcm8sc29ydD1UUlVFKQojIGNvdW50KGRmLEZlY2hhLHNvcnQ9VFJVRSkKIyBjb3VudChkZixIb3JhLHNvcnQ9VFJVRSkKIyBjb3VudChkZixNYXJjYSxzb3J0PVRSVUUpCiMgY291bnQoZGYsRmFicmljYW50ZSxzb3J0PVRSVUUpCiMgY291bnQoZGYsUHJvZHVjdG8sc29ydD1UUlVFKQpjb3VudChkZixOb21icmVEZXBhcnRhbWVudG8sc29ydD1UUlVFKQojIGNvdW50KGRmLE5vbWJyZUZhbWlsaWEsc29ydD1UUlVFKQojIGNvdW50KGRmLE5vbWJyZUNhdGVnb3JpYSxzb3J0PVRSVUUpCmNvdW50KGRmLEVzdGFkbyAsc29ydD1UUlVFKQpjb3VudChkZixUaXBvLnViaWNhY2nDs24sc29ydD1UUlVFKQpjb3VudChkZixHaXJvLHNvcnQ9VFJVRSkKY291bnQoZGYsSG9yYS5pbmljaW8sc29ydD1UUlVFKQpjb3VudChkZixIb3JhLmNpZXJyZSxzb3J0PVRSVUUpCgojIEdlbmVyYXIgc3VidGFibGEgZGUgVGllbmRhIHkgRGVwYXJ0YW1lbnRvCgp0YWJ5bChkZix2Y0NsYXZlVGllbmRhLE5vbWJyZURlcGFydGFtZW50bykKdGFieWwoZGYsRXN0YWRvLE5vbWJyZURlcGFydGFtZW50bykKdGFieWwoZGYsRXN0YWRvLEhvcmEuaW5pY2lvKQp0YWJ5bChkZixFc3RhZG8sSG9yYS5jaWVycmUpCgojIFRpZW5kYSAxIGVzIE51ZXZvIExlw7NuLCBhYnJlIGEgbGFzIDggY2llcnJhIGEgbGFzIDIyCiMgVGllbmRhIDIgZXMgSmFsaXNjbywgYWJyZSBhIGxhcyA5IGNpZXJyYSBhIGxhcyAyMgojIFRpZW5kYSAzIGVzIENoaWFwYXMsIGFicmUgYSBsYXMgNyBjaWVycmEgYSBsYXMgMjMKIyBUaWVuZGEgNCBlcyBTaW5hbG9hLCBhYnJlIGEgbGFzIDcgY2llcnJhIGEgbGFzIDIzCiMgVGllbmRhIDUgZXMgUXVpbnRhbmEgUm9vLCBhYnJlIGEgbGFzIDggY2llcnJhIGEgbGFzIDIxCmBgYAoKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXJpYXM8L3NwYW4+CgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpCmxpYnJhcnkobHVicmlkYXRlKQojaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpCmxpYnJhcnkocGx5cikKI2luc3RhbGwucGFja2FnZXMoIk1hdHJpeCIpCmxpYnJhcnkoTWF0cml4KQojaW5zdGFsbC5wYWNrYWdlcygiYXJ1bGVzIikKbGlicmFyeShhcnVsZXMpCiNpbnN0YWxsLnBhY2thZ2VzKCJhcnVsZXNWaXoiKQpsaWJyYXJ5KGFydWxlc1ZpeikKI2luc3RhbGwucGFja2FnZXMoImRhdGFzZXRzIikKbGlicmFyeShkYXRhc2V0cykKYGBgCgpPYnNlcnZhY2lvbmVzOgoKMS4gUExVIGNhc2kgbm8gdGllbmUgcmVnaXN0cm9zLiAKCjIuIEVsIGZvcm1hdG8gZGUgZmVjaGEgbm8gdGllbmUgZm9ybWF0byBhZGVjdWFkby4gCgozLiBFbCBwcmVjaW8gdGllbmUgdmFsb3JlcyBuZWdhdGl2b3MuIAoKNC4gTGEgaG9yYSBubyB0aWVuZSBmb3JtYXRvIGFkZWN1YWRvLiAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5MaW1waWV6YSBkZSBkYXRvczwvc3Bhbj4KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSAxLiBSZW1vdmVyIHZhbG9yZXMgaXJyZWxldmFudGVzPC9zcGFuPgoKYGBge3J9CiMgRWxpbWluYXIgY29sdW1uYXMKZGYxPC1kZgpkZjE8LXN1YnNldChkZjEsc2VsZWN0PSAtYyhQTFUsQ29kaWdvLkJhcnJhcykpCgojIEVsaW1pbmFyIHJlbmdsb25lcwpkZjI8LWRmMQpkZjI8LWRmMltkZjIkUHJlY2lvID4gMCwgXQpzdW1tYXJ5KGRmMiRQcmVjaW8pCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSAyLiBSZW1vdmVyIHZhbG9yZXMgcmVwZXRpZG9zPC9zcGFuPgpgYGB7cn0KIyBDdcOhbnRvcyByZW5nbG9uZXMgZHVwbGljYWRvcyB0ZW5lbW9zPwpkZjJbZHVwbGljYXRlZChkZjIpLCBdCnN1bShkdXBsaWNhdGVkKGRmMikpCiNFbGltaW5hciByZW5nbG9uZXMgZHVwbGljYWRvcwpkZjM8LWRmMgpkZjM8LWRpc3RpbmN0KGRmMykKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlTDqWNuaWNhIDMuIENvcnJlZ2lyIGVycm9yZXMgdGlwb2dyw6FmaWNvcyB5IHNpbWlsYXJlczwvc3Bhbj4KYGBge3J9CiMgUHJlY2lvcyBlbiBhYnNvbHV0bwpkZjQ8LWRmMQpkZiRQcmVjaW88LWFicyhkZjQkUHJlY2lvKQpzdW1tYXJ5KGRmNCRQcmVjaW8pCiMgTm8gc2UgdmEgYSB1dGlsaXphciBlbiBlc3RlIGVqZXJjaWNpbwoKIyBDYW50aWRhZGVzIGVuIGVudGVyb3MKZGY1PC1kZjEKZGY1JFVuaWRhZGVzPC1jZWlsaW5nKGRmNSRVbmlkYWRlcykKc3VtbWFyeShkZjUkVW5pZGFkZXMpCiMgTm8gc2UgdmEgYSB1dGlsaXphciBlbiBlc3RlIGVqZXJjaWNpbwoKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlTDqWNuaWNhIDQuIENvcnJlZ2lyIGVycm9yZXMgdGlwb2dyw6FmaWNvcyB5IHNpbWlsYXJlczwvc3Bhbj4KYGBge3J9CmRmNjwtZGYzCmRmNiRGZWNoYSA8LSBhcy5EYXRlKGRmNiRGZWNoYSwgZm9ybWF0PSIlZC8lbS8lWSIpCnN0cihkZjYpCgojIENvbnZlcnRpciBkZSBjYXJhY3RlciBhIGhvcmEKZGY3PC1kZjYKZGY3JEhvcmEgPC0gYXMuUE9TSVhjdChkZjckSG9yYSwgZm9ybWF0PSIlSDolTTolUyIpCmRmNyRIb3JhIDwtIGZvcm1hdChkZjckSG9yYSwgIiVIIikKZGY3JEhvcmEgPC0gYXMuaW50ZWdlcihkZjckSG9yYSkKc3RyKGRmNykKdGFieWwoZGY3LCBFc3RhZG8sIEhvcmEpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSA1LiBWYWxvcmVzIEZhbHRhbnRlczwvc3Bhbj4KYGBge3J9CiMgQ3XDoW50b3MgTkEgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8Kc3VtKGlzLm5hKGRmNykpCnN1bShpcy5uYShkZikpCiMgQ3XDoW50b3MgTkEgdGVuZ28gcG9yIHZhcmlhYmxlPwpzYXBwbHkoZGYsZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKIyBCb3JyYXIgdG9kb3MgbG9zIHJlZ2lzdHJvcyBjb24gTkEgZGUgbGEgdGFibGEKZGY4IDwtIGRmCmRmOCA8LSBuYS5vbWl0KGRmOCkKIyBSZWVtcGxhemFyIE5BIGNvbiBDRVJPUwpkZjkgPC0gZGYKZGY5W2lzLm5hKGRmKV0gPC0gMApzdW1tYXJ5KGRmOSRQTFUpCiMgUmVlbXBsYXphciBsb3MgTkEgY29uIFBST01FRElPCmRmMTAgPC0gZGYKZGYxMCRQTFVbaXMubmEoZGYxMCRQTFUpXTwtbWVhbihkZjEwJFBMVSwgbmEucm09VFJVRSkgCnN1bW1hcnkoZGYxMCRQTFUpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSA2LiBNw6l0b2RvIEVzdGFkw61zdGljbzwvc3Bhbj4KYGBge3J9CmRmMTEgPC0gZGY3CmJveHBsb3QoZGYxMSRQcmVjaW8sIGhvcml6b250YWwgPSBUUlVFKQpib3hwbG90KGRmMTEkVW5pZGFkZXMsIGhvcml6b250YWwgPSBUUlVFKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5BZ3JlZ2FyIGNvbHVtbmFzPC9zcGFuPgpgYGB7cn0KZGYxMSREaWFfZGVfbGFfU2VtYW5hIDwtIHdkYXkoZGYxMSRGZWNoYSkKc3VtbWFyeShkZjExKQogICAgCmRmMTEkU3VidG90YWwgPC0gZGYxMSRQcmVjaW8gKiBkZjExJFVuaWRhZGVzCnN1bW1hcnkoZGYxMSkKCmRmMTEkVXRpbGlkYWQgPC0gZGYxMSRQcmVjaW8gLSBkZjExJFVsdC5Db3N0bwpzdW1tYXJ5KGRmMTEpCgpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5FeHBvcnRhciBsYSBiYXNlIGRlIGRhdG9zIGxpbXBpYTwvc3Bhbj4KYGBge3J9CmJkX2xpbXBpYSA8LSBkZjExCndyaXRlLmNzdihiZF9saW1waWEsIGZpbGU9ImFiYXJyb3Rlc19iZF9saW1waWEuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Db25jbHVzacOzbjwvc3Bhbj4KClNlIGxsZXbDsyBhIGNhYm8gdW4gYW7DoWxpc2lzIHNvYnJlIGxhIGJhc2UgZGUgZGF0b3MgcXVlIGZ1ZSBzdW1pbmlzdHJhZGEgc29icmUgbG9zIHByb2R1Y3RvcyBkZSBhYmFycm90ZXMsIGxvIGN1YWwgaW1wbGljw7MgdW4gbWludWNpb3NvIHByb2Nlc28gZGUgcmVub3ZhY2nDs24sIGRlcHVyYWNpw7NuIHkgbGEgZm9ybWFjacOzbiBkZSB2YXJpYWJsZXMgYWRpY2lvbmFsZXMuIE5vcyBhZGVudHJhbW9zIGEgbGEgZXN0cnVjdHVyYSBkZSBsYSBiYXNlIGRlIGRhdG9zIHByb3BvcmNpb25hZGEsIHBhcmEgcG9kZXIgaWRlbnRpZmljYXIgdmFsb3JlcyBmYWx0YW50ZXMgZGVudHJvIGRlIGxhcyB2YXJpYWJsZXMsIGZvcm1hdG9zIGVycsOzbmVvcywgcmVnaXN0cm9zIG5lZ2F0aXZvcyBvIGVuIGdlbmVyYWwgYWxndW5hIGlycmVndWxhcmlkYWQgcXVlIHB1ZGllcmEgZGHDsWFyIGxhIGludGVncmlkYWQgZGUgbGEgYmFzZSBkYXRvcy4gRGVzcHXDqXMgZGUgZXN0ZSBhbsOhbGlzaXMgbG9ncmFtb3MgZGlzdGluZ3VpciBsYXMgdGVuZGVuY2lhcyB5IGxvcyBwYXRyb25lcyBlbiBsb3MgcHJvZHVjdG9zLCBlbiAgc3VzIGNvbnN1bWlkb3JlcyB5IGVuIHN1cyB2ZW50YXMuCg==