# 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)
# file.choose()
bd <- read.csv("C:\\Users\\spacanino\\Downloads\\R\\abarrotes.csv")
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)
# 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
# ¿cuántos renglones duplicados tenemos?
sum(duplicated(bd))
## [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)
# Cantidades en enteros
bd4 <- bd3
bd4$Unidades <- ceiling(bd4$Unidades)
# Convertir de caracter a fecha
bd5 <- bd4
bd5$Fecha <- as.Date(bd5$Fecha, format ="%d/%m/%Y")
# Convertir en caracter a entero
bd6 <- bd5
bd6$Hora <- substr(bd5$Hora, start=1, stop=2)
bd6$Hora <- as.integer(bd6$Hora)
# ¿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(c)))
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## Warning in is.na(c): is.na() applied to non-(list or vector) of type 'builtin'
## vcClaveTienda DescGiro Codigo.Barras PLU
## 0 0 0 0
## 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
# Opción 1. Borrar todos los NAs de una tabla
# bd100 <- na.omit(bd)
# Opción 2. Reemplazar los NAs con CEROS
# bd101 <- bd
# bd101 [is.na(bd101)]<-0
# Opción 3. Reemplazaer los NAs con el promedio
# bd102 <- bd
# bd102$PLU[is.na(bd102$PLU)]<-mean(bd102$PLU, na.rm=TRUE)
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
# write.csv(bd6, file = "abarrotes_limpia.csv", row.names = FALSE)
# 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 a Marca
colnames(basket) <- c("Marca")
# Exportar basket
# write.csv(basket, file = "basket.csv", row.names = FALSE)
# Importar transacciones
# file.choose()
tr <- read.transactions("C:\\Users\\spacanino\\Downloads\\R\\basket.csv", format = "basket", sep = ",")
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.06s].
## 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.01s].
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 TOP10 de reglas de asociación
top10reglas <- head(reglas.asociacion, n=10, by="confidence")
# plot(top10reglas, method="graph", engine="htmlwidget")
R es sumamente util para poder limpiar altas cantidades de datos de manera eficiente y de esta manera el poder ibtener informacion sumamente valiosa para los negocios, como se demoestro en esta actividad, al utilizar R se pueden utilizar diversos comandos para poder limpiar correctamente los datos para de esta manera identificar informacion critica, en este caso el poder encontrar la informacion al respecto de que productos tienden a venderse juntos o que productos causan que se vendan otros, es informacion muy valiosa para poder crear promociones que apunten a un sector espefico de los consumidores aunque esta informacion podria complementarse mucho mas con los dias de la semana o incluo horas del dia para poder llegar a ofertas sumamente especificas para los diferentes grupos de interes con los que cuenta el negocio.