5  Análisis de patrones

Author

Rubén Oliva Zamora

5.1 Paquete arules

arules trabaja con el concepto de transacciones. Cada transacción es una “cesta de compra” que contiene un conjunto de items. Debemos decidir qué representa una transacción en nuestro contexto.

En este caso consideraré que customer_id es la unidad de análisis. La “transacción” para cada cliente sería el conjunto de todos los items (características, acciones registradas) asociados a ese cliente a lo largo de su historial disponible en nuestros datos limpios.

5.1.1 Creación de las transacciones

Comenzamos definiendo nuestra población de estudio. Nos centraremos en los clientes que ya son OWNER de un vehículo, ya que son el objetivo principal de las campañas de recompra. Esta tabla all_customers contendrá los customer_id únicos que formarán la base de nuestras transacciones.

# Empezar con todos los clientes únicos de customer_vehicle (OWNERs)
all_customers <- customer_vehicle_pt_with_targets |> distinct(customer_id)

5.1.1.1 Adición de características de lista de deseados

A continuación, procesaremos los datos de wishlist_pt_cleaned para extraer características relevantes del comportamiento de cada cliente en la wishlist. Nos interesa saber si han usado la wishlist, cuál fue el último tipo de configuración y class_bodytype que les interesó, cuál es el tipo de configuración y class_bodytype más frecuente para el cliente, y cuál ha sido su nivel de actividad. Estas características se convertirán en “items” para arules.

NOTA: considero los últimos porque generalmente la información más reciente es la más predictiva del comportamiento inmediato futuro, y los frecuentes porque las tendencias repetitivas suelen, por definición, repetirse. Naturalmente esto supone un compromiso, pues puedo estar perdiendo información valiosa

wishlist_summary <- wishlist_pt_cleaned |>
  arrange(customer_id, desc(wish_create_date)) |> # Ordenar para obtener el último
  group_by(customer_id) |>
  summarise(
    # Tomamos info de la última entrada
    wl_last_bodytype = first(class_bodytype),
    wl_last_type = first(wish_type),
    # Tomamos info del más frecuente (manejo de NAs y empates tomando el primero por frecuencia)
    wl_freq_bodytype = {
      vals <- class_bodytype[!is.na(class_bodytype)]
      if(length(vals) == 0) NA_character_ else names(sort(table(vals), decreasing = TRUE)[1])
    },
    wl_freq_type = {
      vals <- wish_type[!is.na(wish_type)]
      if(length(vals) == 0) NA_character_ else names(sort(table(vals), decreasing = TRUE)[1])
    },
    # Contamos actividad
    wl_n_entradas_total = n()
  ) |>
  # Crear items categóricos
  mutate(
    wl_uso_wishlist = "WL:Uso=SI", # Item explícito para indicar uso
    wl_last_bodytype = paste0("WL:LastBodytype=", ifelse(is.na(wl_last_bodytype), "NA", as.character(wl_last_bodytype))),
    wl_last_type = paste0("WL:LastType=", as.character(wl_last_type)),
    wl_freq_bodytype = paste0("WL:FreqBodytype=", ifelse(is.na(wl_freq_bodytype), "NA", as.character(wl_freq_bodytype))),
    wl_freq_type = paste0("WL:FreqType=", ifelse(is.na(wl_freq_type), "NA", as.character(wl_freq_type))),
    wl_activity = cut(wl_n_entradas_total, breaks = c(0, 1, 5, Inf), labels=c("WL:Activity=Baja(1)", "WL:Activity=Media(2-5)", "WL:Activity=Alta(6+)"), right = TRUE)
  ) |>
  select(customer_id, wl_uso_wishlist, wl_last_bodytype, wl_last_type, wl_freq_bodytype, wl_freq_type, wl_activity)

5.1.1.2 Adición de características de daños

De manera similar, resumiremos el historial de visitas al taller de cada cliente desde damage_pt_cleaned. Crearemos items que reflejen si el cliente ha tenido daños, la frecuencia de visitas, el coste y tipo de servicio de la última y más frecuente visita, y la recencia de esta.

Para calcular la recencia de forma consistente, primero definimos una fecha de referencia global (ref_date). Esta fecha se establece como la más reciente observada en todas nuestras fuentes de datos de actividad principales (historial de daños, wishlist, y fechas de inicio de validez de vehículos de clientes).

Usar una ref_date global asegura que todas las métricas temporales (como “días desde la última reparación” o “antigüedad del vehículo”) se calculan con respecto al “punto de corte” de la ventana de observación de nuestros datos. Esto hace que las características derivadas sean consistentes y comparables entre sí, anclando el análisis al marco temporal completo de los datos disponibles.

ref_date <- max(c(max(damage_pt_cleaned$damage_repair_date, na.rm=TRUE),
                  max(wishlist_pt_cleaned$wish_create_date, na.rm=TRUE),
                  max(customer_vehicle_pt_with_targets$valid_from, na.rm=TRUE)), na.rm=TRUE)
print(paste("Fecha de referencia para cálculos de recencia:", ref_date))
[1] "Fecha de referencia para cálculos de recencia: 2025-02-26"
damage_summary <- damage_pt_cleaned |>
  mutate(dias_desde_reparacion = as.numeric(difftime(ref_date, damage_repair_date, units = "days"))) |>
  arrange(customer_id, desc(damage_repair_date)) |> # Ordenar para obtener el último
  group_by(customer_id) |>
  summarise(
    dmg_n_visitas = n(),
    # Última visita
    dmg_last_cost = first(repair_cost_category),
    dmg_last_service_desc = first(service_type_description), # Desc estandarizada
    dmg_dias_ult_visita = min(dias_desde_reparacion, na.rm = TRUE), # Tiempo desde la última visita
    # Visita más frecuente (manejo de NAs y empates tomando el primero por frecuencia)
    dmg_freq_cost = {
      vals <- repair_cost_category[!is.na(repair_cost_category)]
      if(length(vals) == 0) NA_character_ else names(sort(table(vals), decreasing = TRUE)[1])
    },
    dmg_freq_service_desc = {
      vals <- service_type_description[!is.na(service_type_description) & service_type_description != ""]
      if(length(vals) == 0) NA_character_ else names(sort(table(vals), decreasing = TRUE)[1])
    }
  ) |>
  # Crear items categóricos
  mutate(
    dmg_tuvo_danos = "DMG:Tuvo=SI",
    dmg_freq = cut(dmg_n_visitas, breaks = c(0, 1, 3, Inf), labels = c("DMG:Freq=1", "DMG:Freq=2-3", "DMG:Freq=4+"), right=TRUE),
    dmg_last_cost = paste0("DMG:LastCost=", as.character(dmg_last_cost)),
    dmg_last_service_desc = paste0("DMG:LastService=", ifelse(is.na(dmg_last_service_desc) | dmg_last_service_desc=="", "NA", as.character(dmg_last_service_desc))), # Tratar NAs/vacíos
    dmg_freq_cost = paste0("DMG:FreqCost=", ifelse(is.na(dmg_freq_cost), "NA", as.character(dmg_freq_cost))),
    dmg_freq_service_desc = paste0("DMG:FreqService=", ifelse(is.na(dmg_freq_service_desc) | dmg_freq_service_desc=="", "NA", as.character(dmg_freq_service_desc))),
    dmg_recency = cut(dmg_dias_ult_visita, breaks = c(-Inf, 90, 365, Inf), labels = c("DMG:Recent=<3M", "DMG:Recent=3M-1A", "DMG:Recent=>1A"), right = FALSE)
  ) |>
  select(customer_id, dmg_tuvo_danos, dmg_freq, dmg_last_cost, dmg_last_service_desc, dmg_freq_cost, dmg_freq_service_desc, dmg_recency)

5.1.1.3 Adición de características de cliente-vehículo

Es fundamental conocer las características del vehículo que el cliente posee actualmente, como su class_bodytype y su antigüedad. Esta información se extraerá de customer_vehicle_pt_with_targets (para los vehículos actualmente vinculados) y se enriquecerá con detalles de vehicle_data_cleaned.

# Crear la tabla lookup desde vehicle_data_cleaned ASEGURANDO unicidad por vehicle_id
# Nos quedamos con la primera aparición si hay duplicados.
vehicle_info_unique <- vehicle_data_cleaned |>
  select(vehicle_id, class_bodytype, date_of_first_registration) |>
  distinct(vehicle_id, .keep_all = TRUE)

customer_vehicle_summary <- customer_vehicle_pt_with_targets |>
  filter(is.na(valid_to)) |> # Solo vehículos actualmente vinculados
  arrange(customer_id, desc(valid_from)) |> # Ordenar para obtener el más reciente
  group_by(customer_id) |>
  slice(1) |> # Tomar el vehículo actual más reciente si un cliente tuviera varios activos (poco probable)
  ungroup() |>
  # Unir con la tabla lookup donde vehicle_id es ahora garantizado único
  left_join(vehicle_info_unique, by = "vehicle_id") |>
  mutate(
    # Calcular edad del vehículo respecto a la fecha de referencia
    edad_vehiculo_dias = if_else(!is.na(date_of_first_registration),
                                 as.numeric(difftime(ref_date, date_of_first_registration, units="days")),
                                 NA_real_),
    # Crear items categóricos para arules
    cv_edad_vehiculo_cat = cut(edad_vehiculo_dias, breaks = c(-Inf, 365*2, 365*5, Inf), labels = c("CV:Edad=0-2A", "CV:Edad=3-5A", "CV:Edad=6+A"), right = FALSE),
    cv_bodytype = paste0("CV:Bodytype=", ifelse(is.na(class_bodytype), "NA", as.character(class_bodytype)))
  ) |>
  # Seleccionar columnas finales para el resumen del cliente
  select(customer_id, cv_bodytype, cv_edad_vehiculo_cat)

Para incorporar las variables objetivo en nuestro análisis de patrones a nivel de cliente, necesitamos resumir esta información. Las variables objetivo (cuándo será la próxima compra y qué tipo de vehículo será) se generaron para cada transacción de compra individual en el capítulo anterior.

Aquí, nos enfocamos en la última transición de compra conocida para cada cliente. Es decir, para cada cliente que ha realizado al menos dos compras (y por lo tanto, tiene al menos una instancia donde conocemos la “siguiente compra”), tomamos la información de su compra más reciente que fue seguida por otra.

# Nos interesa la información de la última transición de compra conocida para cada cliente.
target_summary <- customer_vehicle_pt_with_targets |>
  filter(!is.na(next_repurchase_date)) |> # Solo compras que tuvieron una siguiente compra
  arrange(customer_id, desc(valid_from)) |> # Ordenar para obtener la más reciente con target
  group_by(customer_id) |>
  ungroup() |>
  mutate(
    # Crear items para arules. El prefijo "TGT:" ayuda a identificarlos.
    TGT_RepTime = paste0("TGT:RepTime=", ifelse(is.na(time_until_next_purchase_category), NA_character_, as.character(time_until_next_purchase_category))),
    TGT_NextBodytype = paste0("TGT:NextBodytype=", ifelse(is.na(next_class_bodytype), NA_character_, as.character(next_class_bodytype)))
  ) |>
  select(customer_id, TGT_RepTime, TGT_NextBodytype)

Ahora, unimos todos los resúmenes (wishlist_summary, damage_summary, customer_vehicle_summary, target_summary) a nuestra tabla base de clientes (all_customers). También es importante manejar los casos donde un cliente no tenga actividad en alguna de estas áreas (ej. no usó la wishlist); para ello, crearemos items explícitos como WL:Uso=NO. Finalmente, todas las columnas que representarán items se convertirán a factores.

