Análisis de cohortes
Paso a paso en python

El análisis de cohortes es una técnica muy útil y relativamente simple que ayuda a obtener información valiosa sobre el comportamiento de los clientes / usuarios de cualquier empresa. Para el análisis, podemos centrarnos en diferentes métricas (dependiendo del modelo de negocio): conversión, retención, ingresos generados, etc.

En este artículo, proporciono una breve introducción teórica al análisis de cohortes y muestro cómo llevarlo a cabo en Python.

Introducción al análisis de cohortes

Empecemos con lo básico. Un cohorte es un grupo de personas que comparten algo en común, como la fecha de registro en una aplicación, el mes de la primera compra, la ubicación geográfica, el canal de adquisición (usuarios orgánicos, provenientes del marketing de resultados, etc.) y pronto.En Análisis de cohorte, hacemos un seguimiento de estos grupos de usuarios a lo largo del tiempo para identificar algunos patrones o comportamientos comunes.

Al realizar el análisis de cohorte, es fundamental considerar la relación entre la métrica que estamos rastreando y el modelo de negocio. Dependiendo de los objetivos de la empresa, podemos centrarnos en la retención de usuarios, la tasa de conversión (suscribirse a la versión paga del servicio), los ingresos generados, etc.

En este artículo, cubro el caso de la retención de usuarios . Al comprender la retención de usuarios, podemos inferir la rigidez / lealtad de los clientes y evaluar la salud del negocio. Es importante recordar que los valores de retención esperados varían mucho entre las empresas, 3 compras al año para un minorista pueden ser mucho, mientras que para otro pueden ser demasiado pequeñas.

Retener clientes es fundamental para cualquier negocio, ya que es mucho más barato retener a los clientes actuales (mediante el uso de herramientas CRM, descuentos para miembros, etc.) que adquirir nuevos.

Además, el análisis de cohortes también puede ayudar a observar el impacto de los cambios en el producto en el comportamiento del usuario, ya sean cambios de diseño o características completamente nuevas. Al ver cómo se comportan los grupos a lo largo del tiempo, podemos observar más o menos si nuestros esfuerzos tuvieron algún efecto en los usuarios.

Esto debería ser suficiente teoría por ahora, pasemos al ejemplo de la vida real.

Configuración

En este artículo, usaremos las siguientes bibliotecas:


import pandas as pd
import matplotlib.pyplot as plt
import warnings
import seaborn as sns
from operator import attrgetter
import matplotlib.colors as mcolors

El conjunto de datos

Usaremos un conjunto de datos descargado del Repositorio de aprendizaje automático de UCI , que es una gran fuente para diferentes tipos de conjuntos de datos. Ya están etiquetados según el área de aprendizaje automático para el que se pueden utilizar:

  • supervisado (regresión / clasificación),
  • sin supervisión (agrupación).

Puede encontrar el conjunto de datos aquí . Alternativamente, puede descargar los datos directamente desde Jupyter Notebook usando la siguiente línea:

! wget https://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx

El conjunto de datos se puede describir brevemente como: “Este es un conjunto de datos transnacionales que contiene todas las transacciones que ocurren entre el 01/12/2010 y el 09/12/2011 para una tienda minorista en línea registrada y con sede en el Reino Unido. La empresa vende principalmente regalos únicos para todas las ocasiones. Muchos clientes de la empresa son mayoristas ”.

A continuación, cargamos los datos del archivo de Excel.

Los datos cargados tienen el siguiente aspecto:

También inspeccionamos el DataFrame usando df.info()para ver si faltan valores. En cuanto al análisis, debido al hecho de que necesitamos tener los ID de cliente, descartamos todas las filas sin ellos.

df.dropna (subconjunto = ['CustomerID'], inplace = True)

En aras de la integridad, también hacemos una EDA muy rápida, con un enfoque en los usuarios. EDA es siempre un paso muy importante de cualquier análisis, ya que descubrimos los detalles del conjunto de datos con el que estamos trabajando.

Comenzamos inspeccionando la distribución de las variables numéricas: cantidad y precio unitario.

df.describe (). transpose ()

En la tabla anterior, podemos ver que hay pedidos con cantidad negativa, lo más probable es que sean devoluciones. En total, hay alrededor de 9 mil compras con cantidad negativa. Los eliminamos del conjunto de datos. Esto introduce una especie de sesgo, ya que incluimos los pedidos iniciales y eliminamos la devolución, de esta manera se tiene en cuenta el pedido inicial aunque en teoría no se realizó y no generó ingresos. Sin embargo, para simplificar, dejamos el pedido inicial, ya que para métricas como la retención (que indica el compromiso de los clientes), esta debe ser una suposición válida.

