Instalar paquetes y llamar librerías

#install.packages("tidyverse")
library(tidyverse)
#install.packages("dplyr")
library(dplyr)
#install.packages("lubridate")
library(lubridate)
#install.packages("Matrix")
library(Matrix)
#install.packages("arules")
library(arules)
#install.packages("arulesViz")
library(arulesViz)
#install.packages("datasets")
library(datasets)
#install.packages("plyr")
library(plyr)

Importar la base de datos

# file.choose()
bd<- read.csv("/Users/paulinaportilla/Library/Mobile Documents/com~apple~CloudDocs/Documents/BOOTCAMP/abarrotes.csv")

Entender la base de datos

summary(bd)
##  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  
##                                       
##                                       
##                                       
## 
str(bd)
## '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(bd, n=10)
##    vcClaveTienda  DescGiro Codigo.Barras PLU      Fecha     Hora
## 1          MX001 Abarrotes  7.501021e+12  NA 19/06/2020 08:16:21
## 2          MX001 Abarrotes  7.501032e+12  NA 19/06/2020 08:23:33
## 3          MX001 Abarrotes  7.501000e+12  NA 19/06/2020 08:24:33
## 4          MX001 Abarrotes  7.501031e+12  NA 19/06/2020 08:24:33
## 5          MX001 Abarrotes  7.501026e+12  NA 19/06/2020 08:26:28
## 6          MX001 Abarrotes  7.501021e+12  NA 19/06/2020 08:16:21
## 7          MX001 Abarrotes  7.501032e+12  NA 19/06/2020 08:23:33
## 8          MX001 Abarrotes  7.501000e+12  NA 19/06/2020 08:24:33
## 9          MX001 Abarrotes  7.501031e+12  NA 19/06/2020 08:24:33
## 10         MX001 Abarrotes  7.501026e+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                 NUTRI LECHE                    MEXILAC
## 7                      DAN UP           DANONE DE MEXICO
## 8                       BIMBO                GRUPO BIMBO
## 9                       PEPSI        PEPSI-COLA MEXICANA
## 10 BLANCA NIEVES (DETERGENTE) FABRICA DE JABON LA CORONA
##                              Producto Precio Ult.Costo Unidades F.Ticket
## 1                 Nutri Leche 1 Litro   16.0     12.31        1        1
## 2  DANUP STRAWBERRY P/BEBER 350GR NAL   14.0     14.00        1        2
## 3                 Rebanadas Bimbo 2Pz    5.0      5.00        1        3
## 4                    Pepsi N.R. 400Ml    8.0      8.00        1        3
## 5       Detergente Blanca Nieves 500G   19.5     15.00        1        4
## 6                 Nutri Leche 1 Litro   16.0     12.31        1        1
## 7  DANUP STRAWBERRY P/BEBER 350GR NAL   14.0     14.00        1        2
## 8                 Rebanadas Bimbo 2Pz    5.0      5.00        1        3
## 9                    Pepsi N.R. 400Ml    8.0      8.00        1        3
## 10      Detergente Blanca Nieves 500G   19.5     15.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 Lacteos y Refrigerados                     Leche
## 7           Abarrotes Lacteos y Refrigerados                    Yogurt
## 8           Abarrotes         Pan y Tortilla     Pan Dulce Empaquetado
## 9           Abarrotes                Bebidas Refrescos Plástico (N.R.)
## 10          Abarrotes     Limpieza del Hogar                Lavandería
##        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
## 8  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 9  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 10 Nuevo León    60        Esquina Abarrotes       08:00       22:00
tail(bd,n=10)
##        vcClaveTienda DescGiro Codigo.Barras PLU      Fecha     Hora
## 200616         MX005 Depósito   7.62221e+12  NA 07/08/2020 19:30:13
## 200617         MX005 Depósito   7.62221e+12  NA 25/07/2020 18:42:24
## 200618         MX005 Depósito   7.62221e+12  NA 18/07/2020 22:45:58
## 200619         MX005 Depósito   7.62221e+12  NA 12/07/2020 00:36:34
## 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
## 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
## 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
## 200616      6.92        1   106411          Abarrotes      Dulcería
## 200617      6.92        1   104693          Abarrotes      Dulcería
## 200618      6.92        1   103856          Abarrotes      Dulcería
## 200619      6.92        1   103087          Abarrotes      Dulcería
## 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
## 200616 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200617 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200618 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200619 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 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
## 200616       21:00
## 200617       21:00
## 200618       21:00
## 200619       21:00
## 200620       21:00
## 200621       21:00
## 200622       21:00
## 200623       21:00
## 200624       21:00
## 200625       21:00
#dplyr::count(bd,vcClaveTienda, sort = TRUE)
#dplyr::count(bd,DescGiro, sort = TRUE)
#dplyr::count(bd,Fecha, sort = TRUE)
#dplyr::count(bd,Hora, sort = TRUE)
#dplyr::count(bd,Marca, sort = TRUE)
#dplyr::count(bd,Fabricante, sort = TRUE)
#dplyr::count(bd,Producto, sort = TRUE)
#dplyr::count(bd,NombreDepartamento, sort = TRUE)
#dplyr::count(bd,NombreFamilia, sort = TRUE)
#dplyr::count(bd,NombreCategoria, sort = TRUE)
#dplyr::count(bd,Estado, sort = TRUE)#dplyr::count(bd,Tipo.ubicación, sort = TRUE)
#dplyr::count(bd,Giro, sort = TRUE)
#dplyr::count(bd,Hora.inicio, sort = TRUE)
#dplyr::count(bd,Hora.cierre, sort = TRUE)

