📚 Ejercicio: Reglas de Asociación en Librerías - Optimización de Recomendaciones

🎯 Objetivos del Análisis

Objetivo General

Identificar patrones de compra en la librería “LibroMágico” para mejorar estrategias de merchandising y recomendaciones personalizadas.

Objetivos Específicos

  1. Preprocesar datos de ventas para identificar categorías y autores frecuentes.
  2. Aplicar Apriori con umbrales adaptados al comportamiento de compra.
  3. Interpretar reglas para diseñar bundles estratégicos.

📊 Base de Datos (30,000 transacciones)

Estructura del Dataset

La base de datos se encuentra en el archivo ventas_libreria.csv

  • ID_Transacción: Identificador único.
  • Productos: Libros/categorías compradas (máx. 5 por transacción).
#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

🔍 Desarrollo del Análisis

1. Preprocesamiento y Exploración

# 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)

Hallazgos clave:

  • 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

Productos más populares:

  1. Ficción_Contemporánea (9,271 apariciones)

  2. Fantasía (8,599)

  3. J.K._Rowling (8,154)

  4. Romance (7,546)

  5. Ciencia_Ficción (7,388)

  • Densidad del 19.78%: Indica que aproximadamente el 20% de las posibles combinaciones producto-transacción existen en los datos.

Patrones de Compra

  • 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)

Distribución de Tamaño de Compra

   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)

2. Algoritmo Apriori (Parámetros Optimizados)

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 )

3. Interpretación Comercial

# 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

🔍 Hallazgos Clave

1. Asociaciones Más Fuertes (Lift > 2.5)

  1. {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”

  2. {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

2. Asociaciones Moderadas (Lift 1.3-2.0)

  1. {Autoayuda} ⇨ {Negocios} (Lift: 1.19)

    • Relación recíproca esperada pero menos fuerte
  2. {Stephen_King} ⇨ {Ciencia_Ficción} (Lift: 1.11)

    • Asociación autor-género presente pero no dominante

📊 Problemas Detectados

  1. Baja confianza en reglas potenciales (mayoría <30%)

  2. Alto lift pero bajo soporte (0.012 = solo 363 transacciones)

📈 Estrategias Comerciales Basadas en Hallazgos

Para Asociaciones Fuertes

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

Para Productos Populares No Asociados

  • Ficción Contemporánea y Romance: Crear club de lectura con descuentos progresivos

  • J.K._Rowling: Promoción “Completa tu colección” con merchandising