Luego, calculamos una métrica agregada que indica cuántos pedidos realizó cada cliente.

Usando el código anterior, podemos afirmar que el 65,57% de los clientes ordenó más de una vez. Esta ya es una información valiosa, ya que parece que los clientes están realizando varios pedidos. Esto significa que habrá al menos algo de retención. Dado que el conjunto de datos no tiene una fecha de registro / unión, sería problemático si la mayoría de los usuarios solo hicieran un pedido, pero volveremos a él más tarde.

Además, observamos la distribución del número de pedidos por cliente. Para eso, podemos reutilizar los datos agregados previamente ( n_orders) y trazar los datos en un histograma.

La ejecución del código genera el siguiente gráfico:

Hay algunos casos poco frecuentes de clientes que pidieron más de 50 veces.

Análisis de cohorte

El conjunto de datos que estamos usando para este ejemplo no contiene la fecha de registro del cliente, la fecha en la que se registró con el minorista. Por eso asumimos que la cohorte a la que pertenecen se basa en la primera fecha de compra. Una posible desventaja de este enfoque es que el conjunto de datos no contiene los datos pasados ​​y lo que ya vemos en esta instantánea (entre el 01/12/2010 y el 09/12/2011) incluye clientes recurrentes. En otras palabras, la primera compra que vemos en este conjunto de datos podría no ser la primera compra real de un cliente determinado. Sin embargo, no hay forma de dar cuenta de esto sin tener acceso a todo el conjunto de datos históricos del minorista.

Como primer paso, mantenemos solo las columnas relevantes y eliminamos los valores duplicados: un pedido (indicado por InvoiceNo) puede contener varios elementos (indicado por StockCode).

Como segundo paso, creamos las variables cohorty order_month. El primero indica la cohorte mensual en función de la primera fecha de compra (calculada por cliente). Este último es el mes truncado de la fecha de compra.

Luego, agregamos los datos por cohorty order_monthcontamos el número de clientes únicos en cada grupo. Adicionalmente, agregamos el period_number, que indica el número de periodos entre el mes de la cohorte y el mes de la compra.

El siguiente paso es hacer pivotar la df_cohorttabla de manera que cada fila contenga información sobre una cohorte determinada y cada columna contenga valores para un período determinado.

Para obtener la matriz de retención , debemos dividir los valores de cada fila por el primer valor de la fila, que en realidad es el tamaño de la cohorte: todos los clientes que realizaron su primera compra en el mes dado.

Por último, trazamos la matriz de retención como un mapa de calor. Además, queríamos incluir información adicional sobre el tamaño de la cohorte. Es por eso que de hecho creamos dos mapas de calor, donde el que indica el tamaño de la cohorte usa un mapa de colores solo en blanco, sin colorear en absoluto.

El resultado final es la siguiente matriz de retención:

En la imagen, podemos ver que ya hay una fuerte caída en el segundo mes (indexado como 1), en promedio alrededor del 80% de los clientes no realizan ninguna compra en el segundo mes. La primera cohorte (2010-2012) parece ser una excepción y se desempeña sorprendentemente bien en comparación con las otras. Un año después de la primera compra, hay una retención del 50%. Esta podría ser una cohorte de clientes dedicados, que primero se unieron a la plataforma basándose en algunas conexiones ya existentes con el minorista. Sin embargo, solo a partir de los datos, es muy difícil de explicar con precisión.

A lo largo de la matriz, podemos ver fluctuaciones en la retención a lo largo del tiempo. Esto puede deberse a las características del negocio, donde los clientes realizan compras periódicas, seguidas de períodos de inactividad.

Conclusiones

En este artículo, mostré cómo realizar análisis de cohortes usando Python pandas y seaborn. En el camino, hice algunas suposiciones simplificadoras, pero eso se debió principalmente a la naturaleza del conjunto de datos. Mientras trabajamos en un escenario de la vida real para una empresa, comprenderíamos mejor el negocio y podríamos sacar conclusiones mejores y más significativas del análisis.



Compartir
Identificarse dejar un comentario
Función SMOTE
Equilibrando conjuntos de datos desbalanceados
/*
*/