Limpiar la base de datos

Técnica 1. Remover valores irrelevantes

# Eliminar columnas
bd1 <- bd 
bd1 <- subset (bd1, select = -c(PLU, Codigo.Barras))

#Eliminar renglones
bd2 <- bd1
bd2 <- bd2 [bd2$Precio > 0, ]
summary(bd1$Precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -147.00   11.00   16.00   19.42   25.00 1000.00
summary(bd2$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 duplicados

# ¿Cuantos renglones duplicados tenemos?
sum (duplicated (bd2))
## [1] 5
# ¿Cuáles son los renglones duplicados?
bd2[duplicated (bd2),]
##    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
# Eliminar renglones duplicados
bd3 <- bd2
bd3 <- distinct (bd3)

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

# Cantidades en enteros
bd4 <- bd3
bd4$Unidades <- ceiling (bd4$Unidades)

Técnica 4. Convertir tipos de datos

# Convertir de caracter a fecha
bd5 <- bd4
bd5$Fecha <- as.Date(bd5$Fecha, format = "%d/%m/%Y")

# Convertir de caracter a entero
bd6 <- bd5
bd6$Hora <- substr(bd6$Hora, star=1, stop=2)
bd6$Hora <- as.integer(bd6$Hora)

Técnica 5. Reemplazar valores faltantes

# ¿Cuántos NAs tengo en la base de datos?

sum(is.na(bd6))
## [1] 0
sum(is.na(bd))
## [1] 199188
# ¿Cuántos NAs tengo por variable?
sapply(bd, 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
# Opcion 1. Borrar todos los NAs de una tabla
#bd100 <- na.omit(bd)

# Opcion 2.Reemplazar los NAs con CEROS
#bd101 <- bd
#bd101[is.na(bd101)] <- 0

# Opcion 3.Reemplazar los NAs con el PROMEDIO
# bd102<- bd
# bd102$PLU[is.na(bd102$PLU)] <-mean(bd102$PLU, na.rm=TRUE)

Técnica 6. Correcciones por métodos estadísticos

boxplot (bd6$Precio, horizontal = TRUE)

boxplot(bd6$Unidades, horizontal = TRUE)

Agregar columnas

# Agregar día de la semana
bd6$Dia_Semana <- wday (bd6$Fecha)

# Agregar el subtotal de la venta
bd6$Subtotal <- bd6$Precio * bd6$Unidades

Exportar la base de datos

#write.csv(bd6, file="abarrotes_limpia.csv", row.names = FALSE)

Generar Market Base Analysis

# Ordenar de menor a mayor la columna TICKET
bd7 <- bd6
bd7 <- bd7[order(bd7$F.Ticket),]

# Generar el canasto
basket <- ddply(bd7, c("F.Ticket"), function(bd7)paste(bd7$Marca, collapse = ","))

# Eliminar la columna TICKET
basket$F.Ticket <- NULL

# Renombrar nombre de columna Marca
colnames (basket) <- c("Marca")

# Exportar basket
write.csv(basket, file="basket.csv", row.names = FALSE)

# Importar transacciones
#file.choose()
tr <- read.transactions("/Users/paulinaportilla/Library/Mobile Documents/com~apple~CloudDocs/Documents/BOOTCAMP/basket.csv", sep = ",")

# Generar reglas de asociación 
reglas.asociacion <- apriori(tr, parameter = list (supp=0.001, conf=0.2, maxlen=10))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.2    0.1    1 none FALSE            TRUE       5   0.001      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 115 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[28710 item(s), 115031 transaction(s)] done [0.02s].
## sorting and recoding items ... [119 item(s)] done [0.00s].
## creating transaction tree ... done [0.01s].
## checking subsets of size 1 done [0.00s].
## writing ... [0 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
summary(reglas.asociacion)
## set of 0 rules
inspect(reglas.asociacion)

# Ordenar reglas de asociación 
reglas.asociacion <- sort(reglas.asociacion, by="confidence", decreasing = TRUE)

# Graficar TOP 10 de reglas de asociación
top10reglas <- head(reglas.asociacion, n=10, by="confidence")
#plot(top10reglas, method="graph", engine="htmlwidget")

Resultados finales

Conclusiones

En conclusión, creo que este programa en R fue de mucha ayuda para analizar todos los datos que tenemos de los hábitos y patrones de compra entre los consumidores de abarrotes. Una persona o incluso un equipo tardaría un tiempo excesivo para poder analizar los miles de datos que se tienen de manera eficiente y estructurada. Con el programa se pudo limpiar, transformar y utilizar herramientas de análisis que nos permiten depurar la información innecesaria y enfocarnos en la más importante en un tiempo relativamente rápido.

En el caso específico de marketing, este análisis nos daría la capacidad de descubrir cuáles productos suelen comprarse juntos, lo que nos ayudaría a crear promociones más efectivas, optimizar el acomodo de productos en las tiendas y en general, diseñar campañas de marketing más personalizadas y que sean realistas a lo que los consumidores consumen.

Los resultados que nos dió el programa de Market Basket Analysis son muy ricos. El gráfico nos reveló asociaciones interesantes como la fuerte relación entre marcas de limpieza como Salvo y Fabuloso o la combinación frecuente de productos de Coca Cola con otras variantes como Zeroy Light. Además, también encontramos relaciones con los refrescos de sabores con los de Coca Cola, como la de Fanta y Sprite, lo que muestra cómo los consumidores tienden a comprar varias bebidas de la misma marca. En productos de limpieza, vimos la asociación entre Pinoly Cloralex, y en la parte de alimentos, la relación entre Bimbo con marcas como Hellman’s, Fud y Blue House. Finalmente, encontramos que Reyma y Convermex, marcas relacionadas con productos desechables, también se compran juntas, probablemente para eventos o reuniones.

Esto nos da una imagen mucho más clara sobre lo que pasa realmente dentro de las tiendas a que si lo viéramos en un Excel, ya que aquí logramos ver conexiones, patrones y relaciones, que en una tabla con miles de datos serían muy fáciles perderse. En resumen, este programa fue de mucha ayuda para comprender mejor los hábitos de consumo en las tiendas de abarrotes y nos da la oportunidad de diseñar estrategias basadas en datos reales.

LS0tCnRpdGxlOiAiTWFya2V0IEJhc2tldCBBbmFseXNpcyIKYXV0aG9yOiAiUGF1bGluYSBQb3J0aWxsYSIKZGF0ZTogIjIwMjUtMDMtMTkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogInlldGkiCi0tLQohW10oaHR0cHM6Ly9tZWRpYTIuZ2lwaHkuY29tL21lZGlhL2wwSGxORXlMc242V0ZCdjVDL2dpcGh5LmdpZj9jaWQ9NmMwOWI5NTJkcDk4bGhuY3ltdWRscHBrOGxma212b20yYjVnbml2NmlqZXM2NzU4JmVwPXYxX2ludGVybmFsX2dpZl9ieV9pZCZyaWQ9Z2lwaHkuZ2lmJmN0PWcpCgojIEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCmxpYnJhcnkodGlkeXZlcnNlKQojaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQpsaWJyYXJ5KGRwbHlyKQojaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikKbGlicmFyeShsdWJyaWRhdGUpCiNpbnN0YWxsLnBhY2thZ2VzKCJNYXRyaXgiKQpsaWJyYXJ5KE1hdHJpeCkKI2luc3RhbGwucGFja2FnZXMoImFydWxlcyIpCmxpYnJhcnkoYXJ1bGVzKQojaW5zdGFsbC5wYWNrYWdlcygiYXJ1bGVzVml6IikKbGlicmFyeShhcnVsZXNWaXopCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhc2V0cyIpCmxpYnJhcnkoZGF0YXNldHMpCiNpbnN0YWxsLnBhY2thZ2VzKCJwbHlyIikKbGlicmFyeShwbHlyKQpgYGAKCiMgSW1wb3J0YXIgbGEgYmFzZSBkZSBkYXRvcwoKYGBge3J9CiMgZmlsZS5jaG9vc2UoKQpiZDwtIHJlYWQuY3N2KCIvVXNlcnMvcGF1bGluYXBvcnRpbGxhL0xpYnJhcnkvTW9iaWxlIERvY3VtZW50cy9jb21+YXBwbGV+Q2xvdWREb2NzL0RvY3VtZW50cy9CT09UQ0FNUC9hYmFycm90ZXMuY3N2IikKYGBgCgoKIyBFbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zCmBgYHtyfQpzdW1tYXJ5KGJkKQpzdHIoYmQpCmhlYWQoYmQsIG49MTApCnRhaWwoYmQsbj0xMCkKI2RwbHlyOjpjb3VudChiZCx2Y0NsYXZlVGllbmRhLCBzb3J0ID0gVFJVRSkKI2RwbHlyOjpjb3VudChiZCxEZXNjR2lybywgc29ydCA9IFRSVUUpCiNkcGx5cjo6Y291bnQoYmQsRmVjaGEsIHNvcnQgPSBUUlVFKQojZHBseXI6OmNvdW50KGJkLEhvcmEsIHNvcnQgPSBUUlVFKQojZHBseXI6OmNvdW50KGJkLE1hcmNhLCBzb3J0ID0gVFJVRSkKI2RwbHlyOjpjb3VudChiZCxGYWJyaWNhbnRlLCBzb3J0ID0gVFJVRSkKI2RwbHlyOjpjb3VudChiZCxQcm9kdWN0bywgc29ydCA9IFRSVUUpCiNkcGx5cjo6Y291bnQoYmQsTm9tYnJlRGVwYXJ0YW1lbnRvLCBzb3J0ID0gVFJVRSkKI2RwbHlyOjpjb3VudChiZCxOb21icmVGYW1pbGlhLCBzb3J0ID0gVFJVRSkKI2RwbHlyOjpjb3VudChiZCxOb21icmVDYXRlZ29yaWEsIHNvcnQgPSBUUlVFKQojZHBseXI6OmNvdW50KGJkLEVzdGFkbywgc29ydCA9IFRSVUUpI2RwbHlyOjpjb3VudChiZCxUaXBvLnViaWNhY2nDs24sIHNvcnQgPSBUUlVFKQojZHBseXI6OmNvdW50KGJkLEdpcm8sIHNvcnQgPSBUUlVFKQojZHBseXI6OmNvdW50KGJkLEhvcmEuaW5pY2lvLCBzb3J0ID0gVFJVRSkKI2RwbHlyOjpjb3VudChiZCxIb3JhLmNpZXJyZSwgc29ydCA9IFRSVUUpCmBgYAoKIyBMaW1waWFyIGxhIGJhc2UgZGUgZGF0b3MKCiMjIFTDqWNuaWNhIDEuIFJlbW92ZXIgdmFsb3JlcyBpcnJlbGV2YW50ZXMKYGBge3J9CiMgRWxpbWluYXIgY29sdW1uYXMKYmQxIDwtIGJkIApiZDEgPC0gc3Vic2V0IChiZDEsIHNlbGVjdCA9IC1jKFBMVSwgQ29kaWdvLkJhcnJhcykpCgojRWxpbWluYXIgcmVuZ2xvbmVzCmJkMiA8LSBiZDEKYmQyIDwtIGJkMiBbYmQyJFByZWNpbyA+IDAsIF0Kc3VtbWFyeShiZDEkUHJlY2lvKQpzdW1tYXJ5KGJkMiRQcmVjaW8pCmBgYAoKIyMgVMOpY25pY2EgMi4gUmVtb3ZlciB2YWxvcmVzIGR1cGxpY2Fkb3MKCmBgYHtyfQojIMK/Q3VhbnRvcyByZW5nbG9uZXMgZHVwbGljYWRvcyB0ZW5lbW9zPwpzdW0gKGR1cGxpY2F0ZWQgKGJkMikpCgojIMK/Q3XDoWxlcyBzb24gbG9zIHJlbmdsb25lcyBkdXBsaWNhZG9zPwpiZDJbZHVwbGljYXRlZCAoYmQyKSxdCgojIEVsaW1pbmFyIHJlbmdsb25lcyBkdXBsaWNhZG9zCmJkMyA8LSBiZDIKYmQzIDwtIGRpc3RpbmN0IChiZDMpCmBgYAoKIyMgVMOpY25pY2EgMy4gRWxpbWluYXIgZXJyb3JlcyB0aXBvZ3LDoWZpY29zIHkgc2ltaWxhcmVzCgpgYGB7cn0KIyBDYW50aWRhZGVzIGVuIGVudGVyb3MKYmQ0IDwtIGJkMwpiZDQkVW5pZGFkZXMgPC0gY2VpbGluZyAoYmQ0JFVuaWRhZGVzKQpgYGAKCiMjIFTDqWNuaWNhIDQuIENvbnZlcnRpciB0aXBvcyBkZSBkYXRvcwpgYGB7cn0KIyBDb252ZXJ0aXIgZGUgY2FyYWN0ZXIgYSBmZWNoYQpiZDUgPC0gYmQ0CmJkNSRGZWNoYSA8LSBhcy5EYXRlKGJkNSRGZWNoYSwgZm9ybWF0ID0gIiVkLyVtLyVZIikKCiMgQ29udmVydGlyIGRlIGNhcmFjdGVyIGEgZW50ZXJvCmJkNiA8LSBiZDUKYmQ2JEhvcmEgPC0gc3Vic3RyKGJkNiRIb3JhLCBzdGFyPTEsIHN0b3A9MikKYmQ2JEhvcmEgPC0gYXMuaW50ZWdlcihiZDYkSG9yYSkKCmBgYAoKIyMgVMOpY25pY2EgNS4gUmVlbXBsYXphciB2YWxvcmVzIGZhbHRhbnRlcwpgYGB7cn0KIyDCv0N1w6FudG9zIE5BcyB0ZW5nbyBlbiBsYSBiYXNlIGRlIGRhdG9zPwoKc3VtKGlzLm5hKGJkNikpCnN1bShpcy5uYShiZCkpCgojIMK/Q3XDoW50b3MgTkFzIHRlbmdvIHBvciB2YXJpYWJsZT8Kc2FwcGx5KGJkLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQoKIyBPcGNpb24gMS4gQm9ycmFyIHRvZG9zIGxvcyBOQXMgZGUgdW5hIHRhYmxhCiNiZDEwMCA8LSBuYS5vbWl0KGJkKQoKIyBPcGNpb24gMi5SZWVtcGxhemFyIGxvcyBOQXMgY29uIENFUk9TCiNiZDEwMSA8LSBiZAojYmQxMDFbaXMubmEoYmQxMDEpXSA8LSAwCgojIE9wY2lvbiAzLlJlZW1wbGF6YXIgbG9zIE5BcyBjb24gZWwgUFJPTUVESU8KIyBiZDEwMjwtIGJkCiMgYmQxMDIkUExVW2lzLm5hKGJkMTAyJFBMVSldIDwtbWVhbihiZDEwMiRQTFUsIG5hLnJtPVRSVUUpCgpgYGAKCgojIyBUw6ljbmljYSA2LiBDb3JyZWNjaW9uZXMgcG9yIG3DqXRvZG9zIGVzdGFkw61zdGljb3MKYGBge3J9CmJveHBsb3QgKGJkNiRQcmVjaW8sIGhvcml6b250YWwgPSBUUlVFKQpib3hwbG90KGJkNiRVbmlkYWRlcywgaG9yaXpvbnRhbCA9IFRSVUUpCmBgYAoKIyBBZ3JlZ2FyIGNvbHVtbmFzCmBgYHtyfQojIEFncmVnYXIgZMOtYSBkZSBsYSBzZW1hbmEKYmQ2JERpYV9TZW1hbmEgPC0gd2RheSAoYmQ2JEZlY2hhKQoKIyBBZ3JlZ2FyIGVsIHN1YnRvdGFsIGRlIGxhIHZlbnRhCmJkNiRTdWJ0b3RhbCA8LSBiZDYkUHJlY2lvICogYmQ2JFVuaWRhZGVzCmBgYAoKIyBFeHBvcnRhciBsYSBiYXNlIGRlIGRhdG9zCmBgYHtyfQojd3JpdGUuY3N2KGJkNiwgZmlsZT0iYWJhcnJvdGVzX2xpbXBpYS5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKYGBgCgojIEdlbmVyYXIgTWFya2V0IEJhc2UgQW5hbHlzaXMKYGBge3J9CiMgT3JkZW5hciBkZSBtZW5vciBhIG1heW9yIGxhIGNvbHVtbmEgVElDS0VUCmJkNyA8LSBiZDYKYmQ3IDwtIGJkN1tvcmRlcihiZDckRi5UaWNrZXQpLF0KCiMgR2VuZXJhciBlbCBjYW5hc3RvCmJhc2tldCA8LSBkZHBseShiZDcsIGMoIkYuVGlja2V0IiksIGZ1bmN0aW9uKGJkNylwYXN0ZShiZDckTWFyY2EsIGNvbGxhcHNlID0gIiwiKSkKCiMgRWxpbWluYXIgbGEgY29sdW1uYSBUSUNLRVQKYmFza2V0JEYuVGlja2V0IDwtIE5VTEwKCiMgUmVub21icmFyIG5vbWJyZSBkZSBjb2x1bW5hIE1hcmNhCmNvbG5hbWVzIChiYXNrZXQpIDwtIGMoIk1hcmNhIikKCiMgRXhwb3J0YXIgYmFza2V0CndyaXRlLmNzdihiYXNrZXQsIGZpbGU9ImJhc2tldC5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKCiMgSW1wb3J0YXIgdHJhbnNhY2Npb25lcwojZmlsZS5jaG9vc2UoKQp0ciA8LSByZWFkLnRyYW5zYWN0aW9ucygiL1VzZXJzL3BhdWxpbmFwb3J0aWxsYS9MaWJyYXJ5L01vYmlsZSBEb2N1bWVudHMvY29tfmFwcGxlfkNsb3VkRG9jcy9Eb2N1bWVudHMvQk9PVENBTVAvYmFza2V0LmNzdiIsIHNlcCA9ICIsIikKCiMgR2VuZXJhciByZWdsYXMgZGUgYXNvY2lhY2nDs24gCnJlZ2xhcy5hc29jaWFjaW9uIDwtIGFwcmlvcmkodHIsIHBhcmFtZXRlciA9IGxpc3QgKHN1cHA9MC4wMDEsIGNvbmY9MC4yLCBtYXhsZW49MTApKQpzdW1tYXJ5KHJlZ2xhcy5hc29jaWFjaW9uKQppbnNwZWN0KHJlZ2xhcy5hc29jaWFjaW9uKQoKIyBPcmRlbmFyIHJlZ2xhcyBkZSBhc29jaWFjacOzbiAKcmVnbGFzLmFzb2NpYWNpb24gPC0gc29ydChyZWdsYXMuYXNvY2lhY2lvbiwgYnk9ImNvbmZpZGVuY2UiLCBkZWNyZWFzaW5nID0gVFJVRSkKCiMgR3JhZmljYXIgVE9QIDEwIGRlIHJlZ2xhcyBkZSBhc29jaWFjacOzbgp0b3AxMHJlZ2xhcyA8LSBoZWFkKHJlZ2xhcy5hc29jaWFjaW9uLCBuPTEwLCBieT0iY29uZmlkZW5jZSIpCiNwbG90KHRvcDEwcmVnbGFzLCBtZXRob2Q9ImdyYXBoIiwgZW5naW5lPSJodG1sd2lkZ2V0IikKCmBgYAojIFJlc3VsdGFkb3MgZmluYWxlcwoKIVtdKC9Vc2Vycy9wYXVsaW5hcG9ydGlsbGEvTGlicmFyeS9Nb2JpbGUgRG9jdW1lbnRzL2NvbX5hcHBsZX5DbG91ZERvY3MvRG9jdW1lbnRzL0JPT1RDQU1QL0ZPVE8xLnBuZykKIVtdKC9Vc2Vycy9wYXVsaW5hcG9ydGlsbGEvTGlicmFyeS9Nb2JpbGUgRG9jdW1lbnRzL2NvbX5hcHBsZX5DbG91ZERvY3MvRG9jdW1lbnRzL0JPT1RDQU1QL0ZPVE8yLnBuZykKCgojIENvbmNsdXNpb25lcwoKRW4gY29uY2x1c2nDs24sIGNyZW8gcXVlIGVzdGUgcHJvZ3JhbWEgZW4gKipSKiogZnVlIGRlIG11Y2hhIGF5dWRhIHBhcmEgYW5hbGl6YXIgdG9kb3MgbG9zIGRhdG9zIHF1ZSB0ZW5lbW9zIGRlIGxvcyBow6FiaXRvcyB5IHBhdHJvbmVzIGRlIGNvbXByYSBlbnRyZSBsb3MgY29uc3VtaWRvcmVzIGRlIGFiYXJyb3Rlcy4gVW5hIHBlcnNvbmEgbyBpbmNsdXNvIHVuIGVxdWlwbyB0YXJkYXLDrWEgdW4gdGllbXBvIGV4Y2VzaXZvIHBhcmEgcG9kZXIgYW5hbGl6YXIgbG9zIG1pbGVzIGRlIGRhdG9zIHF1ZSBzZSB0aWVuZW4gZGUgbWFuZXJhIGVmaWNpZW50ZSB5IGVzdHJ1Y3R1cmFkYS4gQ29uIGVsIHByb2dyYW1hIHNlIHB1ZG8gbGltcGlhciwgdHJhbnNmb3JtYXIgeSB1dGlsaXphciBoZXJyYW1pZW50YXMgZGUgYW7DoWxpc2lzIHF1ZSBub3MgcGVybWl0ZW4gZGVwdXJhciBsYSBpbmZvcm1hY2nDs24gaW5uZWNlc2FyaWEgeSBlbmZvY2Fybm9zIGVuIGxhIG3DoXMgaW1wb3J0YW50ZSBlbiB1biB0aWVtcG8gcmVsYXRpdmFtZW50ZSByw6FwaWRvLgoKRW4gZWwgY2FzbyBlc3BlY8OtZmljbyBkZSBtYXJrZXRpbmcsIGVzdGUgYW7DoWxpc2lzIG5vcyBkYXLDrWEgbGEgY2FwYWNpZGFkIGRlIGRlc2N1YnJpciBjdcOhbGVzIHByb2R1Y3RvcyBzdWVsZW4gY29tcHJhcnNlIGp1bnRvcywgbG8gcXVlIG5vcyBheXVkYXLDrWEgYSBjcmVhciBwcm9tb2Npb25lcyBtw6FzIGVmZWN0aXZhcywgb3B0aW1pemFyIGVsIGFjb21vZG8gZGUgcHJvZHVjdG9zIGVuIGxhcyB0aWVuZGFzIHkgZW4gZ2VuZXJhbCwgZGlzZcOxYXIgY2FtcGHDsWFzIGRlIG1hcmtldGluZyBtw6FzIHBlcnNvbmFsaXphZGFzIHkgcXVlIHNlYW4gcmVhbGlzdGFzIGEgbG8gcXVlIGxvcyBjb25zdW1pZG9yZXMgY29uc3VtZW4uCgpMb3MgcmVzdWx0YWRvcyBxdWUgbm9zIGRpw7MgZWwgcHJvZ3JhbWEgZGUgTWFya2V0IEJhc2tldCBBbmFseXNpcyBzb24gbXV5IHJpY29zLiBFbCBncsOhZmljbyBub3MgcmV2ZWzDsyBhc29jaWFjaW9uZXMgaW50ZXJlc2FudGVzIGNvbW8gbGEgZnVlcnRlIHJlbGFjacOzbiBlbnRyZSBtYXJjYXMgZGUgbGltcGllemEgY29tbyAqKlNhbHZvKiogeSAqKkZhYnVsb3NvKiogbyBsYSBjb21iaW5hY2nDs24gZnJlY3VlbnRlIGRlIHByb2R1Y3RvcyBkZSAqKkNvY2EgQ29sYSoqIGNvbiBvdHJhcyB2YXJpYW50ZXMgY29tbyAqKlplcm8qKnkgKipMaWdodCoqLiBBZGVtw6FzLCB0YW1iacOpbiBlbmNvbnRyYW1vcyByZWxhY2lvbmVzIGNvbiBsb3MgcmVmcmVzY29zIGRlIHNhYm9yZXMgY29uIGxvcyBkZSAqKkNvY2EgQ29sYSoqLCBjb21vIGxhIGRlICoqRmFudGEqKiB5ICoqU3ByaXRlKiosIGxvIHF1ZSBtdWVzdHJhIGPDs21vIGxvcyBjb25zdW1pZG9yZXMgdGllbmRlbiBhIGNvbXByYXIgdmFyaWFzIGJlYmlkYXMgZGUgbGEgbWlzbWEgbWFyY2EuIEVuIHByb2R1Y3RvcyBkZSBsaW1waWV6YSwgdmltb3MgbGEgYXNvY2lhY2nDs24gZW50cmUgKipQaW5vbCoqeSAqKkNsb3JhbGV4KiosIHkgZW4gbGEgcGFydGUgZGUgYWxpbWVudG9zLCBsYSByZWxhY2nDs24gZW50cmUgQmltYm8gY29uIG1hcmNhcyBjb21vIEhlbGxtYW4ncywgRnVkIHkgQmx1ZSBIb3VzZS4gRmluYWxtZW50ZSwgZW5jb250cmFtb3MgcXVlICoqUmV5bWEqKiB5ICoqQ29udmVybWV4KiosIG1hcmNhcyByZWxhY2lvbmFkYXMgY29uIHByb2R1Y3RvcyBkZXNlY2hhYmxlcywgdGFtYmnDqW4gc2UgY29tcHJhbiBqdW50YXMsIHByb2JhYmxlbWVudGUgcGFyYSBldmVudG9zIG8gcmV1bmlvbmVzLgoKRXN0byBub3MgZGEgdW5hIGltYWdlbiBtdWNobyBtw6FzIGNsYXJhIHNvYnJlIGxvIHF1ZSBwYXNhIHJlYWxtZW50ZSBkZW50cm8gZGUgbGFzIHRpZW5kYXMgYSBxdWUgc2kgbG8gdmnDqXJhbW9zIGVuIHVuICoqRXhjZWwqKiwgeWEgcXVlIGFxdcOtIGxvZ3JhbW9zIHZlciBjb25leGlvbmVzLCBwYXRyb25lcyB5IHJlbGFjaW9uZXMsIHF1ZSBlbiB1bmEgdGFibGEgY29uIG1pbGVzIGRlIGRhdG9zIHNlcsOtYW4gbXV5IGbDoWNpbGVzIHBlcmRlcnNlLiBFbiByZXN1bWVuLCBlc3RlIHByb2dyYW1hIGZ1ZSBkZSBtdWNoYSBheXVkYSBwYXJhIGNvbXByZW5kZXIgbWVqb3IgbG9zIGjDoWJpdG9zIGRlIGNvbnN1bW8gZW4gbGFzIHRpZW5kYXMgZGUgYWJhcnJvdGVzIHkgbm9zIGRhIGxhIG9wb3J0dW5pZGFkIGRlIGRpc2XDsWFyIGVzdHJhdGVnaWFzIGJhc2FkYXMgZW4gZGF0b3MgcmVhbGVzLgoKCg==