Identificar patrones de compra en la librería “LibroMágico” para mejorar estrategias de merchandising y recomendaciones personalizadas.
La base de datos se encuentra en el archivo ventas_libreria.csv
#Carga de librerías
library(arules)
## Cargando paquete requerido: Matrix
##
## Adjuntando el paquete: 'arules'
## The following objects are masked from 'package:base':
##
## abbreviate, write
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() ──
## ✖ tidyr::expand() masks Matrix::expand()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ tidyr::pack() masks Matrix::pack()
## ✖ dplyr::recode() masks arules::recode()
## ✖ tidyr::unpack() masks Matrix::unpack()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Paso 1: Leer el archivo CSV
datos_csv <- read_csv("ventas_libreria.csv",
col_types = cols(
ID_Transacción = col_integer(),
Productos = col_character()
))
# Paso 2: Convertir a formato transactions
transacciones <- strsplit(datos_csv$Productos, "\\|")
transacciones <- as(transacciones, "transactions")
# Paso 3: Verificar estructura
summary(transacciones)
## transactions as itemMatrix in sparse format with
## 30000 rows (elements/itemsets/transactions) and
## 15 columns (items) and a density of 0.1978044
##
## most frequent items:
## Ficción_Contemporánea Fantasía J.K._Rowling
## 9271 8599 8154
## Romance Ciencia_Ficción (Other)
## 7546 7388 48054
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5
## 5813 6709 6006 5597 5875
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 3.000 2.967 4.000 5.000
##
## includes extended item information - examples:
## labels
## 1 Autoayuda
## 2 Ciencia_Ficción
## 3 Cocina
Gráfico de frecuencias.
itemFrequencyPlot(transacciones, topN = 10,
main = "Top 10 Productos Más Vendidos",
col = "#3498DB", cex.names = 0.8)
30,000 transacciones analizadas
15 productos/categorías únicos (como se definió originalmente)
Densidad del 19.07%: Indica que aproximadamente el 20% de las posibles combinaciones producto-transacción existen
Ficción_Contemporánea (9,271 apariciones)
Fantasía (8,599)
J.K._Rowling (8,154)
Romance (7,546)
Ciencia_Ficción (7,388)
Distribución de tamaños de transacción:
19.4% compras individuales (5,813 transacciones)
22.4% compras de 2 productos (6,709)
20.0% compras de 3 productos (6,006)
18.7% compras de 4 productos (5,597)
19.6% compras de 5 productos (5,875)
Tamaño promedio: 2.97 productos por transacción (mediana = 3)
1 2 3 4 5
5813 6709 6006 5597 5875
Distribución equilibrada: No hay preferencia clara por compras pequeñas o grandes
Pico en 2 y 5 productos: Sugiere dos comportamientos distintos:
Compras rápidas (1-2 items)
Compras de abastecimiento (5 items)
reglas <- apriori(transacciones,
parameter = list(
support = 0.003, # Bajamos a ~240 transacciones
confidence = 0.10, # Subimos confianza mínima
minlen = 2,
target = "rules"
))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.1 0.1 1 none FALSE TRUE 5 0.003 2
## 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: 90
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[15 item(s), 30000 transaction(s)] done [0.01s].
## sorting and recoding items ... [15 item(s)] done [0.00s].
## creating transaction tree ... done [0.01s].
## checking subsets of size 1 2 3 4 5 done [0.00s].
## writing ... [1233 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
# Filtrado más inteligente
reglas_filtradas <- subset(reglas,
lift > 1.1 )
# Ordenar reglas por lift y mostrar las top 10
mejores_reglas <- head(sort(reglas_filtradas, by = "lift", decreasing = TRUE), 10)
inspect(mejores_reglas)
## lhs rhs support confidence
## [1] {Autoayuda, Negocios} => {Viajes} 0.01210000 0.2835937
## [2] {Negocios, Viajes} => {Autoayuda} 0.01210000 0.5576037
## [3] {Autoayuda, Viajes} => {Negocios} 0.01210000 0.4389359
## [4] {Viajes} => {Autoayuda} 0.02756667 0.2901754
## [5] {Autoayuda} => {Viajes} 0.02756667 0.1328087
## [6] {Viajes} => {Negocios} 0.02170000 0.2284211
## [7] {Negocios} => {Viajes} 0.02170000 0.1251201
## [8] {Negocios} => {Autoayuda} 0.04266667 0.2460119
## [9] {Autoayuda} => {Negocios} 0.04266667 0.2055564
## [10] {Stephen_King} => {Ciencia_Ficción} 0.05936667 0.2729502
## coverage lift count
## [1] 0.04266667 2.985197 363
## [2] 0.02170000 2.686384 363
## [3] 0.02756667 2.530862 363
## [4] 0.09500000 1.397987 827
## [5] 0.20756667 1.397987 827
## [6] 0.09500000 1.317054 651
## [7] 0.17343333 1.317054 651
## [8] 0.17343333 1.185219 1280
## [9] 0.20756667 1.185219 1280
## [10] 0.21750000 1.108352 1781
# Resumen de calidad
summary(quality(mejores_reglas))
## support confidence coverage lift
## Min. :0.01210 Min. :0.1251 Min. :0.02170 Min. :1.108
## 1st Qu.:0.01450 1st Qu.:0.2113 1st Qu.:0.05575 1st Qu.:1.218
## Median :0.02463 Median :0.2595 Median :0.13422 Median :1.358
## Mean :0.02795 Mean :0.2781 Mean :0.12614 Mean :1.711
## 3rd Qu.:0.03889 3rd Qu.:0.2885 3rd Qu.:0.19903 3rd Qu.:2.248
## Max. :0.05937 Max. :0.5576 Max. :0.21750 Max. :2.985
## count
## Min. : 363.0
## 1st Qu.: 435.0
## Median : 739.0
## Mean : 838.6
## 3rd Qu.:1166.8
## Max. :1781.0
{Autoayuda, Negocios} ⇒ {Viajes}
Lift: 2.99
Confianza: 28.4%
Interpretación: Quienes compran Autoayuda y Negocios tienen 3x más probabilidad de comprar Viajes.
Acción: Crear paquete “Desarrollo Profesional + Descanso”
{Negocios, Viajes} ⇒ {Autoayuda}
Lift: 2.69
Confianza: 55.8%
Interpretación: Más de la mitad de quienes compran Negocios y Viajes llevan Autoayuda.
Acción: Exhibición conjunta en sección de negocios
{Autoayuda} ⇨ {Negocios} (Lift: 1.19)
{Stephen_King} ⇨ {Ciencia_Ficción} (Lift: 1.11)
Baja confianza en reglas potenciales (mayoría <30%)
Alto lift pero bajo soporte (0.012 = solo 363 transacciones)
Combinación | Estrategia | KPI a Medir |
---|---|---|
Autoayuda+Negocios+Viajes | Paquete premium con 15% descuento | Ticket promedio |
Stephen_King+Ciencia_Ficción | Exposición “Clásicos del Género” | Ventas cruzadas |
Ficción Contemporánea y Romance: Crear club de lectura con descuentos progresivos
J.K._Rowling: Promoción “Completa tu colección” con merchandising