Basket Mrket

Author

Raul Marin

Published

July 25, 2026

Introducción

En el sector asegurador, entender cómo los clientes combinan sus pólizas es clave para las estrategias de venta cruzada (cross-selling). El Market Basket Analysis (Análisis de la Cesta de la Compra), apoyado en el Algoritmo Apriori, nos permite descubrir asociaciones ocultas entre productos.

¿Un cliente con un seguro de comercio tiende a contratar un seguro de contingencias? ¿El seguro de hogar arrastra al de salud? En este artículo utilizaremos el lenguaje R y las librerías arules y arulesViz para simular un ecosistema de seguros y extraer sus reglas de asociación.


1. Preparación del Entorno y Librerías

Para comenzar, necesitamos instalar y cargar el motor analítico (arules) y la herramienta de visualización (arulesViz). El siguiente bloque de código realiza esta gestión de forma automática.

# Cargar las librerías en la sesión
library(arules)
library(arulesViz)

2. Creación del Catálogo de Productos de Seguros

Definiremos un vector con 30 productos de seguros. Incluiremos desde los ramos más universales y tradicionales hasta seguros nicho o técnicos para simular un portafolio realista.

# Vector de 30 productos del sector seguros
productos_seguros <- c(
  "Seguro de Salud", "Seguro de Hogar", "Seguro de Coche", "Seguro de Vida", "Seguro de Decesos",
  "Seguro de Accidentes", "Seguro de Viaje", "Seguro de Mascotas", "Seguro de Impago de Alquiler",
  "Seguro de Embarcaciones de Recreo", "Seguro de Patinetes Eléctricos / Movilidad",
  "Seguro de Dispositivos Móviles y Tecnología", "Seguro de Defensa Jurídica Familiar",
  "Seguro de Instrumentos Musicales", "Seguro de Responsabilidad Civil (RC) General",
  "Seguro de RC Profesional (Médicos, Abogados, etc.)", "Seguro de RC de Directivos y Administradores (D&O)",
  "Seguro Multirriesgo Comercial / Comercio", "Seguro Macropyme o Pyme Industrial",
  "Seguro de Ciberriesgos y Ciberseguridad", "Seguro de Transporte de Mercancías",
  "Seguro de Crédito y Caución", "Seguro de Todo Riesgo Construcción",
  "Seguro de Pérdida de Beneficios / Interrupción de Negocio", "Seguro Agrario Combinado / Cultivos",
  "Seguro de Retirada del Carnet de Conducir", "Seguro de Cancelación de Eventos y Espectáculos",
  "Seguro de Obras de Arte y Colecciones", "Seguro de Hospitalización por Enfermedad (Subsidio)",
  "Seguro de Contingencias / Premio Hoyo en Uno (Golf)"
)

# Mostrar la cantidad de productos disponibles
length(productos_seguros)
[1] 30

3. Simulación de Transacciones (Carteras de Clientes)

El algoritmo Apriori requiere que los datos estén estructurados como transacciones (el conjunto de seguros que posee cada cliente). Generaremos una lista en R que simule 1,000 clientes, donde cada uno contratará de forma aleatoria entre 1 y 6 seguros de nuestro catálogo. Resultará entretenido ver que asociaciones se realizan.

# Asegurar la reproducibilidad del experimento
set.seed(123)

n_transacciones <- 1000
lista_transacciones <- vector("list", n_transacciones)

# Generación aleatoria de las combinaciones por cliente
for (i in 1:n_transacciones) {
  n_compras <- sample(1:6, size = 1)
  seguros_cliente <- sample(productos_seguros, size = n_compras, replace = FALSE)
  lista_transacciones[[i]] <- seguros_cliente
}

# Verificar el formato de los primeros 3 clientes
print(lista_transacciones[1:3])
[[1]]
[1] "Seguro de Instrumentos Musicales"  "Seguro de Coche"                  
[3] "Seguro de Embarcaciones de Recreo"

[[2]]
[1] "Seguro de Crédito y Caución"               
[2] "Seguro de Patinetes Eléctricos / Movilidad"

[[3]]
[1] "Seguro de Ciberriesgos y Ciberseguridad"  
[2] "Seguro de Instrumentos Musicales"         
[3] "Seguro de Crédito y Caución"              
[4] "Seguro Agrario Combinado / Cultivos"      
[5] "Seguro de Retirada del Carnet de Conducir"

4. Transformación de Datos y Ejecución de Apriori

Para que la librería arules procese la información, transformamos la lista al objeto nativo transactions. Posteriormente, ejecutamos el algoritmo apriori() configurando los umbrales mínimos de Soporte (frecuencia de la combinación) y Confianza (fiabilidad de la regla).

# Convertir lista a formato transactions
transacciones_seguros <- transactions(lista_transacciones)

# Resumen estadístico del dataset comercial
summary(transacciones_seguros)
transactions as itemMatrix in sparse format with
 1000 rows (elements/itemsets/transactions) and
 30 columns (items) and a density of 0.1156667 

most frequent items:
         Seguro de Embarcaciones de Recreo 
                                       136 
                        Seguro de Mascotas 
                                       129 
