Predicción del éxito de un programa de recompensas en Starbucks.

'Predicting the success of a rewards program at Starbucks.'

Explicación paso a paso para principiantes de un proyecto completo, desde el inicio hasta el final

Foto de Robert Linder en Unsplash

Resumen del proyecto

Este proyecto se centra en identificar ofertas de programas de recompensas que involucren efectivamente a los clientes actuales de Starbucks y atraigan a nuevos.

Starbucks es una empresa impulsada por datos que invierte en obtener una comprensión completa de sus clientes utilizando conjuntos de datos que contienen información de clientes, ofertas especiales y datos de transacciones.

Para desarrollar un modelo capaz de determinar el éxito de un programa de recompensas, dividí el proyecto en tres fases:

  1. Inspeccionar y limpiar los datos proporcionados por Udacity.
  2. Crear un conjunto de datos que combine toda la información relevante.
  3. Construir y evaluar el rendimiento de tres modelos de clasificación para predecir el éxito o fracaso de un programa de recompensas para una persona específica.

Declaración del problema

Tomar una inversión significativa en una campaña de marketing es una decisión compleja que requiere la aprobación de varias partes interesadas, recursos financieros y tiempo. Por lo tanto, tener un modelo predictivo que pueda clasificar si vale la pena lanzar una oferta particular para un grupo objetivo específico se convierte en un activo estratégico para cualquier empresa.

Para crear este modelo, emplearemos técnicas de aprendizaje supervisado para la clasificación binaria.

El resultado del modelo indicará si se espera que la oferta sea efectiva o no.

Exploración y limpieza de datos

Udacity nos ha proporcionado tres conjuntos de datos en formato JSON: portafolio, perfil y transcripción. Cada conjunto de datos sirve a un propósito diferente y proporciona información valiosa para nuestro análisis.

Conjunto de datos de portafolio

Este conjunto de datos proporciona información sobre las ofertas activas disponibles en Starbucks.

  • id (cadena) — identificación de la oferta
  • offer_type (cadena) — tipo de oferta, es decir, BOGO, descuento, informativo
  • difficulty (int) — gasto mínimo requerido para completar una oferta
  • reward (int) — recompensa otorgada por completar una oferta
  • duration (int) — tiempo que la oferta está abierta, en días
  • canales (lista de cadenas)
Conjunto de datos de portafolio (original) - Imagen de (autor) Erdem Isbilen

Hay diez filas y seis columnas en el conjunto de datos del portafolio. Es un conjunto de datos simple sin valores faltantes, nulos o duplicados.

Las columnas ‘canales’, ‘id’, ‘offer_type’ son categóricas, mientras que ‘difficulty’, ‘duration’, ‘reward’ son enteros.

A continuación se muestran las modificaciones que he hecho en el conjunto de datos:

  • codificar uno por uno los ’ canales’ y ‘offer_type’
  • cambiar el ‘id’ por ‘offer_id’
Conjunto de datos de portafolio (después de la limpieza de datos) - Imagen de (autor) Erdem Isbilen

Conjunto de datos de perfil

El conjunto de datos del perfil contiene información demográfica sobre los clientes de Starbucks.

  • edad (int) — edad del cliente
  • became_member_on (int) — fecha en que el cliente creó una cuenta de la aplicación
  • género (str) — género del cliente (nota: algunas entradas contienen “O” para otro en lugar de M o F)
  • id (str) — identificación del cliente
  • ingreso (float) — ingresos del cliente
Conjunto de datos del perfil (original) — Imagen de (autor) Erdem Isbilen

Hay 17000 filas (número de personas únicas en el conjunto de datos) y 5 columnas en este conjunto de datos con 2175 elementos nulos (tanto en las columnas de género e ingreso). Como el valor de edad también es 118 en estas filas, eliminé las 2175 filas del conjunto de datos.

A continuación se muestran las modificaciones realizadas en el conjunto de datos:

  • eliminar 2175 filas con valor faltante (también con valor de edad de 118)
  • cambiar ‘id’ por ‘customer_id’
  • conversión de cadena de ‘become_member_on’ a fecha
  • creación de las columnas ‘year_joined’ y ‘membership_days’
  • codificación one-hot del ‘género’
  • creación de ‘age_group’ para categorizar a los clientes como adolescentes, adultos jóvenes, adultos, ancianos
  • creación de ‘income_range’ para categorizar a los clientes como promedio, por encima del promedio, alto
  • creación de ‘member_type’ para categorizar a los clientes como nuevo, regular, leal
