
# Instalar y cargar el paquete 'tidyverse' para manipulación de datos
# install.packages("tidyverse")
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.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── 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
# Instalar y cargar el paquete 'dplyr' para manipulación eficiente de datos
# ºinstall.packages("dplyr")
library(dplyr)
# Instalar y cargar 'lubridate' para manejo de fechas
# install.packages("lubridate")
library(lubridate)
# Instalar y cargar el paquete 'Matrix' para trabajar con matrices dispersas
# install.packages("Matrix")
library(Matrix)
##
## Attaching package: 'Matrix'
##
## The following objects are masked from 'package:tidyr':
##
## expand, pack, unpack
# Instalar y cargar el paquete 'arules' para análisis de reglas de asociación
# 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
# Instalar y cargar el paquete 'arulesViz' para visualizar reglas de asociación
# install.packages("arulesViz")
library(arulesViz)
# Instalar y cargar el paquete 'datasets' para acceder a conjuntos de datos preinstalados en R
# install.packages("datasets")
library(datasets)
# Instalar y cargar el paquete 'plyr' para facilitar operaciones de manipulación de datos
# 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
# Cargar el archivo CSV con los datos de ventas
# file.choose() puede ser usado en lugar de la ruta específica para seleccionar el archivo
bd <- read.csv("C:\\Users\\alfre\\Downloads\\abarrotes (1).csv")
# Resumen y estructura del dataset
summary(bd) # Resumen de las estadísticas descriptivas
## 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) # Estructura de los datos
## '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) # Primeras filas del dataset
## vcClaveTienda DescGiro Codigo.Barras PLU Fecha Hora
## 1 MX001 Abarrotes 7.501021e+12 NA 19/06/2020 08:16:21
## 2 MX001 Abarrotes 7.501032e+12 NA 19/06/2020 08:23:33
## 3 MX001 Abarrotes 7.501000e+12 NA 19/06/2020 08:24:33
## 4 MX001 Abarrotes 7.501031e+12 NA 19/06/2020 08:24:33
## 5 MX001 Abarrotes 7.501026e+12 NA 19/06/2020 08:26:28
## 6 MX001 Abarrotes 7.501021e+12 NA 19/06/2020 08:16:21
## Marca Fabricante
## 1 NUTRI LECHE MEXILAC
## 2 DAN UP DANONE DE MEXICO
## 3 BIMBO GRUPO BIMBO
## 4 PEPSI PEPSI-COLA MEXICANA
## 5 BLANCA NIEVES (DETERGENTE) FABRICA DE JABON LA CORONA
## 6 NUTRI LECHE MEXILAC
## Producto Precio Ult.Costo Unidades F.Ticket
## 1 Nutri Leche 1 Litro 16.0 12.31 1 1
## 2 DANUP STRAWBERRY P/BEBER 350GR NAL 14.0 14.00 1 2
## 3 Rebanadas Bimbo 2Pz 5.0 5.00 1 3
## 4 Pepsi N.R. 400Ml 8.0 8.00 1 3
## 5 Detergente Blanca Nieves 500G 19.5 15.00 1 4
## 6 Nutri Leche 1 Litro 16.0 12.31 1 1
## NombreDepartamento NombreFamilia NombreCategoria
## 1 Abarrotes Lacteos y Refrigerados Leche
## 2 Abarrotes Lacteos y Refrigerados Yogurt
## 3 Abarrotes Pan y Tortilla Pan Dulce Empaquetado
## 4 Abarrotes Bebidas Refrescos Plástico (N.R.)
## 5 Abarrotes Limpieza del Hogar Lavandería
## 6 Abarrotes Lacteos y Refrigerados Leche
## Estado Mts.2 Tipo.ubicación Giro Hora.inicio Hora.cierre
## 1 Nuevo León 60 Esquina Abarrotes 08:00 22:00
## 2 Nuevo León 60 Esquina Abarrotes 08:00 22:00
## 3 Nuevo León 60 Esquina Abarrotes 08:00 22:00
## 4 Nuevo León 60 Esquina Abarrotes 08:00 22:00
## 5 Nuevo León 60 Esquina Abarrotes 08:00 22:00
## 6 Nuevo León 60 Esquina Abarrotes 08:00 22:00
tail(bd) # Últimas filas del dataset
## vcClaveTienda DescGiro Codigo.Barras PLU Fecha Hora
## 200620 MX005 Depósito 7.62221e+12 NA 12/07/2020 01:08:25
## 200621 MX005 Depósito 7.62221e+12 NA 23/10/2020 22:17:37
## 200622 MX005 Depósito 7.62221e+12 NA 10/10/2020 20:30:20
## 200623 MX005 Depósito 7.62221e+12 NA 10/10/2020 22:40:43
## 200624 MX005 Depósito 7.62221e+12 NA 27/06/2020 22:30:19
## 200625 MX005 Depósito 7.62221e+12 NA 26/06/2020 23:43:34
## Marca Fabricante Producto Precio
## 200620 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G 9
## 200621 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G 9
## 200622 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G 9
## 200623 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G 9
## 200624 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G 9
## 200625 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G 9
## Ult.Costo Unidades F.Ticket NombreDepartamento NombreFamilia
## 200620 6.92 1 103100 Abarrotes Dulcería
## 200621 6.92 1 116598 Abarrotes Dulcería
## 200622 6.92 1 114886 Abarrotes Dulcería
## 200623 6.92 1 114955 Abarrotes Dulcería
## 200624 6.92 1 101121 Abarrotes Dulcería
## 200625 6.92 1 100879 Abarrotes Dulcería
## NombreCategoria Estado Mts.2 Tipo.ubicación Giro Hora.inicio
## 200620 Gomas de Mazcar Quintana Roo 58 Esquina Mini súper 08:00
## 200621 Gomas de Mazcar Quintana Roo 58 Esquina Mini súper 08:00
## 200622 Gomas de Mazcar Quintana Roo 58 Esquina Mini súper 08:00
## 200623 Gomas de Mazcar Quintana Roo 58 Esquina Mini súper 08:00
## 200624 Gomas de Mazcar Quintana Roo 58 Esquina Mini súper 08:00
## 200625 Gomas de Mazcar Quintana Roo 58 Esquina Mini súper 08:00
## Hora.cierre
## 200620 21:00
## 200621 21:00
## 200622 21:00
## 200623 21:00
## 200624 21:00
## 200625 21:00
# Contar las ocurrencias de categorías en diferentes columnas
# count(bd, vcClaveTienda, sort = TRUE)
# count(bd, NombreDepartamento, sort = TRUE)
# count(bd, NombreFamilia, sort = TRUE)
# count(bd, NombreCategoria, sort = TRUE)
# count(bd, Estado, sort = TRUE)
# count(bd, Mts.2, sort = TRUE)
# count(bd, Tipo.ubicación, sort = TRUE)
# count(bd, Giro, sort = TRUE)
# count(bd, Hora.inicio, sort = TRUE)
# count(bd, Hora.cierre, sort = TRUE)
# count(bd, vcClaveTienda, sort = TRUE)
# count(bd, DescGiro, sort = TRUE)
# count(bd, Codigo.Barras, sort = TRUE)
# count(bd, PLU, sort = TRUE)
# count(bd, Fecha, sort = TRUE)
# count(bd, Hora, sort = TRUE)
# count(bd, Marca, sort = TRUE)
# count(bd, Fabricante, sort = TRUE)
# count(bd, Producto, sort = TRUE)
# Crear una copia del dataset original
bd1 <- bd
# Identificar valores duplicados en el dataset
bd2 <- sum(duplicated(bd1))
bd2 <- as.data.frame(bd2)
bd2[duplicated(bd2) | duplicated(bd2, fromLast = TRUE), ]
## integer(0)
# Eliminar filas duplicadas
bd3 <- bd1[!duplicated(bd1), ]
# Modificar la columna 'Unidades' y redondear valores
bd4 <- bd3
bd4$Unidades <- ceiling(bd4$Unidades)
# Cambiar formato de la columna 'Fecha'
bd5 <- bd4
bd5$Fecha <- as.Date(bd5$Fecha, format = "%d/%m/%Y")
# Extraer la hora de la columna 'Hora'
bd6 <- bd5
bd6$Hora <- substr(bd6$Hora, start = 1, stop = 2)
bd6$Hora <- as.integer(bd6$Hora)
# Verificar valores faltantes en el dataset
sum(is.na(bd6)) # Total de NA en bd6
## [1] 199183
sum(is.na(bd)) # Total de NA en bd
## [1] 199188
sapply(bd, function(x) sum(is.na(x))) # NA por columna
## 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
# Crear boxplots para las columnas 'Precio' y 'Unidades'
boxplot(bd6$Precio, horizontal = TRUE)

