# Importar la base de datos

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

# Exploración 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  
##                                       
##                                       
##                                       
## 

# Instalar paquetes y llamar librerías

library(tidyverse)
## 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.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
library(dplyr)
#install.packages("janitor")
library(janitor)
## 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
#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)
## 
## 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)

#Para explorar variables de texto

contar_y_ordenar <- function(columna) {
  tabla <- table(columna)
  tabla_ordenada <- sort(tabla, decreasing = TRUE)
  return(tabla_ordenada)
}
tabla_vcClaveTienda <- contar_y_ordenar(df$vcClaveTienda)
tabla_DescGiro <- contar_y_ordenar(df$DescGiro)
tabla_Marca <- contar_y_ordenar(df$Marca)
tabla_Fabricante <- contar_y_ordenar(df$Fabricante)
tabla_Producto <- contar_y_ordenar(df$Producto)
tabla_NombreDepartamento <- contar_y_ordenar(df$NombreDepartamento)
tabla_NombreFamilia <- contar_y_ordenar(df$NombreFamilia)
tabla_Estado <- contar_y_ordenar(df$Estado)
tabla_TipoUbicacion <- contar_y_ordenar(df$Tipo.ubicacion)
tabla_Giro <- contar_y_ordenar(df$Giro)
tabla_HoraInicio <- contar_y_ordenar(df$Hora.inicio)
tabla_HoraCierre <- contar_y_ordenar(df$Hora.cierre)
tabla_Fecha <- contar_y_ordenar(df$Fecha)
tabla_Hora <- contar_y_ordenar(df$Hora)
tibble(df)
## # 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)
## '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)
##   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
##                        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
##                             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
##   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
##       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
tail(df)
##        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

#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 Léon, 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 el 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),]
##    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 repetidos
df3 <- df2
df3 <- distinct(df3)

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

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
#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 este ejecicio

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)
## 'data.frame':    200473 obs. of  20 variables:
##  $ vcClaveTienda     : chr  "MX001" "MX001" "MX001" "MX001" ...
##  $ DescGiro          : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Fecha             : Date, format: NA NA ...
##  $ 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: NA NA ...
##  $ Hora              : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ 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   NA_
##       Chiapas  4051
##       Jalisco  6629
##    Nuevo León 96317
##  Quintana Roo 10021
##       Sinaloa 83455

Técnica 5. Valores Faltantes

#Cuántos NA tengo en la base de datos?
sum(is.na(df7))
## [1] 400946
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 NA
df8 <- df
df8 <- na.omit(df8)
# Reemplazar los NA con CEROS
df9 <- df
df9[is.na(df9)] <- 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.   :NA       Min.   : NA     
##  Class :character   Class :character   1st Qu.:NA       1st Qu.: NA     
##  Mode  :character   Mode  :character   Median :NA       Median : NA     
##                                        Mean   :NaN      Mean   :NaN     
##                                        3rd Qu.:NA       3rd Qu.: NA     
##                                        Max.   :NA       Max.   : NA     
##                                        NA's   :200473   NA's   :200473  
##     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.   : NA     
##  1st Qu.: NA     
##  Median : NA     
##  Mean   :NaN     
##  3rd Qu.: NA     
##  Max.   : NA     
##  NA's   :200473
df11$Subtotal <- df11$Precio * df11$Unidades
summary(df11)
##  vcClaveTienda        DescGiro             Fecha             Hora       
##  Length:200473      Length:200473      Min.   :NA       Min.   : NA     
##  Class :character   Class :character   1st Qu.:NA       1st Qu.: NA     
##  Mode  :character   Mode  :character   Median :NA       Median : NA     
##                                        Mean   :NaN      Mean   :NaN     
##                                        3rd Qu.:NA       3rd Qu.: NA     
##                                        Max.   :NA       Max.   : NA     
##                                        NA's   :200473   NA's   :200473  
##     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.   : NA      Min.   :   1.0  
##  1st Qu.: NA      1st Qu.:  12.0  
##  Median : NA      Median :  18.0  
##  Mean   :NaN      Mean   :  24.3  
##  3rd Qu.: NA      3rd Qu.:  27.0  
##  Max.   : NA      Max.   :2496.0  
##  NA's   :200473
df11$Utilidad <- df11$Precio - df11$Ult.Costo
summary(df11)
##  vcClaveTienda        DescGiro             Fecha             Hora       
##  Length:200473      Length:200473      Min.   :NA       Min.   : NA     
##  Class :character   Class :character   1st Qu.:NA       1st Qu.: NA     
##  Mode  :character   Mode  :character   Median :NA       Median : NA     
##                                        Mean   :NaN      Mean   :NaN     
##                                        3rd Qu.:NA       3rd Qu.: NA     
##                                        Max.   :NA       Max.   : NA     
##                                        NA's   :200473   NA's   :200473  
##     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.   : NA      Min.   :   1.0   Min.   :  0.000  
##  1st Qu.: NA      1st Qu.:  12.0   1st Qu.:  2.310  
##  Median : NA      Median :  18.0   Median :  3.230  
##  Mean   :NaN      Mean   :  24.3   Mean   :  4.141  
##  3rd Qu.: NA      3rd Qu.:  27.0   3rd Qu.:  5.420  
##  Max.   : NA      Max.   :2496.0   Max.   :230.770  
##  NA's   :200473

