Predicción de rotación

Foto por Mantas Hesthaven en Unsplash

la pérdida de Clientes, también conocida como la pérdida de clientes, se produce cuando los clientes dejar de hacer negocios con una empresa. Las empresas están interesadas en identificar segmentos de estos clientes porque el precio para adquirir un nuevo cliente suele ser más alto que retener al anterior. Por ejemplo, si Netflix conociera un segmento de clientes que corrían el riesgo de perder, podría interactuar con ellos de forma proactiva con ofertas especiales en lugar de simplemente perderlos.

En esta publicación, crearemos un modelo simple de predicción de cancelación de clientes utilizando un conjunto de datos de cancelación de clientes de Telecomunicaciones. Elegimos un árbol de decisiones para modelar a los clientes en rotación, pandas para el procesamiento de datos y matplotlib para visualizaciones. Haremos todo lo anterior en Python.
El código se puede usar con otro conjunto de datos con algunos ajustes menores para entrenar el modelo de línea de base. También proporcionamos algunas referencias y damos ideas para nuevas características y mejoras.

Puede ejecutar este código descargando este cuaderno de Jupyter.

Aquí hay algunos enlaces que pueden interesarte:

- Labeling and Data Engineering for Conversational AI and Analytics- Data Science for Business Leaders - Intro to Machine Learning with PyTorch - Become a Growth Product Manager - Deep Learning (Adaptive Computation and ML series) - Free skill tests for Data Scientists & Machine Learning Engineers

Algunos de los enlaces anteriores son enlaces de afiliados y si los revisas para hacer una compra, ganaré una comisión. Tenga en cuenta que enlazo cursos por su calidad y no por la comisión que recibo de sus compras.

utilizamos los pandas para leer el conjunto de datos y procesarlos. El conjunto de datos de telecomunicaciones tiene un cliente por línea con muchas columnas (características). No hay filas con todos los valores faltantes o duplicados (esto rara vez sucede con los conjuntos de datos del mundo real). Hay 11 muestras que tienen cargas totales configuradas en»», lo que parece un error en los datos. Eliminamos esas muestras y establecemos el tipo en numérico (flotante).

df = pd.read_csv('data/WA_Fn-UseC_-Telco-Customer-Churn.csv')df = df.dropna(how=”all”) # remove samples with all missing values
df = df # remove duplicatestotal_charges_filter = df.TotalCharges == " "
df = df
df.TotalCharges = pd.to_numeric(df.TotalCharges)

Primeras muestras en Telecomunicaciones de la pérdida de Clientes del conjunto de datos

Análisis Exploratorio de Datos

disponemos de 2 tipos de características en el conjunto de datos: categórica (dos o más valores y sin ningún tipo de orden) y numéricos. La mayoría de los nombres de las funciones se explican por sí mismos, a excepción de:

  • Partner: si el cliente tiene un partner o no (Sí, No),
  • Dependientes: si el cliente tiene dependientes o no (Sí, No),
  • OnlineBackup: Si el cliente tiene una copia de seguridad en línea o no (Sí, No, No Hay servicio de Internet),
  • tenencia: número de meses que el cliente ha permanecido con la empresa,
  • Mensualmente Cargos: el monto cobrado al cliente mensualmente,
  • Cargos totales: el monto total cobrado al cliente.

Hay 7032 clientes en el conjunto de datos y 19 entidades sin CustomerID (no informativo) y columna de abandono (variable de destino). La mayoría de las características categóricas tienen 4 o menos valores únicos.

Resumen del conjunto de datos

Combinamos las características en dos listas, de modo que podemos analizarlos conjuntamente.

categorical_features = 
numerical_features =
target = "Churn”

Distribución de características numéricas

Técnicas de resumen numérico (media, desviación estándar, etc.) no nos muestre picos, formas de distribuciones y es difícil observar valores atípicos con él. Esa es la razón por la que usamos histogramas.

df.describe()

Resumen de características numéricas

A primera vista, no hay valores atípicos en los datos. Ningún punto de datos está desconectado de la distribución o demasiado lejos del valor medio. Para confirmar que necesitaríamos calcular el rango intercuartílico (IQR) y mostrar que los valores de cada característica numérica están dentro del 1,5 IQR del primer y tercer cuartil.

Podríamos convertir entidades numéricas a intervalos ordinales. Por ejemplo, la tenencia es numérica, pero a menudo no nos importan las pequeñas diferencias numéricas y, en su lugar, agrupamos la tenencia a clientes con tenencia a corto, mediano y largo plazo. Una razón para convertirlo sería reducir el ruido, a menudo las pequeñas fluctuaciones son solo ruido.

df.hist(bins=30, figsize=(10, 7))

Histogramas de características numéricas

Nos fijamos en la distribución de características numéricas en relación con la variable de destino. Podemos observar que cuanto mayores sean los cargos totales y la tenencia, menor será la probabilidad de rotación.

fig, ax = plt.subplots(1, 3, figsize=(14, 4))
df.hist(bins=30, color="blue", alpha=0.5, ax=ax)
df.hist(bins=30, color="red", alpha=0.5, ax=ax)

características Numéricas en relación con la variable de destino

Categórico de la función de distribución de

analizar categórica características, gráficos de barras. Observamos que las personas mayores y los clientes sin servicio telefónico están menos representados en los datos.

ROWS, COLS = 4, 4
fig, ax = plt.subplots(ROWS, COLS, figsize=(18, 18))
row, col = 0, 0
for i, categorical_feature in enumerate(categorical_features):
if col == COLS - 1:
row += 1
col = i % COLS
df.value_counts().plot('bar', ax=ax).set_title(categorical_feature)

Distribución de categórico características