Seguro de Patinetes Eléctricos / Movilidad 
                                       129 
                         Seguro de Decesos 
                                       126 
          Seguro de Instrumentos Musicales 
                                       123 
                                   (Other) 
                                      2827 

element (itemset/transaction) length distribution:
sizes
  1   2   3   4   5   6 
162 176 164 179 166 153 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    2.00    3.00    3.47    5.00    6.00 

includes extended item information - examples:
                                           labels
1             Seguro Agrario Combinado / Cultivos
2                            Seguro de Accidentes
3 Seguro de Cancelación de Eventos y Espectáculos
# Ejecución del algoritmo Apriori
reglas <- apriori(
  transacciones_seguros, 
  parameter = list(support = 0.01, confidence = 0.15, minlen = 2)
)
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
       0.15    0.1    1 none FALSE            TRUE       5    0.01      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: 10 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[30 item(s), 1000 transaction(s)] done [0.00s].
sorting and recoding items ... [30 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 done [0.00s].
writing ... [86 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
# Ordenar e inspeccionar las 10 mejores reglas según el indicador Lift
reglas_ordenadas <- sort(reglas, by = "lift")
inspect(head(reglas_ordenadas, 10))
     lhs                                                      rhs                                                   support confidence coverage     lift count
[1]  {Seguro Multirriesgo Comercial / Comercio}            => {Seguro de Contingencias / Premio Hoyo en Uno (Golf)}   0.023  0.1885246    0.122 1.558054    23
[2]  {Seguro de Contingencias / Premio Hoyo en Uno (Golf)} => {Seguro Multirriesgo Comercial / Comercio}              0.023  0.1900826    0.121 1.558054    23
[3]  {Seguro de Hogar}                                     => {Seguro de Salud}                                       0.020  0.1666667    0.120 1.543210    20
[4]  {Seguro de Salud}                                     => {Seguro de Hogar}                                       0.020  0.1851852    0.108 1.543210    20
[5]  {Seguro de Accidentes}                                => {Seguro Multirriesgo Comercial / Comercio}              0.022  0.1864407    0.118 1.528202    22
[6]  {Seguro Multirriesgo Comercial / Comercio}            => {Seguro de Accidentes}                                  0.022  0.1803279    0.122 1.528202    22
[7]  {Seguro de RC Profesional (Médicos, Abogados, etc.)}  => {Seguro de Contingencias / Premio Hoyo en Uno (Golf)}   0.019  0.1792453    0.106 1.481366    19
[8]  {Seguro de Contingencias / Premio Hoyo en Uno (Golf)} => {Seguro de RC Profesional (Médicos, Abogados, etc.)}    0.019  0.1570248    0.121 1.481366    19
[9]  {Seguro de Transporte de Mercancías}                  => {Seguro de Todo Riesgo Construcción}                    0.017  0.1700000    0.100 1.478261    17
[10] {Seguro de RC de Directivos y Administradores (D&O)}  => {Seguro de Patinetes Eléctricos / Movilidad}            0.023  0.1900826    0.121 1.473509    23

¿Cómo interpretar estas métricas en el negocio?

  • LHS y RHS: Si un cliente tiene contratado el seguro del lado izquierdo (LHS), el algoritmo evalúa la probabilidad de que adquiera el del lado derecho (RHS).
  • Support (Soporte): El porcentaje total de clientes que tienen ambos seguros contratados a la vez.
  • Confidence (Confianza): La probabilidad condicional. De los que compraron el producto LHS, qué porcentaje adquirió también el RHS.
  • Lift (Elevación): La métrica reina. Un Lift > 1 indica que los productos están asociados positivamente (se compran juntos más de lo habitual). Un Lift = 1 denota total independencia estadística (no hay correlación).

5. Visualización Avanzada de Reglas

Las reglas numéricas cobran vida cuando las graficamos. Utilizaremos dos enfoques de visualización fundamentales para analizar los resultados.

A. Gráfico de Dispersión (Scatter Plot)

Este gráfico sitúa cada regla según su Soporte (Eje X) y Confianza (Eje Y), usando el color para resaltar el nivel de Lift. Las reglas más valiosas comercialmente suelen ubicarse en la zona superior derecha y con colores intensos.

plot(reglas, method = "scatterplot", engine = "ggplot2")

B. Gráfico de Red (Graph Interactivo)

Ideal para identificar visualmente qué productos actúan como “imanes” o “anclas” comerciales hacia otros ramos. Las flechas conectan los antecedentes con sus consecuentes.

# Visualización de las 10 reglas con mayor Lift
plot(head(reglas_ordenadas, 10), method = "graph", engine = "htmlwidget")

Conclusión

El algoritmo Apriori transforma datos transaccionales brutos en estrategias de negocio accionables. En entornos corporativos reales (con datos no aleatorios), este análisis revela conexiones lógicas (como vincular el seguro de Hogar con el de Impago de Alquiler) que permiten a las aseguradoras optimizar sus campañas de marketing (venta cruzada o crosselling), empaquetar pólizas atractivas (bundling) y mejorar la retención de sus clientes.