transaction_data_df <- all_customers |>
  left_join(wishlist_summary, by = "customer_id") |>
  left_join(damage_summary, by = "customer_id") |>
  left_join(customer_vehicle_summary, by = "customer_id") |>
  left_join(target_summary, by = "customer_id") |>
  # Crear items explícitos para ausencia de datos
  mutate(
      wl_uso_wishlist = replace_na(wl_uso_wishlist, "WL:Uso=NO"),
      dmg_tuvo_danos = replace_na(dmg_tuvo_danos, "DMG:Tuvo=NO"),
  ) |>
  # Convertir todas las columnas (excepto ID) a factor para arules
  mutate(across(-customer_id, as.factor))

El último paso es transformar transaction_data_df al formato de lista de transacciones que arules requiere. Cada elemento de la lista será un vector de caracteres, donde cada caracter es un “item” asociado a un cliente. Se eliminan los NA reales y los items que representan valores faltantes explícitos (como WL:LastBodytype=NA_Value).

# Crear una lista donde cada elemento es un vector de items para un cliente
transaction_data_list <- apply(transaction_data_df |> select(-customer_id), 1, function(row) {
  # Convertir la fila a character y eliminar los NAs explícitos o los factores con nivel NA
  items <- as.character(row)
  # Eliminar los NA_character_ reales (estos no son items válidos para arules)
  items <- items[!is.na(items)]
  return(items)
})
names(transaction_data_list) <- transaction_data_df$customer_id

# Convertir la lista a objeto transactions
transaction_mercedes <- as(transaction_data_list, "transactions")

# Inspeccionar las transacciones y frecuencias de items
summary(transaction_mercedes)
transactions as itemMatrix in sparse format with
 31287 rows (elements/itemsets/transactions) and
 202 columns (items) and a density of 0.05611226 

most frequent items:
          DMG:Tuvo=SI             WL:Uso=NO DMG:FreqCost=Low cost 
                31118                 29559                 22284 
          DMG:Freq=4+ DMG:LastCost=Low cost               (Other) 
                21456                 14752                235459 

element (itemset/transaction) length distribution:
sizes
    2     4     6     7     8     9    10    11    12    13    15    17 
    2     3     4    14   640    98 12482    48 16428    12   302  1254 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2.00   10.00   12.00   11.33   12.00   17.00 

includes extended item information - examples:
                         labels
1 CV:Bodytype=A_class_hatchback
2     CV:Bodytype=A_class_sedan
3 CV:Bodytype=B_class_hatchback

includes extended transaction information - examples:
                                             transactionID
1 00044ab8958c8cdf0b5e56eb43ff3aba4541c699d3f31d6e555934ef
2 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380
3 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380
itemFrequencyPlot(transaction_mercedes, topN=30, type="absolute", cex.names=0.7, main="Top 30 items más frecuentes")

Con este objeto transaction_mercedes, ya estamos listos para aplicar el algoritmo Apriori y buscar reglas de asociación.

5.1.2 Algoritmo apriori

El algoritmo Apriori nos permite descubrir reglas de asociación frecuentes en el conjunto de “transacciones” de cada cliente, entendiendo como tal el conjunto de ítems (wishlist, daños, características del vehículo y targets) asociados a su historial.

Aplicando umbrales mínimos de soporte y confianza, podremos extraer patrones que relacionen comportamientos previos (ej. uso de wishlist, frecuencia de reparaciones) y atributos del vehículo actual con las variables objetivo (TGT:RepTime, TGT:NextBodytype).

# Tras tanteo con prueba y error, estos umbrales proporcionan un número manejable y aceptable de reglas
min_support <- 0.005
min_confidence <- 0.3

print(paste("Ejecutando apriori con supp=", min_support, "y conf=", min_confidence))
[1] "Ejecutando apriori con supp= 0.005 y conf= 0.3"
reglas_target <- apriori(transaction_mercedes,
                  parameter = list(supp = min_support,
                                   conf = min_confidence,
                                   minlen = 2,
                                   target = "rules"),
                  appearance = list(rhs = c(levels(transaction_data_df$TGT_RepTime), levels(transaction_data_df$TGT_NextBodytype)),
                                  default = "lhs"))
Apriori

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

