Instalar paquetes y llamar librerías

#install.packages("tidyverse") # Manipulación de datos
library(tidyverse)
## ── 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
#install.packages("dplyr") # Gramática de funciones de manipulación
library(dplyr)
#install.packages("janitor") # Limpieza de datos
library(janitor)
## 
## 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)
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
## 
## Attaching package: 'plyr'
## 
## The following objects are masked from 'package:dplyr':
## 
##     arrange, count, desc, failwith, id, mutate, rename, summarise,
##     summarize
## 
## The following object is masked from 'package:purrr':
## 
##     compact
#install.packages("Matrix")
library(Matrix)
## 
## Attaching package: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
#install.packages("arules")
library(arules)
## 
## Attaching package: 'arules'
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
#install.packages("arulesViz")
library(arulesViz)
#install.packages("datasets")
library(datasets)
options(repos = c(CRAN = "www.xquartz.org"))

Importar la base de datos

df <- read.csv("abarrotes.csv")

Exploración de datos

# Para explorar variables numéricas
summary(df)
##  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  
##                                       
##                                       
##                                       
## 
# Para explorar variables de texto
count(df, vcClaveTienda, sort = TRUE) # Sort hace que la más repetida este arriba, menos abajo
count(df, Hora.cierre, sort = TRUE)
count(df, Hora.inicio, sort = TRUE)
count(df, Giro, sort = TRUE)
count(df, Tipo.ubicación, sort = TRUE)
count(df, Estado, sort = TRUE)
count(df, NombreCategoria, sort = TRUE)
count(df, NombreFamilia, sort = TRUE)
count(df, NombreDepartamento, sort = TRUE)
count(df, Producto, sort = TRUE)
count(df, Fabricante, sort = TRUE)
count(df, Marca, sort = TRUE)
count(df, Hora, sort = TRUE)
count(df, Fecha, sort = TRUE)
count(df, DescGiro, sort = TRUE)
# Para ver los primeros valores y el tipo de datos por variables
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" ...
# Generar una subtabla de Tienda y Departamento
tabyl(df, Estado, NombreDepartamento)
##        Estado Abarrotes Bebes e Infantiles Carnes Farmacia Ferretería Mercería
##       Chiapas      4026                 15      0        2          8        0
##       Jalisco      6590                 21      0        4         10        0
##    Nuevo León     95415                515      1      147        245       28
##  Quintana Roo     10014                  0      0        0          0        0
##       Sinaloa     82234                932      0      102        114       16
##  Papelería Productos a Eliminar Vinos y Licores
##          0                    0               0
##          0                    0               4
##         35                    3              80
##          7                    0               0
##         32                    5              20
tabyl(df, Estado, Hora.cierre)
##        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
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

Observaciones:

  • Quintana Roo cierra a las 9 pm; Nuevo León y Jalisco cierran a la 10 pm; y Sinaloa y Chiapas cierran a las 11 pm.
  • Chiapas y Sinaloa abren a las 7 am; Nuevo León y Quintana Roo abren a las 8 am y Jalisco abre a las 9 am.
  • PLU casi no tiene registros.
  • La fecha no tiene formato adecuado.
  • El precio tiene valores negativos.
  • 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. Eliminar 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 renflones duplicados
df3 <- df2
df3 <- distinct(df3) # Checar que tenga 5 renglones menos que df2

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

# Precios en absoluto (no se va a utilizar)
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  (no se va a utilizar)
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

Técnica 4. Convertir tipos de datos

# Convertir de character a fecha
df6 <- df3
df6$Fecha <- as.Date(df6$Fecha, format = "%d/%m/%Y")

# Convertir de character a hora
df7 <- df6
df7$Hora <- strptime(df7$Hora, format = "%H:%M:%S")
df7$Hora <- format(df7$Hora, "%H")
df7$Hora <- as.integer(df7$Hora)

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

Técnica 5. Valores faltantes

