A la base de datos se le hicieron los siguientes cambios:
1. Se cambió el formato a fecha corta.
2. Se duplicaron los primeros 5 registros.
3. Se cambió le formato a hora (español México).
4. Se cambió el formato a código de barras (para que salga completo).
5. Se guardó como CSV UTF 8 (Delimitado por comas).

Cargar librerias

library(dplyr)
library(tidyverse)
library(janitor)
library(tidyr)
library(lubridate)

Importar base de datos

df<-read.csv("C:\\Users\\javaw\\OneDrive - Instituto Tecnologico y de Estudios Superiores de Monterrey\\7mo Semestre\\Modulo 3\\Abarrotes_Ventas2.csv")
colnames(df)
##  [1] "ï..vcClaveTienda"   "DescGiro"           "Codigo.Barras"     
##  [4] "PLU"                "Fecha"              "Hora"              
##  [7] "Marca"              "Fabricante"         "Producto"          
## [10] "Precio"             "Ult.Costo"          "Unidades"          
## [13] "F.Ticket"           "NombreDepartamento" "NombreFamilia"     
## [16] "NombreCategoria"    "Estado"             "Mts.2"             
## [19] "Tipo.ubicación"    "Giro"               "Hora.inicio"       
## [22] "Hora.cierre"

Entender base de datos

summary(df)
##  ï..vcClaveTienda     DescGiro         Codigo.Barras            PLU        
##  Length:200620      Length:200620      Min.   :8.347e+05   Min.   : 1.00   
##  Class :character   Class :character   1st Qu.:7.500e+12   1st Qu.: 1.00   
##  Mode  :character   Mode  :character   Median :7.500e+12   Median : 1.00   
##                                        Mean   :5.949e+12   Mean   : 2.11   
##                                        3rd Qu.:7.500e+12   3rd Qu.: 1.00   
##                                        Max.   :1.750e+13   Max.   :30.00   
##                                                            NA's   :199183  
##     Fecha               Hora              Marca            Fabricante       
##  Length:200620      Length:200620      Length:200620      Length:200620     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##    Producto             Precio          Ult.Costo         Unidades     
##  Length:200620      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:200620      Length:200620      Length:200620     
##  1st Qu.: 33967   Class :character   Class :character   Class :character  
##  Median :105996   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :193994                                                           
##  3rd Qu.:383009                                                           
##  Max.   :450040                                                           
##                                                                           
##     Estado              Mts.2      Tipo.ubicación        Giro          
##  Length:200620      Min.   :47.0   Length:200620      Length:200620     
##  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:200620      Length:200620     
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 
count(df, ï..vcClaveTienda, sort=TRUE)
count(df,DescGiro, sort=TRUE)
count(df,Marca, sort=TRUE)
count(df,Fabricante, sort=TRUE)
count(df,Producto, sort=TRUE)
count(df,NombreDepartamento, sort=TRUE)
count(df,NombreFamilia, sort=TRUE)
count(df,NombreCategoria, sort=TRUE)
count(df,Estado, sort=TRUE)
count(df,Mts.2, sort=TRUE)
count(df, Tipo.ubicación, sort=TRUE)
count(df,Giro, sort=TRUE)
count(df,Hora.inicio, sort=TRUE)
count(df,Hora.cierre, sort=TRUE)

Observaciones
1. Casi ningun registro cuenta con PLU. 2. El formato de fecha ya sale con el cambio previo. 3. El formato de hora ya sale con el cambio previo. 4. Hay precios negativos. 5. Hay unidades menores a 1.

Funciones con tidyverse para exploración de bases de datos

tibble(df)
## # A tibble: 200,620 x 22
##    ï..vcClaveTienda DescGiro  Codigo.Barras   PLU Fecha   Hora  Marca Fabricante
##    <chr>            <chr>             <dbl> <int> <chr>   <chr> <chr> <chr>     
##  1 MX001            Abarrotes 7500000000000    NA 19/06/~ 08:1~ NUTR~ MEXILAC   
##  2 MX001            Abarrotes 7500000000000    NA 19/06/~ 08:2~ DAN ~ DANONE DE~
##  3 MX001            Abarrotes 7500000000000    NA 19/06/~ 08:2~ BIMBO GRUPO BIM~
##  4 MX001            Abarrotes 7500000000000    NA 19/06/~ 08:2~ PEPSI PEPSI-COL~
##  5 MX001            Abarrotes 7500000000000    NA 19/06/~ 08:2~ BLAN~ FABRICA D~
##  6 MX001            Abarrotes 7500000000000    NA 19/06/~ 08:2~ FLASH ALEN      
##  7 MX001            Abarrotes 7500000000000    NA 19/06/~ 08:2~ VARI~ DANONE DE~
##  8 MX001            Abarrotes 7500000000000    NA 19/06/~ 08:2~ ZOTE  FABRICA D~
##  9 MX001            Abarrotes 7510000000000    NA 19/06/~ 08:2~ ALWA~ PROCTER &~
## 10 MX001            Abarrotes   32239052017    NA 19/06/~ 15:2~ JUMEX JUMEX     
## # ... with 200,610 more rows, and 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':    200620 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 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" ...
head(df, 7)
##   ï..vcClaveTienda  DescGiro Codigo.Barras PLU      Fecha     Hora
## 1            MX001 Abarrotes       7.5e+12  NA 19/06/2020 08:16:21
## 2            MX001 Abarrotes       7.5e+12  NA 19/06/2020 08:23:33
## 3            MX001 Abarrotes       7.5e+12  NA 19/06/2020 08:24:33
## 4            MX001 Abarrotes       7.5e+12  NA 19/06/2020 08:24:33
## 5            MX001 Abarrotes       7.5e+12  NA 19/06/2020 08:26:28
## 6            MX001 Abarrotes       7.5e+12  NA 19/06/2020 08:26:28
## 7            MX001 Abarrotes       7.5e+12  NA 19/06/2020 08:26:28
##                        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                      FLASH                       ALEN
## 7              VARIOS DANONE           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       Flash Xtra Brisa Marina 500Ml    9.5      7.31        1        4
## 7 Danone Bipack Fresa Chocoarroz 130G   11.0     11.00        1        4
##   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     Limpieza del Hogar      Limpiadores Líquidos
## 7          Abarrotes Lacteos y Refrigerados       Postres Refrigerados
##        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)
##        ï..vcClaveTienda  DescGiro Codigo.Barras PLU      Fecha     Hora
## 200615            MX005 Depósito      7.62e+12  NA 12/07/2020 01:08:25
## 200616            MX005 Depósito      7.62e+12  NA 23/10/2020 22:17:37
## 200617            MX005 Depósito      7.62e+12  NA 10/10/2020 20:30:20
## 200618            MX005 Depósito      7.62e+12  NA 10/10/2020 22:40:43
## 200619            MX005 Depósito      7.62e+12  NA 27/06/2020 22:30:19
## 200620            MX005 Depósito      7.62e+12  NA 26/06/2020 23:43:34
##                    Marca    Fabricante                          Producto Precio
## 200615 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200616 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200617 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200618 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200619 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200620 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
##        Ult.Costo Unidades F.Ticket NombreDepartamento NombreFamilia
## 200615      6.92        1   103100          Abarrotes     Dulcería
## 200616      6.92        1   116598          Abarrotes     Dulcería
## 200617      6.92        1   114886          Abarrotes     Dulcería
## 200618      6.92        1   114955          Abarrotes     Dulcería
## 200619      6.92        1   101121          Abarrotes     Dulcería
## 200620      6.92        1   100879          Abarrotes     Dulcería
##        NombreCategoria       Estado Mts.2 Tipo.ubicación        Giro
## 200615 Gomas de Mazcar Quintana Roo    58         Esquina Mini súper
## 200616 Gomas de Mazcar Quintana Roo    58         Esquina Mini súper
## 200617 Gomas de Mazcar Quintana Roo    58         Esquina Mini súper
## 200618 Gomas de Mazcar Quintana Roo    58         Esquina Mini súper
## 200619 Gomas de Mazcar Quintana Roo    58         Esquina Mini súper
## 200620 Gomas de Mazcar Quintana Roo    58         Esquina Mini súper
##        Hora.inicio Hora.cierre
## 200615       08:00       21:00
## 200616       08:00       21:00
## 200617       08:00       21:00
## 200618       08:00       21:00
## 200619       08:00       21:00
## 200620       08:00       21:00

Estas funciones nos permiten ver la estructura de las variables, así como los primeros y últimos registros.

Funciones con janitor

tabyl(df, ï..vcClaveTienda, NombreDepartamento)
##  ï..vcClaveTienda Abarrotes Bebes e Infantiles Carnes Farmacia Ferretería
##             MX001     95410                515      1      147         245
##             MX002      6590                 21      0        4          10
##             MX003      4026                 15      0        2           8
##             MX004     82234                932      0      102         114
##             MX005     10014                  0      0        0           0
##  Mercería Papelería Productos a Eliminar Vinos y Licores
##         28         35                    3              80
##          0          0                    0               4
##          0          0                    0               0
##         16         32                    5              20
##          0          7                    0               0

Esta función construye una tabla a partir de dos variables de nuestra base de datos.

Técnicas para limpieza de datos

Técnica 1. Remover valores irrelevantes

Eliminar columnas
df1<-df
df1<-subset(df1,select= -c(PLU,Codigo.Barras))
summary(df1)
##  ï..vcClaveTienda     DescGiro            Fecha               Hora          
##  Length:200620      Length:200620      Length:200620      Length:200620     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     Marca            Fabricante          Producto             Precio       
##  Length:200620      Length:200620      Length:200620      Min.   :-147.00  
##  Class :character   Class :character   Class :character   1st Qu.:  11.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :  16.00  
##                                                           Mean   :  19.42  
##                                                           3rd Qu.:  25.00  
##                                                           Max.   :1000.00  
##    Ult.Costo         Unidades         F.Ticket      NombreDepartamento
##  Min.   :  0.38   Min.   : 0.200   Min.   :     1   Length:200620     
##  1st Qu.:  8.46   1st Qu.: 1.000   1st Qu.: 33967   Class :character  
##  Median : 12.31   Median : 1.000   Median :105996   Mode  :character  
##  Mean   : 15.31   Mean   : 1.262   Mean   :193994                     
##  3rd Qu.: 19.23   3rd Qu.: 1.000   3rd Qu.:383009                     
##  Max.   :769.23   Max.   :96.000   Max.   :450040                     
##  NombreFamilia      NombreCategoria       Estado              Mts.2     
##  Length:200620      Length:200620      Length:200620      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:200620      Length:200620      Length:200620      Length:200620     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
## 
Eliminar renglones
df2 <-df1
df2 <- df2[df2$Precio>0,]
summary(df2)
##  ï..vcClaveTienda     DescGiro            Fecha               Hora          
##  Length:200473      Length:200473      Length:200473      Length:200473     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     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  
##                                                                             
##                                                                             
## 
#Esto no se utilizara puesto que utilizaremos los valores negativos como absolutos.