Conjunto de datos del perfil (después del procesamiento de datos) — Imagen de (autor) Erdem Isbilen

Se observa que el número de personas que se unen al programa tiene una tendencia creciente entre los años 2013 y 2017, siendo 2017 el mejor año. El 50% de los miembros tienen entre 42 y 66 años.

Gráficos de histograma de las columnas de edad, ingresos, año de unión — Imagen de (autor) Erdem Isbilen

Como se puede ver a continuación, la población masculina supera a la población femenina en la zona de ingresos bajos y promedio, mientras que la población femenina supera a la población masculina en la zona de ingresos altos.

Gráficos de histograma de ingresos mostrados por separado en diferentes grupos de género — Imagen de (autor) Erdem Isbilen

Al considerar el género, el conjunto de datos está un poco sesgado, ya que el número de población masculina supera a la población femenina y hay un pequeño número de personas en la categoría de otros. Hablando con cifras exactas; hay 8484 hombres, 6129 mujeres y solo 212 otros en el conjunto de datos.

Gráficos de histograma de género — Imagen de (autor) Erdem Isbilen

Conjunto de datos de transcripción

El conjunto de datos de transcripción captura las interacciones de los clientes con las ofertas.

  • evento (str) — descripción del registro (transacción, oferta recibida, oferta vista, etc.)
  • persona (str) — identificación del cliente
  • tiempo (int) — tiempo en horas desde el inicio de la prueba. Los datos comienzan en el tiempo t=0
  • valor (dict de cadenas) — ya sea un id de oferta o la cantidad de la transacción dependiendo del registro
Conjunto de datos de transcripción (original) — Imagen de (autor) Erdem Isbilen

Si un evento en el conjunto de datos de transcripción corresponde a uno de los tres posibles estados de oferta (vista, recibida o completada), la columna de valor contiene el id de la oferta. Además del id de oferta, habrá un valor de recompensa en caso de que el evento esté en estado de ‘oferta completada’.

Sin embargo, si el evento es una transacción, la columna de valor solo mostrará el monto de la transacción.

A continuación se muestran las modificaciones que he realizado en el conjunto de datos:

  • Expandir el valor de ‘value’ en nuevas columnas de ‘offer_id’, ‘amount’ y ‘rewards’.
  • Crear ‘time_in_days’ convirtiendo las horas en días.
  • Cambiar ‘persona’ por ‘customer_id’
  • Dividir el conjunto de datos de transcripción en dos subconjuntos de datos como offer_tr (datos de oferta) y transaction_tr (datos de transacciones)
Conjunto de datos offer_tr (después de la limpieza de datos) — Imagen de (autor) Erdem Isbilen

Construyendo los modelos

Una vez que los conjuntos de datos han sido limpiados y se han realizado las modificaciones necesarias, debemos combinarlos en un solo conjunto de datos. Luego crearemos una nueva columna llamada offer_successful. Esta columna indicará si la oferta fue exitosa o no para un cliente en particular. Esto nos permitirá construir modelos que puedan predecir si una determinada oferta será exitosa para un tipo de cliente en particular.

Un cliente debe ver y completar una oferta dentro del marco de tiempo permitido para que se considere exitosa. He desarrollado una función de soporte que calcula el valor objetivo considerando los datos de las ofertas que se han completado y visto, así como el rango de tiempo entre esos eventos.

Para crear un modelo que pueda predecir si una oferta será exitosa o no, necesitamos entrenar un modelo en el conjunto de datos final.

Los números de ofertas exitosas y no exitosas son 35136 y 31365 respectivamente. Lo que significa que tenemos un conjunto de datos equilibrado considerando el objetivo. Por lo tanto, no tenemos ninguna limitación (que viene con conjuntos de datos no equilibrados) con respecto a los modelos que podemos elegir.

Como este es un problema de clasificación binaria, usaremos tres algoritmos de aprendizaje supervisado diferentes:

  • Regresión logística
  • Random Forest
  • Gradient Boosting