El siguiente paso es ver categórica características en relación a la variable de destino. Hacemos esto solo para la función de contrato. Los usuarios que tienen un contrato de mes a mes tienen más probabilidades de perder que los usuarios con contratos a largo plazo.

feature = ‘Contract’
fig, ax = plt.subplots(1, 2, figsize=(14, 4))
df.value_counts().plot(‘bar’, ax=ax).set_title(‘not churned’)
df.value_counts().plot(‘bar’, ax=ax).set_title(‘churned’)

Contrato característica en relación a la variable de destino

Objetivo de la distribución de las variables

el Objetivo de la distribución de las variables muestra que estamos tratando con un desequilibrio problema, ya que hay muchos más que no se agitaba como se agitaba los usuarios. El modelo lograría una alta precisión, ya que en su mayoría predeciría a la mayoría de los usuarios de clase que no se retiraron en nuestro ejemplo.

Pocas cosas que podemos hacer para minimizar la influencia del conjunto de datos desequilibrado:
– remuestrear datos (desequilibrado-aprender),
– recopilar más muestras,
– usar precisión y recuperación como métricas de precisión.

df.value_counts().plot('bar').set_title('churned')

Objetivo de la distribución de las variables

Características

ajuste de valor de Telco conjunto de datos ya agrupados por customerID, por lo que es difícil añadir nuevas características. Cuando trabajamos en la predicción de la pérdida de clientes, generalmente obtenemos un conjunto de datos que tiene una entrada por sesión de cliente (actividad del cliente en un tiempo determinado). Luego podríamos agregar características como:

  • número de sesiones antes de comprar algo,
  • tiempo promedio por sesión,
  • diferencia de tiempo entre sesiones (cliente frecuente o menos frecuente),
  • es un cliente solo en un país.

A veces incluso tenemos datos de eventos de clientes, lo que nos permite encontrar patrones de comportamiento del cliente en relación con el resultado (churn).

Características de codificación

Para preparar el conjunto de datos para modelar la rotación, necesitamos codificar características categóricas a números. Esto significa codificar «Sí», » No » a 0 y 1 para que el algoritmo pueda trabajar con los datos. Este proceso se denomina codificación onehot.

Uno caliente codificado categórica características

Clasificador

utilizamos sklearn, una Máquina de Aprendizaje de la biblioteca de Python, para crear un clasificador.La forma de sklearn es usar canalizaciones que definen el procesamiento de entidades y el clasificador. En nuestro ejemplo, la canalización toma un conjunto de datos en la entrada, preprocesa entidades y entrena el clasificador.
Cuando está entrenado, toma la misma entrada y devuelve predicciones en la salida.

En el proceso, procesamos por separado las características categóricas y numéricas. Onehot codificamos entidades categóricas y escalamos entidades numéricas eliminando la media y escalándolas a la varianza unitaria.Elegimos un modelo de árbol de decisiones debido a su interpretabilidad y establecemos la profundidad máxima a 3 (arbitrariamente).

La tubería toma un conjunto de datos en la entrada, preprocesa y características de los trenes de la clasificador

el modelo de Formación

Podemos dividir el conjunto de datos para entrenar (el 75% de las muestras) y la prueba (25% de las muestras). Entrenamos (ajustamos) la tubería y hacemos predicciones. Con classification_report calculamos la precisión y la recuperación con valores reales y previstos.

from sklearn.model_selection import train_test_splitdf_train, df_test = train_test_split(df, test_size=0.25, random_state=42)pipeline.fit(df_train, df_train)
pred = pipeline.predict(df_test)

Probando el modelo

Con classification_report calculamos la precisión y el recuerdo con valores reales y previstos.

Para el modelo de clase 1 (usuarios alterados), se logra una precisión de 0,67 y un recuerdo de 0,37. La precisión nos dice cuántos usuarios batidos predijeron correctamente nuestro clasificador. Por otro lado, recordar nos dice cuántos usuarios se perdieron.

En términos sencillos, el clasificador no es muy preciso para usuarios alterados.

from sklearn.metrics import classification_reportprint(classification_report(df_test, pred))

informe de Clasificación para el modelo de Árbol de Decisión

Modelo de interpretación

modelo de Árbol de Decisión se utiliza Contrato, MonthlyCharges, InternetService, TotalCharges, y la tenencia de la cuenta para tomar una decisión si un cliente va a batir o no. Estas características separan bien a los clientes en rotación de los demás en función de los criterios de división en el árbol de decisiones.

Cada muestra de cliente atraviesa el árbol y el nodo final da la predicción.
Por ejemplo, si Contract_Month-to-month es:

  • igual a 0, continúa atravesando el árbol con la rama Verdadera,
  • igual a 1, continúa atravesando el árbol con la rama Falsa,
  • no definida, genera la clase 0.

Este es un gran enfoque para ver cómo el modelo está tomando una decisión o si se coló alguna característica en nuestro modelo que no debería estar allí.

Interpretación del modelo de árbol de Decisión

leer Más

  1. el Manejo de la clase desequilibrio en la pérdida de clientes de predicción — ¿cómo podemos manejar mejor clase de desequilibrio en el churn de predicción.
  2. Una encuesta sobre la Predicción de la pérdida de clientes utilizando Técnicas de Aprendizaje Automático]: Este documento revisa los algoritmos de aprendizaje automático más populares utilizados por los investigadores para predecir la pérdida de clientes.
  3. Cancelación de clientes de telecomunicaciones en Kaggle-Análisis de cancelación de clientes en Kaggle.
  4. WTTE-RNN-Modelado de churn sin hackeo-Predicción de churn basada en eventos.

Antes de ir

Sígueme en Twitter, donde tuiteo regularmente sobre Ciencia de Datos y Aprendizaje Automático.

Foto por Courtney Concretamente en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada.