Importar base de datos

#file.choose()

df <- read.csv("C:\\Users\\HP\\Downloads\\abarrotes (1).csv")

Exploracion de 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
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ 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
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.
## Warning: package 'janitor' was built under R version 4.3.3
## 
## 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)
## Warning: package 'plyr' was built under R version 4.3.3
## ------------------------------------------------------------------------------
## 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)
## Warning: package 'Matrix' was built under R version 4.3.3
## 
## Attaching package: 'Matrix'
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
#install.packages("arules")
library(arules)
## Warning: package 'arules' was built under R version 4.3.3
## 
## 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)
## Warning: package 'arulesViz' was built under R version 4.3.3
#install.packages("datasets")
library(datasets)

Observaciones: 1. La variable PLU tiene más de 199,000 NAs 2. Las variables Fecha, Hora, inicio y Hora.cierre no tienen formato correcto. 3. Existen precios negativos 4. No se observó variable “ventas” o “Subtotal”.

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)

Conclusion

Se realizó un análisis exhaustivo de la base de datos de abarrotes proporcionada, incluyendo limpieza, transformació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.

LS0tDQp0aXRsZTogIlRpZW5kYSBkZSBBYmFycm90ZXMiDQphdXRob3I6ICJGYWJpYW5hIE1lZGluYWNlbGxpIEEwMDgzNTg2Ig0KZGF0ZTogIjIwMjQtMDMtMDciDQpvdXRwdXQ6ICANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUgDQogICAgdG9jX2Zsb2F0OiBUUlVFIA0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogImJvb3RzdHJhcCIgDQogICAgaGlnaGxpZ2h0OiAiemVuYnVybiINCi0tLQ0KDQohW10oQzpcXFVzZXJzXFxIUFxcRGVza3RvcFxcRGF0aXNcXGRhMjFkOTMzMDA5MDc4MWM2YWFhM2I3ZjkwOTEwMzVhXzctZWxldmVuLXN0b3JlLWxvY2F0aW9uLmpwZykNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkltcG9ydGFyIGJhc2UgZGUgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCiNmaWxlLmNob29zZSgpDQoNCmRmIDwtIHJlYWQuY3N2KCJDOlxcVXNlcnNcXEhQXFxEb3dubG9hZHNcXGFiYXJyb3RlcyAoMSkuY3N2IikNCmBgYA0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkV4cGxvcmFjaW9uIGRlIGJhc2UgZGUgZGF0b3M8L3NwYW4+DQoNCmBgYHtyfQ0KcmVzdW1lbiA8LSBzdW1tYXJ5KGRmKQ0KcmVzdW1lbg0KDQojIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBWaXN1YWxpenIgbG9zIHByaW1lcm9zIDEwIHJlbmdvbmVzIGRlIGxhIHRhYmxhDQoNCnRpYmJsZShkZikgIyBWaXN1YWxpemEgbG9zIHByaW1lcm9zIDEwIHJlbmdsb25lcyBkZSBsYSB0YWJsYS4NCnN0cihkZikgIyBWaXN1YWxpemEgZW4gdGV4dG8gbGFzIHZhcmlhYmxlcywgc3UgdGlwbyB5IGVqZW1wbG9zLg0KaGVhZChkZiwgbj03KSAjIE11ZXN0cmEgbG9zIHByaW1lcm9zIDYgcmVuZ2xvbmVzIGRlIGxhIHRhYmxhLg0KdGFpbChkZikgIyBNdWVzdHJhIGxvcyB1bHRpbW9zIDYgcmVuZ2xvbmVzIGRlIGxhIHRhYmxhLg0KDQpgYGANCmBgYHtyfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikNCg0KbGlicmFyeShqYW5pdG9yKSAjIExpYnJlcmlhIHBhcmEgZXhwbG9yYXIgeSBsaW1waWFyIGRhdG9zLg0KbGlicmFyeShkcGx5cikgIyBMaWJyZXJpYSBwYXJhIG1hbmlwdWxhciBkYXRvcy4NCg0KY291bnQoZGYsdmNDbGF2ZVRpZW5kYSxzb3J0PVRSVUUpDQpjb3VudChkZixEZXNjR2lybyxzb3J0PVRSVUUpDQojIGNvdW50KGRmLEZlY2hhLHNvcnQ9VFJVRSkNCiMgY291bnQoZGYsSG9yYSxzb3J0PVRSVUUpDQojIGNvdW50KGRmLE1hcmNhLHNvcnQ9VFJVRSkNCiMgY291bnQoZGYsRmFicmljYW50ZSxzb3J0PVRSVUUpDQojIGNvdW50KGRmLFByb2R1Y3RvLHNvcnQ9VFJVRSkNCmNvdW50KGRmLE5vbWJyZURlcGFydGFtZW50byxzb3J0PVRSVUUpDQojIGNvdW50KGRmLE5vbWJyZUZhbWlsaWEsc29ydD1UUlVFKQ0KIyBjb3VudChkZixOb21icmVDYXRlZ29yaWEsc29ydD1UUlVFKQ0KY291bnQoZGYsRXN0YWRvICxzb3J0PVRSVUUpDQpjb3VudChkZixUaXBvLnViaWNhY2nDs24sc29ydD1UUlVFKQ0KY291bnQoZGYsR2lybyxzb3J0PVRSVUUpDQpjb3VudChkZixIb3JhLmluaWNpbyxzb3J0PVRSVUUpDQpjb3VudChkZixIb3JhLmNpZXJyZSxzb3J0PVRSVUUpDQoNCiMgR2VuZXJhciBzdWJ0YWJsYSBkZSBUaWVuZGEgeSBEZXBhcnRhbWVudG8NCnRhYnlsKGRmLHZjQ2xhdmVUaWVuZGEsTm9tYnJlRGVwYXJ0YW1lbnRvKQ0KdGFieWwoZGYsRXN0YWRvLE5vbWJyZURlcGFydGFtZW50bykNCnRhYnlsKGRmLEVzdGFkbyxIb3JhLmluaWNpbykNCnRhYnlsKGRmLEVzdGFkbyxIb3JhLmNpZXJyZSkNCg0KIyBUaWVuZGEgMSBlcyBOdWV2byBMZcOzbiwgYWJyZSBhIGxhcyA4IGNpZXJyYSBhIGxhcyAyMg0KIyBUaWVuZGEgMiBlcyBKYWxpc2NvLCBhYnJlIGEgbGFzIDkgY2llcnJhIGEgbGFzIDIyDQojIFRpZW5kYSAzIGVzIENoaWFwYXMsIGFicmUgYSBsYXMgNyBjaWVycmEgYSBsYXMgMjMNCiMgVGllbmRhIDQgZXMgU2luYWxvYSwgYWJyZSBhIGxhcyA3IGNpZXJyYSBhIGxhcyAyMw0KIyBUaWVuZGEgNSBlcyBRdWludGFuYSBSb28sIGFicmUgYSBsYXMgOCBjaWVycmEgYSBsYXMgMjENCg0KYGBgDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyaWFzPC9zcGFuPg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikNCmxpYnJhcnkobHVicmlkYXRlKQ0KI2luc3RhbGwucGFja2FnZXMoInBseXIiKQ0KbGlicmFyeShwbHlyKQ0KI2luc3RhbGwucGFja2FnZXMoIk1hdHJpeCIpDQpsaWJyYXJ5KE1hdHJpeCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJhcnVsZXMiKQ0KbGlicmFyeShhcnVsZXMpDQojaW5zdGFsbC5wYWNrYWdlcygiYXJ1bGVzVml6IikNCmxpYnJhcnkoYXJ1bGVzVml6KQ0KI2luc3RhbGwucGFja2FnZXMoImRhdGFzZXRzIikNCmxpYnJhcnkoZGF0YXNldHMpDQpgYGANCk9ic2VydmFjaW9uZXM6IA0KMS4gTGEgdmFyaWFibGUgUExVIHRpZW5lIG3DoXMgZGUgMTk5LDAwMCBOQXMNCjIuIExhcyB2YXJpYWJsZXMgRmVjaGEsIEhvcmEsIGluaWNpbyB5IEhvcmEuY2llcnJlIG5vIHRpZW5lbiBmb3JtYXRvIGNvcnJlY3RvLg0KMy4gRXhpc3RlbiBwcmVjaW9zIG5lZ2F0aXZvcw0KNC4gTm8gc2Ugb2JzZXJ2w7MgdmFyaWFibGUg4oCcdmVudGFz4oCdIG8g4oCcU3VidG90YWzigJ0uDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5MaW1waWV6YSBkZSBkYXRvczwvc3Bhbj4NCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VMOpY25pY2EgMS4gUmVtb3ZlciB2YWxvcmVzIGlycmVsZXZhbnRlczwvc3Bhbj4NCmBgYHtyfQ0KIyBFbGltaW5hciBjb2x1bW5hcw0KZGYxPC1kZg0KZGYxPC1zdWJzZXQoZGYxLHNlbGVjdD0gLWMoUExVLENvZGlnby5CYXJyYXMpKQ0KDQojIEVsaW1pbmFyIHJlbmdsb25lcw0KZGYyPC1kZjENCmRmMjwtZGYyW2RmMiRQcmVjaW8gPiAwLCBdDQpzdW1tYXJ5KGRmMiRQcmVjaW8pDQpgYGANCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VMOpY25pY2EgMi4gUmVtb3ZlciB2YWxvcmVzIHJlcGV0aWRvczwvc3Bhbj4NCmBgYHtyfQ0KIyBDdcOhbnRvcyByZW5nbG9uZXMgZHVwbGljYWRvcyB0ZW5lbW9zPw0KZGYyW2R1cGxpY2F0ZWQoZGYyKSwgXQ0Kc3VtKGR1cGxpY2F0ZWQoZGYyKSkNCiNFbGltaW5hciByZW5nbG9uZXMgZHVwbGljYWRvcw0KZGYzPC1kZjINCmRmMzwtZGlzdGluY3QoZGYzKQ0KYGBgDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlTDqWNuaWNhIDMuIENvcnJlZ2lyIGVycm9yZXMgdGlwb2dyw6FmaWNvcyB5IHNpbWlsYXJlczwvc3Bhbj4NCmBgYHtyfQ0KIyBQcmVjaW9zIGVuIGFic29sdXRvDQpkZjQ8LWRmMQ0KZGYkUHJlY2lvPC1hYnMoZGY0JFByZWNpbykNCnN1bW1hcnkoZGY0JFByZWNpbykNCiMgTm8gc2UgdmEgYSB1dGlsaXphciBlbiBlc3RlIGVqZXJjaWNpbw0KDQojIENhbnRpZGFkZXMgZW4gZW50ZXJvcw0KZGY1PC1kZjENCmRmNSRVbmlkYWRlczwtY2VpbGluZyhkZjUkVW5pZGFkZXMpDQpzdW1tYXJ5KGRmNSRVbmlkYWRlcykNCiMgTm8gc2UgdmEgYSB1dGlsaXphciBlbiBlc3RlIGVqZXJjaWNpbw0KYGBgDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlTDqWNuaWNhIDQuIENvcnJlZ2lyIGVycm9yZXMgdGlwb2dyw6FmaWNvcyB5IHNpbWlsYXJlczwvc3Bhbj4NCmBgYHtyfQ0KZGY2PC1kZjMNCmRmNiRGZWNoYSA8LSBhcy5EYXRlKGRmNiRGZWNoYSwgZm9ybWF0PSIlZC8lbS8lWSIpDQpzdHIoZGY2KQ0KDQojIENvbnZlcnRpciBkZSBjYXJhY3RlciBhIGhvcmENCmRmNzwtZGY2DQpkZjckSG9yYSA8LSBhcy5QT1NJWGN0KGRmNyRIb3JhLCBmb3JtYXQ9IiVIOiVNOiVTIikNCmRmNyRIb3JhIDwtIGZvcm1hdChkZjckSG9yYSwgIiVIIikNCmRmNyRIb3JhIDwtIGFzLmludGVnZXIoZGY3JEhvcmEpDQpzdHIoZGY3KQ0KdGFieWwoZGY3LCBFc3RhZG8sIEhvcmEpDQpgYGANCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VMOpY25pY2EgNS4gVmFsb3JlcyBGYWx0YW50ZXM8L3NwYW4+DQpgYGB7cn0NCiMgQ3XDoW50b3MgTkEgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8NCnN1bShpcy5uYShkZjcpKQ0Kc3VtKGlzLm5hKGRmKSkNCiMgQ3XDoW50b3MgTkEgdGVuZ28gcG9yIHZhcmlhYmxlPw0Kc2FwcGx5KGRmLGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpDQojIEJvcnJhciB0b2RvcyBsb3MgcmVnaXN0cm9zIGNvbiBOQSBkZSBsYSB0YWJsYQ0KZGY4IDwtIGRmDQpkZjggPC0gbmEub21pdChkZjgpDQojIFJlZW1wbGF6YXIgTkEgY29uIENFUk9TDQpkZjkgPC0gZGYNCmRmOVtpcy5uYShkZildIDwtIDANCnN1bW1hcnkoZGY5JFBMVSkNCiMgUmVlbXBsYXphciBsb3MgTkEgY29uIFBST01FRElPDQpkZjEwIDwtIGRmDQpkZjEwJFBMVVtpcy5uYShkZjEwJFBMVSldPC1tZWFuKGRmMTAkUExVLCBuYS5ybT1UUlVFKSANCnN1bW1hcnkoZGYxMCRQTFUpDQpgYGANCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VMOpY25pY2EgNi4gTcOpdG9kbyBFc3RhZMOtc3RpY288L3NwYW4+DQpgYGB7cn0NCmRmMTEgPC0gZGY3DQpib3hwbG90KGRmMTEkUHJlY2lvLCBob3Jpem9udGFsID0gVFJVRSkNCmJveHBsb3QoZGYxMSRVbmlkYWRlcywgaG9yaXpvbnRhbCA9IFRSVUUpDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5BZ3JlZ2FyIGNvbHVtbmFzPC9zcGFuPg0KYGBge3J9DQpkZjExJERpYV9kZV9sYV9TZW1hbmEgPC0gd2RheShkZjExJEZlY2hhKQ0Kc3VtbWFyeShkZjExKQ0KICAgIA0KZGYxMSRTdWJ0b3RhbCA8LSBkZjExJFByZWNpbyAqIGRmMTEkVW5pZGFkZXMNCnN1bW1hcnkoZGYxMSkNCg0KZGYxMSRVdGlsaWRhZCA8LSBkZjExJFByZWNpbyAtIGRmMTEkVWx0LkNvc3RvDQpzdW1tYXJ5KGRmMTEpDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5FeHBvcnRhciBsYSBiYXNlIGRlIGRhdG9zIGxpbXBpYTwvc3Bhbj4NCmBgYHtyfQ0KYmRfbGltcGlhIDwtIGRmMTENCndyaXRlLmNzdihiZF9saW1waWEsIGZpbGU9ImFiYXJyb3Rlc19iZF9saW1waWEuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Db25jbHVzaW9uPC9zcGFuPg0KU2UgcmVhbGl6w7MgdW4gYW7DoWxpc2lzIGV4aGF1c3Rpdm8gZGUgbGEgYmFzZSBkZSBkYXRvcyBkZSBhYmFycm90ZXMgcHJvcG9yY2lvbmFkYSwgaW5jbHV5ZW5kbyBsaW1waWV6YSwgdHJhbnNmb3JtYWNpw7NuIHkgZ2VuZXJhY2nDs24gZGUgbnVldmFzIHZhcmlhYmxlcy4gU2UgZXhwbG9yw7MgbGEgYmFzZSBkZSBkYXRvcyBwYXJhIGlkZW50aWZpY2FyIHZhcmlhYmxlcyBjb24gTkEsIHZhbG9yZXMgbmVnYXRpdm9zLCBmb3JtYXRvcyBpbmNvcnJlY3RvcyB5IG90cmFzIGluY29uc2lzdGVuY2lhcy4gRmluYWxtZW50ZSBzZSBlbmNvbnRyYXJvbiBwYXRyb25lcyB5IHRlbmRlbmNpYXMgZW4gdmVudGFzLCBwcmVjaW9zLCBwcm9kdWN0b3MgeSBjbGllbnRlcy4NCg0K