boxplot(bd6$Unidades, horizontal = TRUE)

# Crear una nueva columna 'Dia_Semana' con el día de la semana
bd6$Dia_Semana <- wday(bd6$Fecha)
# Calcular el subtotal por venta
bd6$Subtotal <- bd6$Precio * bd6$Unidades
# Guardar el dataset modificado en un nuevo archivo CSV
# file.choose()
write.csv(bd6, file = "C:\\Users\\alfre\\Downloads\\basket.csv", row.names = FALSE)
# Ordenar los datos por la columna 'F.Ticket' y agrupar por 'F.Ticket'
bd7 <- bd6
bd7 <- bd7[order(bd7$F.Ticket), ]
# Crear un dataset con las marcas por ticket de compra
basket <- bd7 %>%
group_by(F.Ticket) %>%
summarise(Marca = paste(Marca, collapse = ", "))
basket$F.Ticket <- NULL # Eliminar la columna 'F.Ticket'
# Guardar el dataset 'basket' en un archivo CSV
write.csv(basket, file = "C:\\Users\\alfre\\Downloads\\basket.csv", row.names = FALSE)
# Leer el archivo CSV con el formato 'basket' para análisis de reglas de asociación
tr <- read.transactions("C:\\Users\\alfre\\Downloads\\basket.csv", format = "basket", sep = ",")
# Generar las reglas de asociación usando el algoritmo apriori
reglas.asociacion <- apriori(tr, parameter = list(supp = 0.0005, conf = 0.1, maxlen = 10))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.1 0.1 1 none FALSE TRUE 5 5e-04 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: 0
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[2 item(s), 2 transaction(s)] done [0.00s].
## sorting and recoding items ... [2 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 done [0.00s].
## writing ... [2 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
# Ordenar las reglas por confianza y seleccionar las 10 mejores
reglas.asociacion <- sort(reglas.asociacion, by = "confidence", decreasing = TRUE)
top10reglas <- head(reglas.asociacion, n = 10, by = "confidence")
# Graficar las 10 mejores reglas
# No se pudieron encontrar asosiaciones por error se añaden las imagenes
"Creo que el uso de la programación en la parte de los negocios es muy importante para crear estrategias de valor, así como para incrementar las ventas y mejorar la experiencia del cliente. Fue una clase muy importante y lo aprendido tiene mucho valor para situaciones prácticas."
## [1] "Creo que el uso de la programación en la parte de los negocios es muy importante para crear estrategias de valor, así como para incrementar las ventas y mejorar la experiencia del cliente. Fue una clase muy importante y lo aprendido tiene mucho valor para situaciones prácticas."