Técnica2. Remover valores duplicados

¿Cuantos renglones duplicados tenemos?
df1[duplicated(df1),]
##  [1] ï..vcClaveTienda   DescGiro           Fecha              Hora              
##  [5] Marca              Fabricante         Producto           Precio            
##  [9] Ult.Costo          Unidades           F.Ticket           NombreDepartamento
## [13] NombreFamilia      NombreCategoria    Estado             Mts.2             
## [17] Tipo.ubicación    Giro               Hora.inicio        Hora.cierre       
## <0 rows> (or 0-length row.names)
sum(duplicated(df1))
## [1] 0
Eliminar renglones duplicados
df3<-df1
df3<-distinct(df3)

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

Precios en absoluto
df4<-df3
df4$Precio<-abs(df4$Precio)
unique(df4$Precio)
##   [1]   16.00   14.00    5.00    8.00   19.50    9.50   11.00   23.50   12.00
##  [10]   27.00   33.00   13.00    6.00   20.00   21.00   44.00   10.00   12.50
##  [19]   14.50   49.00   29.00   10.50   28.00    9.00   32.00   34.00   18.00
##  [28]   37.00    3.50   35.00   22.50    2.00   24.00   22.00    7.00    1.50
##  [37]   25.00   19.00   39.00  115.00   30.50   31.50    6.50   36.00   16.50
##  [46]   26.00   11.50    4.00   63.00    4.50   60.00   58.00   40.50   15.00
##  [55]   17.00   30.00   50.00   56.00   13.50    3.00   40.00   15.50   20.50
##  [64]   23.00  260.00   29.50   36.50   18.50   21.50    5.50   68.00   53.00
##  [73]   27.50   38.00   41.00   47.00   45.00   28.50    7.50   48.00   38.50
##  [82]    1.00   65.00   17.50    8.50   31.00   43.00   55.00   26.50   25.50
##  [91]   33.50  135.50  130.00   24.50   35.50  110.00   75.00    2.50   34.50
## [100]   69.00   57.00   76.00   39.50  113.00   81.00  125.00   50.50   55.50
## [109]   73.00   32.50   53.50  147.00   70.00  200.00   64.50   43.50   80.00
## [118]  105.00   54.00  140.00   42.00  100.00   61.00   37.50  250.00 1000.00
## [127]   74.00   52.00  135.00  129.00  148.00   66.00  126.00   59.00  145.00
## [136]    0.50   44.50  134.50   72.00  170.00   47.50   42.50   85.00  120.00
## [145]   46.00   12.90   14.17  175.00  122.00  108.00  173.50   51.00   46.50
## [154]  134.00  150.00  197.00   98.00   90.00  116.00  103.00   62.00   77.00
## [163]  155.00   67.00
Cantidades en enteros
df5<-df4
df5$Unidades<-ceiling(df5$Unidades)
unique(df5$Unidades)
##  [1]  1  2  3  5 14  6  4 15 10 11 25 12 18  9 20  8  7 24 61 16 50 60 48 36 13
## [26] 46 80 44 40 17 26 22 23 32 33 72 56 30 37 29 96 27

Técnica 4. Convertir tipos de datos

Convertir de caracter a fecha
df6<-df5
df6$Fecha<-as.Date(df6$Fecha, format = "%d/%m/%Y")
tibble(df6)
## # A tibble: 200,620 x 20
##    ï..vcClaveTienda DescGiro  Fecha      Hora   Marca Fabricante Producto Precio
##    <chr>            <chr>     <date>     <chr>  <chr> <chr>      <chr>     <dbl>
##  1 MX001            Abarrotes 2020-06-19 08:16~ NUTR~ MEXILAC    Nutri L~   16  
##  2 MX001            Abarrotes 2020-06-19 08:23~ DAN ~ DANONE DE~ DANUP S~   14  
##  3 MX001            Abarrotes 2020-06-19 08:24~ BIMBO GRUPO BIM~ Rebanad~    5  
##  4 MX001            Abarrotes 2020-06-19 08:24~ PEPSI PEPSI-COL~ Pepsi N~    8  
##  5 MX001            Abarrotes 2020-06-19 08:26~ BLAN~ FABRICA D~ Deterge~   19.5
##  6 MX001            Abarrotes 2020-06-19 08:26~ FLASH ALEN       Flash X~    9.5
##  7 MX001            Abarrotes 2020-06-19 08:26~ VARI~ DANONE DE~ Danone ~   11  
##  8 MX001            Abarrotes 2020-06-19 08:26~ ZOTE  FABRICA D~ Jabon Z~    9.5
##  9 MX001            Abarrotes 2020-06-19 08:26~ ALWA~ PROCTER &~ T Femen~   23.5
## 10 MX001            Abarrotes 2020-06-19 15:24~ JUMEX JUMEX      Jugo De~   12  
## # ... with 200,610 more rows, and 12 more variables: 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>
Convertir de caracter a entero
df7<-df6
df7$Hora<-substr(df7$Hora, start=1,stop=2)
tibble(df7)
## # A tibble: 200,620 x 20
##    ï..vcClaveTienda DescGiro  Fecha      Hora  Marca  Fabricante Producto Precio
##    <chr>            <chr>     <date>     <chr> <chr>  <chr>      <chr>     <dbl>
##  1 MX001            Abarrotes 2020-06-19 08    NUTRI~ MEXILAC    Nutri L~   16  
##  2 MX001            Abarrotes 2020-06-19 08    DAN UP DANONE DE~ DANUP S~   14  
##  3 MX001            Abarrotes 2020-06-19 08    BIMBO  GRUPO BIM~ Rebanad~    5  
##  4 MX001            Abarrotes 2020-06-19 08    PEPSI  PEPSI-COL~ Pepsi N~    8  
##  5 MX001            Abarrotes 2020-06-19 08    BLANC~ FABRICA D~ Deterge~   19.5
##  6 MX001            Abarrotes 2020-06-19 08    FLASH  ALEN       Flash X~    9.5
##  7 MX001            Abarrotes 2020-06-19 08    VARIO~ DANONE DE~ Danone ~   11  
##  8 MX001            Abarrotes 2020-06-19 08    ZOTE   FABRICA D~ Jabon Z~    9.5
##  9 MX001            Abarrotes 2020-06-19 08    ALWAYS PROCTER &~ T Femen~   23.5
## 10 MX001            Abarrotes 2020-06-19 15    JUMEX  JUMEX      Jugo De~   12  
## # ... with 200,610 more rows, and 12 more variables: 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>
df7$Hora<- as.integer(df7$Hora)
str(df7)
## 'data.frame':    200620 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" ...

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] 199183
¿Cuántos NA tengo por variable?

Aquí estamos calculando los NA’s del primer df, y de df7, ya que la primera si tiene la columna PLU que contiene muchos NA’s y la segunda ya no tiene esta columna.