set item appearances ...[54 item(s)] done [0.00s].
set transactions ...[202 item(s), 31287 transaction(s)] done [0.01s].
sorting and recoding items ... [99 item(s)] done [0.00s].
creating transaction tree ... done [0.01s].
checking subsets of size 1 2 3 4 5 6 7 8 9 10
Warning in apriori(transaction_mercedes, parameter = list(supp = min_support, :
Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!
 done [0.18s].
writing ... [15131 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
# Resumen inicial
summary(reglas_target)
set of 15131 rules

rule length distribution (lhs + rhs):sizes
   2    3    4    5    6    7    8    9   10 
  28  396 1691 3468 4104 3113 1613  580  138 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   5.000   6.000   6.032   7.000  10.000 

summary of quality measures:
    support           confidence        coverage             lift       
 Min.   :0.005018   Min.   :0.3000   Min.   :0.006968   Min.   : 1.266  
 1st Qu.:0.005402   1st Qu.:0.3617   1st Qu.:0.011538   1st Qu.: 1.593  
 Median :0.006456   Median :0.4490   Median :0.015693   Median : 1.935  
 Mean   :0.011028   Mean   :0.4565   Mean   :0.026586   Mean   : 2.114  
 3rd Qu.:0.010420   3rd Qu.:0.5087   3rd Qu.:0.024371   3rd Qu.: 2.276  
 Max.   :0.178253   Max.   :0.8194   Max.   :0.529134   Max.   :16.293  
     count     
 Min.   : 157  
 1st Qu.: 169  
 Median : 202  
 Mean   : 345  
 3rd Qu.: 326  
 Max.   :5577  

mining info:
                 data ntransactions support confidence
 transaction_mercedes         31287   0.005        0.3
                                                                                                                                                                                                                                                                call
 apriori(data = transaction_mercedes, parameter = list(supp = min_support, conf = min_confidence, minlen = 2, target = "rules"), appearance = list(rhs = c(levels(transaction_data_df$TGT_RepTime), levels(transaction_data_df$TGT_NextBodytype)), default = "lhs"))

5.1.3 Filtrado de reglas

En el proceso de minería de reglas de asociación, es común que el algoritmo Apriori genere un número considerable de reglas. Para facilitar su interpretación y extraer los insights más valiosos, aplicamos cuatro pasos clave:

5.1.3.1 Eliminación de reglas redundantes

Una regla se considera redundante si su información ya está cubierta por otra regla más simple (con menos items en el antecedente) que posee una confianza igual o superior. Eliminar estas redundancias nos permite eliminar ruido y enfocarnos en las relaciones más directas y fundamentales.

# Identificar reglas redundantes
redundant_rules <- is.redundant(reglas_target)
reglas_pruned <- reglas_target[!redundant_rules]
summary(reglas_pruned)
set of 3087 rules

rule length distribution (lhs + rhs):sizes
   2    3    4    5    6    7    8 
  28  336  876 1010  618  197   22 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   4.000   5.000   4.821   6.000   8.000 

summary of quality measures:
    support           confidence        coverage             lift       
 Min.   :0.005018   Min.   :0.3001   Min.   :0.006968   Min.   : 1.267  
 1st Qu.:0.005657   1st Qu.:0.3760   1st Qu.:0.012305   1st Qu.: 1.653  
 Median :0.007575   Median :0.4489   Median :0.017579   Median : 1.954  
 Mean   :0.013914   Mean   :0.4660   Mean   :0.032677   Mean   : 2.099  
 3rd Qu.:0.012881   3rd Qu.:0.5393   3rd Qu.:0.030764   3rd Qu.: 2.332  
 Max.   :0.178253   Max.   :0.8194   Max.   :0.529134   Max.   :16.293  
     count       
 Min.   : 157.0  
 1st Qu.: 177.0  
 Median : 237.0  
 Mean   : 435.3  
 3rd Qu.: 403.0  
 Max.   :5577.0  

mining info:
                 data ntransactions support confidence
 transaction_mercedes         31287   0.005        0.3
                                                                                                                                                                                                                                                                call
 apriori(data = transaction_mercedes, parameter = list(supp = min_support, conf = min_confidence, minlen = 2, target = "rules"), appearance = list(rhs = c(levels(transaction_data_df$TGT_RepTime), levels(transaction_data_df$TGT_NextBodytype)), default = "lhs"))

5.1.3.2 Eliminación de reglas no significativas

Después de eliminar las redundancias, verificamos si las asociaciones restantes son estadísticamente significativas, es decir, si no son probablemente producto del azar. La función is.significant() utiliza pruebas estadísticas (como la prueba exacta de Fisher por defecto) para este propósito. Mantenemos solo las reglas que superan este umbral de significación.

significant_rules_logical <- is.significant(reglas_pruned, transaction_mercedes)
reglas_pruned <- reglas_pruned[significant_rules_logical]
summary(reglas_pruned)
set of 3087 rules

rule length distribution (lhs + rhs):sizes
   2    3    4    5    6    7    8 
  28  336  876 1010  618  197   22 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   4.000   5.000   4.821   6.000   8.000 

summary of quality measures:
    support           confidence        coverage             lift       
 Min.   :0.005018   Min.   :0.3001   Min.   :0.006968   Min.   : 1.267  
 1st Qu.:0.005657   1st Qu.:0.3760   1st Qu.:0.012305   1st Qu.: 1.653  
 Median :0.007575   Median :0.4489   Median :0.017579   Median : 1.954  
 Mean   :0.013914   Mean   :0.4660   Mean   :0.032677   Mean   : 2.099  
 3rd Qu.:0.012881   3rd Qu.:0.5393   3rd Qu.:0.030764   3rd Qu.: 2.332  
 Max.   :0.178253   Max.   :0.8194   Max.   :0.529134   Max.   :16.293  
     count       
 Min.   : 157.0  
 1st Qu.: 177.0  
 Median : 237.0  
 Mean   : 435.3  
 3rd Qu.: 403.0  
 Max.   :5577.0  

mining info:
                 data ntransactions support confidence
 transaction_mercedes         31287   0.005        0.3
                                                                                                                                                                                                                                                                call
 apriori(data = transaction_mercedes, parameter = list(supp = min_support, conf = min_confidence, minlen = 2, target = "rules"), appearance = list(rhs = c(levels(transaction_data_df$TGT_RepTime), levels(transaction_data_df$TGT_NextBodytype)), default = "lhs"))

5.1.3.3 Eliminación de reglas tautológicas

Algunas reglas pueden ser lógicamente verdaderas por la forma en que se construyeron los ítems, pero no ofrecen insights nuevos. Un ejemplo sería una regla donde el uso de la wishlist (WL:Uso=SI) es el único antecedente que lleva a una actividad específica en la wishlist (ej. WL:Activity=Media(2-5)), si ambas son de la misma categoría y una implica trivialmente la otra. Filtramos estas reglas para centrarnos en interacciones menos obvias.

Definimos una regla como tautológica/definicional en este contexto si:

  1. Todos los ítems en el antecedente (LHS) pertenecen a una única categoría (ej. todos son “WL:…”).
  2. Todos los ítems en el consecuente (RHS) pertenecen a esa misma única categoría.
  3. Uno de los lados (LHS o RHS) consiste únicamente en el ítem general de “uso” o “existencia” para esa categoría (ej. WL:Uso=SI o DMG:Tuvo=SI).
# Definición de ítems de "uso" o "existencia" por categoría
wl_usage_item <- "WL:Uso=SI"
dmg_usage_item <- "DMG:Tuvo=SI"

# Función para identificar reglas definicionales/tautológicas
is_definitional_rule <- function(rule, wl_item_ref, dmg_item_ref) {
  clean_item_label <- function(item_label) { gsub("[{}]", "", item_label) }
  lhs_items_raw <- labels(lhs(rule)); rhs_items_raw <- labels(rhs(rule))
  lhs_items <- unlist(lapply(strsplit(lhs_items_raw, ",", fixed = TRUE), clean_item_label))
  rhs_items <- unlist(lapply(strsplit(rhs_items_raw, ",", fixed = TRUE), clean_item_label))
  lhs_items <- lhs_items[lhs_items != ""]; rhs_items <- rhs_items[rhs_items != ""]

  if (length(lhs_items) == 0 || length(rhs_items) == 0) return(FALSE)

  get_unique_prefixes <- function(item_set) {
    if (length(item_set) == 0) return(character(0))
    unique(sapply(strsplit(item_set, ":"), `[`, 1))
  }
  lhs_prefixes <- get_unique_prefixes(lhs_items)
  rhs_prefixes <- get_unique_prefixes(rhs_items)

  if (length(lhs_prefixes) != 1 || length(rhs_prefixes) != 1) return(FALSE)
  if (lhs_prefixes[1] != rhs_prefixes[1]) return(FALSE)
  
  rule_category <- lhs_prefixes[1]
  lhs_is_solely_usage_item <- FALSE; rhs_is_solely_usage_item <- FALSE

  if (rule_category == "WL") {
    if (length(lhs_items) == 1 && lhs_items[1] == wl_item_ref) lhs_is_solely_usage_item <- TRUE
    if (length(rhs_items) == 1 && rhs_items[1] == wl_item_ref) rhs_is_solely_usage_item <- TRUE
  } else if (rule_category == "DMG") {
    if (length(lhs_items) == 1 && lhs_items[1] == dmg_item_ref) lhs_is_solely_usage_item <- TRUE
    if (length(rhs_items) == 1 && rhs_items[1] == dmg_item_ref) rhs_is_solely_usage_item <- TRUE
  }
  # Añadir 'else if' para otras categorías como CV si es necesario

  return(lhs_is_solely_usage_item || rhs_is_solely_usage_item)
}

# Aplicar el filtro
keep_rules_definitional_logical <- !sapply(1:length(reglas_pruned), function(i) {
  is_definitional_rule(reglas_pruned[i], wl_usage_item, dmg_usage_item)
})
reglas_pruned <- reglas_pruned[keep_rules_definitional_logical]
summary(reglas_pruned)
set of 3087 rules

rule length distribution (lhs + rhs):sizes
   2    3    4    5    6    7    8 
  28  336  876 1010  618  197   22 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   4.000   5.000   4.821   6.000   8.000 

summary of quality measures:
    support           confidence        coverage             lift       
 Min.   :0.005018   Min.   :0.3001   Min.   :0.006968   Min.   : 1.267  
 1st Qu.:0.005657   1st Qu.:0.3760   1st Qu.:0.012305   1st Qu.: 1.653  
 Median :0.007575   Median :0.4489   Median :0.017579   Median : 1.954  
 Mean   :0.013914   Mean   :0.4660   Mean   :0.032677   Mean   : 2.099  
 3rd Qu.:0.012881   3rd Qu.:0.5393   3rd Qu.:0.030764   3rd Qu.: 2.332  
 Max.   :0.178253   Max.   :0.8194   Max.   :0.529134   Max.   :16.293  
     count       
 Min.   : 157.0  
 1st Qu.: 177.0  
 Median : 237.0  
 Mean   : 435.3  
 3rd Qu.: 403.0  
 Max.   :5577.0  

mining info:
                 data ntransactions support confidence
 transaction_mercedes         31287   0.005        0.3
                                                                                                                                                                                                                                                                call
 apriori(data = transaction_mercedes, parameter = list(supp = min_support, conf = min_confidence, minlen = 2, target = "rules"), appearance = list(rhs = c(levels(transaction_data_df$TGT_RepTime), levels(transaction_data_df$TGT_NextBodytype)), default = "lhs"))

5.1.3.4 Eliminación de reglas estrictamente intra-dominio

A menudo, las reglas más interesantes son aquellas que cruzan diferentes dominios de datos (ej. un comportamiento en la wishlist que lleva a una característica del vehículo actual, o un patrón de daños que se relaciona con el uso de la wishlist). Para enfocarnos en estas, podemos filtrar las reglas donde todos los ítems (tanto en el antecedente como en el consecuente) pertenecen a la misma categoría (ej. WL:... => WL:... o DMG:... => DMG:...).

# Función para obtener prefijos de un conjunto de etiquetas de ítems
get_item_prefixes_from_labels <- function(item_set_labels) {
  if (length(item_set_labels) == 0 || item_set_labels == "{}") return(character(0))
  items <- gsub("[{}]", "", unlist(strsplit(item_set_labels, ",", fixed = TRUE)))
  items <- items[items != ""]
  if (length(items) == 0) return(character(0))
  unique(sapply(strsplit(items, ":"), `[`, 1))
}

# Función para identificar reglas estrictamente intra-dominio
is_strictly_intra_domain_rule <- function(rule) {
  lhs_prefixes <- get_item_prefixes_from_labels(labels(lhs(rule)))
  rhs_prefixes <- get_item_prefixes_from_labels(labels(rhs(rule)))

  if (length(lhs_prefixes) == 0 || length(rhs_prefixes) == 0) return(FALSE) # Regla vacía o mal formada

  # Es estrictamente intra-dominio si todos los prefijos del LHS son iguales entre sí,
  # todos los prefijos del RHS son iguales entre sí, Y estos dos únicos prefijos (uno del LHS, uno del RHS) son idénticos.
  if (length(lhs_prefixes) == 1 && length(rhs_prefixes) == 1 && lhs_prefixes[1] == rhs_prefixes[1]) {
    return(TRUE)
  }
  return(FALSE)
}

# Aplicar el filtro
keep_rules_cross_domain_logical <- !sapply(1:length(reglas_pruned), function(i) {
  is_strictly_intra_domain_rule(reglas_pruned[i])
})
reglas_pruned <- reglas_pruned[keep_rules_cross_domain_logical]

summary(reglas_pruned)
set of 3087 rules

rule length distribution (lhs + rhs):sizes
   2    3    4    5    6    7    8 
  28  336  876 1010  618  197   22 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   4.000   5.000   4.821   6.000   8.000 

summary of quality measures:
    support           confidence        coverage             lift       
 Min.   :0.005018   Min.   :0.3001   Min.   :0.006968   Min.   : 1.267  
 1st Qu.:0.005657   1st Qu.:0.3760   1st Qu.:0.012305   1st Qu.: 1.653  
 Median :0.007575   Median :0.4489   Median :0.017579   Median : 1.954  
 Mean   :0.013914   Mean   :0.4660   Mean   :0.032677   Mean   : 2.099  
 3rd Qu.:0.012881   3rd Qu.:0.5393   3rd Qu.:0.030764   3rd Qu.: 2.332  
 Max.   :0.178253   Max.   :0.8194   Max.   :0.529134   Max.   :16.293  
     count       
 Min.   : 157.0  
 1st Qu.: 177.0  
 Median : 237.0  
 Mean   : 435.3  
 3rd Qu.: 403.0  
 Max.   :5577.0  

mining info:
                 data ntransactions support confidence
 transaction_mercedes         31287   0.005        0.3
                                                                                                                                                                                                                                                                call
 apriori(data = transaction_mercedes, parameter = list(supp = min_support, conf = min_confidence, minlen = 2, target = "rules"), appearance = list(rhs = c(levels(transaction_data_df$TGT_RepTime), levels(transaction_data_df$TGT_NextBodytype)), default = "lhs"))

5.1.4 Inspección de reglas

Una vez que hemos aplicado los filtros para obtener un conjunto de reglas (reglas_pruned) más manejable y potencialmente más interesante, el siguiente paso es inspeccionarlas cuidadosamente. No existe una única “mejor” métrica para evaluar reglas de asociación; diferentes métricas resaltan distintos aspectos de la relación entre los ítems. Por ello, es crucial examinar las reglas desde múltiples perspectivas. Nos centraremos en tres métricas fundamentales:

  1. Support: indica la frecuencia o popularidad de una regla en el conjunto de datos. Específicamente, es la proporción de transacciones que contienen todos los ítems de la regla (tanto el antecedente como el consecuente). Un alto soporte significa que el patrón es común.

  2. Confidence: mide la fiabilidad o predictibilidad de la regla. Es la probabilidad condicional de que ocurra el consecuente (RHS) dado que el antecedente (LHS) ya ha ocurrido. Una alta confianza sugiere que si se observa el LHS, es muy probable que también se observe el RHS.

  3. Lift: evalúa la fortaleza de una asociación más allá de la simple popularidad de los ítems. Mide cuánto más probable es que el consecuente ocurra cuando el antecedente está presente, en comparación con la probabilidad de que el consecuente ocurra por sí solo (es decir, independientemente del antecedente). Un lift > 1 indica una asociación positiva (el LHS “eleva” la probabilidad del RHS), un lift = 1 indica independencia, y un lift < 1 sugiere una asociación negativa.

Al ordenar e inspeccionar las reglas según cada una de estas métricas (lift, support y confidence), podemos descubrir distintos tipos de insights. Examinaremos las 30 reglas principales para cada métrica para obtener una visión general representativa y capturar tanto patrones robustos y comunes como relaciones sorprendentes y específicas.

# Ordenadas por lift
inspect(head(sort(reglas_pruned, by="lift"), 30))
     lhs                                       rhs                                    support confidence    coverage      lift count
[1]  {CV:Bodytype=V_class_van,                                                                                                      
      DMG:Recent=<3M,                                                                                                               
      WL:Uso=NO}                            => {TGT:NextBodytype=V_class_van}     0.011953847  0.6233333 0.019177294 16.292590   374
[2]  {CV:Bodytype=V_class_van,                                                                                                      
      DMG:LastCost=Medium-low cost,                                                                                                 
      WL:Uso=NO}                            => {TGT:NextBodytype=V_class_van}     0.005497491  0.6209386 0.008853517 16.229997   172
[3]  {CV:Bodytype=V_class_van,                                                                                                      
      DMG:LastCost=Medium-low cost}         => {TGT:NextBodytype=V_class_van}     0.005593377  0.6161972 0.009077253 16.106066   175
[4]  {CV:Bodytype=EQE_class_sedan,                                                                                                  
      DMG:Recent=3M-1A}                     => {TGT:NextBodytype=EQE_class_sedan} 0.005497491  0.3847875 0.014287084 16.051794   172
[5]  {CV:Bodytype=V_class_van,                                                                                                      
      DMG:Recent=<3M}                       => {TGT:NextBodytype=V_class_van}     0.012625052  0.6076923 0.020775402 15.883767   395
[6]  {CV:Bodytype=V_class_van,                                                                                                      
      DMG:LastCost=Low cost}                => {TGT:NextBodytype=V_class_van}     0.005177869  0.5806452 0.008917442 15.176813   162
[7]  {CV:Bodytype=EQE_class_sedan,                                                                                                  
      CV:Edad=0-2A,                                                                                                                 
      DMG:LastCost=Low cost}                => {TGT:NextBodytype=EQE_class_sedan} 0.005209832  0.3614191 0.014414933 15.076958   163
[8]  {CV:Bodytype=EQE_class_sedan,                                                                                                  
      DMG:LastCost=Low cost}                => {TGT:NextBodytype=EQE_class_sedan} 0.006072810  0.3612167 0.016812094 15.068517   190
[9]  {CV:Bodytype=V_class_van,                                                                                                      
      DMG:FreqService=KDM Campaign Claims}  => {TGT:NextBodytype=V_class_van}     0.005209832  0.5207668 0.010004155 13.611721   163
[10] {CV:Bodytype=V_class_van,                                                                                                      
      CV:Edad=0-2A,                                                                                                                 
      WL:Uso=NO}                            => {TGT:NextBodytype=V_class_van}     0.015885192  0.5102669 0.031131141 13.337278   497
[11] {CV:Bodytype=V_class_van,                                                                                                      
      WL:Uso=NO}                            => {TGT:NextBodytype=V_class_van}     0.019592802  0.5082919 0.038546361 13.285654   613
[12] {CV:Bodytype=V_class_van}              => {TGT:NextBodytype=V_class_van}     0.021031099  0.4831131 0.043532458 12.627534   658
[13] {CV:Bodytype=E_class_sedan,                                                                                                    
      CV:Edad=0-2A}                         => {TGT:NextBodytype=E_class_sedan}   0.005657302  0.3235832 0.017483300  9.641854   177
[14] {CV:Bodytype=E_class_sedan,                                                                                                    
      DMG:Freq=4+}                          => {TGT:NextBodytype=E_class_sedan}   0.008022501  0.3133583 0.025601688  9.337182   251
[15] {CV:Bodytype=E_class_sedan}            => {TGT:NextBodytype=E_class_sedan}   0.011762074  0.3105485 0.037875156  9.253459   368
[16] {CV:Bodytype=E_class_estate,                                                                                                   
      DMG:Recent=>1A}                       => {TGT:NextBodytype=E_class_estate}  0.005369642  0.3485477 0.015405760  8.162434   168
[17] {CV:Bodytype=E_class_estate,                                                                                                   
      DMG:LastService=KDM Campaign Claims,                                                                                          
      WL:Uso=NO}                            => {TGT:NextBodytype=E_class_estate}  0.006520280  0.3238095 0.020136159  7.583105   204
[18] {CV:Bodytype=E_class_estate,                                                                                                   
      DMG:LastService=KDM Campaign Claims}  => {TGT:NextBodytype=E_class_estate}  0.006712053  0.3196347 0.020999137  7.485338   210
[19] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:FreqCost=Low cost,                                                                                                        
      DMG:FreqService=KDM Campaign Claims,                                                                                          
      DMG:LastService=KDM Campaign Claims}  => {TGT:NextBodytype=C_class_estate}  0.005145907  0.3609865 0.014255122  6.726734   161
[20] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:FreqService=KDM Campaign Claims,                                                                                          
      DMG:LastService=KDM Campaign Claims,                                                                                          
      WL:Uso=NO}                            => {TGT:NextBodytype=C_class_estate}  0.005337680  0.3576017 0.014926327  6.663660   167
[21] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:FreqService=KDM Campaign Claims,                                                                                          
      DMG:LastService=KDM Campaign Claims}  => {TGT:NextBodytype=C_class_estate}  0.005561415  0.3486974 0.015949116  6.497734   174
