4  Creación de variables objetivo

Author

Rubén Oliva Zamora

4.1 Creación de variables objetivo

En esta primera sección definimos dos variables clave que servirán de base para los modelos de recompra de Mercedes-Benz:

  • next_repurchase_date: fecha estimada de la siguiente compra del cliente.
  • next_class_bodytype: tipo de carrocería (class_bodytype) del vehículo que probablemente adquirirá.

4.1.1 Preparación de datos de vehículos para consulta rápida

Crearemos una tabla simple (vehicle_class_lookup) que nos permita encontrar rápidamente el class_bodytype de cualquier vehicle_id. Esto es útil porque la información de class_bodytype está en vehicle_data_cleaned, y la necesitaremos para la “siguiente” compra.

vehicle_class_lookup <- vehicle_data_cleaned |>
  select(vehicle_id, class_bodytype_of_next_vehicle = class_bodytype) |>
  distinct(vehicle_id, .keep_all = TRUE) 

4.1.2 Identificación de la siguiente compra y su fecha

Para cada compra en customer_vehicle_pt_cleaned, se busca la fecha de la siguiente compra del mismo cliente y el vehicle_id de esa siguiente compra.

customer_vehicle_pt_with_targets <- customer_vehicle_pt_cleaned |>
  # Ordenar las compras
  arrange(customer_id, valid_from) |>
  
  # Agrupar por cliente
  group_by(customer_id) |>
  
  # Encontrar la información de la siguiente compra
  mutate(
    next_repurchase_date = lead(valid_from), # siguiente valid_from
    next_vehicle_id_temp = lead(vehicle_id) # siguiente vehicle_id
  ) |>
  
  # Desagrupar
  ungroup()

4.1.3 Obtención del tipo de carrocería del siguiente vehículo

Se utiliza el next_vehicle_id_temp (ID del siguiente vehículo) para encontrar su class_bodytype usando la tabla vehicle_class_lookup.

customer_vehicle_pt_with_targets <- customer_vehicle_pt_with_targets |>
  left_join(vehicle_class_lookup, by = c("next_vehicle_id_temp" = "vehicle_id")) |>
  rename(next_class_bodytype = class_bodytype_of_next_vehicle) |>
  select(-next_vehicle_id_temp)

Los valores NA en next_class_bodytype indican que no hay una compra futura registrada para ese cliente. Esto puede ocurrir si el cliente no ha realizado compras adicionales o si la fecha de la siguiente compra es posterior a la última fecha de análisis.

4.2 Creación de variables adicionales

En el contexto de este proyecto, la creación de variables adicionales (features) es fundamental para enriquecer el análisis y mejorar la capacidad predictiva de los modelos de recompra y personalización de campañas de Mercedes-Benz, aportando información relevante más allá de las variables objetivo.

4.2.1 Cálculo del tiempo hasta la siguiente compra

Se calcula la diferencia de tiempo (en días) entre la compra actual y la next_repurchase_date encontrada anteriormente. Esta variable numérica (time_until_next_purchase_days) es esencial, ya que indica cuánto tiempo transcurre antes de que un cliente realice su próxima compra y será la base para la posterior categorización.

customer_vehicle_pt_with_targets <- customer_vehicle_pt_with_targets |>
  mutate(
    time_until_next_purchase_days = if_else(
      !is.na(next_repurchase_date), 
      as.numeric(difftime(next_repurchase_date, valid_from, units = "days")),
      NA_real_ 
    )
  )

4.2.2 Categorización del tiempo hasta la siguiente compra

Para facilitar el análisis y el uso en determinados modelos (como las reglas de asociación que se explorarán con arules), se categoriza la variable time_until_next_purchase_days previamente calculada. Esta categorización agrupa los tiempos en rangos significativos (“Soon”, “Mid”, “Late”) basados en cuantiles, lo que puede ayudar a identificar patrones de recompra.

# Calcular los puntos de corte (cuantiles)
quantiles_time <- quantile(customer_vehicle_pt_with_targets$time_until_next_purchase_days, 
                           probs = c(0.33, 0.66), na.rm = TRUE)

# Crear la nueva columna categórica
customer_vehicle_pt_with_targets <- customer_vehicle_pt_with_targets |>
  mutate(
    time_until_next_purchase_category = case_when(
      is.na(time_until_next_purchase_days) ~ NA_character_,
      time_until_next_purchase_days <= quantiles_time[1] ~ "Soon",
      time_until_next_purchase_days <= quantiles_time[2] ~ "Mid",
      TRUE ~ "Late"
    ),
    time_until_next_purchase_category = factor(time_until_next_purchase_category, 
                                               levels = c("Soon", "Mid", "Late"))
  )