sapply(df7, function(x) sum(is.na(x)))
##   ï..vcClaveTienda           DescGiro              Fecha               Hora 
##                  0                  0                  0                  0 
##              Marca         Fabricante           Producto             Precio 
##                  0                  0                  0                  0 
##          Ult.Costo           Unidades           F.Ticket NombreDepartamento 
##                  0                  0                  0                  0 
##      NombreFamilia    NombreCategoria             Estado              Mts.2 
##                  0                  0                  0                  0 
##    Tipo.ubicación               Giro        Hora.inicio        Hora.cierre 
##                  0                  0                  0                  0
sapply(df, function(x) sum(is.na(x)))
##   ï..vcClaveTienda           DescGiro      Codigo.Barras                PLU 
##                  0                  0                  0             199183 
##              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 NA de una tabla
df8<-df
df8<-na.omit(df8)
summary(df8)
##  ï..vcClaveTienda     DescGiro         Codigo.Barras            PLU        
##  Length:1437        Length:1437        Min.   :6.750e+08   Min.   : 1.000  
##  Class :character   Class :character   1st Qu.:6.750e+08   1st Qu.: 1.000  
##  Mode  :character   Mode  :character   Median :6.750e+08   Median : 1.000  
##                                        Mean   :2.616e+11   Mean   : 2.112  
##                                        3rd Qu.:6.750e+08   3rd Qu.: 1.000  
##                                        Max.   :7.500e+12   Max.   :30.000  
##     Fecha               Hora              Marca            Fabricante       
##  Length:1437        Length:1437        Length:1437        Length:1437       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##    Producto             Precio        Ult.Costo        Unidades    
##  Length:1437        Min.   :30.00   Min.   : 1.00   Min.   :1.000  
##  Class :character   1st Qu.:90.00   1st Qu.:64.62   1st Qu.:1.000  
##  Mode  :character   Median :90.00   Median :64.62   Median :1.000  
##                     Mean   :87.94   Mean   :56.65   Mean   :1.124  
##                     3rd Qu.:90.00   3rd Qu.:64.62   3rd Qu.:1.000  
##                     Max.   :90.00   Max.   :64.62   Max.   :7.000  
##     F.Ticket      NombreDepartamento NombreFamilia      NombreCategoria   
##  Min.   :   772   Length:1437        Length:1437        Length:1437       
##  1st Qu.: 99955   Class :character   Class :character   Class :character  
##  Median :102493   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :100595                                                           
##  3rd Qu.:106546                                                           
##  Max.   :118356                                                           
##     Estado              Mts.2       Tipo.ubicación        Giro          
##  Length:1437        Min.   :58.00   Length:1437        Length:1437       
##  Class :character   1st Qu.:58.00   Class :character   Class :character  
##  Mode  :character   Median :58.00   Mode  :character   Mode  :character  
##                     Mean   :58.07                                        
##                     3rd Qu.:58.00                                        
##                     Max.   :60.00                                        
##  Hora.inicio        Hora.cierre       
##  Length:1437        Length:1437       
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 
Remplazar NA con ceros
df9<- df
df9[is.na(df9)]<-0
summary(df9)
##  ï..vcClaveTienda     DescGiro         Codigo.Barras            PLU          
##  Length:200620      Length:200620      Min.   :8.347e+05   Min.   : 0.00000  
##  Class :character   Class :character   1st Qu.:7.500e+12   1st Qu.: 0.00000  
##  Mode  :character   Mode  :character   Median :7.500e+12   Median : 0.00000  
##                                        Mean   :5.949e+12   Mean   : 0.01513  
##                                        3rd Qu.:7.500e+12   3rd Qu.: 0.00000  
##                                        Max.   :1.750e+13   Max.   :30.00000  
##     Fecha               Hora              Marca            Fabricante       
##  Length:200620      Length:200620      Length:200620      Length:200620     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##    Producto             Precio          Ult.Costo         Unidades     
##  Length:200620      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:200620      Length:200620      Length:200620     
##  1st Qu.: 33967   Class :character   Class :character   Class :character  
##  Median :105996   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :193994                                                           
##  3rd Qu.:383009                                                           
##  Max.   :450040                                                           
##     Estado              Mts.2      Tipo.ubicación        Giro          
##  Length:200620      Min.   :47.0   Length:200620      Length:200620     
##  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:200620      Length:200620     
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 
Remplazar NA con el promedio
df10<-df
df10$PLU[is.na(df10$PLU)]<-mean(df10$PLU, na.rm=TRUE)
summary(df10)
##  ï..vcClaveTienda     DescGiro         Codigo.Barras            PLU        
##  Length:200620      Length:200620      Min.   :8.347e+05   Min.   : 1.000  
##  Class :character   Class :character   1st Qu.:7.500e+12   1st Qu.: 2.112  
##  Mode  :character   Mode  :character   Median :7.500e+12   Median : 2.112  
##                                        Mean   :5.949e+12   Mean   : 2.112  
##                                        3rd Qu.:7.500e+12   3rd Qu.: 2.112  
##                                        Max.   :1.750e+13   Max.   :30.000  
##     Fecha               Hora              Marca            Fabricante       
##  Length:200620      Length:200620      Length:200620      Length:200620     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##    Producto             Precio          Ult.Costo         Unidades     
##  Length:200620      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:200620      Length:200620      Length:200620     
##  1st Qu.: 33967   Class :character   Class :character   Class :character  
##  Median :105996   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :193994                                                           
##  3rd Qu.:383009                                                           
##  Max.   :450040                                                           
##     Estado              Mts.2      Tipo.ubicación        Giro          
##  Length:200620      Min.   :47.0   Length:200620      Length:200620     
##  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:200620      Length:200620     
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 
Remplazar negativos con cero
df11<-df
df11[df11<0]<-0
summary(df11)
##  ï..vcClaveTienda     DescGiro         Codigo.Barras            PLU        
##  Length:200620      Length:200620      Min.   :8.347e+05   Min.   : 1.00   
##  Class :character   Class :character   1st Qu.:7.500e+12   1st Qu.: 1.00   
##  Mode  :character   Mode  :character   Median :7.500e+12   Median : 1.00   
##                                        Mean   :5.949e+12   Mean   : 2.11   
##                                        3rd Qu.:7.500e+12   3rd Qu.: 1.00   
##                                        Max.   :1.750e+13   Max.   :30.00   
##                                                            NA's   :199183  
##     Fecha               Hora              Marca            Fabricante       
##  Length:200620      Length:200620      Length:200620      Length:200620     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##    Producto             Precio          Ult.Costo         Unidades     
##  Length:200620      Min.   :   0.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.44   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:200620      Length:200620      Length:200620     
##  1st Qu.: 33967   Class :character   Class :character   Class :character  
##  Median :105996   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :193994                                                           
##  3rd Qu.:383009                                                           
##  Max.   :450040                                                           
##                                                                           
##     Estado              Mts.2      Tipo.ubicación        Giro          
##  Length:200620      Min.   :47.0   Length:200620      Length:200620     
##  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:200620      Length:200620     
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 

Técnica 6. Método estadístico

df12<-df7
boxplot(df12$Precio,horixontal=TRUE)

boxplot(df12$Unidades,horizontal=TRUE)

Agregar columnas
df12$Dia_de_la_semana<-wday(df12$Fecha)


df12$Subtotal<-df12$Precio * df12$Unidades


df12$Utilidad<-df12$Precio-df12$Ult.Costo

df13<-select(df12, Dia_de_la_semana, Subtotal,Utilidad)
head(df13)
##   Dia_de_la_semana Subtotal Utilidad
## 1                6     16.0     3.69
## 2                6     14.0     0.00
## 3                6      5.0     0.00
## 4                6      8.0     0.00
## 5                6     19.5     4.50
## 6                6      9.5     2.19

Exportar base de datos limpia

df_limpia<-df12

write.csv(df_limpia,file = "abarrotes_bd_limpia.csv", row.names = FALSE)

Conclusión

Previo a la manipulación de una base de datos y realizar análisis, es necesario asegurar que la base de datos que se usa esté limpia y lista para manipularse. El presente trabajo brinda herramientas que permiten la limpieza de las bases de datos para poder manipularlas y analizarlas sin encontrarnos con errores o dificultades en el análisis.