[22] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:FreqCost=Low cost,                                                                                                        
      DMG:FreqService=KDM Campaign Claims,                                                                                          
      WL:Uso=NO}                            => {TGT:NextBodytype=C_class_estate}  0.007575031  0.3300836 0.022948829  6.150878   237
[23] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:FreqCost=Low cost,                                                                                                        
      DMG:LastService=KDM Campaign Claims,                                                                                          
      WL:Uso=NO}                            => {TGT:NextBodytype=C_class_estate}  0.005593377  0.3295669 0.016971905  6.141250   175
[24] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:FreqCost=Low cost,                                                                                                        
      DMG:FreqService=KDM Campaign Claims}  => {TGT:NextBodytype=C_class_estate}  0.007798766  0.3253333 0.023971618  6.062361   244
[25] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:FreqCost=Low cost,                                                                                                        
      DMG:LastService=KDM Campaign Claims}  => {TGT:NextBodytype=C_class_estate}  0.005817113  0.3232682 0.017994694  6.023879   182
[26] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:FreqService=KDM Campaign Claims,                                                                                          
      WL:Uso=NO}                            => {TGT:NextBodytype=C_class_estate}  0.008054464  0.3230769 0.024930482  6.020314   252
[27] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:LastService=KDM Campaign Claims,                                                                                          
      WL:Uso=NO}                            => {TGT:NextBodytype=C_class_estate}  0.006456356  0.3211447 0.020104197  5.984308   202
[28] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:FreqService=KDM Campaign Claims}  => {TGT:NextBodytype=C_class_estate}  0.008278199  0.3189655 0.025953271  5.943701   259
[29] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:LastService=KDM Campaign Claims}  => {TGT:NextBodytype=C_class_estate}  0.006712053  0.3157895 0.021254834  5.884518   210
[30] {CV:Bodytype=C_class_estate,                                                                                                   
      DMG:Recent=>1A}                       => {TGT:NextBodytype=C_class_estate}  0.006392431  0.3110420 0.020551667  5.796052   200
# Ordenadas por confianza
inspect(head(sort(reglas_pruned, by="confidence"), 30))
     lhs                                       rhs                    support confidence   coverage     lift count