Exportar la base de datos limpia

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

Conclusión

En el código se realiza un análisis y limpieza de una base de datos de abarrotes. Iniciamos importando los datos desde un archivo CSV de excel donde tenemos toda la información y los datos, exploramos esa información y se generan resúmenes estadísticos. Se aplican técnicas de limpieza, como la eliminación de datos irrelevantes, corrección de errores tipográficos y manejo de valores faltantes. Se realiza un análisis estadístico y se calculan nuevas variables relevantes. Finalmente, la base de datos limpia se exporta a un archivo CSV.

LS0tDQp0aXRsZTogIkFiYXJyb3RlcyINCmF1dGhvcjogIkFudG9uaW8gQ2FyZGVuYXMgLSBBMDE1Njg5MDgiDQpkYXRlOiAiMjAyNC0wMy0wNyINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFIA0KICAgIHRvY19mbG9hdDogVFJVRSANCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6ICJsdW1lbiIgDQogICAgaGlnaGxpZ2h0OiAiYnJlZXplZGFyIg0KLS0tDQoNCiFbXShDOlxcVXNlcnNcXGFudG9uXFxEb3dubG9hZHNcXDJBNEZDQTA2LTAzQjItNDA1Ri04NEVDLTA0REQyMzJGNTY1My0xMDMweDQ1My0yLmpwZWcpDQoNCiM8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPiBJbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPg0KYGBge3J9DQpkZiA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxhbnRvblxcRG93bmxvYWRzXFxhYmFycm90ZXMuY3N2IikNCmBgYA0KDQojPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4gRXhwbG9yYWNpw7NuIGRlIGRhdG9zPC9zcGFuPg0KYGBge3J9DQpyZXN1bWVuIDwtIHN1bW1hcnkoZGYpDQpyZXN1bWVuDQpgYGANCg0KIzxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+DQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCiNpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikNCmxpYnJhcnkoamFuaXRvcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJsdWJyaWRhdGUiKQ0KbGlicmFyeShsdWJyaWRhdGUpDQojaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpDQpsaWJyYXJ5KHBseXIpDQojaW5zdGFsbC5wYWNrYWdlcygiTWF0cml4IikNCmxpYnJhcnkoTWF0cml4KQ0KI2luc3RhbGwucGFja2FnZXMoImFydWxlcyIpDQpsaWJyYXJ5KGFydWxlcykNCiNpbnN0YWxsLnBhY2thZ2VzKCJhcnVsZXNWaXoiKQ0KbGlicmFyeShhcnVsZXNWaXopDQojaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKQ0KbGlicmFyeShkYXRhc2V0cykNCmBgYA0KDQoNCiNQYXJhIGV4cGxvcmFyIHZhcmlhYmxlcyBkZSB0ZXh0bw0KYGBge3J9DQpjb250YXJfeV9vcmRlbmFyIDwtIGZ1bmN0aW9uKGNvbHVtbmEpIHsNCiAgdGFibGEgPC0gdGFibGUoY29sdW1uYSkNCiAgdGFibGFfb3JkZW5hZGEgPC0gc29ydCh0YWJsYSwgZGVjcmVhc2luZyA9IFRSVUUpDQogIHJldHVybih0YWJsYV9vcmRlbmFkYSkNCn0NCmBgYA0KDQpgYGB7cn0NCnRhYmxhX3ZjQ2xhdmVUaWVuZGEgPC0gY29udGFyX3lfb3JkZW5hcihkZiR2Y0NsYXZlVGllbmRhKQ0KdGFibGFfRGVzY0dpcm8gPC0gY29udGFyX3lfb3JkZW5hcihkZiREZXNjR2lybykNCnRhYmxhX01hcmNhIDwtIGNvbnRhcl95X29yZGVuYXIoZGYkTWFyY2EpDQp0YWJsYV9GYWJyaWNhbnRlIDwtIGNvbnRhcl95X29yZGVuYXIoZGYkRmFicmljYW50ZSkNCnRhYmxhX1Byb2R1Y3RvIDwtIGNvbnRhcl95X29yZGVuYXIoZGYkUHJvZHVjdG8pDQp0YWJsYV9Ob21icmVEZXBhcnRhbWVudG8gPC0gY29udGFyX3lfb3JkZW5hcihkZiROb21icmVEZXBhcnRhbWVudG8pDQp0YWJsYV9Ob21icmVGYW1pbGlhIDwtIGNvbnRhcl95X29yZGVuYXIoZGYkTm9tYnJlRmFtaWxpYSkNCnRhYmxhX0VzdGFkbyA8LSBjb250YXJfeV9vcmRlbmFyKGRmJEVzdGFkbykNCnRhYmxhX1RpcG9VYmljYWNpb24gPC0gY29udGFyX3lfb3JkZW5hcihkZiRUaXBvLnViaWNhY2lvbikNCnRhYmxhX0dpcm8gPC0gY29udGFyX3lfb3JkZW5hcihkZiRHaXJvKQ0KdGFibGFfSG9yYUluaWNpbyA8LSBjb250YXJfeV9vcmRlbmFyKGRmJEhvcmEuaW5pY2lvKQ0KdGFibGFfSG9yYUNpZXJyZSA8LSBjb250YXJfeV9vcmRlbmFyKGRmJEhvcmEuY2llcnJlKQ0KdGFibGFfRmVjaGEgPC0gY29udGFyX3lfb3JkZW5hcihkZiRGZWNoYSkNCnRhYmxhX0hvcmEgPC0gY29udGFyX3lfb3JkZW5hcihkZiRIb3JhKQ0KYGBgDQoNCg0KYGBge3J9DQp0aWJibGUoZGYpDQpzdHIoZGYpDQpoZWFkKGRmKQ0KdGFpbChkZikNCmBgYA0KDQojR2VuZXJhciBzdWJ0YWJsYSBkZSBUaWVuZGEgeSBEZXBhcnRhbWVudG8NCmBgYHtyfQ0KdGFieWwoZGYsIHZjQ2xhdmVUaWVuZGEsIE5vbWJyZURlcGFydGFtZW50bykNCnRhYnlsKGRmLCBFc3RhZG8sIE5vbWJyZURlcGFydGFtZW50bykNCnRhYnlsKGRmLCBFc3RhZG8sIEhvcmEuaW5pY2lvKQ0KdGFieWwoZGYsIEVzdGFkbywgSG9yYS5jaWVycmUpDQpgYGANCg0KI1RpZW5kYSAxIGVzIE51ZXZvIEzDqW9uLCBhYnJlIGEgbGFzIDggeSBjaWVycmEgYSBsYXMgMjINCiNUaWVuZGEgMiBlcyBKYWxpc2NvLCBhYnJlIGEgbGFzIDkgeSBjaWVycmEgYSBsYXMgMjINCiNUaWVuZGEgMyBlcyBDaGlhcGFzLCBhYnJlIGEgbGFzIDcgeSBjaWVycmEgYSBsYXMgMjMNCiNUaWVuZGEgNCBlcyBTaW5hbG9hLCBhYnJlIGEgbGFzIDcgeSBjaWVycmEgYSBsYXMgMjMNCiNUaWVuZGEgNSBlcyBRdWludGFuYSBSb28sIGFicmUgYSBsYXMgOCB5IGNpZXJyYSBhIGxhcyAyMQ0KDQpPYnNlcnZhY2lvbmVzOiANCjEuIFBMVSBjYXNpIG5vIHRpZW5lIHJlZ2lzdHJvcw0KMi4gTGEgZmVjaGEgbm8gdGllbmUgIGVsIGZvcm1hdG8gYWRlY3VhZG8NCjMuIEVsIHByZWNpbyB0aWVuZSB2YWxvcmVzIG5lZ2F0aXZvcw0KNC4gTGEgaG9yYSBubyB0aWVuZSBmb3JtYXRvIGFkZWN1YWRvDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5MaW1waWV6YSBkZSBkYXRvczwvc3Bhbj4NCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VMOpY25pY2EgMS4gUmVtb3ZlciB2YWxvcmVzIGlycmVsZXZhbnRlczwvc3Bhbj4NCmBgYHtyfQ0KI0VsaW1pbmFyIENvbHVtbmFzDQpkZjEgPC0gZGYNCmRmMSA8LSBzdWJzZXQoZGYxLCBzZWxlY3QgPSAtYyhDb2RpZ28uQmFycmFzLCBQTFUpKQ0KYGBgDQoNCmBgYHtyfQ0KI0VsaW1pbmFyIHJlbmdsb25lcw0KZGYyIDwtIGRmMQ0KZGYyIDwtIGRmMltkZjIkUHJlY2lvID4wLCBdDQpzdW1tYXJ5KGRmMiRQcmVjaW8pDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSAyLiBSZW1vdmVyIHZhbG9yZXMgcmVwZXRpZG9zPC9zcGFuPg0KYGBge3J9DQojwr9DdcOhbnRvcyByZW5nbG9uZXMgZHVwbGljYWRvcyB0ZW5lbW9zPw0KZGYyW2R1cGxpY2F0ZWQoZGYyKSxdDQpzdW0oZHVwbGljYXRlZChkZjIpKQ0KYGBgDQoNCmBgYHtyfQ0KI0VsaW1pbmFyIHJlbmdsb25lcyByZXBldGlkb3MNCmRmMyA8LSBkZjINCmRmMyA8LSBkaXN0aW5jdChkZjMpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSAzLiBDb3JyZWdpciBlcnJvcmVzIHRpbXBvZ3LDoWZpY29zIHkgc2ltaWxhcmVzPC9zcGFuPg0KYGBge3J9DQpkZjQgPC0gZGYxDQpkZjQkUHJlY2lvIDwtIGFicyhkZjQkUHJlY2lvKQ0Kc3VtbWFyeShkZjQkUHJlY2lvKQ0KYGBgDQoNCmBgYHtyfQ0KI0NhbnRpZGFkZXMgZW4gZW50ZXJvcw0KZGY1IDwtIGRmMQ0KZGY1JFVuaWRhZGVzIDwtIGNlaWxpbmcoZGY1JFVuaWRhZGVzKQ0Kc3VtbWFyeShkZjUkVW5pZGFkZXMpDQojTm8gc2UgdmEgYSB1dGlsaXphciBlc3RlIGVqZWNpY2lvDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSA0LiBDb252ZXJ0aXIgdGlwb3MgZGUgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCiNDb252ZXJ0aXIgZGUgY2FyYWN0ZXIgYSBmZWNoYQ0KZGY2IDwtIGRmMw0KZGY2JEZlY2hhIDwtIGFzLkRhdGUoZGY2JEZlY2hhLCBmb3JtYXQgPSAiJUQvJU0vJVkiKQ0Kc3RyKGRmNikNCmBgYA0KDQpgYGB7cn0NCiNDb252ZXJ0aXIgZGUgY2FyYWN0ZXIgYSBob3JhDQpkZjcgPC0gZGY2DQpkZjckSG9yYSA8LSBhcy5QT1NJWGN0KGRmNyRIb3JhLCBmb3JtYXQgPSAiJUgvJU0vJVMiKQ0KZGY3JEhvcmEgPC0gZm9ybWF0KGRmNyRIb3JhLCAiJUgiKQ0KZGY3JEhvcmEgPC0gYXMuaW50ZWdlcihkZjckSG9yYSkNCnN0cihkZjcpDQp0YWJ5bChkZjcsIEVzdGFkbywgSG9yYSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlTDqWNuaWNhIDUuIFZhbG9yZXMgRmFsdGFudGVzPC9zcGFuPg0KYGBge3J9DQojQ3XDoW50b3MgTkEgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8NCnN1bShpcy5uYShkZjcpKQ0Kc3VtKGlzLm5hKGRmKSkNCmBgYA0KDQojQ3XDoW50b3MgTkEgdGVuZ28gcG9yIHZhcmlhYmxlPw0KYGBge3J9DQpzYXBwbHkoZGYsIGZ1bmN0aW9uKHgpc3VtKGlzLm5hKHgpKSkNCmBgYA0KYGBge3J9DQojQm9ycmFyIHRvZG9zIGxvcyBOQQ0KZGY4IDwtIGRmDQpkZjggPC0gbmEub21pdChkZjgpDQpgYGANCg0KYGBge3J9DQojIFJlZW1wbGF6YXIgbG9zIE5BIGNvbiBDRVJPUw0KZGY5IDwtIGRmDQpkZjlbaXMubmEoZGY5KV0gPC0gMA0Kc3VtbWFyeShkZjkkUExVKQ0KYGBgDQoNCg0KYGBge3J9DQojIFJlZW1wbGF6YXIgbG9zIE5BIGNvbiBQUk9NRURJTw0KZGYxMCA8LSBkZg0KZGYxMCRQTFVbaXMubmEoZGYxMCRQTFUpXSA8LSBtZWFuKGRmMTAkUExVLCBuYS5ybSA9VFJVRSkNCnN1bW1hcnkoZGYxMCRQTFUpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSA2LiBNw6l0b2RvIEVzdGFkw61zdGljbzwvc3Bhbj4NCmBgYHtyfQ0KZGYxMSA8LSBkZjcNCmJveHBsb3QoZGYxMSRQcmVjaW8sIGhvcml6b250YWwgPSBUUlVFKQ0KYm94cGxvdChkZjExJFVuaWRhZGVzLCBob3Jpem9udGFsID0gVFJVRSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+QWdyZWdhciBjb2x1bW5hczwvc3Bhbj4NCmBgYHtyfQ0KZGYxMSREaWFfZGVfbGFfU2VtYW5hIDwtIHdkYXkoZGYxMSRGZWNoYSkNCnN1bW1hcnkoZGYxMSkNCiAgICANCmRmMTEkU3VidG90YWwgPC0gZGYxMSRQcmVjaW8gKiBkZjExJFVuaWRhZGVzDQpzdW1tYXJ5KGRmMTEpDQoNCmRmMTEkVXRpbGlkYWQgPC0gZGYxMSRQcmVjaW8gLSBkZjExJFVsdC5Db3N0bw0Kc3VtbWFyeShkZjExKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5FeHBvcnRhciBsYSBiYXNlIGRlIGRhdG9zIGxpbXBpYTwvc3Bhbj4NCmBgYHtyfQ0KYmRfbGltcGlhIDwtIGRmMTENCndyaXRlLmNzdihiZF9saW1waWEsIGZpbGU9ImFiYXJyb3Rlc19iZF9saW1waWEuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+Q29uY2x1c2nDs248L3NwYW4+DQpFbiBlbCBjw7NkaWdvIHNlIHJlYWxpemEgdW4gYW7DoWxpc2lzIHkgbGltcGllemEgZGUgdW5hIGJhc2UgZGUgZGF0b3MgZGUgYWJhcnJvdGVzLiANCkluaWNpYW1vcyBpbXBvcnRhbmRvIGxvcyBkYXRvcyBkZXNkZSB1biBhcmNoaXZvIENTViBkZSBleGNlbCBkb25kZSB0ZW5lbW9zIHRvZGEgbGEgaW5mb3JtYWNpw7NuIHkgbG9zIGRhdG9zLCBleHBsb3JhbW9zIGVzYSBpbmZvcm1hY2nDs24geSBzZSBnZW5lcmFuIHJlc8O6bWVuZXMgZXN0YWTDrXN0aWNvcy4gU2UgYXBsaWNhbiB0w6ljbmljYXMgZGUgbGltcGllemEsIGNvbW8gbGEgZWxpbWluYWNpw7NuIGRlIGRhdG9zIGlycmVsZXZhbnRlcywgY29ycmVjY2nDs24gZGUgZXJyb3JlcyB0aXBvZ3LDoWZpY29zIHkgbWFuZWpvIGRlIHZhbG9yZXMgZmFsdGFudGVzLiBTZSByZWFsaXphIHVuIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28geSBzZSBjYWxjdWxhbiBudWV2YXMgdmFyaWFibGVzIHJlbGV2YW50ZXMuIEZpbmFsbWVudGUsIGxhIGJhc2UgZGUgZGF0b3MgbGltcGlhIHNlIGV4cG9ydGEgYSB1biBhcmNoaXZvIENTVi4=