LS0tDQp0aXRsZTogIkhlcnJhbWllbnRhcyBwYXJhIExpbXBpZXphIGRlIERhdG9zIg0KYXV0aG9yOiAiSmF2aWVyIEF5YWxhLUEwMDgyMzk1OCINCmRhdGU6ICcyMDIyLTA4LTI5Jw0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCjxjZW50ZXI+DQo8aW1nIHNyYz0iQzovL1VzZXJzLy9qYXZhdy8vT25lRHJpdmUgLSBJbnN0aXR1dG8gVGVjbm9sb2dpY28geSBkZSBFc3R1ZGlvcyBTdXBlcmlvcmVzIGRlIE1vbnRlcnJleS8vTG9nbyBJVEVTTSBzbWFsbC5wbmciPg0KPC9jZW50ZXI+DQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQpoMSwgaDQgew0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxLCBoMiwgaDMgew0KICBjb2xvcjogIzA2MUY2QjsNCn0NCmBgYA0KDQoNCioqQSBsYSBiYXNlIGRlIGRhdG9zIHNlIGxlIGhpY2llcm9uIGxvcyBzaWd1aWVudGVzIGNhbWJpb3M6KiogIA0KMS4gU2UgY2FtYmnDsyBlbCBmb3JtYXRvIGEgZmVjaGEgY29ydGEuICANCjIuIFNlIGR1cGxpY2Fyb24gbG9zIHByaW1lcm9zIDUgcmVnaXN0cm9zLiAgDQozLiBTZSBjYW1iacOzIGxlIGZvcm1hdG8gYSBob3JhIChlc3Bhw7FvbCBNw6l4aWNvKS4gIA0KNC4gU2UgY2FtYmnDsyBlbCBmb3JtYXRvIGEgY8OzZGlnbyBkZSBiYXJyYXMgKHBhcmEgcXVlIHNhbGdhIGNvbXBsZXRvKS4gIA0KNS4gU2UgZ3VhcmTDsyBjb21vIENTViBVVEYgOCAoRGVsaW1pdGFkbyBwb3IgY29tYXMpLiAgDQoNCiMjIENhcmdhciBsaWJyZXJpYXMNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpgYGANCg0KDQojIyBJbXBvcnRhciBiYXNlIGRlIGRhdG9zDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpkZjwtcmVhZC5jc3YoIkM6XFxVc2Vyc1xcamF2YXdcXE9uZURyaXZlIC0gSW5zdGl0dXRvIFRlY25vbG9naWNvIHkgZGUgRXN0dWRpb3MgU3VwZXJpb3JlcyBkZSBNb250ZXJyZXlcXDdtbyBTZW1lc3RyZVxcTW9kdWxvIDNcXEFiYXJyb3Rlc19WZW50YXMyLmNzdiIpDQpgYGANCg0KYGBge3J9DQpjb2xuYW1lcyhkZikNCmBgYA0KDQojIyBFbnRlbmRlciBiYXNlIGRlIGRhdG9zICANCmBgYHtyfQ0Kc3VtbWFyeShkZikNCmBgYA0KDQpgYGB7ciBlY2hvPVQsIHJlc3VsdHM9J2hpZGUnfQ0KY291bnQoZGYsIMOvLi52Y0NsYXZlVGllbmRhLCBzb3J0PVRSVUUpDQpjb3VudChkZixEZXNjR2lybywgc29ydD1UUlVFKQ0KY291bnQoZGYsTWFyY2EsIHNvcnQ9VFJVRSkNCmNvdW50KGRmLEZhYnJpY2FudGUsIHNvcnQ9VFJVRSkNCmNvdW50KGRmLFByb2R1Y3RvLCBzb3J0PVRSVUUpDQpjb3VudChkZixOb21icmVEZXBhcnRhbWVudG8sIHNvcnQ9VFJVRSkNCmNvdW50KGRmLE5vbWJyZUZhbWlsaWEsIHNvcnQ9VFJVRSkNCmNvdW50KGRmLE5vbWJyZUNhdGVnb3JpYSwgc29ydD1UUlVFKQ0KY291bnQoZGYsRXN0YWRvLCBzb3J0PVRSVUUpDQpjb3VudChkZixNdHMuMiwgc29ydD1UUlVFKQ0KY291bnQoZGYsIFRpcG8udWJpY2FjacODwrNuLCBzb3J0PVRSVUUpDQpjb3VudChkZixHaXJvLCBzb3J0PVRSVUUpDQpjb3VudChkZixIb3JhLmluaWNpbywgc29ydD1UUlVFKQ0KY291bnQoZGYsSG9yYS5jaWVycmUsIHNvcnQ9VFJVRSkNCmBgYA0KDQoqKk9ic2VydmFjaW9uZXMqKiAgDQoxLiBDYXNpIG5pbmd1biByZWdpc3RybyBjdWVudGEgY29uIFBMVS4NCjIuIEVsIGZvcm1hdG8gZGUgZmVjaGEgeWEgc2FsZSBjb24gZWwgY2FtYmlvIHByZXZpby4NCjMuIEVsIGZvcm1hdG8gZGUgaG9yYSB5YSBzYWxlIGNvbiBlbCBjYW1iaW8gcHJldmlvLg0KNC4gSGF5IHByZWNpb3MgbmVnYXRpdm9zLg0KNS4gSGF5IHVuaWRhZGVzIG1lbm9yZXMgYSAxLiANCg0KDQojIyBGdW5jaW9uZXMgY29uIHRpZHl2ZXJzZSBwYXJhIGV4cGxvcmFjacOzbiBkZSBiYXNlcyBkZSBkYXRvcw0KYGBge3J9DQp0aWJibGUoZGYpDQpzdHIoZGYpDQpoZWFkKGRmLCA3KQ0KdGFpbChkZikNCmBgYA0KRXN0YXMgZnVuY2lvbmVzIG5vcyBwZXJtaXRlbiB2ZXIgbGEgZXN0cnVjdHVyYSBkZSBsYXMgdmFyaWFibGVzLCBhc8OtIGNvbW8gbG9zIHByaW1lcm9zIHkgw7psdGltb3MgcmVnaXN0cm9zLiAgDQoNCg0KIyMgRnVuY2lvbmVzIGNvbiBqYW5pdG9yDQpgYGB7cn0NCnRhYnlsKGRmLCDDry4udmNDbGF2ZVRpZW5kYSwgTm9tYnJlRGVwYXJ0YW1lbnRvKQ0KYGBgDQpFc3RhIGZ1bmNpw7NuIGNvbnN0cnV5ZSB1bmEgdGFibGEgYSBwYXJ0aXIgZGUgZG9zIHZhcmlhYmxlcyBkZSBudWVzdHJhIGJhc2UgZGUgZGF0b3MuICANCg0KDQojIyBUw6ljbmljYXMgcGFyYSBsaW1waWV6YSBkZSBkYXRvcw0KDQojIyMgVMOpY25pY2EgMS4gUmVtb3ZlciB2YWxvcmVzIGlycmVsZXZhbnRlcw0KDQojIyMjIyBFbGltaW5hciBjb2x1bW5hcw0KYGBge3J9DQpkZjE8LWRmDQpkZjE8LXN1YnNldChkZjEsc2VsZWN0PSAtYyhQTFUsQ29kaWdvLkJhcnJhcykpDQpzdW1tYXJ5KGRmMSkNCmBgYA0KDQojIyMjIyBFbGltaW5hciByZW5nbG9uZXMNCmBgYHtyfQ0KZGYyIDwtZGYxDQpkZjIgPC0gZGYyW2RmMiRQcmVjaW8+MCxdDQpzdW1tYXJ5KGRmMikNCiNFc3RvIG5vIHNlIHV0aWxpemFyYSBwdWVzdG8gcXVlIHV0aWxpemFyZW1vcyBsb3MgdmFsb3JlcyBuZWdhdGl2b3MgY29tbyBhYnNvbHV0b3MuDQpgYGANCg0KIyMjIFTDqWNuaWNhMi4gUmVtb3ZlciB2YWxvcmVzIGR1cGxpY2Fkb3MNCg0KIyMjIyMgwr9DdWFudG9zIHJlbmdsb25lcyBkdXBsaWNhZG9zIHRlbmVtb3M/DQpgYGB7cn0NCmRmMVtkdXBsaWNhdGVkKGRmMSksXQ0Kc3VtKGR1cGxpY2F0ZWQoZGYxKSkNCmBgYA0KDQojIyMjIyBFbGltaW5hciByZW5nbG9uZXMgZHVwbGljYWRvcw0KYGBge3J9DQpkZjM8LWRmMQ0KZGYzPC1kaXN0aW5jdChkZjMpDQoNCmBgYA0KDQojIyMgVMOpY25pY2EgMy4gRXJyb3JlcyB0aXBvZ3LDoWZpY29zIHkgZXJyb3JlcyBzaW1pbGFyZXMNCg0KIyMjIyMgUHJlY2lvcyBlbiBhYnNvbHV0bw0KYGBge3J9DQpkZjQ8LWRmMw0KZGY0JFByZWNpbzwtYWJzKGRmNCRQcmVjaW8pDQp1bmlxdWUoZGY0JFByZWNpbykNCmBgYA0KDQojIyMjIyBDYW50aWRhZGVzIGVuIGVudGVyb3MNCmBgYHtyfQ0KZGY1PC1kZjQNCmRmNSRVbmlkYWRlczwtY2VpbGluZyhkZjUkVW5pZGFkZXMpDQp1bmlxdWUoZGY1JFVuaWRhZGVzKQ0KYGBgDQogDQojIyMgVMOpY25pY2EgNC4gQ29udmVydGlyIHRpcG9zIGRlIGRhdG9zDQoNCiMjIyMjIENvbnZlcnRpciBkZSBjYXJhY3RlciBhIGZlY2hhDQpgYGB7cn0NCmRmNjwtZGY1DQpkZjYkRmVjaGE8LWFzLkRhdGUoZGY2JEZlY2hhLCBmb3JtYXQgPSAiJWQvJW0vJVkiKQ0KdGliYmxlKGRmNikNCmBgYA0KDQojIyMjIyBDb252ZXJ0aXIgZGUgY2FyYWN0ZXIgYSBlbnRlcm8NCmBgYHtyfQ0KZGY3PC1kZjYNCmRmNyRIb3JhPC1zdWJzdHIoZGY3JEhvcmEsIHN0YXJ0PTEsc3RvcD0yKQ0KdGliYmxlKGRmNykNCmRmNyRIb3JhPC0gYXMuaW50ZWdlcihkZjckSG9yYSkNCnN0cihkZjcpDQpgYGANCg0KIyMjIFTDqWNuaWNhIDUuVmFsb3JlcyBGYWx0YW50ZXMNCg0KIyMjIyMgwr9DdcOhbnRvcyBOQSB0ZW5nbyBlbiBsYSBiYXNlIGRlIGRhdG9zDQpgYGB7cn0NCnN1bShpcy5uYShkZjcpKQ0Kc3VtKGlzLm5hKGRmKSkNCmBgYA0KDQojIyMjIyDCv0N1w6FudG9zIE5BIHRlbmdvIHBvciB2YXJpYWJsZT8gIA0KQXF1w60gZXN0YW1vcyBjYWxjdWxhbmRvIGxvcyBOQSdzIGRlbCBwcmltZXIgZGYsIHkgZGUgZGY3LCB5YSBxdWUgbGEgcHJpbWVyYSBzaSB0aWVuZSBsYSBjb2x1bW5hIFBMVSBxdWUgY29udGllbmUgbXVjaG9zIE5BJ3MgeSBsYSBzZWd1bmRhIHlhIG5vIHRpZW5lIGVzdGEgY29sdW1uYS4gIA0KYGBge3J9DQpzYXBwbHkoZGY3LCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQ0Kc2FwcGx5KGRmLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQ0KYGBgDQoNCiMjIyMjIEJvcnJhciB0b2RvcyBsb3MgcmVnaXN0cm9zIE5BIGRlIHVuYSB0YWJsYQ0KYGBge3J9DQpkZjg8LWRmDQpkZjg8LW5hLm9taXQoZGY4KQ0Kc3VtbWFyeShkZjgpDQoNCmBgYA0KDQojIyMjIyBSZW1wbGF6YXIgTkEgY29uIGNlcm9zDQpgYGB7cn0NCmRmOTwtIGRmDQpkZjlbaXMubmEoZGY5KV08LTANCnN1bW1hcnkoZGY5KQ0KDQpgYGANCg0KIyMjIyMgUmVtcGxhemFyIE5BIGNvbiBlbCBwcm9tZWRpbw0KYGBge3J9DQpkZjEwPC1kZg0KZGYxMCRQTFVbaXMubmEoZGYxMCRQTFUpXTwtbWVhbihkZjEwJFBMVSwgbmEucm09VFJVRSkNCnN1bW1hcnkoZGYxMCkNCg0KYGBgDQoNCiMjIyMjIFJlbXBsYXphciBuZWdhdGl2b3MgY29uIGNlcm8NCmBgYHtyfQ0KZGYxMTwtZGYNCmRmMTFbZGYxMTwwXTwtMA0Kc3VtbWFyeShkZjExKQ0KDQpgYGANCg0KIyMjIFTDqWNuaWNhIDYuIE3DqXRvZG8gZXN0YWTDrXN0aWNvDQpgYGB7cn0NCmRmMTI8LWRmNw0KYm94cGxvdChkZjEyJFByZWNpbyxob3JpeG9udGFsPVRSVUUpDQpib3hwbG90KGRmMTIkVW5pZGFkZXMsaG9yaXpvbnRhbD1UUlVFKQ0KYGBgDQoNCiMjIyMjIEFncmVnYXIgY29sdW1uYXMNCmBgYHtyfQ0KZGYxMiREaWFfZGVfbGFfc2VtYW5hPC13ZGF5KGRmMTIkRmVjaGEpDQoNCg0KZGYxMiRTdWJ0b3RhbDwtZGYxMiRQcmVjaW8gKiBkZjEyJFVuaWRhZGVzDQoNCg0KZGYxMiRVdGlsaWRhZDwtZGYxMiRQcmVjaW8tZGYxMiRVbHQuQ29zdG8NCg0KZGYxMzwtc2VsZWN0KGRmMTIsIERpYV9kZV9sYV9zZW1hbmEsIFN1YnRvdGFsLFV0aWxpZGFkKQ0KaGVhZChkZjEzKQ0KYGBgDQoNCiMjIEV4cG9ydGFyIGJhc2UgZGUgZGF0b3MgbGltcGlhDQpgYGB7cn0NCmRmX2xpbXBpYTwtZGYxMg0KDQp3cml0ZS5jc3YoZGZfbGltcGlhLGZpbGUgPSAiYWJhcnJvdGVzX2JkX2xpbXBpYS5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkNCg0KYGBgDQoNCg0KIyMgQ29uY2x1c2nDs24gIA0KUHJldmlvIGEgbGEgbWFuaXB1bGFjacOzbiBkZSB1bmEgYmFzZSBkZSBkYXRvcyB5IHJlYWxpemFyIGFuw6FsaXNpcywgZXMgbmVjZXNhcmlvIGFzZWd1cmFyIHF1ZSBsYSBiYXNlIGRlIGRhdG9zIHF1ZSBzZSB1c2EgZXN0w6kgbGltcGlhIHkgbGlzdGEgcGFyYSBtYW5pcHVsYXJzZS4gRWwgcHJlc2VudGUgdHJhYmFqbyBicmluZGEgaGVycmFtaWVudGFzIHF1ZSBwZXJtaXRlbiBsYSBsaW1waWV6YSBkZSBsYXMgYmFzZXMgZGUgZGF0b3MgcGFyYSBwb2RlciBtYW5pcHVsYXJsYXMgeSBhbmFsaXphcmxhcyBzaW4gZW5jb250cmFybm9zIGNvbiBlcnJvcmVzIG8gZGlmaWN1bHRhZGVzIGVuIGVsIGFuw6FsaXNpcy4=