[1]  {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8194444 0.01150638 3.458980   295
[2]  {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:FreqCost=Low cost,                                                                                      
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastService=KDM Campaign Claims}  => {TGT:RepTime=Soon} 0.009428836  0.8171745 0.01153834 3.449398   295
[3]  {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:FreqCost=Low cost,                                                                                      
      DMG:LastCost=Low cost,                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8149171 0.01157030 3.439869   295
[4]  {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:FreqCost=Low cost,                                                                                      
      DMG:LastCost=Low cost,                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8104396 0.01163423 3.420969   295
[5]  {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastCost=Low cost,                                                                                      
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8082192 0.01166619 3.411597   295
[6]  {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:LastCost=Low cost,                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8082192 0.01166619 3.411597   295
[7]  {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:FreqCost=Low cost,                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8082192 0.01166619 3.411597   295
[8]  {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastService=KDM Campaign Claims}  => {TGT:RepTime=Soon} 0.009428836  0.8060109 0.01169815 3.402275   295
[9]  {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastCost=Low cost,                                                                                      
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8038147 0.01173011 3.393005   295
[10] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:LastCost=Low cost,                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8038147 0.01173011 3.393005   295
[11] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:FreqCost=Low cost,                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8038147 0.01173011 3.393005   295
[12] {CV:Bodytype=A_class_hatchback,                                                                              
      DMG:Freq=4+,                                                                                                
      DMG:FreqCost=Low cost,                                                                                      
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8038147 0.01173011 3.393005   295
[13] {CV:Bodytype=A_class_hatchback,                                                                              
      DMG:FreqCost=Low cost,                                                                                      
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8016304 0.01176207 3.383785   295
[14] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.8016304 0.01176207 3.383785   295
[15] {CV:Bodytype=A_class_hatchback,                                                                              
      DMG:Freq=4+,                                                                                                
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M,                                                                                             
      WL:Uso=NO}                            => {TGT:RepTime=Soon} 0.009428836  0.8016304 0.01176207 3.383785   295
[16] {CV:Bodytype=A_class_hatchback,                                                                              
      DMG:Freq=4+,                                                                                                
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.7994580 0.01179404 3.374614   295
[17] {CV:Bodytype=A_class_hatchback,                                                                              
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastCost=Low cost,                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M,                                                                                             
      WL:Uso=NO}                            => {TGT:RepTime=Soon} 0.009428836  0.7994580 0.01179404 3.374614   295
[18] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:FreqCost=Low cost,                                                                                      
      DMG:FreqService=mobilty,                                                                                    
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.7994580 0.01179404 3.374614   295
[19] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.7972973 0.01182600 3.365494   295
[20] {CV:Bodytype=A_class_hatchback,                                                                              
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastCost=Low cost,                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.7972973 0.01182600 3.365494   295
[21] {CV:Bodytype=A_class_hatchback,                                                                              
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M,                                                                                             
      WL:Uso=NO}                            => {TGT:RepTime=Soon} 0.009428836  0.7972973 0.01182600 3.365494   295
[22] {CV:Bodytype=A_class_hatchback,                                                                              
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.7951482 0.01185796 3.356422   295
[23] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:FreqCost=Low cost,                                                                                      
      DMG:FreqService=mobilty,                                                                                    
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009428836  0.7951482 0.01185796 3.356422   295
[24] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:FreqCost=Low cost,                                                                                      
      DMG:LastCost=Low cost,                                                                                      
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009460798  0.7914439 0.01195385 3.340786   296
[25] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:FreqCost=Low cost,                                                                                      
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastCost=Low cost}                => {TGT:RepTime=Soon} 0.009428836  0.7908847 0.01192188 3.338426   295
[26] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:LastCost=Low cost,                                                                                      
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009460798  0.7851459 0.01204973 3.314201   296
[27] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:Freq=4+,                                                                                                
      DMG:FreqService=mobilty,                                                                                    
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009492761  0.7836412 0.01211366 3.307850   297
[28] {CV:Bodytype=A_class_hatchback,                                                                              
      DMG:Freq=4+,                                                                                                
      DMG:FreqCost=Low cost,                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                        
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.011762074  0.7780127 0.01511810 3.284091   368
[29] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:FreqCost=Low cost,                                                                                      
      DMG:FreqService=mobilty,                                                                                    
      DMG:LastCost=Low cost}                => {TGT:RepTime=Soon} 0.009492761  0.7774869 0.01220954 3.281872   297
[30] {CV:Bodytype=A_class_hatchback,                                                                              
      CV:Edad=0-2A,                                                                                               
      DMG:FreqCost=Low cost,                                                                                      
      DMG:LastCost=Low cost,                                                                                      
      DMG:Recent=<3M}                       => {TGT:RepTime=Soon} 0.009460798  0.7748691 0.01220954 3.270822   296
# Ordenadas por soporte
inspect(head(sort(reglas_pruned, by="support"), 30))
     lhs                           rhs                   support confidence  coverage     lift count
[1]  {DMG:Freq=4+,                                                                                  
      DMG:FreqCost=Low cost}    => {TGT:RepTime=Soon} 0.17825295  0.3368771 0.5291335 1.422001  5577
[2]  {DMG:Freq=4+,                                                                                  
      DMG:FreqCost=Low cost}    => {TGT:RepTime=Mid}  0.16016237  0.3026880 0.5291335 1.355015  5011
[3]  {CV:Edad=0-2A}             => {TGT:RepTime=Soon} 0.14597117  0.3398571 0.4295075 1.434580  4567
[4]  {CV:Edad=0-2A,                                                                                 
      DMG:Tuvo=SI}              => {TGT:RepTime=Soon} 0.14577940  0.3405510 0.4280692 1.437509  4561
[5]  {CV:Edad=0-2A,                                                                                 
      DMG:Freq=4+}              => {TGT:RepTime=Soon} 0.13647841  0.3841655 0.3552594 1.621612  4270
[6]  {CV:Edad=0-2A,                                                                                 
      WL:Uso=NO}                => {TGT:RepTime=Soon} 0.13641449  0.3416040 0.3993352 1.441954  4268
[7]  {CV:Edad=0-2A}             => {TGT:RepTime=Mid}  0.12973439  0.3020539 0.4295075 1.352176  4059
[8]  {CV:Edad=0-2A,                                                                                 
      DMG:Tuvo=SI}              => {TGT:RepTime=Mid}  0.12963851  0.3028448 0.4280692 1.355717  4056
[9]  {CV:Edad=0-2A,                                                                                 
      DMG:FreqCost=Low cost}    => {TGT:RepTime=Soon} 0.12829610  0.3852207 0.3330457 1.626066  4014
[10] {CV:Edad=0-2A,                                                                                 
      DMG:Freq=4+,                                                                                  
      WL:Uso=NO}                => {TGT:RepTime=Soon} 0.12772078  0.3884514 0.3287947 1.639703  3996
[11] {CV:Edad=0-2A,                                                                                 
      DMG:Freq=4+,                                                                                  
      DMG:FreqCost=Low cost}    => {TGT:RepTime=Soon} 0.12343785  0.4182822 0.2951066 1.765623  3862
[12] {CV:Edad=0-2A,                                                                                 
      DMG:Freq=4+}              => {TGT:RepTime=Mid}  0.12161601  0.3423302 0.3552594 1.532477  3805
[13] {CV:Edad=0-2A,                                                                                 
      DMG:FreqCost=Low cost,                                                                        
      WL:Uso=NO}                => {TGT:RepTime=Soon} 0.11992201  0.3872033 0.3097133 1.634435  3752
[14] {DMG:Recent=<3M}           => {TGT:RepTime=Soon} 0.11806821  0.3843113 0.3072203 1.622227  3694
[15] {CV:Edad=0-2A,                                                                                 
      DMG:Freq=4+,                                                                                  
      DMG:FreqCost=Low cost,                                                                        
      WL:Uso=NO}                => {TGT:RepTime=Soon} 0.11557516  0.4228251 0.2733404 1.784799  3616
[16] {DMG:Freq=4+,                                                                                  
      DMG:LastCost=Low cost}    => {TGT:RepTime=Soon} 0.11225109  0.3515867 0.3192700 1.484093  3512
[17] {DMG:Freq=4+,                                                                                  
      DMG:Recent=<3M}           => {TGT:RepTime=Soon} 0.11199540  0.4285190 0.2613546 1.808834  3504
[18] {DMG:Recent=<3M,                                                                               
      WL:Uso=NO}                => {TGT:RepTime=Soon} 0.11161185  0.3866253 0.2886822 1.631995  3492
[19] {DMG:FreqCost=Low cost,                                                                        
      DMG:Recent=<3M}           => {TGT:RepTime=Soon} 0.10742481  0.4394613 0.2444466 1.855022  3361
[20] {CV:Edad=0-2A,                                                                                 
      DMG:FreqCost=Low cost}    => {TGT:RepTime=Mid}  0.10643398  0.3195777 0.3330457 1.430624  3330
[21] {DMG:Freq=4+,                                                                                  
      DMG:Recent=<3M,                                                                               
      WL:Uso=NO}                => {TGT:RepTime=Soon} 0.10621025  0.4342088 0.2446064 1.832851  3323
[22] {DMG:Freq=4+,                                                                                  
      DMG:FreqCost=Low cost,                                                                        
      DMG:Recent=<3M}           => {TGT:RepTime=Soon} 0.10397290  0.4765602 0.2181737 2.011622  3253
[23] {DMG:Freq=4+,                                                                                  
      DMG:FreqCost=Low cost,                                                                        
      DMG:LastCost=Low cost}    => {TGT:RepTime=Soon} 0.10323777  0.3621076 0.2851024 1.528503  3230
[24] {CV:Edad=0-2A,                                                                                 
      DMG:Freq=4+,                                                                                  
      DMG:FreqCost=Low cost}    => {TGT:RepTime=Mid}  0.10211909  0.3460414 0.2951066 1.549091  3195
[25] {DMG:FreqCost=Low cost,                                                                        
      DMG:Recent=<3M,                                                                               
      WL:Uso=NO}                => {TGT:RepTime=Soon} 0.10112826  0.4447568 0.2273788 1.877375  3164
[26] {DMG:Freq=4+,                                                                                  
      DMG:FreqCost=Low cost,                                                                        
      DMG:Recent=<3M,                                                                               
      WL:Uso=NO}                => {TGT:RepTime=Soon} 0.09821971  0.4856962 0.2022246 2.050186  3073
[27] {DMG:FreqService=Warranty} => {TGT:RepTime=Mid}  0.09767635  0.3230785 0.3023300 1.446295  3056
[28] {CV:Edad=0-2A,                                                                                 
      DMG:Recent=<3M}           => {TGT:RepTime=Soon} 0.09716496  0.4788156 0.2029277 2.021142  3040
[29] {DMG:Freq=4+,                                                                                  
      DMG:LastCost=Low cost}    => {TGT:RepTime=Mid}  0.09604628  0.3008309 0.3192700 1.346702  3005
[30] {DMG:FreqService=Warranty} => {TGT:RepTime=Soon} 0.09540704  0.3155725 0.3023300 1.332072  2985

5.1.5 Reglas genéricas

Aparte de las reglas que desembocan en información de la variable objetivo, puede ser interesante ver la interacción genérica de todos los ítems de todos los datasets. Para ello, aplicamos el algoritmo Apriori a todo el conjunto de transacciones, sin filtrar por las variables objetivo.

print(paste("Ejecutando apriori con supp=", min_support, "y conf=", min_confidence, " para reglas genéricas"))
[1] "Ejecutando apriori con supp= 0.005 y conf= 0.3  para reglas genéricas"
reglas_genericas <- apriori(transaction_mercedes,
                  parameter = list(supp = min_support,
                                   conf = min_confidence,
                                   minlen = 2,
                                   target = "rules"))
Apriori

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

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[202 item(s), 31287 transaction(s)] done [0.01s].
sorting and recoding items ... [99 item(s)] done [0.00s].
creating transaction tree ... done [0.01s].
checking subsets of size 1 2 3 4 5 6 7 8 9 10
Warning in apriori(transaction_mercedes, parameter = list(supp = min_support, :
Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!
 done [0.18s].
writing ... [701276 rule(s)] done [0.07s].
creating S4 object  ... done [0.13s].
# Resumen inicial
summary(reglas_genericas)
set of 701276 rules

rule length distribution (lhs + rhs):sizes
     2      3      4      5      6      7      8      9     10 
  1009  11366  46052  96061 129176 135462 123614  96908  61628 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   6.000   7.000   6.989   8.000  10.000 

summary of quality measures:
    support           confidence        coverage             lift         
 Min.   :0.005018   Min.   :0.3000   Min.   :0.005018   Min.   :  0.4213  
 1st Qu.:0.007096   1st Qu.:0.8957   1st Qu.:0.007096   1st Qu.:  1.4040  
 Median :0.007543   Median :1.0000   Median :0.007543   Median :  2.6568  
 Mean   :0.009652   Mean   :0.8991   Mean   :0.012345   Mean   : 14.1280  
 3rd Qu.:0.007703   3rd Qu.:1.0000   3rd Qu.:0.010260   3rd Qu.: 18.1059  
 Max.   :0.944482   Max.   :1.0000   Max.   :0.994598   Max.   :104.6388  
     count      
 Min.   :  157  
 1st Qu.:  222  
 Median :  236  
 Mean   :  302  
 3rd Qu.:  241  
 Max.   :29550  

mining info:
                 data ntransactions support confidence
 transaction_mercedes         31287   0.005        0.3
                                                                                                                            call
 apriori(data = transaction_mercedes, parameter = list(supp = min_support, conf = min_confidence, minlen = 2, target = "rules"))

5.1.5.1 Filtrado de las reglas genéricas

Procediendo exactamente igual que antes, aplicamos los mismos filtros de redundancia, significación, tautología e intra-dominio a las reglas genéricas. Esto nos permitirá obtener un conjunto de reglas más manejable y relevante.

# Aplicamos todos los filtros redundantes, significativos, tautológicos e intra-dominio 
reglas_genericas <- reglas_genericas[!is.redundant(reglas_genericas)]
reglas_genericas <- reglas_genericas[is.significant(reglas_genericas, transaction_mercedes)]

# Aplicar el filtro tautologico
keep_rules_definitional_logical <- !sapply(1:length(reglas_genericas), function(i) {
  is_definitional_rule(reglas_genericas[i], wl_usage_item, dmg_usage_item)
})
reglas_genericas <- reglas_genericas[keep_rules_definitional_logical]

# Aplicar el filtro intra-dominio
keep_rules_cross_domain_logical <- !sapply(1:length(reglas_pruned), function(i) {
  is_strictly_intra_domain_rule(reglas_genericas[i])
})
reglas_genericas <- reglas_genericas[keep_rules_cross_domain_logical]

summary(reglas_genericas)
set of 41036 rules

rule length distribution (lhs + rhs):sizes
    2     3     4     5     6     7     8     9 
  401  5155 12982 13937  6788  1559   209     5 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2.00    4.00    5.00    4.66    5.00    9.00 

summary of quality measures:
    support           confidence        coverage             lift        
 Min.   :0.005018   Min.   :0.3000   Min.   :0.005018   Min.   :  1.002  
 1st Qu.:0.006776   1st Qu.:0.5435   1st Qu.:0.007959   1st Qu.:  1.444  
 Median :0.007671   Median :0.7904   Median :0.011698   Median :  2.111  
 Mean   :0.013633   Mean   :0.7416   Mean   :0.021253   Mean   :  9.207  
 3rd Qu.:0.011730   3rd Qu.:0.9621   3rd Qu.:0.019305   3rd Qu.:  3.445  
 Max.   :0.944482   Max.   :1.0000   Max.   :0.994598   Max.   :104.639  
     count        
 Min.   :  157.0  
 1st Qu.:  212.0  
 Median :  240.0  
 Mean   :  426.5  
 3rd Qu.:  367.0  
 Max.   :29550.0  

mining info:
                 data ntransactions support confidence
 transaction_mercedes         31287   0.005        0.3
                                                                                                                            call
 apriori(data = transaction_mercedes, parameter = list(supp = min_support, conf = min_confidence, minlen = 2, target = "rules"))

5.1.5.2 Inspección de reglas genéricas

# Ordenadas por lift
inspect(head(sort(reglas_genericas, by="lift"), 30))
     lhs                               rhs                                 support confidence    coverage     lift count
[1]  {CV:Bodytype=GLC_class_suv,                                                                                        
      WL:FreqBodytype=G_class_suv}  => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[2]  {DMG:Recent=>1A,                                                                                                   
      WL:Activity=Media(2-5),                                                                                           
      WL:FreqBodytype=G_class_suv}  => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[3]  {DMG:LastService=mobilty,                                                                                          
      DMG:Recent=>1A,                                                                                                   
      WL:FreqBodytype=G_class_suv}  => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[4]  {DMG:LastCost=Low cost,                                                                                            
      DMG:LastService=mobilty,                                                                                          
      WL:FreqBodytype=G_class_suv}  => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[5]  {CV:Edad=6+A,                                                                                                      
      DMG:Recent=>1A,                                                                                                   
      WL:FreqBodytype=G_class_suv}  => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[6]  {CV:Edad=6+A,                                                                                                      
      DMG:FreqService=Warranty,                                                                                         
      WL:FreqBodytype=G_class_suv}  => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[7]  {CV:Edad=6+A,                                                                                                      
      DMG:FreqCost=Low cost,                                                                                            
      WL:FreqBodytype=G_class_suv}  => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[8]  {DMG:FreqService=Warranty,                                                                                         
      DMG:Recent=>1A,                                                                                                   
      WL:FreqBodytype=G_class_suv}  => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[9]  {CV:Bodytype=GLC_class_suv,                                                                                        
      WL:Activity=Media(2-5),                                                                                           
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[10] {CV:Bodytype=GLC_class_suv,                                                                                        
      CV:Edad=6+A,                                                                                                      
      WL:FreqType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[11] {CV:Edad=6+A,                                                                                                      
      WL:Activity=Media(2-5),                                                                                           
      WL:FreqBodytype=G_class_suv,                                                                                      
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[12] {CV:Edad=6+A,                                                                                                      
      DMG:Freq=4+,                                                                                                      
      WL:FreqBodytype=G_class_suv,                                                                                      
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[13] {CV:Edad=6+A,                                                                                                      
      DMG:FreqService=Warranty,                                                                                         
      WL:Activity=Media(2-5),                                                                                           
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[14] {DMG:FreqService=Warranty,                                                                                         
      DMG:Recent=>1A,                                                                                                   
      WL:Activity=Media(2-5),                                                                                           
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[15] {CV:Bodytype=GLC_class_suv,                                                                                        
      DMG:FreqCost=Low cost,                                                                                            
      DMG:FreqService=Warranty,                                                                                         
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[16] {CV:Edad=6+A,                                                                                                      
      DMG:FreqService=Warranty,                                                                                         
      DMG:LastService=mobilty,                                                                                          
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[17] {CV:Edad=6+A,                                                                                                      
      DMG:LastCost=Low cost,                                                                                            
      DMG:LastService=mobilty,                                                                                          
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[18] {DMG:FreqService=Warranty,                                                                                         
      DMG:LastCost=Low cost,                                                                                            
      DMG:LastService=mobilty,                                                                                          
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[19] {CV:Edad=6+A,                                                                                                      
      DMG:Freq=4+,                                                                                                      
      DMG:Recent=>1A,                                                                                                   
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[20] {CV:Edad=6+A,                                                                                                      
      DMG:Freq=4+,                                                                                                      
      DMG:FreqService=Warranty,                                                                                         
      WL:LastType=CONFIGURATION}    => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[21] {CV:Bodytype=GLC_class_suv,                                                                                        
      CV:Edad=6+A,                                                                                                      
      DMG:LastService=mobilty,                                                                                          
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[22] {CV:Bodytype=GLC_class_suv,                                                                                        
      DMG:FreqService=Warranty,                                                                                         
      DMG:LastService=mobilty,                                                                                          
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[23] {CV:Bodytype=GLC_class_suv,                                                                                        
      DMG:Freq=4+,                                                                                                      
      DMG:LastService=mobilty,                                                                                          
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[24] {CV:Bodytype=GLC_class_suv,                                                                                        
      CV:Edad=6+A,                                                                                                      
      DMG:FreqService=Warranty,                                                                                         
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[25] {CV:Bodytype=GLC_class_suv,                                                                                        
      CV:Edad=6+A,                                                                                                      
      DMG:LastCost=Low cost,                                                                                            
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[26] {CV:Bodytype=GLC_class_suv,                                                                                        
      CV:Edad=6+A,                                                                                                      
      DMG:Freq=4+,                                                                                                      
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[27] {CV:Bodytype=GLC_class_suv,                                                                                        
      CV:Edad=6+A,                                                                                                      
      DMG:FreqCost=Low cost,                                                                                            
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[28] {CV:Edad=6+A,                                                                                                      
      DMG:LastService=mobilty,                                                                                          
      DMG:Recent=>1A,                                                                                                   
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[29] {CV:Edad=6+A,                                                                                                      
      DMG:FreqService=Warranty,                                                                                         
      DMG:LastService=mobilty,                                                                                          
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
[30] {DMG:FreqService=Warranty,                                                                                         
      DMG:LastService=mobilty,                                                                                          
      DMG:Recent=>1A,                                                                                                   
      WL:Activity=Media(2-5)}       => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.6388   236
# Ordenadas por confianza
inspect(head(sort(reglas_genericas, by="confidence"), 30))
     lhs                                            rhs                                 support confidence    coverage       lift count
[1]  {TGT:NextBodytype=CLA_class_shooting_brake} => {DMG:Tuvo=SI}                   0.033048870          1 0.033048870   1.005431  1034
[2]  {CV:Bodytype=V_class_van}                   => {DMG:Tuvo=SI}                   0.043532458          1 0.043532458   1.005431  1362
[3]  {DMG:FreqService=POW,                                                                                                             
      DMG:LastService=POW}                       => {WL:Uso=NO}                     0.009588647          1 0.009588647   1.058459   300
[4]  {CV:Edad=6+A,                                                                                                                     
      DMG:FreqService=POW}                       => {WL:Uso=NO}                     0.006871864          1 0.006871864   1.058459   215
[5]  {DMG:FreqService=POW,                                                                                                             
      DMG:Recent=>1A}                            => {WL:Uso=NO}                     0.005561415          1 0.005561415   1.058459   174
[6]  {CV:Bodytype=CLS_class_coupe,                                                                                                     
      DMG:LastCost=Medium-high cost}             => {WL:Uso=NO}                     0.008406047          1 0.008406047   1.058459   263
[7]  {CV:Bodytype=CLS_class_coupe,                                                                                                     
      TGT:RepTime=Mid}                           => {DMG:FreqCost=Low cost}         0.005561415          1 0.005561415   1.404012   174
[8]  {CV:Bodytype=CLS_class_coupe,                                                                                                     
      TGT:RepTime=Mid}                           => {WL:Uso=NO}                     0.005561415          1 0.005561415   1.058459   174
[9]  {CV:Bodytype=CLS_class_coupe,                                                                                                     
      DMG:Recent=<3M}                            => {DMG:Freq=4+}                   0.005145907          1 0.005145907   1.458194   161
[10] {CV:Bodytype=CLS_class_coupe,                                                                                                     
      DMG:Recent=<3M}                            => {WL:Uso=NO}                     0.005145907          1 0.005145907   1.058459   161
[11] {CV:Bodytype=CLS_class_coupe,                                                                                                     
      DMG:FreqService=KDM Campaign Claims}       => {WL:Uso=NO}                     0.005305718          1 0.005305718   1.058459   166
[12] {CV:Bodytype=CLS_class_coupe,                                                                                                     
      CV:Edad=0-2A}                              => {WL:Uso=NO}                     0.009013328          1 0.009013328   1.058459   282
[13] {CV:Bodytype=CLS_class_coupe,                                                                                                     
      DMG:Freq=4+}                               => {WL:Uso=NO}                     0.009908269          1 0.009908269   1.058459   310
[14] {CV:Bodytype=CLE_class_coupe,                                                                                                     
      TGT:RepTime=Soon}                          => {WL:Uso=NO}                     0.005497491          1 0.005497491   1.058459   172
[15] {CV:Bodytype=CLE_class_coupe,                                                                                                     
      DMG:Recent=<3M}                            => {WL:Uso=NO}                     0.010291814          1 0.010291814   1.058459   322
[16] {CV:Bodytype=GLC_class_suv,                                                                                                       
      WL:LastBodytype=GLS_class_suv}             => {WL:FreqBodytype=G_class_suv}   0.007543069          1 0.007543069  80.636598   236
[17] {CV:Bodytype=GLC_class_suv,                                                                                                       
      WL:FreqBodytype=G_class_suv}               => {WL:LastBodytype=GLS_class_suv} 0.007543069          1 0.007543069 104.638796   236
[18] {DMG:FreqService=Warranty,                                                                                                        
      WL:LastBodytype=GLS_class_suv}             => {WL:FreqBodytype=G_class_suv}   0.007543069          1 0.007543069  80.636598   236
[19] {WL:FreqBodytype=G_class_suv,                                                                                                     
      WL:LastBodytype=GLS_class_suv}             => {DMG:LastCost=Low cost}         0.009173139          1 0.009173139   2.120865   287
[20] {WL:FreqBodytype=G_class_suv,                                                                                                     
      WL:LastBodytype=GLS_class_suv}             => {DMG:Freq=4+}                   0.009173139          1 0.009173139   1.458194   287
[21] {WL:FreqBodytype=G_class_suv,                                                                                                     
      WL:LastBodytype=GLS_class_suv}             => {DMG:FreqCost=Low cost}         0.009173139          1 0.009173139   1.404012   287
[22] {CV:Bodytype=GLC_class_suv,                                                                                                       
      WL:LastBodytype=GLS_class_suv}             => {WL:LastType=CONFIGURATION}     0.007543069          1 0.007543069  65.045738   236
[23] {DMG:LastService=mobilty,                                                                                                         
      WL:LastBodytype=GLS_class_suv}             => {WL:LastType=CONFIGURATION}     0.007575031          1 0.007575031  65.045738   237
[24] {CV:Edad=6+A,                                                                                                                     
      WL:LastBodytype=GLS_class_suv}             => {WL:LastType=CONFIGURATION}     0.007575031          1 0.007575031  65.045738   237
[25] {DMG:FreqService=Warranty,                                                                                                        
      WL:LastBodytype=GLS_class_suv}             => {WL:LastType=CONFIGURATION}     0.007543069          1 0.007543069  65.045738   236
[26] {CV:Bodytype=GLC_class_suv,                                                                                                       
      WL:LastBodytype=GLS_class_suv}             => {WL:Activity=Media(2-5)}        0.007543069          1 0.007543069  23.090037   236
[27] {DMG:FreqService=Warranty,                                                                                                        
      WL:LastBodytype=GLS_class_suv}             => {WL:Activity=Media(2-5)}        0.007543069          1 0.007543069  23.090037   236
[28] {WL:Activity=Media(2-5),                                                                                                          
      WL:LastBodytype=GLS_class_suv}             => {DMG:Freq=4+}                   0.009492761          1 0.009492761   1.458194   297
[29] {WL:Activity=Media(2-5),                                                                                                          
      WL:LastBodytype=GLS_class_suv}             => {DMG:FreqCost=Low cost}         0.009492761          1 0.009492761   1.404012   297
[30] {CV:Bodytype=GLC_class_suv,                                                                                                       
      WL:LastBodytype=GLS_class_suv}             => {WL:FreqType=CONFIGURATION}     0.007543069          1 0.007543069  22.095339   236
# Ordenadas por soporte
inspect(head(sort(reglas_genericas, by="support"), 30))
     lhs                                       rhs                                     support confidence  coverage     lift count
[1]  {WL:Uso=NO}                            => {DMG:Tuvo=SI}                         0.9444817  0.9996955 0.9447694 1.005125 29550
[2]  {DMG:Tuvo=SI}                          => {WL:Uso=NO}                           0.9444817  0.9496112 0.9945984 1.005125 29550
[3]  {DMG:LastCost=Low cost}                => {WL:Uso=NO}                           0.4532873  0.9613612 0.4715057 1.017562 14182
[4]  {WL:Uso=NO}                            => {DMG:LastCost=Low cost}               0.4532873  0.4797862 0.9447694 1.017562 14182
[5]  {DMG:Tuvo=SI,                                                                                                                
      WL:Uso=NO}                            => {DMG:LastCost=Low cost}               0.4532873  0.4799323 0.9444817 1.017872 14182
[6]  {CV:Edad=0-2A}                         => {DMG:Tuvo=SI}                         0.4280692  0.9966513 0.4295075 1.002064 13393
[7]  {DMG:Tuvo=SI}                          => {CV:Edad=0-2A}                        0.4280692  0.4303940 0.9945984 1.002064 13393
[8]  {DMG:FreqCost=Low cost,                                                                                                      
      WL:Uso=NO}                            => {DMG:LastCost=Low cost}               0.4158596  0.6185111 0.6723559 1.311779 13011
[9]  {CV:Edad=0-2A,                                                                                                               
      WL:Uso=NO}                            => {DMG:Tuvo=SI}                         0.3992393  0.9997599 0.3993352 1.005190 12491
[10] {DMG:LastService=KDM Campaign Claims}  => {WL:Uso=NO}                           0.3760667  0.9707921 0.3873813 1.027544 11766
[11] {WL:Uso=NO}                            => {DMG:LastService=KDM Campaign Claims} 0.3760667  0.3980514 0.9447694 1.027544 11766
[12] {DMG:Tuvo=SI,                                                                                                                
      WL:Uso=NO}                            => {DMG:LastService=KDM Campaign Claims} 0.3760667  0.3981726 0.9444817 1.027857 11766
[13] {DMG:Recent=3M-1A}                     => {WL:Uso=NO}                           0.3567936  0.9596802 0.3717838 1.015782 11163
[14] {WL:Uso=NO}                            => {DMG:Recent=3M-1A}                    0.3567936  0.3776515 0.9447694 1.015782 11163
[15] {DMG:Tuvo=SI,                                                                                                                
      WL:Uso=NO}                            => {DMG:Recent=3M-1A}                    0.3567936  0.3777665 0.9444817 1.016092 11163
[16] {CV:Edad=0-2A}                         => {DMG:Freq=4+}                         0.3552594  0.8271320 0.4295075 1.206119 11115
[17] {DMG:Freq=4+}                          => {CV:Edad=0-2A}                        0.3552594  0.5180369 0.6857800 1.206119 11115
[18] {CV:Edad=0-2A,                                                                                                               
      DMG:Tuvo=SI}                          => {DMG:Freq=4+}                         0.3552594  0.8299111 0.4280692 1.210171 11115
[19] {DMG:FreqCost=Low cost,                                                                                                      
      WL:Uso=NO}                            => {DMG:LastService=KDM Campaign Claims} 0.3358583  0.4995246 0.6723559 1.289491 10508
[20] {CV:Edad=0-2A}                         => {DMG:FreqCost=Low cost}               0.3330457  0.7754130 0.4295075 1.088689 10420
[21] {DMG:FreqCost=Low cost}                => {CV:Edad=0-2A}                        0.3330457  0.4676001 0.7122447 1.088689 10420
[22] {CV:Edad=0-2A,                                                                                                               
      DMG:Tuvo=SI}                          => {DMG:FreqCost=Low cost}               0.3330457  0.7780184 0.4280692 1.092347 10420
[23] {DMG:LastCost=Low cost,                                                                                                      
      DMG:LastService=KDM Campaign Claims}  => {WL:Uso=NO}                           0.3274523  0.9808521 0.3338447 1.038192 10245
[24] {DMG:LastService=KDM Campaign Claims,                                                                                        
      WL:Uso=NO}                            => {DMG:LastCost=Low cost}               0.3274523  0.8707292 0.3760667 1.846699 10245
[25] {DMG:LastCost=Low cost,                                                                                                      
      WL:Uso=NO}                            => {DMG:LastService=KDM Campaign Claims} 0.3274523  0.7223946 0.4532873 1.864815 10245
[26] {CV:Edad=0-2A,                                                                                                               
      WL:Uso=NO}                            => {DMG:FreqCost=Low cost}               0.3097133  0.7755723 0.3993352 1.088913  9690
[27] {DMG:LastCost=Low cost,                                                                                                      
      DMG:LastService=KDM Campaign Claims}  => {DMG:FreqCost=Low cost}               0.3089462  0.9254189 0.3338447 1.299299  9666
[28] {DMG:FreqCost=Low cost,                                                                                                      
      DMG:LastService=KDM Campaign Claims}  => {DMG:LastCost=Low cost}               0.3089462  0.8916152 0.3465017 1.890995  9666
[29] {DMG:FreqCost=Low cost,                                                                                                      
      DMG:LastCost=Low cost}                => {DMG:LastService=KDM Campaign Claims} 0.3089462  0.7126742 0.4335027 1.839723  9666
[30] {DMG:FreqCost=Low cost,                                                                                                      
      DMG:LastService=KDM Campaign Claims,                                                                                        
      WL:Uso=NO}                            => {DMG:LastCost=Low cost}               0.3030012  0.9021698 0.3358583 1.913380  9480

5.1.6 Conclusiones arules

El análisis de reglas de asociación, tras un exhaustivo proceso de filtrado, ha revelado patrones significativos en el comportamiento de los clientes y las interacciones entre sus características. La inspección de las reglas a través de las métricas de lift, confianza y soporte ofrece una visión multifacética:

5.1.6.1 Conclusiones de las reglas de target

5.1.6.1.1 Predicción de TGT:NextBodytype
  • Lealtad extrema al modelo actual en V-Class Van
    • Las reglas con mayor lift (≈16–17) son del tipo
      {CV:Bodytype=V_class_van, DMG:Recent=<3M, WL:Uso=NO} ⇒ {TGT:NextBodytype=V_class_van}
      y variantes con distintas categorías de coste de reparación (Low cost, Medium-low cost).
    • Implicación: los propietarios de V-Class que han tenido un daño reciente y no usan la wishlist muestran una propensión muy superior (>16x) a recomprar la misma furgoneta.
  • Fidelidad significativa en EQE Sedan
    • Reglas como
      {CV:Bodytype=EQE_class_sedan, DMG:Recent=3M-1A} ⇒ {TGT:NextBodytype=EQE_class_sedan}
      con lift ≈16 y confianza ≈0.38.
    • Implicación: los dueños de EQE que tuvieron un daño hace entre 3 meses y 1 año tienen ~16x más probabilidades de volver a elegir el mismo bodytype.
5.1.6.1.2 Predicción de TGT:RepTime
  • “Soon” en A-Class Hatchback tras servicios de movilidad y campañas KDM
    • Máxima confidence (≈0.82) en reglas del tipo
      {CV:Bodytype=A_class_hatchback, CV:Edad=0-2A, DMG:FreqService=mobilty, DMG:LastService=KDM Campaign Claims, DMG:Recent=<3M} ⇒ {TGT:RepTime=Soon}
    • Implicación: clientes jóvenes de A-Class con historial de reparaciones de movilidad y campañas KDM muy recientes tienden a recomprar pronto.
  • Perfiles de alta frecuencia de daños y coste bajo predicen recompra rápida
    • Con soporte elevado (>0.11) y lift ≈1.8, reglas como
      {DMG:Freq=4+, DMG:LastCost=Low cost, DMG:Recent=<3M} ⇒ {TGT:RepTime=Soon}
    • Implicación: clientes con múltiples visitas de bajo coste y recencia de daño <3 meses tienen ~2x más probabilidad de recompra inmediata.
  • Vehículos jóvenes (CV:Edad=0-2A) como factor de recompra
    • Soporte alto (>0.13) y lift ≈1.4 en
      {CV:Edad=0-2A} ⇒ {TGT:RepTime=Soon}
    • Implicación: los coches nuevos inducen una tendencia general a ciclos de recompra más cortos.

5.1.6.2 Conclusiones de las reglas genéricas

5.1.6.2.1 Comportamiento de wishlist en GLC→GLS
  • Reglas con lift ≈100 y confidence=1 del tipo
    {CV:Bodytype=GLC_class_suv, WL:FreqBodytype=G_class_suv} ⇒ {WL:LastBodytype=GLS_class_suv}
  • Implicación: toda la submuestra de propietarios de GLC que consultan con frecuencia SUVs de la clase G acaba configurando GLS como último interés.
5.1.6.2.2 Daño como impulsor de inactividad en wishlist
  • {WL:Uso=NO} ⇒ {DMG:Tuvo=SI} y viceversa, con soporte ~0.94 y confidence ~0.95–0.999
  • Implicación: la gran mayoría de los clientes que no usan la wishlist han sufrido al menos un daño, y casi todos los que han tenido daños no usan la wishlist.
5.1.6.2.3 Coste bajo de daño refuerza la no-actividad
  • {DMG:LastCost=Low cost} ⇒ {WL:Uso=NO} con soporte ~0.45 y confidence ~0.96
  • Implicación: los daños de bajo coste desalientan el uso de la wishlist en casi la mitad de la base de clientes.

5.2 Paquete fcaR

El Análisis Formal de Conceptos (FCA) es otra técnica para explorar relaciones en los datos. A diferencia de las reglas de asociación que buscan implicaciones (si A entonces B), FCA identifica “conceptos”, que son grupos de objetos (en nuestro caso, clientes) que comparten un conjunto común de atributos (las características o items que hemos definido). Estos conceptos se organizan en una estructura jerárquica llamada retículo de conceptos.

Dado que ya hemos analizado con arules las implicaciones desde el punto de vista del soporte, confianza y elevación, podemos usar fcaR para:

  1. Identificar perfiles de clientes basados en conjuntos de características compartidas.

  2. Visualizar cómo estos perfiles se relacionan entre sí.

Para ello necesitamos una matriz binaria (TRUE/FALSE) de clientes x items. El objeto transaction_mercedes de arules es una representación sparse, podemos convertirlo a una matriz lógica.

5.2.1 Creación de matriz binaria

# Convertir el objeto transactions a una matriz lógica
# Primero, obtenemos los nombres de los items y los clientes
item_labels <- itemLabels(transaction_mercedes)
customer_ids_fca <- transaction_data_df$customer_id # O transaction_data_df$customer_id si prefieres

# Usamos as(transaction_mercedes, "matrix") que devuelve una matriz lógica directamente
binary_matrix_fca <- as(transaction_mercedes, "matrix")
colnames(binary_matrix_fca) <- item_labels # Asegurar nombres de columnas
rownames(binary_matrix_fca) <- customer_ids_fca # Asegurar nombres de filas
print(paste("Dimensiones de la matriz binaria para FCA:", paste(dim(binary_matrix_fca), collapse="x")))
[1] "Dimensiones de la matriz binaria para FCA: 31287x202"

5.2.2 Filtrado de la matriz binaria y búsqueda de conceptos

Como la matriz binaria puede ser muy grande, es recomendable trabajar con un subconjunto de los items más frecuentes. Esto no solo facilita la visualización y hace que se pueda ejecutar find_concepts() en un tiempo asumible, sino que también ayuda a identificar patrones más relevantes.

# Saco la frecuencia de los items
all_item_frequencies <- itemFrequency(transaction_mercedes, type="absolute")
sorted_frequencies <- sort(all_item_frequencies, decreasing = TRUE)

# Cojo los n items más frecuentes
top_n_val <- 20
top_items_names_fca <- names(head(sorted_frequencies, top_n_val))

# Filtro la matriz
binary_matrix_fca_subset <- binary_matrix_fca[, top_items_names_fca, drop = FALSE]

# Creo el contexto formal y encuentro los conceptos
fc <- FormalContext$new(binary_matrix_fca_subset); fc
FormalContext with 31287 objects and 20 attributes.
                                                          DMG:Tuvo=SI  WL:Uso=NO  
 00044ab8958c8cdf0b5e56eb43ff3aba4541c699d3f31d6e555934ef      X           X      
 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380      X           X      
 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380      X           X      
 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380      X           X      
 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380      X           X      
 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380      X           X      
 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380      X           X      
 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380      X           X      
 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380      X           X      
 000b7927a082cf83d67c1a7f877525d3963b201ef0f81cda9b88f380      X           X      
Other attributes are: DMG:FreqCost=Low cost, DMG:Freq=4+, DMG:LastCost=Low cost,
CV:Edad=0-2A, DMG:LastService=KDM Campaign Claims, DMG:Recent=3M-1A, ... 
fc$find_concepts()

5.2.3 Resumen de conceptos

Como la información de cada concepto es muy densa (debido a la naturaleza de los objetos del contexto formal, es decir, de los ids de los clientes), resumir los conceptos encontrados por fcaR es una gran idea.

Para ello, creamos una función que extrae el número de clientes del concepto (pues lo más importante no es saber quién tiene un comportamiento, sino cuántos lo tienen) y los atributos asociados al concepto y la organiza en un data frame. Esta función toma como entrada los conceptos y un vector de nombres de atributos (que se generó previamente) para mapear los índices de los atributos a sus nombres legibles.

summarize_fca_concepts <- function(concepts, attribute_names_map) {
  if (is.null(concepts) || length(concepts) == 0) {
    warning("Input concepts is NULL or empty. Returning an empty data frame.")
    return(data.frame(
      num_customers = integer(),
      attributes = character(),
      support = numeric(),
      stringsAsFactors = FALSE
    ))
  }

  concept_data_list <- lapply(seq_along(concepts), function(i) {
    concept <- concepts[i]
    
    # Extraer nombre de atributos
    attribute_indices <- which(as.logical(concept$intents())) 
    current_attribute_names_vec <- attribute_names_map[attribute_indices]
    
    # Convertir el vector de atributos a una sola cadena de texto
    attributes_string <- if (length(current_attribute_names_vec) > 0 && !all(is.na(current_attribute_names_vec))) {
      paste(current_attribute_names_vec[!is.na(current_attribute_names_vec)], collapse = ", ")
    } else {
      "Ninguno"
    }
    
    # Extraer numero de clientes
    num_customers_val <- length(which(as.logical(concept$extents())))
    
    # Lista que será fila de data frame
    list(
      num_customers = num_customers_val,
      attributes = attributes_string,
      support = concept$support() 
    )
  })

  concepts_df <- do.call(rbind.data.frame, concept_data_list)
  # Asegurarse de que los tipos de datos son correctos
  concepts_df$num_customers <- as.integer(concepts_df$num_customers)
  concepts_df$attributes <- as.list(concepts_df$attributes)
  concepts_df$support <- as.numeric(concepts_df$support) # Should already be numeric

  # Ordenar por soporte
  concepts_df <- concepts_df |> arrange(desc(support))

  return(concepts_df)
}

summary_conceptos <- summarize_fca_concepts(fc$concepts, top_items_names_fca)
print(knitr::kable(head(summary_conceptos, 50), caption = "Primeras 50 filas de Conceptos Resumidos y Ordenados"))


Table: Primeras 50 filas de Conceptos Resumidos y Ordenados

| num_customers|attributes                                                                                                |   support|
|-------------:|:---------------------------------------------------------------------------------------------------------|---------:|
|         31287|Ninguno                                                                                                   | 1.0000000|
|         31118|DMG:Tuvo=SI                                                                                               | 0.9945984|
|         29559|WL:Uso=NO                                                                                                 | 0.9447694|
|         29550|DMG:Tuvo=SI, WL:Uso=NO                                                                                    | 0.9444817|
|         22284|DMG:Tuvo=SI, DMG:FreqCost=Low cost                                                                        | 0.7122447|
|         21456|DMG:Tuvo=SI, DMG:Freq=4+                                                                                  | 0.6857800|
|         21036|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost                                                             | 0.6723559|
|         20107|DMG:Tuvo=SI, WL:Uso=NO, DMG:Freq=4+                                                                       | 0.6426631|
|         16555|DMG:Tuvo=SI, DMG:FreqCost=Low cost, DMG:Freq=4+                                                           | 0.5291335|
|         15432|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost, DMG:Freq=4+                                                | 0.4932400|
|         14752|DMG:Tuvo=SI, DMG:LastCost=Low cost                                                                        | 0.4715057|
|         14182|DMG:Tuvo=SI, WL:Uso=NO, DMG:LastCost=Low cost                                                             | 0.4532873|
|         13563|DMG:Tuvo=SI, DMG:FreqCost=Low cost, DMG:LastCost=Low cost                                                 | 0.4335027|
|         13438|CV:Edad=0-2A                                                                                              | 0.4295075|
|         13393|DMG:Tuvo=SI, CV:Edad=0-2A                                                                                 | 0.4280692|
|         13011|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost, DMG:LastCost=Low cost                                      | 0.4158596|
|         12494|WL:Uso=NO, CV:Edad=0-2A                                                                                   | 0.3993352|
|         12491|DMG:Tuvo=SI, WL:Uso=NO, CV:Edad=0-2A                                                                      | 0.3992393|
|         12120|DMG:Tuvo=SI, DMG:LastService=KDM Campaign Claims                                                          | 0.3873813|
|         11766|DMG:Tuvo=SI, WL:Uso=NO, DMG:LastService=KDM Campaign Claims                                               | 0.3760667|
|         11632|DMG:Tuvo=SI, DMG:Recent=3M-1A                                                                             | 0.3717838|
|         11163|DMG:Tuvo=SI, WL:Uso=NO, DMG:Recent=3M-1A                                                                  | 0.3567936|
|         11115|DMG:Tuvo=SI, DMG:Freq=4+, CV:Edad=0-2A                                                                    | 0.3552594|
|         10841|DMG:Tuvo=SI, DMG:FreqCost=Low cost, DMG:LastService=KDM Campaign Claims                                   | 0.3465017|
|         10508|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost, DMG:LastService=KDM Campaign Claims                        | 0.3358583|
|         10500|DMG:Tuvo=SI, DMG:FreqService=KDM Campaign Claims                                                          | 0.3356026|
|         10445|DMG:Tuvo=SI, DMG:LastCost=Low cost, DMG:LastService=KDM Campaign Claims                                   | 0.3338447|
|         10420|DMG:Tuvo=SI, DMG:FreqCost=Low cost, CV:Edad=0-2A                                                          | 0.3330457|
|         10287|DMG:Tuvo=SI, WL:Uso=NO, DMG:Freq=4+, CV:Edad=0-2A                                                         | 0.3287947|
|         10245|DMG:Tuvo=SI, WL:Uso=NO, DMG:LastCost=Low cost, DMG:LastService=KDM Campaign Claims                        | 0.3274523|
|          9989|DMG:Tuvo=SI, DMG:Freq=4+, DMG:LastCost=Low cost                                                           | 0.3192700|
|          9874|DMG:Tuvo=SI, DMG:Recent=>1A                                                                               | 0.3155943|
|          9812|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqService=KDM Campaign Claims                                               | 0.3136127|
|          9690|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost, CV:Edad=0-2A                                               | 0.3097133|
|          9666|DMG:Tuvo=SI, DMG:FreqCost=Low cost, DMG:LastCost=Low cost, DMG:LastService=KDM Campaign Claims            | 0.3089462|
|          9612|DMG:Tuvo=SI, DMG:Recent=<3M                                                                               | 0.3072203|
|          9509|DMG:Tuvo=SI, WL:Uso=NO, DMG:Freq=4+, DMG:LastCost=Low cost                                                | 0.3039281|
|          9506|DMG:Tuvo=SI, DMG:FreqCost=Low cost, DMG:FreqService=KDM Campaign Claims                                   | 0.3038323|
|          9480|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost, DMG:LastCost=Low cost, DMG:LastService=KDM Campaign Claims | 0.3030012|
|          9459|DMG:Tuvo=SI, DMG:FreqService=Warranty                                                                     | 0.3023300|
|          9355|DMG:Tuvo=SI, WL:Uso=NO, DMG:Recent=>1A                                                                    | 0.2990060|
|          9250|DMG:Tuvo=SI, DMG:LastService=Warranty                                                                     | 0.2956500|
|          9233|DMG:Tuvo=SI, DMG:FreqCost=Low cost, DMG:Freq=4+, CV:Edad=0-2A                                             | 0.2951066|
|          9032|DMG:Tuvo=SI, WL:Uso=NO, DMG:Recent=<3M                                                                    | 0.2886822|
|          8920|DMG:Tuvo=SI, DMG:FreqCost=Low cost, DMG:Freq=4+, DMG:LastCost=Low cost                                    | 0.2851024|
|          8919|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqService=Warranty                                                          | 0.2850705|
|          8908|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost, DMG:FreqService=KDM Campaign Claims                        | 0.2847189|
|          8582|DMG:Tuvo=SI, WL:Uso=NO, DMG:LastService=Warranty                                                          | 0.2742992|
|          8552|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost, DMG:Freq=4+, CV:Edad=0-2A                                  | 0.2733404|
|          8454|DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost, DMG:Freq=4+, DMG:LastCost=Low cost                         | 0.2702081|

5.2.4 Conclusiones fcaR

El Análisis Formal de Conceptos (FCA), aplicado sobre los 20 ítems más frecuentes, complementa el análisis de reglas de asociación al identificar perfiles de clientes (conceptos) basados en conjuntos de características compartidas. Estos conceptos, ordenados por su soporte (proporción de clientes que pertenecen al concepto), revelan las combinaciones de atributos más comunes en la base de clientes.

Aunque este análisis no predice directamente TGT:NextBodytype o TGT:RepTime (ya que las variables objetivo no se incluyeron como atributos en la generación de conceptos para FCA), sí define los segmentos de clientes subyacentes sobre los cuales operan las reglas predictivas.

  1. Dominancia absoluta del perfil “con daño y sin uso de wishlist”:
    • El concepto más fundamental después del universal (todos los clientes) es {DMG:Tuvo=SI} (99% de los clientes), seguido de cerca por {WL:Uso=NO} (97% de los clientes).
    • Crucialmente, el concepto {DMG:Tuvo=SI, WL:Uso=NO} (97% de los clientes) es prácticamente igual de grande. Esto subraya que la gran mayoría de la base de clientes ha experimentado daños y no utiliza la wishlist. Este es el contexto principal para cualquier estrategia.
  2. Relevancia del “coste bajo de daño” en la segmentación:
    • Un subgrupo muy significativo (59% del total) se define por {DMG:Tuvo=SI, DMG:FreqCost=Low cost}.
    • Este perfil se refina aún más al añadir el no uso de la wishlist: {DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost} representa al 58% de los clientes. Esto indica que más de la mitad de los clientes han tenido daños de bajo coste y no usan la wishlist. Esto puede indicar conformidad con su vehículo actual o una falta de interés en explorar opciones alternativas.
  3. Perfiles distintivos por edad del vehículo (CV:Edad):
    • Vehículos de edad media (3-5 Años): aproximadamente el 39% de los clientes tienen vehículos en este rango de edad. Este grupo se combina consistentemente con haber tenido daños y no usar la wishlist, formando el concepto {DMG:Tuvo=SI, WL:Uso=NO, CV:Edad=3-5A} que agrupa al 38% de los clientes. De nuevo, esto puede denotar conformidad con el vehículo actual.
    • Vehículos antiguos (6+ Años): alrededor del 30% de los clientes poseen vehículos más antiguos. De manera similar, el concepto {DMG:Tuvo=SI, WL:Uso=NO, CV:Edad=6+A} representa al 29% de la base de clientes.
  4. Impacto de la frecuencia de daños y servicios específicos (KDM):
    • Un segmento considerable (46%) se caracteriza por alta frecuencia de daños (DMG:Freq=4+) dentro del grupo que ya tuvo daños. Al igual que otros perfiles, este se combina fuertemente con el no uso de la wishlist ({DMG:Tuvo=SI, WL:Uso=NO, DMG:Freq=4+} con 45% de soporte).
    • Los servicios de KDM Campaign Claims (tanto DMG:LastService como DMG:FreqService) aparecen en conceptos que agrupan a más del 36% de los clientes que han tenido daños. Estos también se asocian frecuentemente con WL:Uso=NO y DMG:FreqCost=Low cost.

5.2.4.1 Implicaciones estratégicas de los perfiles FCA

  • Comprensión profunda de la base de clientes: FCA proporciona una “radiografía” de los segmentos más comunes. Las reglas de asociación predictivas (vistas anteriormente) actúan sobre estos perfiles. Por ejemplo, cuando una regla indica que {CV:Bodytype=V_class_van, CV:Edad=0-2A, DMG:Freq=4+, WL:Uso=NO} predice la recompra del mismo modelo, FCA nos ayuda a entender que el componente {DMG:Freq=4+, WL:Uso=NO} es parte de un perfil muy extendido.
  • Refinamiento de la segmentación para campañas: aunque los conceptos FCA no son directamente predictivos de las variables TGT (por diseño de este análisis FCA específico), los perfiles identificados (ej. “Daño bajo coste, No Wishlist”, “Vehículo antiguo, Daño, No Wishlist”) son grupos homogéneos a los que se pueden dirigir mensajes o estrategias generales, complementando las acciones más específicas derivadas de arules.
  • Refuerzo de la necesidad de investigar el no uso de la wishlist: la omnipresencia de WL:Uso=NO en casi todos los conceptos de alto soporte, especialmente en combinación con DMG:Tuvo=SI, reitera la importancia estratégica de entender las barreras para el uso de la wishlist, particularmente después de un incidente con el vehículo.
  • Identificación de oportunidades en segmentos comunes: los perfiles mayoritarios como {DMG:Tuvo=SI, WL:Uso=NO, DMG:FreqCost=Low cost} (58% de clientes) o {DMG:Tuvo=SI, WL:Uso=NO, CV:Edad=3-5A} (38% de clientes) son tan grandes que cualquier mejora en la interacción o conversión dentro de ellos tendría un impacto significativo.