# ¿Cuántos NA tengo en la base de datos?
sum(is.na(df7))
## [1] 0
sum(is.na(df))
## [1] 199188
# ¿Cuántos NA tengo por variable?
sapply(df, function (x) sum(is.na(x)))
##      vcClaveTienda           DescGiro      Codigo.Barras                PLU 
##                  0                  0                  0             199188 
##              Fecha               Hora              Marca         Fabricante 
##                  0                  0                  0                  0 
##           Producto             Precio          Ult.Costo           Unidades 
##                  0                  0                  0                  0 
##           F.Ticket NombreDepartamento      NombreFamilia    NombreCategoria 
##                  0                  0                  0                  0 
##             Estado              Mts.2     Tipo.ubicación               Giro 
##                  0                  0                  0                  0 
##        Hora.inicio        Hora.cierre 
##                  0                  0
# Borrar todos los NA
df8 <-  df
df8 <- na.omit(df8)

# Reemplazar los NA por CEROS (afecta resultados estadísticos)
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 el PROMEDIO (no afecta resultados estadísticos)
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)

head(df11)
##   vcClaveTienda  DescGiro      Fecha Hora                      Marca
## 1         MX001 Abarrotes 2020-06-19    8                NUTRI LECHE
## 2         MX001 Abarrotes 2020-06-19    8                     DAN UP
## 3         MX001 Abarrotes 2020-06-19    8                      BIMBO
## 4         MX001 Abarrotes 2020-06-19    8                      PEPSI
## 5         MX001 Abarrotes 2020-06-19    8 BLANCA NIEVES (DETERGENTE)
## 6         MX001 Abarrotes 2020-06-19    8                      FLASH
##                   Fabricante                           Producto Precio
## 1                    MEXILAC                Nutri Leche 1 Litro   16.0
## 2           DANONE DE MEXICO DANUP STRAWBERRY P/BEBER 350GR NAL   14.0
## 3                GRUPO BIMBO                Rebanadas Bimbo 2Pz    5.0
## 4        PEPSI-COLA MEXICANA                   Pepsi N.R. 400Ml    8.0
## 5 FABRICA DE JABON LA CORONA      Detergente Blanca Nieves 500G   19.5
## 6                       ALEN      Flash Xtra Brisa Marina 500Ml    9.5
##   Ult.Costo Unidades F.Ticket NombreDepartamento          NombreFamilia
## 1     12.31        1        1          Abarrotes Lacteos y Refrigerados
## 2     14.00        1        2          Abarrotes Lacteos y Refrigerados
## 3      5.00        1        3          Abarrotes         Pan y Tortilla
## 4      8.00        1        3          Abarrotes                Bebidas
## 5     15.00        1        4          Abarrotes     Limpieza del Hogar
## 6      7.31        1        4          Abarrotes     Limpieza del Hogar
##             NombreCategoria     Estado Mts.2 Tipo.ubicación      Giro
## 1                     Leche Nuevo León    60        Esquina Abarrotes
## 2                    Yogurt Nuevo León    60        Esquina Abarrotes
## 3     Pan Dulce Empaquetado Nuevo León    60        Esquina Abarrotes
## 4 Refrescos Plástico (N.R.) Nuevo León    60        Esquina Abarrotes
## 5                Lavandería Nuevo León    60        Esquina Abarrotes
## 6      Limpiadores Líquidos Nuevo León    60        Esquina Abarrotes
##   Hora.inicio Hora.cierre
## 1       08:00       22:00
## 2       08:00       22:00
## 3       08:00       22:00
## 4       08:00       22:00
## 5       08:00       22:00
## 6       08:00       22:00

Agregar Columnas

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

Exportar base de datos limpia

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

Conclusiones

El análisis llevado a cabo en este proyecto ha revelado conclusiones clave sobre el conjunto de datos de abarrotes. Durante este proceso, se identificaron varios problemas, como valores nulos, duplicados y formatos incorrectos en fechas y horas, así como valores negativos en los precios. Mediante diversas técnicas de limpieza de datos, como la eliminación de registros irrelevantes y la corrección de errores tipográficos, se logró preparar una base de datos más coherente y confiable. Además, se llevó a cabo un análisis visual de los datos** y se agregaron nuevas columnas para enriquecer la información. Por último, la exportación de la base de datos limpia garantiza su utilidad para futuros análisis. Este proceso demuestra la importancia de la limpieza y preparación adecuada de los datos para obtener resultados precisos en cualquier proyecto de análisis.

