Analizando una campaña de marketing con pandas 

Como les he estado compartiendo esta semana, el A/B testing es una de las formas más comunes para el análisis de datos en marketing digital, pero hay mucho más allá que simplemente evaluar 2 variables independientes.

Hay una metodología establecida, unas pruebas estadísticas a evaluar y estrategias de programación, ya sea en python o R para llevar a cabo un buen análisis de datos enfocado a este método. 

En este gráfico te dejo el resumen de como funciona un A/B testing. Si quieres saber más sobre el proceso adecuado para llevar a cabo un test A/B te comparto el siguiente post

Ahora, antes de ejecutar cualquier prueba vamos a determinar

  • ¿Cual es el resultado esperado del test?
  • ¿Cual es nuestra hipótesis?
  • ¿Cual es la métrica que estamos tratando de impactar (número de clics, tasa de apertura de un correo?
  • ¿Tendremos suficiente tráfico en nuestro sitio web para alcanzar estadísticos importantes para tomar decisiones? 

Test de personalización de EMAIL

Se realizó un test A/B en un campaña de Email marketing donde la mitad de los correos enviados fueron de ventas genéricas para un producto del cliente, mientras que la otra mitad contenía mensajes personalizados para cada uno de los clientes

  • Nuestra hipótesis: Los correos con personalización tienen mayor tasa de conversión 
  • Métrica a tener en cuenta: Tasa de conversión del correo electrónico 
  1. Verificamos que se hayan asignado de forma aleatoria de igual medida para el grupo control y el grupo de prueba 
email = df[df['marketing_channel'] =='Email']
alloc = email.groupby(["variant"]) ["user_id"].nunique()
alloc.plot(kind="bar")
plt.title("Asignación de prueba para personalización")
plt.ylabel("# de participantes")
plt.show()

La distribución es relativamente uniforme así que nos funciona

2. Vamos a ver la tasa de conversión para el control y la personalización

Dado que elegimos la tasa de conversión como nuestra métrica. Es importante evaluar si la conversión fue mayor en el test de personalización comparada con la de control

Para esto mediremos la diferencia entre la métrica clave, el control e igualmente para la personalización para evaluar el éxito de la prueba 

Configuramos los datos para evaluar la prueba 

  • Agrupemos a marketing por id del usuario y la variante
suscribers = email.groupby(["user_id", "variant"])["converted"].max()
suscribers_df = pd.DataFrame(suscribers.unstack(level=1))
  • Eliminamos los valores nulos de la columna de control
control = suscribers_df["control"].dropna()
  • Eliminamos los valores faltantes de la columna de personalización
personalization = suscribers_df["personalization"].dropna()
  • Tasa de conversión de cada una
print("Control convertion rate:", np.mean(control))
print("Personalization conversion rate", np.mean(personalization)

RESULTADO

Control convertion rate: 0.2814814814814815
Personalization conversion rate 0.3908450704225352

Claramente la prueba de personalización obtuvo una mayor conversión

Pero ahora vamos a hacer testing 

Cálculo de elevación (lift) y prueba de significación 

Crear una funcion de elevacion 

Para los modelos de clasificación, esta función crea una ‘gráfica de elevación’ que describe qué tan bien un modelo clasifica las muestras para una clase

El lift (elevación) se encuentra calculando la diferencia entre el efecto del tratamiento (o la media) en comparación con el efecto del tratamiento del control dividido por el efecto del tratamiento del control suena confuso pero así se vería la fórmula 

Tasa de conversión del tratamiento — tasa de conversión del control/tasa de conversión del control 

Ahora vamos a crear una función para automatizar el proceso de calculo del lift (porque automatizar esta bien y es bonito)

Tip 

Lift puede ser calculado en python de la siguiente manera

(treatment - control)/control

Ahora vamos al código

def lift(a,b):
a_mean = np.mean(a)
b_mean = np.mean(b)

#Calculamos el lift usando a_mean y b_mean

lift = (b_mean-a_mean)/a_mean
return str(round(lift*100, 2)) + "%"
print (lift(control,personalization))

RESULTADO

38.85%

Evaluación de la significancia estadística

Ahora que sabemos que la variable de personalización superó al control, vamos a determinar el resultado estadístico significativo. Es muy importante implementar modelos estadísticos en la evaluación de cualquier test que estemos realizando, para así tener datos reales sobre lo que estamos haciendo

TIP

Implementar el test en python Recuerde que usamos el control y la personalización como entradas

stats.ttest_ind()

Ahora nos preguntamos ¿Es la diferencia entre el control y la personalización estadísticamente significativa? 

Para eso como indicamos en el código vamos a usar la distribución T (T-student)

https://www.enciclopediafinanciera.com/definicion-prueba-t-de-student.html

Valores P, la estadística T de 1.96 es típicamente estadísticamente significativo al 95% dependiendo de la prueba este valor puede ser superior e inferior según la prueba 

from scipy.stats import ttest_ind
t = ttest_ind(control, personalization)
t

RESULTADO

Ttest_indResult(statistic=-2.7343299447505074, pvalue=0.006451487844694175)

Los resultados son estadísticamente significativos con valor de P=0.006

Aplicar pruebas de A/B para determinar ciertos factores de nuestras estrategias de marketing tienen gran valor y resultados significativos. Experimentar de forma correcta con las bases de estadistica y matematicas indicadas nos puede brindar datos mas tangibles y reales 

Todo el código puedes encontrarlo aqui https://github.com/Nataceved/a-b-testing

A/B TESTING resultados con código y análisis en pandas