Usaré RandomizedSearchCV con 12 iteraciones para optimizar los hiperparámetros de los modelos, ya que es menos costoso computacionalmente que GridSearchCV. RandomizedSearchCV funciona seleccionando aleatoriamente valores de hiperparámetros de una distribución especificada.

Métricas y Resultados

Utilizaré la matriz de confusión y las métricas que se mencionan a continuación para evaluar el rendimiento de los modelos.

Estaré enfocándome específicamente en la precisión ya que el propósito principal del estudio es definir las clases positivas tanto como sea posible.

  • Exactitud: La exactitud es la métrica más común utilizada para evaluar la precisión de un modelo de clasificación. Se calcula dividiendo el número de predicciones correctas por el número total de predicciones.
  • Precisión: La precisión es una medida de qué tan precisa es el modelo cuando predice una clase positiva. Se calcula dividiendo el número de verdaderos positivos por el número de verdaderos positivos más el número de falsos positivos.
  • Recall: Recall es una medida de qué tan completo es el modelo cuando predice una clase positiva. Se calcula dividiendo el número de verdaderos positivos por el número de verdaderos positivos más el número de falsos negativos.
  • Puntuación F1: La puntuación F1 es un promedio ponderado de precisión y recall. Se calcula dividiendo 2 * (precisión * recall) entre (precisión + recall).

Resultados:

  • Regresión Logística ……. → Exactitud: 0.69 , Precisión: 0.66
  • Random Forest …………. → Exactitud: 0.70 , Precisión: 0.66
  • Gradient Boosting ……… → Exactitud: 0.69 , Precisión: 0.66

Aunque todos los modelos proporcionan métricas de rendimiento similares, Random Forest tiene una exactitud ligeramente mejor.

Conclusión y Mejoras

Aunque los modelos proporcionan un buen punto de partida, los resultados con una precisión del %66 tienen margen para mejoras.

Una mejora interesante para este proyecto es crear múltiples modelos de aprendizaje supervisado y combinarlos en un modelo de ensamblado personalizado. Crear un modelo de ensamblado combinando múltiples modelos de aprendizaje supervisado ofrece la ventaja de la compensación de errores. Al aprovechar las fortalezas de diferentes modelos y compensar sus debilidades, el modelo de ensamblado logra un mejor rendimiento de generalización, lo que lleva a una mayor precisión y robustez.

Para mejorar la precisión de nuestras predicciones de programas de recompensas, podríamos considerar separar los diferentes tipos de recompensas y desarrollar modelos individuales para cada programa. Al adoptar este enfoque, podemos adaptar nuestras técnicas de modelado a las características y objetivos específicos de cada programa de recompensas, lo que finalmente lleva a predicciones más precisas y mejores resultados. Este enfoque también puede ayudarnos a identificar cualquier tendencia o patrón único dentro de cada programa de recompensas, lo que lleva a un diseño e implementación de programa más efectivo.

Otra forma de optimizar la efectividad de nuestro programa de recompensas es identificar y excluir a las personas que compran independientemente de los programas de recompensas. Al hacerlo, podemos enfocar nuestros recursos en aquellos que son más propensos a tener un impacto positivo en los resultados del programa, lo que finalmente maximiza los beneficios que obtenemos del programa.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Investigadores del MIT descubren nuevos conocimientos sobre las conexiones cerebro-auditivas con modelos avanzados de redes neuronales

En un estudio innovador, investigadores del MIT han indagado en el ámbito de las redes neuronales profundas, con el o...

Inteligencia Artificial

Quantización GPTQ en un modelo Llama 2 7B Fine-Tuned con HuggingFace

En mi artículo anterior, te mostré cómo ajustar finamente el nuevo modelo Llama 2, recién lanzado por Meta AI, para c...

Inteligencia Artificial

Conoce CommonCanvas Un modelo de difusión abierto que ha sido entrenado usando imágenes con licencia Creative Commons

La inteligencia artificial ha avanzado significativamente en la generación de texto a imagen en los últimos años. Tra...

Inteligencia Artificial

Tres formas en que la IA generativa puede reforzar la ciberseguridad

Los analistas humanos ya no pueden defenderse de manera efectiva ante la creciente velocidad y complejidad de los ata...