LS0tCnRpdGxlOiAiQWJhcnJvdGVzIgphdXRob3I6ICJBbm5hIER1csOhbiBBMDEyODU2NzQiCmRhdGU6ICIyMDI0LTAzLTA0IgpvdXRwdXQ6CiAgICAgICAgaHRtbF9kb2N1bWVudDoKICAgICAgICAgICAgICAgIHRvYzogVFJVRQogICAgICAgICAgICAgICAgdG9jX2Zsb2F0OiBUUlVFCiAgICAgICAgICAgICAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICAgICAgICAgICAgICB0aGVtZTogZGFyawotLS0KIVtdKC9Vc2Vycy9hbm5hZHVyYW4vTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtSW5zdGl0dXRvVGVjbm9sb2dpY295ZGVFc3R1ZGlvc1N1cGVyaW9yZXNkZU1vbnRlcnJleS80VE8gU0VNL01hbmlwdWxhY2nDs24gZGUgZGF0b3MvUnN0dWRpby9veHhvLnBuZykKCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHJlZDsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+CmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikgIyBNYW5pcHVsYWNpw7NuIGRlIGRhdG9zCmxpYnJhcnkodGlkeXZlcnNlKQojaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKSAjIEdyYW3DoXRpY2EgZGUgZnVuY2lvbmVzIGRlIG1hbmlwdWxhY2nDs24KbGlicmFyeShkcGx5cikKI2luc3RhbGwucGFja2FnZXMoImphbml0b3IiKSAjIExpbXBpZXphIGRlIGRhdG9zCmxpYnJhcnkoamFuaXRvcikKI2luc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpCmxpYnJhcnkobHVicmlkYXRlKQojaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpCmxpYnJhcnkocGx5cikKI2luc3RhbGwucGFja2FnZXMoIk1hdHJpeCIpCmxpYnJhcnkoTWF0cml4KQojaW5zdGFsbC5wYWNrYWdlcygiYXJ1bGVzIikKbGlicmFyeShhcnVsZXMpCiNpbnN0YWxsLnBhY2thZ2VzKCJhcnVsZXNWaXoiKQpsaWJyYXJ5KGFydWxlc1ZpeikKI2luc3RhbGwucGFja2FnZXMoImRhdGFzZXRzIikKbGlicmFyeShkYXRhc2V0cykKb3B0aW9ucyhyZXBvcyA9IGMoQ1JBTiA9ICJ3d3cueHF1YXJ0ei5vcmciKSkKYGBgCgojIDxzcGFuIHN0eWxlID0gImNvbG9yOiByZWQ7Ij5JbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPgpgYGB7cn0KZGYgPC0gcmVhZC5jc3YoImFiYXJyb3Rlcy5jc3YiKQpgYGAKCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHJlZDsiPkV4cGxvcmFjacOzbiBkZSBkYXRvczwvc3Bhbj4KYGBge3J9CiMgUGFyYSBleHBsb3JhciB2YXJpYWJsZXMgbnVtw6lyaWNhcwpzdW1tYXJ5KGRmKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0KIyBQYXJhIGV4cGxvcmFyIHZhcmlhYmxlcyBkZSB0ZXh0bwpjb3VudChkZiwgdmNDbGF2ZVRpZW5kYSwgc29ydCA9IFRSVUUpICMgU29ydCBoYWNlIHF1ZSBsYSBtw6FzIHJlcGV0aWRhIGVzdGUgYXJyaWJhLCBtZW5vcyBhYmFqbwpjb3VudChkZiwgSG9yYS5jaWVycmUsIHNvcnQgPSBUUlVFKQpjb3VudChkZiwgSG9yYS5pbmljaW8sIHNvcnQgPSBUUlVFKQpjb3VudChkZiwgR2lybywgc29ydCA9IFRSVUUpCmNvdW50KGRmLCBUaXBvLnViaWNhY2nDs24sIHNvcnQgPSBUUlVFKQpjb3VudChkZiwgRXN0YWRvLCBzb3J0ID0gVFJVRSkKY291bnQoZGYsIE5vbWJyZUNhdGVnb3JpYSwgc29ydCA9IFRSVUUpCmNvdW50KGRmLCBOb21icmVGYW1pbGlhLCBzb3J0ID0gVFJVRSkKY291bnQoZGYsIE5vbWJyZURlcGFydGFtZW50bywgc29ydCA9IFRSVUUpCmNvdW50KGRmLCBQcm9kdWN0bywgc29ydCA9IFRSVUUpCmNvdW50KGRmLCBGYWJyaWNhbnRlLCBzb3J0ID0gVFJVRSkKY291bnQoZGYsIE1hcmNhLCBzb3J0ID0gVFJVRSkKY291bnQoZGYsIEhvcmEsIHNvcnQgPSBUUlVFKQpjb3VudChkZiwgRmVjaGEsIHNvcnQgPSBUUlVFKQpjb3VudChkZiwgRGVzY0dpcm8sIHNvcnQgPSBUUlVFKQpgYGAKCgpgYGB7cn0KIyBQYXJhIHZlciBsb3MgcHJpbWVyb3MgdmFsb3JlcyB5IGVsIHRpcG8gZGUgZGF0b3MgcG9yIHZhcmlhYmxlcwp0aWJibGUoZGYpCnN0cihkZikKYGBgCgpgYGB7cn0KIyBHZW5lcmFyIHVuYSBzdWJ0YWJsYSBkZSBUaWVuZGEgeSBEZXBhcnRhbWVudG8KdGFieWwoZGYsIEVzdGFkbywgTm9tYnJlRGVwYXJ0YW1lbnRvKQp0YWJ5bChkZiwgRXN0YWRvLCBIb3JhLmNpZXJyZSkKdGFieWwoZGYsIEVzdGFkbywgSG9yYS5pbmljaW8pCmBgYApPYnNlcnZhY2lvbmVzOiAgCgoqICoqUXVpbnRhbmEgUm9vKiogY2llcnJhIGEgbGFzIDkgcG07ICoqTnVldm8gTGXDs24qKiB5ICoqSmFsaXNjbyoqIGNpZXJyYW4gYSBsYSAxMCBwbTsgeSAqKlNpbmFsb2EqKiB5ICoqQ2hpYXBhcyoqIGNpZXJyYW4gYSBsYXMgMTEgcG0uICAKKiAqKkNoaWFwYXMqKiB5ICoqU2luYWxvYSoqIGFicmVuIGEgbGFzIDcgYW07ICoqTnVldm8gTGXDs24qKiB5ICoqUXVpbnRhbmEgUm9vKiogYWJyZW4gYSBsYXMgOCBhbSB5ICoqSmFsaXNjbyoqIGFicmUgYSBsYXMgOSBhbS4gIAoqIFBMVSBjYXNpIG5vIHRpZW5lIHJlZ2lzdHJvcy4gIAoqIExhIGZlY2hhIG5vIHRpZW5lIGZvcm1hdG8gYWRlY3VhZG8uICAKKiBFbCBwcmVjaW8gdGllbmUgdmFsb3JlcyBuZWdhdGl2b3MuICAKKiBMYSBob3JhIG5vIHRpZW5lIGZvcm1hdG8gYWRlY3VhZG8uICAKCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHJlZDsiPkxpbXBpZXphIGRlIGRhdG9zPC9zcGFuPgoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHJlZDsiPlTDqWNuaWNhIDEuIFJlbW92ZXIgdmFsb3JlcyBpcnJlbGV2YW50ZXM8L3NwYW4+CmBgYHtyfQojIEVsaW1pbmFyIGNvbHVtbmFzCmRmMSA8LSAgZGYKZGYxIDwtIHN1YnNldChkZjEsIHNlbGVjdCA9IC1jKENvZGlnby5CYXJyYXMsIFBMVSkpCgojIEVsaW1pbmFyIHJlbmdsb25lcwpkZjIgPC0gZGYxCmRmMiA8LSBkZjJbZGYyJFByZWNpbyA+IDAsIF0Kc3VtbWFyeShkZjIkUHJlY2lvKQpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSAyLiBFbGltaW5hciB2YWxvcmVzIHJlcGV0aWRvczwvc3Bhbj4KYGBge3J9CiMgwr9DdcOhbnRvcyByZW5nbG9uZXMgZHVwbGljYWRvcyB0ZW5lbW9zPwpkZjJbZHVwbGljYXRlZChkZjIpLF0Kc3VtKGR1cGxpY2F0ZWQoZGYyKSkKCiMgRWxpbWluYXIgcmVuZmxvbmVzIGR1cGxpY2Fkb3MKZGYzIDwtIGRmMgpkZjMgPC0gZGlzdGluY3QoZGYzKSAjIENoZWNhciBxdWUgdGVuZ2EgNSByZW5nbG9uZXMgbWVub3MgcXVlIGRmMgpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSAzLiBDb3JyZWdpciBlcnJvcmVzIHRpcG9ncsOhZmljb3MgeSBzaW1pbGFyZXM8L3NwYW4+CmBgYHtyfQojIFByZWNpb3MgZW4gYWJzb2x1dG8gKG5vIHNlIHZhIGEgdXRpbGl6YXIpCmRmNCA8LSBkZjEKZGY0JFByZWNpbyA8LSBhYnMoZGY0JFByZWNpbykKc3VtbWFyeShkZjQkUHJlY2lvKQoKIyBDYW50aWRhZGVzIGVuICAobm8gc2UgdmEgYSB1dGlsaXphcikKZGY1IDwtIGRmMQpkZjUkVW5pZGFkZXMgPC0gY2VpbGluZyhkZjUkVW5pZGFkZXMpCnN1bW1hcnkoZGY1JFVuaWRhZGVzKQpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSA0LiBDb252ZXJ0aXIgdGlwb3MgZGUgZGF0b3M8L3NwYW4+CmBgYHtyfQojIENvbnZlcnRpciBkZSBjaGFyYWN0ZXIgYSBmZWNoYQpkZjYgPC0gZGYzCmRmNiRGZWNoYSA8LSBhcy5EYXRlKGRmNiRGZWNoYSwgZm9ybWF0ID0gIiVkLyVtLyVZIikKCiMgQ29udmVydGlyIGRlIGNoYXJhY3RlciBhIGhvcmEKZGY3IDwtIGRmNgpkZjckSG9yYSA8LSBzdHJwdGltZShkZjckSG9yYSwgZm9ybWF0ID0gIiVIOiVNOiVTIikKZGY3JEhvcmEgPC0gZm9ybWF0KGRmNyRIb3JhLCAiJUgiKQpkZjckSG9yYSA8LSBhcy5pbnRlZ2VyKGRmNyRIb3JhKQoKc3RyKGRmNykKdGFieWwoZGY3LCBFc3RhZG8sIEhvcmEpCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHJlZDsiPlTDqWNuaWNhIDUuIFZhbG9yZXMgZmFsdGFudGVzPC9zcGFuPgpgYGB7cn0KIyDCv0N1w6FudG9zIE5BIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/CnN1bShpcy5uYShkZjcpKQpzdW0oaXMubmEoZGYpKQoKIyDCv0N1w6FudG9zIE5BIHRlbmdvIHBvciB2YXJpYWJsZT8Kc2FwcGx5KGRmLCBmdW5jdGlvbiAoeCkgc3VtKGlzLm5hKHgpKSkKCiMgQm9ycmFyIHRvZG9zIGxvcyBOQQpkZjggPC0gIGRmCmRmOCA8LSBuYS5vbWl0KGRmOCkKCiMgUmVlbXBsYXphciBsb3MgTkEgcG9yIENFUk9TIChhZmVjdGEgcmVzdWx0YWRvcyBlc3RhZMOtc3RpY29zKQpkZjkgPC0gZGYKZGY5W2lzLm5hKGRmOSldIDwtIDAKc3VtbWFyeShkZjkkUExVKQoKIyBSZWVtcGxhemFyIGxvcyBOQSBjb24gZWwgUFJPTUVESU8gKG5vIGFmZWN0YSByZXN1bHRhZG9zIGVzdGFkw61zdGljb3MpCmRmMTAgPC0gZGYKZGYxMCRQTFVbaXMubmEoZGYxMCRQTFUpXSA8LSBtZWFuKGRmMTAkUExVLCBuYS5ybSA9IFRSVUUpCnN1bW1hcnkoZGYxMCRQTFUpCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHJlZDsiPlTDqWNuaWNhIDYuIE3DqXRvZG8gRXN0YWTDrXN0aWNvPC9zcGFuPgpgYGB7ciBlY2hvPVRSVUV9CmRmMTEgPC0gZGY3CmJveHBsb3QoZGYxMSRQcmVjaW8sIGhvcml6b250YWwgPSBUUlVFKQpib3hwbG90KGRmMTEkVW5pZGFkZXMsIGhvcml6b250YWwgPSBUUlVFKQpoZWFkKGRmMTEpCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogcmVkOyI+QWdyZWdhciBDb2x1bW5hczwvc3Bhbj4KYGBge3J9CmRmMTEkRGlhX2RlX2xhX1NlbWFuYSA8LSB3ZGF5KGRmMTEkRmVjaGEpCnN1bW1hcnkoZGYxMSkKCmRmMTEkU3VidG90YWwgPC0gZGYxMSRQcmVjaW8gKiBkZjExJFVuaWRhZGVzCnN1bW1hcnkoZGYxMSkKCmRmMTEkVXRpbGlkYWQgPC0gZGYxMSRQcmVjaW8gKiBkZjExJFVsdC5Db3N0bwpzdW1tYXJ5KGRmMTEpCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogcmVkOyI+RXhwb3J0YXIgYmFzZSBkZSBkYXRvcyBsaW1waWE8L3NwYW4+CmBgYHtyfQpiZF9saW1waWEgPC0gZGYxMQp3cml0ZS5jc3YoYmRfbGltcGlhLCBmaWxlID0gImFiYXJyb3Rlc19iZF9saW1waWEuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogcmVkOyI+Q29uY2x1c2lvbmVzPC9zcGFuPgpFbCBhbsOhbGlzaXMgbGxldmFkbyBhIGNhYm8gZW4gZXN0ZSBwcm95ZWN0byBoYSByZXZlbGFkbyBjb25jbHVzaW9uZXMgY2xhdmUgc29icmUgZWwgY29uanVudG8gZGUgZGF0b3MgZGUgYWJhcnJvdGVzLiBEdXJhbnRlIGVzdGUgcHJvY2Vzbywgc2UgaWRlbnRpZmljYXJvbiB2YXJpb3MgcHJvYmxlbWFzLCBjb21vICoqdmFsb3JlcyBudWxvcyoqLCAqKmR1cGxpY2Fkb3MqKiB5ICoqZm9ybWF0b3MgaW5jb3JyZWN0b3MqKiBlbiBmZWNoYXMgeSBob3JhcywgYXPDrSBjb21vICoqdmFsb3JlcyBuZWdhdGl2b3MgZW4gbG9zIHByZWNpb3MqKi4gTWVkaWFudGUgZGl2ZXJzYXMgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGRhdG9zLCBjb21vIGxhICoqZWxpbWluYWNpw7NuIGRlIHJlZ2lzdHJvcyBpcnJlbGV2YW50ZXMqKiB5IGxhICoqY29ycmVjY2nDs24gZGUgZXJyb3JlcyB0aXBvZ3LDoWZpY29zKiosIHNlIGxvZ3LDsyBwcmVwYXJhciB1bmEgYmFzZSBkZSBkYXRvcyBtw6FzIGNvaGVyZW50ZSB5IGNvbmZpYWJsZS4gQWRlbcOhcywgc2UgbGxldsOzIGEgY2FibyB1biBhbsOhbGlzaXMgdmlzdWFsIGRlIGxvcyBkYXRvcyoqIHkgc2UgYWdyZWdhcm9uIG51ZXZhcyBjb2x1bW5hcyBwYXJhIGVucmlxdWVjZXIgbGEgaW5mb3JtYWNpw7NuLiBQb3Igw7psdGltbywgbGEgKipleHBvcnRhY2nDs24gZGUgbGEgYmFzZSBkZSBkYXRvcyBsaW1waWEqKiBnYXJhbnRpemEgc3UgdXRpbGlkYWQgcGFyYSBmdXR1cm9zIGFuw6FsaXNpcy4gRXN0ZSBwcm9jZXNvIGRlbXVlc3RyYSBsYSAqKmltcG9ydGFuY2lhIGRlIGxhIGxpbXBpZXphIHkgcHJlcGFyYWNpw7NuIGFkZWN1YWRhIGRlIGxvcyBkYXRvcyoqIHBhcmEgb2J0ZW5lciByZXN1bHRhZG9zIHByZWNpc29zIGVuIGN1YWxxdWllciBwcm95ZWN0byBkZSBhbsOhbGlzaXMu