Capítulo 2: Ingeniería de Características para Modelos Predictivoscsv
2.2 Ingeniería de Características para Modelos de Clasificación y Regresión
La ingeniería de características para modelos de clasificación y regresión es un proceso crítico que mejora la precisión predictiva mediante la creación de características que capturan patrones subyacentes en los datos. A diferencia de las técnicas de aprendizaje no supervisado como el agrupamiento o el análisis exploratorio, los modelos de clasificación y regresión dependen de datos etiquetados para predecir una variable objetivo específica. Este enfoque es esencial tanto si el objetivo es clasificar a los clientes por nivel de lealtad, predecir precios de viviendas o estimar el valor de vida del cliente (CLTV).
El proceso de ingeniería de características implica varias estrategias clave:
- Creación de Características: Desarrollo de nuevas características que encapsulen información relevante a partir de los datos existentes. Por ejemplo, en un contexto de retail, crear una característica de "frecuencia de compra" a partir de datos de transacciones.
- Transformación de Características: Modificación de características existentes para representar mejor las relaciones subyacentes. Esto puede incluir transformaciones logarítmicas para datos sesgados o la codificación de variables categóricas.
- Selección de Características: Identificación de las características más relevantes que contribuyen significativamente al poder predictivo del modelo, evitando al mismo tiempo el sobreajuste.
Estas estrategias son aplicables tanto a modelos de clasificación, que predicen categorías discretas (como el abandono de clientes), como a modelos de regresión, que predicen valores continuos (como precios de viviendas o CLTV).
Para ilustrar estos conceptos, exploraremos un ejemplo práctico utilizando un conjunto de datos de retail. Nuestro enfoque será predecir el Valor de Vida del Cliente (CLTV), una métrica clave en la gestión de relaciones con clientes. Este ejemplo demostrará cómo las características cuidadosamente diseñadas pueden mejorar significativamente la precisión e interpretabilidad de los modelos predictivos en escenarios empresariales del mundo real.
2.2.1 Paso 1: Preparación y Comprensión de Datos
Antes de profundizar en la ingeniería de características, es crucial comprender a fondo el conjunto de datos y evaluar las variables disponibles. Este paso inicial sienta las bases para crear características significativas que puedan mejorar significativamente el poder predictivo de nuestros modelos. Comencemos cargando nuestro conjunto de datos y examinando su estructura y contenido.
En este caso, trabajamos con un conjunto de datos de retail que contiene información valiosa sobre transacciones de clientes. Nuestros objetivos principales son dos:
- Predecir el Valor de Vida del Cliente (CLTV): Este es un problema de regresión donde buscamos estimar el valor total que un cliente aportará al negocio a lo largo de su relación.
- Predecir el Abandono: Este es un problema de clasificación binaria donde intentamos identificar a los clientes que probablemente dejarán de hacer negocios con nosotros.
Al analizar cuidadosamente las variables disponibles, podemos identificar posibles predictores que podrían ser particularmente útiles para estas tareas. Por ejemplo, el historial de transacciones, la frecuencia de compra y el valor promedio de los pedidos pueden proporcionar valiosos insights tanto para el CLTV como para la probabilidad de abandono.
A medida que avanzamos en nuestro análisis, buscaremos patrones y relaciones dentro de los datos que puedan informar nuestro proceso de ingeniería de características. Esto puede implicar explorar correlaciones entre variables, identificar valores atípicos o anomalías, y considerar conocimientos específicos del dominio sobre el comportamiento del cliente en el sector retail.
El objetivo de esta exploración inicial es obtener una comprensión integral de nuestros datos, que nos guiará en la creación de características sofisticadas y significativas que capturen las dinámicas subyacentes del comportamiento y valor del cliente. Este trabajo fundamental es esencial para construir modelos predictivos robustos que puedan generar insights procesables e informar decisiones estratégicas en la gestión de relaciones con clientes.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the retail dataset
df = pd.read_csv('retail_cltv_data.csv')
# Display basic information and first few rows
print("Dataset Information:")
print(df.info())
print("\nFirst Few Rows of Data:")
print(df.head())
# Basic statistical summary
print("\nStatistical Summary:")
print(df.describe())
# Check for missing values
print("\nMissing Values:")
print(df.isnull().sum())
# Unique values in categorical columns
categorical_columns = df.select_dtypes(include=['object']).columns
for col in categorical_columns:
print(f"\nUnique values in {col}:")
print(df[col].value_counts())
# Visualize the distribution of a numerical column (e.g., 'Total Spend')
plt.figure(figsize=(10, 6))
sns.histplot(df['Total Spend'], kde=True)
plt.title('Distribution of Total Spend')
plt.xlabel('Total Spend')
plt.ylabel('Count')
plt.show()
# Correlation matrix for numerical columns
numerical_columns = df.select_dtypes(include=['int64', 'float64']).columns
correlation_matrix = df[numerical_columns].corr()
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Numerical Features')
plt.show()
retail_cltv_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c26cc3da0b9b307d3a_retail_cltv_data.csv
Desglosemos este ejemplo de código:
- Declaraciones de Importación:
- Importamos
pandas
para la manipulación de datos,matplotlib.pyplot
para gráficos básicos yseaborn
para visualizaciones estadísticas más avanzadas.
- Importamos
- Carga de Datos:
- El conjunto de datos de retail se carga desde un archivo CSV en un DataFrame de pandas.
- Visualización de Información Básica:
df.info()
proporciona una descripción general del DataFrame, incluyendo nombres de columnas, tipos de datos y conteos de valores no nulos.df.head()
muestra las primeras filas del DataFrame.
- Resumen Estadístico:
df.describe()
genera estadísticas descriptivas para columnas numéricas, incluyendo conteo, media, desviación estándar, valores mínimos, máximos y cuartiles.
- Verificación de Valores Faltantes:
df.isnull().sum()
calcula la cantidad de valores faltantes en cada columna.
- Análisis de Datos Categóricos:
- Identificamos columnas categóricas y mostramos el conteo de valores para cada categoría única.
- Visualización de Datos Numéricos:
- Se crea un histograma para la columna 'Total Spend' para visualizar su distribución.
- Usar
seaborn.histplot
conkde=True
agrega una curva de estimación de densidad kernel.
- Análisis de Correlación:
- Se calcula una matriz de correlación para todas las columnas numéricas.
- La matriz se visualiza usando un mapa de calor, que ayuda a identificar relaciones entre variables.
Este código ofrece una exploración inicial exhaustiva de los datos, examinando tipos de datos, valores faltantes, distribución de datos numéricos y correlaciones entre características. Estos insights son esenciales para comprender las sutilezas del conjunto de datos antes de avanzar hacia la ingeniería de características y el desarrollo del modelo.
2.2.2 Paso 2: Creación de Características Predictivas
Una vez que comprendemos a fondo el conjunto de datos, podemos embarcarnos en el proceso crucial de ingeniería de características. Esto implica crear nuevas características o transformar las existentes para revelar patrones y relaciones que se alineen con nuestra variable objetivo, ya sea para una tarea de clasificación o regresión. El objetivo es extraer información significativa de los datos en bruto que pueda mejorar el poder predictivo de nuestros modelos.
Para problemas de clasificación, como predecir el abandono de clientes, podemos enfocarnos en características que capturen el comportamiento y nivel de compromiso del cliente. Estos podrían incluir métricas como la frecuencia de compras, la recencia de la última interacción o cambios en los patrones de gasto a lo largo del tiempo.
En tareas de regresión, como estimar el Valor de Vida del Cliente (CLTV), podríamos diseñar características que reflejen el valor a largo plazo del cliente. Esto podría incluir el cálculo de valores promedio de pedidos, la identificación de tendencias de compra estacionales o el desarrollo de puntajes compuestos que combinen múltiples aspectos del comportamiento del cliente.
El arte de la ingeniería de características radica en combinar la experiencia en el dominio con insights basados en datos para crear variables que no solo sean estadísticamente significativas, sino también interpretables y accionables desde una perspectiva empresarial. A medida que avanzamos, exploraremos técnicas específicas y ejemplos de cómo diseñar estas características predictivas poderosas.
Característica 1: Recencia
Recencia mide el tiempo transcurrido desde la compra más reciente de un cliente. Este métrico es un indicador poderoso del compromiso del cliente y desempeña un papel crucial tanto en los modelos de predicción de CLTV como en los de clasificación de abandono. Las compras recientes a menudo indican un compromiso activo con la marca, lo que sugiere una mayor probabilidad de lealtad del cliente y un mayor valor.
En el contexto de la predicción de CLTV, la recencia puede ayudar a identificar a los clientes de alto valor que consistentemente realizan compras. Estos clientes probablemente continuarán con su comportamiento de compra, lo que podría conducir a un mayor valor de vida. Por el contrario, los clientes con alta recencia (es decir, mucho tiempo desde su última compra) podrían estar en riesgo de abandono, lo que podría impactar negativamente su CLTV proyectado.
Para la clasificación de abandono, la recencia sirve como un predictor clave. Los clientes que han realizado compras recientemente generalmente tienen menos probabilidades de abandonar, ya que su compromiso con la marca sigue activo. Por otro lado, aquellos con alta recencia podrían mostrar señales de desconexión, lo que los hace más susceptibles al abandono.
Es importante señalar que la interpretación de la recencia puede variar entre industrias y modelos de negocio. Por ejemplo, en un servicio basado en suscripciones, una alta recencia podría ser esperada y no necesariamente indicativa de riesgo de abandono. Por lo tanto, la recencia siempre debe considerarse junto con otras características relevantes y dentro del contexto específico del negocio para derivar los insights más precisos para la predicción de CLTV y clasificación de abandono.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate Recency
most_recent_date = df['PurchaseDate'].max()
df['Recency'] = (most_recent_date - df['PurchaseDate']).dt.days
# Calculate the last purchase date per customer
recency_df = df.groupby('CustomerID')['Recency'].min().reset_index()
# Merge Recency back to main dataset
df = df.merge(recency_df, on='CustomerID', suffixes=('', '_Overall'))
# Display the first few rows with the new Recency feature
print("\nData with Recency Feature:")
print(df[['CustomerID', 'PurchaseDate', 'Recency_Overall']].head())
# Visualize the distribution of Recency
plt.figure(figsize=(10, 6))
sns.histplot(df['Recency_Overall'], kde=True)
plt.title('Distribution of Customer Recency')
plt.xlabel('Recency (days)')
plt.ylabel('Count')
plt.show()
# Calculate additional statistics
avg_recency = df['Recency_Overall'].mean()
median_recency = df['Recency_Overall'].median()
max_recency = df['Recency_Overall'].max()
print(f"\nAverage Recency: {avg_recency:.2f} days")
print(f"Median Recency: {median_recency:.2f} days")
print(f"Maximum Recency: {max_recency:.2f} days")
# Identify customers with high recency (potential churn risk)
high_recency_threshold = df['Recency_Overall'].quantile(0.75) # 75th percentile
high_recency_customers = df[df['Recency_Overall'] > high_recency_threshold]
print(f"\nNumber of customers with high recency (potential churn risk): {len(high_recency_customers)}")
# Correlation between Recency and other features (if available)
if 'TotalSpend' in df.columns:
correlation = df['Recency_Overall'].corr(df['TotalSpend'])
print(f"\nCorrelation between Recency and Total Spend: {correlation:.2f}")
# Save the updated dataset
df.to_csv('retail_data_with_recency.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_recency.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Este ejemplo de código ofrece un enfoque completo para calcular y analizar la característica de Recencia. Desglosemos los componentes clave y sus funciones:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias y se carga el conjunto de datos.
- La columna 'PurchaseDate' se convierte al formato datetime para realizar cálculos precisos.
- Cálculo de Recencia:
- La recencia se calcula como el número de días entre la fecha más reciente en el conjunto de datos y cada fecha de compra.
- Luego se encuentra la recencia mínima para cada cliente, representando su compra más reciente.
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución de la recencia de los clientes.
- Esto ayuda a identificar patrones en el comportamiento del cliente y posibles oportunidades de segmentación.
- Análisis Estadístico:
- Se calculan y muestran los valores promedio, mediano y máximo de la recencia.
- Estas estadísticas ofrecen insights sobre los niveles generales de compromiso de los clientes.
- Segmentación de Clientes:
- Se identifican como riesgos potenciales de abandono a los clientes con alta recencia (por encima del percentil 75).
- Esta segmentación puede utilizarse para estrategias de retención específicas.
- Correlación de Características:
- Si está disponible una columna 'TotalSpend', se calcula su correlación con la recencia.
- Esto ayuda a entender la relación entre el gasto de los clientes y su compromiso.
- Persistencia de Datos:
- El conjunto de datos actualizado con la nueva característica de recencia se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral no solo calcula la característica de recencia, sino que también proporciona valiosos insights sobre el comportamiento de los clientes, riesgos potenciales de abandono y la relación entre la recencia y otras métricas importantes. Estos insights son cruciales para desarrollar estrategias efectivas de retención de clientes y mejorar modelos predictivos tanto para tareas de clasificación (predicción de abandono) como de regresión (estimación de CLTV).
Característica 2: Valor Monetario
Valor Monetario representa el gasto promedio por transacción y actúa como un indicador clave del comportamiento y el valor potencial del cliente. Este métrico ofrece valiosos insights sobre la lealtad del cliente, su capacidad de gasto y el riesgo de abandono. En la predicción del Valor de Vida del Cliente (CLTV), valores monetarios más altos suelen correlacionarse con clientes más rentables, ya que demuestran disposición a invertir más en cada interacción con la marca.
La importancia del valor monetario va más allá de las métricas financieras simples. Puede revelar preferencias de los clientes, sensibilidad al precio e incluso la efectividad de las estrategias de venta adicional (upselling) o venta cruzada (cross-selling). Por ejemplo, los clientes con valores monetarios consistentemente altos podrían ser más receptivos a productos o servicios premium, presentando oportunidades para campañas de marketing dirigidas.
En el contexto de la predicción de abandono, las fluctuaciones en el valor monetario a lo largo del tiempo pueden ser particularmente reveladoras. Una disminución repentina podría señalar insatisfacción o un cambio hacia competidores, mientras que valores constantes o en aumento sugieren un compromiso sostenido.
Al combinar el valor monetario con otras características como recencia y frecuencia, las empresas pueden desarrollar una comprensión más matizada del comportamiento del cliente, permitiendo predicciones más precisas y estrategias de retención personalizadas.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Calculate Monetary Value as the average purchase value for each customer
monetary_value_df = df.groupby('CustomerID')['Total Spend'].agg(['mean', 'sum', 'count']).reset_index()
monetary_value_df.columns = ['CustomerID', 'AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']
# Merge the monetary value features back to main dataset
df = df.merge(monetary_value_df, on='CustomerID')
# Display the first few rows with the new Monetary Value features
print("\nData with Monetary Value Features:")
print(df[['CustomerID', 'Total Spend', 'AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']].head())
# Visualize the distribution of Average Purchase Value
plt.figure(figsize=(10, 6))
sns.histplot(df['AvgPurchaseValue'], kde=True)
plt.title('Distribution of Average Purchase Value')
plt.xlabel('Average Purchase Value')
plt.ylabel('Count')
plt.show()
# Calculate additional statistics
avg_purchase_value = df['AvgPurchaseValue'].mean()
median_purchase_value = df['AvgPurchaseValue'].median()
max_purchase_value = df['AvgPurchaseValue'].max()
print(f"\nAverage Purchase Value: ${avg_purchase_value:.2f}")
print(f"Median Purchase Value: ${median_purchase_value:.2f}")
print(f"Maximum Purchase Value: ${max_purchase_value:.2f}")
# Identify high-value customers (top 20%)
high_value_threshold = df['AvgPurchaseValue'].quantile(0.8)
high_value_customers = df[df['AvgPurchaseValue'] > high_value_threshold]
print(f"\nNumber of high-value customers: {len(high_value_customers)}")
# Correlation between Monetary Value and other features
correlation_matrix = df[['AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Monetary Value Features')
plt.show()
# Save the updated dataset
df.to_csv('retail_data_with_monetary_value.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_monetary_value.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Este fragmento de código muestra un método para calcular y analizar la característica de Valor Monetario. Analicemos sus componentes clave y sus roles:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias (
pandas
para manipulación de datos,matplotlib
yseaborn
para visualización). - El conjunto de datos se carga desde un archivo CSV en un DataFrame de pandas.
- Se importan las bibliotecas necesarias (
- Cálculo del Valor Monetario:
- Se utiliza la función
groupby
para agregar datos porCustomerID
. - Se calculan tres métricas: promedio (
AvgPurchaseValue
), suma (TotalSpend
) y conteo (PurchaseCount
) de 'Total Spend'. - Estas características ofrecen una visión más completa del comportamiento de gasto de los clientes.
- Se utiliza la función
- Fusión de Datos:
- Las nuevas características de valor monetario se fusionan nuevamente en el conjunto de datos principal.
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución del valor promedio de compra (
AvgPurchaseValue
). - Esto ayuda a identificar patrones en el gasto de los clientes y posibles oportunidades de segmentación.
- Se crea un histograma para visualizar la distribución del valor promedio de compra (
- Análisis Estadístico:
- Se calculan y muestran los valores promedio, mediano y máximo de compra.
- Estas estadísticas ofrecen insights sobre los patrones generales de gasto de los clientes.
- Segmentación de Clientes:
- Se identifican clientes de alto valor (el 20% superior basado en el valor promedio de compra).
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o programas de fidelización.
- Correlación de Características:
- Se calcula una matriz de correlación para las características de valor monetario.
- Esto se visualiza usando un mapa de calor, lo que ayuda a entender las relaciones entre diferentes aspectos del gasto de los clientes.
- Persistencia de Datos:
- El conjunto de datos actualizado con las nuevas características de valor monetario se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral no solo calcula la característica de valor monetario, sino que también ofrece valiosos insights sobre los patrones de gasto de los clientes, identifica a los clientes de alto valor y explora relaciones entre diversas métricas monetarias. Estos insights son cruciales para desarrollar estrategias de marketing efectivas, refinar la segmentación de clientes y mejorar modelos predictivos tanto para tareas de clasificación (como predicción de abandono) como de regresión (como estimación de CLTV).
Característica 3: Frecuencia
Frecuencia mide con qué frecuencia un cliente realiza compras dentro de un período de tiempo determinado. Este métrico proporciona valiosos insights sobre el comportamiento y la lealtad del cliente. Las compras frecuentes a menudo indican un alto nivel de compromiso, convirtiéndolo en una característica valiosa tanto para la predicción del Valor de Vida del Cliente (CLTV) como para la clasificación de abandono.
En el contexto de la predicción de CLTV, la frecuencia puede ayudar a identificar a los clientes que probablemente generen un mayor valor a largo plazo. Los clientes con frecuencias de compra más altas tienden a tener una relación más sólida con la marca, lo que potencialmente lleva a un mayor valor de vida. Para la clasificación de abandono, una disminución en la frecuencia de compra puede ser una señal de advertencia temprana de posible desconexión o abandono inminente.
Además, la frecuencia puede analizarse en conjunto con otras características para obtener insights más profundos. Por ejemplo, combinar la frecuencia con el valor monetario puede ayudar a identificar clientes frecuentes de alto valor que podrían ser candidatos ideales para programas de fidelización o campañas de marketing personalizadas. De manera similar, analizar la relación entre frecuencia y recencia puede revelar patrones en el comportamiento del cliente, como hábitos de compra estacionales o la efectividad de las estrategias de retención.
Al diseñar esta característica, es importante considerar el período de tiempo apropiado para el cálculo, ya que puede variar según el modelo de negocio y el ciclo de vida del producto. Para algunos negocios, la frecuencia semanal podría ser relevante, mientras que para otros, frecuencias mensuales o trimestrales podrían ser más informativas. Además, rastrear los cambios en la frecuencia a lo largo del tiempo puede proporcionar insights dinámicos sobre el comportamiento cambiante del cliente y las tendencias del mercado.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate Frequency by counting transactions per customer
frequency_df = df.groupby('CustomerID').agg({
'PurchaseDate': 'count',
'Total Spend': 'sum'
}).reset_index()
frequency_df.columns = ['CustomerID', 'Frequency', 'TotalSpend']
# Calculate average time between purchases
df_sorted = df.sort_values(['CustomerID', 'PurchaseDate'])
df_sorted['PrevPurchaseDate'] = df_sorted.groupby('CustomerID')['PurchaseDate'].shift(1)
df_sorted['DaysBetweenPurchases'] = (df_sorted['PurchaseDate'] - df_sorted['PrevPurchaseDate']).dt.days
avg_time_between_purchases = df_sorted.groupby('CustomerID')['DaysBetweenPurchases'].mean().reset_index()
avg_time_between_purchases.columns = ['CustomerID', 'AvgDaysBetweenPurchases']
# Merge frequency features back to the main dataset
df = df.merge(frequency_df, on='CustomerID')
df = df.merge(avg_time_between_purchases, on='CustomerID')
# Calculate additional metrics
df['AvgPurchaseValue'] = df['TotalSpend'] / df['Frequency']
print("\nData with Frequency Features:")
print(df[['CustomerID', 'PurchaseDate', 'Frequency', 'TotalSpend', 'AvgDaysBetweenPurchases', 'AvgPurchaseValue']].head())
# Visualize the distribution of Frequency
plt.figure(figsize=(10, 6))
sns.histplot(df['Frequency'], kde=True)
plt.title('Distribution of Purchase Frequency')
plt.xlabel('Number of Purchases')
plt.ylabel('Count of Customers')
plt.show()
# Analyze correlation between Frequency and other metrics
correlation_matrix = df[['Frequency', 'TotalSpend', 'AvgDaysBetweenPurchases', 'AvgPurchaseValue']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Frequency-related Features')
plt.show()
# Identify high-frequency customers (top 20%)
high_frequency_threshold = df['Frequency'].quantile(0.8)
high_frequency_customers = df[df['Frequency'] > high_frequency_threshold]
print(f"\nNumber of high-frequency customers: {len(high_frequency_customers)}")
print(f"Average spend of high-frequency customers: ${high_frequency_customers['TotalSpend'].mean():.2f}")
# Save the updated dataset
df.to_csv('retail_data_with_frequency.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_frequency.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Desglosemos los componentes clave y sus funciones:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias (
pandas
para manipulación de datos,matplotlib
yseaborn
para visualización). - El conjunto de datos se carga desde un archivo CSV en un DataFrame de pandas.
- La columna 'PurchaseDate' se convierte al formato datetime para realizar cálculos precisos.
- Se importan las bibliotecas necesarias (
- Cálculo de Frecuencia:
- Se utiliza la función
groupby
para agregar datos porCustomerID
. - Se calculan dos métricas: el conteo de compras (Frecuencia) y la suma de
Total Spend
.
- Se utiliza la función
- Tiempo Entre Compras:
- Los datos se ordenan por
CustomerID
yPurchaseDate
. - Se calcula la diferencia de tiempo entre compras consecutivas para cada cliente.
- Se calcula el tiempo promedio entre compras para cada cliente.
- Los datos se ordenan por
- Fusión de Datos:
- Las nuevas características de frecuencia se fusionan nuevamente en el conjunto de datos principal.
- Métricas Adicionales:
- Se calcula el valor promedio de compra dividiendo
Total Spend
por la frecuencia.
- Se calcula el valor promedio de compra dividiendo
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución de la frecuencia de compra.
- Esto ayuda a identificar patrones en el comportamiento del cliente y posibles oportunidades de segmentación.
- Análisis de Correlación:
- Se calcula una matriz de correlación para las características relacionadas con la frecuencia.
- Esto se visualiza con un mapa de calor, lo que ayuda a comprender las relaciones entre diferentes aspectos del comportamiento del cliente.
- Segmentación de Clientes:
- Se identifican clientes de alta frecuencia (el 20% superior basado en Frecuencia).
- Se calcula y muestra el número de clientes de alta frecuencia y su gasto promedio.
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o programas de fidelización.
- Persistencia de Datos:
- El conjunto de datos actualizado con las nuevas características de frecuencia se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral calcula la característica de Frecuencia y ofrece valiosos insights sobre el comportamiento de los clientes. Identifica clientes de alta frecuencia y explora relaciones entre diversas métricas relacionadas con la frecuencia. Estos insights son esenciales para desarrollar estrategias de marketing efectivas, refinar la segmentación de clientes y mejorar modelos predictivos tanto para tareas de clasificación (como predicción de abandono) como de regresión (como estimación de CLTV).
Característica 4: Tendencia de Compra
Para modelos de clasificación o regresión, la Tendencia de Compra es una característica crucial que captura la naturaleza dinámica del comportamiento del cliente a lo largo del tiempo. Esta característica cuantifica cómo han evolucionado los patrones de gasto de un cliente, proporcionando valiosos insights sobre sus niveles de compromiso y lealtad.
Las tendencias positivas, caracterizadas por un aumento en la frecuencia de compra o el valor, suelen sugerir una creciente satisfacción del cliente y un fortalecimiento de la relación con la marca. Estos clientes pueden ser candidatos ideales para iniciativas de upselling o cross-selling.
Por el contrario, las tendencias negativas podrían señalar problemas potenciales como insatisfacción del cliente, mayor competencia o necesidades cambiantes. Estas tendencias pueden manifestarse como una disminución en la frecuencia de compra, valores de transacción más bajos o intervalos más largos entre compras. Identificar estas tendencias negativas de manera temprana permite a las empresas implementar estrategias de retención específicas, previniendo potencialmente el abandono antes de que ocurra.
La característica de Tendencia de Compra puede ser particularmente poderosa cuando se combina con otras métricas como Recencia y Frecuencia. Por ejemplo, un cliente con alta frecuencia pero una tendencia de compra negativa podría requerir estrategias de intervención diferentes a las de un cliente con baja frecuencia pero una tendencia positiva.
Al incorporar esta dimensión temporal en los modelos predictivos, las empresas pueden desarrollar estrategias de segmentación de clientes más matizadas y efectivas, campañas de marketing personalizadas e iniciativas proactivas de servicio al cliente.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate average spend over time by grouping data by month and CustomerID
df['PurchaseMonth'] = df['PurchaseDate'].dt.to_period('M')
monthly_spend = df.groupby(['CustomerID', 'PurchaseMonth'])['Total Spend'].sum().reset_index()
# Calculate trend as the slope of spending over time for each customer
def calculate_trend(customer_df):
x = np.arange(len(customer_df))
y = customer_df['Total Spend'].values
if len(x) > 1:
return np.polyfit(x, y, 1)[0] # Linear trend slope
return 0
# Apply trend calculation
trend_df = monthly_spend.groupby('CustomerID').apply(calculate_trend).reset_index(name='PurchaseTrend')
# Merge trend feature back to main dataset
df = df.merge(trend_df, on='CustomerID')
print("\nData with Purchase Trend Feature:")
print(df[['CustomerID', 'PurchaseMonth', 'Total Spend', 'PurchaseTrend']].head())
# Visualize Purchase Trend distribution
plt.figure(figsize=(10, 6))
sns.histplot(df['PurchaseTrend'], kde=True)
plt.title('Distribution of Purchase Trends')
plt.xlabel('Purchase Trend (Slope)')
plt.ylabel('Count of Customers')
plt.show()
# Identify customers with positive and negative trends
positive_trend = df[df['PurchaseTrend'] > 0]
negative_trend = df[df['PurchaseTrend'] < 0]
print(f"\nCustomers with positive trend: {len(positive_trend['CustomerID'].unique())}")
print(f"Customers with negative trend: {len(negative_trend['CustomerID'].unique())}")
# Calculate correlation between Purchase Trend and other features
correlation = df[['PurchaseTrend', 'Total Spend', 'Frequency']].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(correlation, annot=True, cmap='coolwarm')
plt.title('Correlation between Purchase Trend and Other Features')
plt.show()
# Example: Using Purchase Trend for customer segmentation
df['TrendCategory'] = pd.cut(df['PurchaseTrend'],
bins=[-np.inf, -10, 0, 10, np.inf],
labels=['Strong Negative', 'Slight Negative', 'Slight Positive', 'Strong Positive'])
trend_segment = df.groupby('TrendCategory').agg({
'CustomerID': 'nunique',
'Total Spend': 'mean',
'Frequency': 'mean'
}).reset_index()
print("\nCustomer Segmentation based on Purchase Trend:")
print(trend_segment)
# Save the updated dataset with the new feature
df.to_csv('retail_data_with_trend.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_trend.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Desglosemos este ejemplo de código integral:
- Carga y Preprocesamiento de Datos:
- Se importan las bibliotecas necesarias:
pandas
para manipulación de datos,numpy
para operaciones numéricas, ymatplotlib
/seaborn
para visualización. - El conjunto de datos se carga desde un archivo CSV y la columna 'PurchaseDate' se convierte al formato datetime.
- Se importan las bibliotecas necesarias:
- Cálculo de la Tendencia de Compra:
- Los datos se agrupan por cliente y mes para obtener patrones de gasto mensual.
- Se define una función
calculate_trend
para calcular la tendencia lineal (pendiente) del gasto a lo largo del tiempo para cada cliente. - Esta tendencia se calcula para cada cliente y se fusiona nuevamente en el conjunto de datos principal.
- Visualización de la Tendencia de Compra:
- Se crea un histograma para mostrar la distribución de las tendencias de compra entre todos los clientes.
- Esta visualización ayuda a identificar los patrones generales de tendencia en la base de clientes.
- Análisis de Tendencias Positivas y Negativas:
- Se separan los clientes con tendencias positivas y negativas, y se cuentan.
- Esto proporciona una visión rápida de cuántos clientes están aumentando o disminuyendo su gasto con el tiempo.
- Análisis de Correlación:
- Se calcula y visualiza la correlación entre la Tendencia de Compra y otras características como Total Spend y Frecuencia.
- Esto ayuda a comprender cómo la tendencia se relaciona con otras métricas importantes de los clientes.
- Segmentación de Clientes:
- Los clientes se categorizan según su Tendencia de Compra en cuatro grupos: Negativa Fuerte, Negativa Leve, Positiva Leve y Positiva Fuerte.
- Para cada segmento, se calcula el número de clientes, el gasto total promedio y la frecuencia de compra promedio.
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o para identificar clientes en riesgo.
- Persistencia de Datos:
- El conjunto de datos actualizado con la nueva característica de Tendencia de Compra se guarda en un nuevo archivo CSV.
- Esto facilita el acceso para análisis futuros o entrenamiento de modelos.
Este código ofrece un análisis exhaustivo de la característica de Tendencia de Compra, mostrando su distribución, correlaciones con otras características y aplicación en la segmentación de clientes. Estos insights son valiosos tanto para tareas de clasificación—como la predicción de abandono—como para tareas de regresión, como la estimación del Valor de Vida del Cliente (CLTV).
2.2.3 Uso de Ingeniería de Características para Entrenamiento de Modelos
Una vez que estas características han sido creadas, sirven como base para entrenar modelos predictivos potentes. En esta sección, exploraremos cómo aprovechar estas características para tareas de clasificación y regresión, centrándonos específicamente en la predicción de abandono y la estimación del CLTV.
Para la predicción de abandono, una tarea de clasificación, utilizaremos un modelo de Regresión Logística. Este modelo es ideal para predecir resultados binarios, lo que lo hace perfecto para determinar si un cliente tiene probabilidades de abandonar o no. Las características que hemos creado, como Recencia, Frecuencia y Tendencia de Compra, proporcionan insights cruciales sobre el comportamiento del cliente que pueden señalar un posible abandono.
Por otro lado, para la predicción de CLTV, una tarea de regresión, emplearemos un modelo de Regresión Lineal. Este modelo es adecuado para predecir valores continuos, permitiéndonos estimar el valor futuro que un cliente puede aportar al negocio. Características como Valor Monetario y Tendencia de Compra son particularmente valiosas aquí, ya que capturan patrones de gasto y el comportamiento a largo plazo del cliente.
Al incorporar estas características en nuestros modelos, mejoramos significativamente su poder predictivo. Esto permite a las empresas tomar decisiones basadas en datos, implementar estrategias de retención dirigidas y optimizar los esfuerzos de compromiso con el cliente. Vamos a profundizar en la implementación práctica de estos modelos utilizando nuestras características recién creadas.
Ejemplo: Entrenamiento de un Modelo de Regresión Logística para la Predicción de Abandono
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data_with_features.csv')
df = pd.read_csv('retail_data_with_features.csv')
# Select features and target
features = ['Recency_Overall', 'AvgPurchaseValue', 'Frequency', 'PurchaseTrend']
X = df[features]
y = df['Churn'] # Target variable for churn
# Standardize the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# Train logistic regression model
log_reg = LogisticRegression(random_state=42)
log_reg.fit(X_train, y_train)
# Predictions
y_pred = log_reg.predict(X_test)
y_pred_proba = log_reg.predict_proba(X_test)[:, 1]
# Model evaluation
print("Model Accuracy:", accuracy_score(y_test, y_pred))
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.show()
# Feature importance
feature_importance = pd.DataFrame({'feature': features, 'importance': abs(log_reg.coef_[0])})
feature_importance = feature_importance.sort_values('importance', ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='importance', y='feature', data=feature_importance)
plt.title('Feature Importance')
plt.show()
# Cross-validation
cv_scores = cross_val_score(log_reg, X_scaled, y, cv=5)
print("\nCross-validation scores:", cv_scores)
print("Mean CV score:", np.mean(cv_scores))
# ROC Curve
from sklearn.metrics import roc_curve, auc
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()
Este ejemplo de código muestra un enfoque integral para entrenar y evaluar un modelo de Regresión Logística para la predicción de abandono. Analicemos sus componentes clave:
- Preparación de Datos:
- Se carga el conjunto de datos y se seleccionan las características relevantes y la variable objetivo.
- Las características se estandarizan usando
StandardScaler
para garantizar que todas estén en la misma escala.
- Entrenamiento del Modelo:
- Se utiliza
train_test_split
para dividir los datos en conjuntos de entrenamiento y prueba. - Se inicializa un modelo de
LogisticRegression
y se entrena con los datos de entrenamiento.
- Se utiliza
- Predicciones:
- El modelo realiza predicciones en el conjunto de prueba.
- También se calculan las probabilidades de predicción, que se utilizarán para la curva ROC.
- Evaluación del Modelo:
- Se calcula la precisión (accuracy) como métrica general de desempeño.
- Se imprime un informe de clasificación detallado que incluye precisión (precision), sensibilidad (recall) y puntaje F1 para cada clase.
- Se visualiza una matriz de confusión usando un mapa de calor, proporcionando una vista clara de verdaderos positivos, verdaderos negativos, falsos positivos y falsos negativos.
- Importancia de Características:
- Se utilizan los valores absolutos de los coeficientes del modelo para clasificar la importancia de las características.
- Un gráfico de barras visualiza la importancia de cada característica en el modelo.
- Validación Cruzada:
- Se realiza validación cruzada para evaluar el desempeño del modelo en diferentes subconjuntos de los datos.
- Esto ayuda a garantizar que el desempeño del modelo sea consistente y no dependa excesivamente de una división particular entre entrenamiento y prueba.
- Curva ROC:
- Se traza la curva Característica Operativa del Receptor (ROC).
- Se calcula el Área Bajo la Curva (AUC), proporcionando un único puntaje que resume el desempeño del modelo en todos los posibles umbrales de clasificación.
Este enfoque integral va más allá del simple entrenamiento del modelo: proporciona una evaluación exhaustiva de su desempeño. Las visualizaciones (matriz de confusión, importancia de características y curva ROC) ofrecen insights intuitivos sobre el comportamiento del modelo. Además, el paso de validación cruzada mejora la robustez de la evaluación, asegurando que el desempeño del modelo se mantenga consistente en diversos subconjuntos de datos.
Ejemplo: Entrenamiento de un Modelo de Regresión Lineal para la Predicción de CLTV
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset
df = pd.read_csv('retail_data_with_features.csv')
# Select features and target
features = ['Recency_Overall', 'AvgPurchaseValue', 'Frequency', 'PurchaseTrend']
X = df[features]
y_cltv = df['CLTV']
# Standardize the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train-test split for CLTV
X_train_cltv, X_test_cltv, y_train_cltv, y_test_cltv = train_test_split(X_scaled, y_cltv, test_size=0.3, random_state=42)
# Train linear regression model
lin_reg = LinearRegression()
lin_reg.fit(X_train_cltv, y_train_cltv)
# Predictions and evaluation
y_pred_cltv = lin_reg.predict(X_test_cltv)
mse = mean_squared_error(y_test_cltv, y_pred_cltv)
r2 = r2_score(y_test_cltv, y_pred_cltv)
print("Mean Squared Error:", mse)
print("R-squared Score:", r2)
# Feature importance
feature_importance = pd.DataFrame({'feature': features, 'importance': abs(lin_reg.coef_)})
feature_importance = feature_importance.sort_values('importance', ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='importance', y='feature', data=feature_importance)
plt.title('Feature Importance for CLTV Prediction')
plt.show()
# Residual plot
residuals = y_test_cltv - y_pred_cltv
plt.figure(figsize=(10, 6))
plt.scatter(y_pred_cltv, residuals)
plt.xlabel('Predicted CLTV')
plt.ylabel('Residuals')
plt.title('Residual Plot')
plt.axhline(y=0, color='r', linestyle='--')
plt.show()
# Cross-validation
cv_scores = cross_val_score(lin_reg, X_scaled, y_cltv, cv=5, scoring='neg_mean_squared_error')
cv_rmse = np.sqrt(-cv_scores)
print("\nCross-validation RMSE scores:", cv_rmse)
print("Mean CV RMSE score:", np.mean(cv_rmse))
# Actual vs Predicted plot
plt.figure(figsize=(10, 6))
plt.scatter(y_test_cltv, y_pred_cltv, alpha=0.5)
plt.plot([y_test_cltv.min(), y_test_cltv.max()], [y_test_cltv.min(), y_test_cltv.max()], 'r--', lw=2)
plt.xlabel('Actual CLTV')
plt.ylabel('Predicted CLTV')
plt.title('Actual vs Predicted CLTV')
plt.show()
Este ejemplo de código ofrece un enfoque integral para entrenar y evaluar un modelo de Regresión Lineal para la predicción del Valor de Vida del Cliente (CLTV). Desglosemos sus componentes clave:
- Preparación de Datos:
- Se carga el conjunto de datos y se seleccionan las características relevantes para la predicción de CLTV.
- Las características se estandarizan utilizando
StandardScaler
para garantizar que todas estén en la misma escala.
- Entrenamiento del Modelo:
- Los datos se dividen en conjuntos de entrenamiento y prueba utilizando
train_test_split
. - Se inicializa un modelo de
LinearRegression
y se entrena con los datos de entrenamiento.
- Los datos se dividen en conjuntos de entrenamiento y prueba utilizando
- Predicciones y Evaluación:
- El modelo realiza predicciones en el conjunto de prueba.
- Se calcula el Error Cuadrático Medio (MSE) para cuantificar el error de predicción del modelo.
- Se computa el puntaje R-cuadrado para medir la proporción de la variabilidad en la variable objetivo que es explicada por las características.
- Importancia de Características:
- Los valores absolutos de los coeficientes del modelo se utilizan para clasificar la importancia de las características.
- Un gráfico de barras visualiza la importancia de cada característica en la predicción de CLTV.
- Análisis de Residuales:
- Se crea un gráfico de residuales para visualizar la diferencia entre los valores reales y los predichos.
- Esto ayuda a identificar patrones en los errores del modelo y evaluar si se cumplen los supuestos de regresión lineal.
- Validación Cruzada:
- Se realiza validación cruzada para evaluar el desempeño del modelo en diferentes subconjuntos de los datos.
- Se utiliza la Raíz del Error Cuadrático Medio (RMSE) como métrica de evaluación en la validación cruzada.
- Gráfico de Valores Reales vs Predichos:
- Se crea un gráfico de dispersión para comparar los valores reales de CLTV con los valores predichos.
- Esta herramienta visual ayuda a comprender qué tan bien se alinean las predicciones del modelo con los valores reales.
Este enfoque integral no solo entrena el modelo, sino que también proporciona una evaluación exhaustiva de su desempeño. Las visualizaciones (importancia de características, gráfico de residuales y gráfico de valores reales vs predichos) ofrecen insights intuitivos sobre el comportamiento y rendimiento del modelo. El paso de validación cruzada mejora la robustez de la evaluación, asegurando que el rendimiento del modelo sea consistente en diversos subconjuntos de datos.
Al implementar estas técnicas de evaluación adicionales y visualizaciones, obtenemos una comprensión más profunda de las fortalezas y limitaciones del modelo en la predicción del CLTV. Esta información puede ser invaluable para refinar el modelo, seleccionar características y tomar decisiones basadas en datos en estrategias de gestión de relaciones con clientes.
2.2.4 Conclusiones Clave y Sus Implicaciones
- La ingeniería de características mejora la precisión predictiva al crear características que capturan patrones y tendencias subyacentes. Este proceso transforma datos en bruto en representaciones significativas que los algoritmos pueden interpretar mejor, lo que conduce a modelos más robustos y precisos.
- Para tareas de clasificación como la predicción de abandono, características como Recencia, Frecuencia y Tendencia de Compra proporcionan insights cruciales sobre la lealtad y el compromiso del cliente. Estas métricas ayudan a identificar clientes en riesgo, permitiendo a las empresas implementar estrategias de retención específicas.
- En tareas de regresión como la predicción de CLTV, las características que capturan hábitos de gasto y comportamiento a lo largo del tiempo, como Valor Monetario y Tendencia de Compra, mejoran significativamente la capacidad del modelo para predecir el valor de vida. Esto permite a las empresas asignar recursos de manera más efectiva y personalizar las experiencias de los clientes.
- La selección de características apropiadas depende del contexto y requiere experiencia en el dominio. Por ejemplo, en salud, características como la frecuencia de citas y la adherencia al tratamiento pueden ser más relevantes para predecir resultados de pacientes.
- El análisis de importancia de características, como se demostró en los ejemplos de código, proporciona valiosos insights sobre qué factores influyen más significativamente en la variable objetivo. Esta información puede guiar decisiones empresariales y la formulación de estrategias.
- La validación cruzada y el análisis de residuales son pasos cruciales para evaluar el desempeño del modelo e identificar posibles áreas de mejora en la ingeniería de características o selección del modelo.
2.2 Ingeniería de Características para Modelos de Clasificación y Regresión
La ingeniería de características para modelos de clasificación y regresión es un proceso crítico que mejora la precisión predictiva mediante la creación de características que capturan patrones subyacentes en los datos. A diferencia de las técnicas de aprendizaje no supervisado como el agrupamiento o el análisis exploratorio, los modelos de clasificación y regresión dependen de datos etiquetados para predecir una variable objetivo específica. Este enfoque es esencial tanto si el objetivo es clasificar a los clientes por nivel de lealtad, predecir precios de viviendas o estimar el valor de vida del cliente (CLTV).
El proceso de ingeniería de características implica varias estrategias clave:
- Creación de Características: Desarrollo de nuevas características que encapsulen información relevante a partir de los datos existentes. Por ejemplo, en un contexto de retail, crear una característica de "frecuencia de compra" a partir de datos de transacciones.
- Transformación de Características: Modificación de características existentes para representar mejor las relaciones subyacentes. Esto puede incluir transformaciones logarítmicas para datos sesgados o la codificación de variables categóricas.
- Selección de Características: Identificación de las características más relevantes que contribuyen significativamente al poder predictivo del modelo, evitando al mismo tiempo el sobreajuste.
Estas estrategias son aplicables tanto a modelos de clasificación, que predicen categorías discretas (como el abandono de clientes), como a modelos de regresión, que predicen valores continuos (como precios de viviendas o CLTV).
Para ilustrar estos conceptos, exploraremos un ejemplo práctico utilizando un conjunto de datos de retail. Nuestro enfoque será predecir el Valor de Vida del Cliente (CLTV), una métrica clave en la gestión de relaciones con clientes. Este ejemplo demostrará cómo las características cuidadosamente diseñadas pueden mejorar significativamente la precisión e interpretabilidad de los modelos predictivos en escenarios empresariales del mundo real.
2.2.1 Paso 1: Preparación y Comprensión de Datos
Antes de profundizar en la ingeniería de características, es crucial comprender a fondo el conjunto de datos y evaluar las variables disponibles. Este paso inicial sienta las bases para crear características significativas que puedan mejorar significativamente el poder predictivo de nuestros modelos. Comencemos cargando nuestro conjunto de datos y examinando su estructura y contenido.
En este caso, trabajamos con un conjunto de datos de retail que contiene información valiosa sobre transacciones de clientes. Nuestros objetivos principales son dos:
- Predecir el Valor de Vida del Cliente (CLTV): Este es un problema de regresión donde buscamos estimar el valor total que un cliente aportará al negocio a lo largo de su relación.
- Predecir el Abandono: Este es un problema de clasificación binaria donde intentamos identificar a los clientes que probablemente dejarán de hacer negocios con nosotros.
Al analizar cuidadosamente las variables disponibles, podemos identificar posibles predictores que podrían ser particularmente útiles para estas tareas. Por ejemplo, el historial de transacciones, la frecuencia de compra y el valor promedio de los pedidos pueden proporcionar valiosos insights tanto para el CLTV como para la probabilidad de abandono.
A medida que avanzamos en nuestro análisis, buscaremos patrones y relaciones dentro de los datos que puedan informar nuestro proceso de ingeniería de características. Esto puede implicar explorar correlaciones entre variables, identificar valores atípicos o anomalías, y considerar conocimientos específicos del dominio sobre el comportamiento del cliente en el sector retail.
El objetivo de esta exploración inicial es obtener una comprensión integral de nuestros datos, que nos guiará en la creación de características sofisticadas y significativas que capturen las dinámicas subyacentes del comportamiento y valor del cliente. Este trabajo fundamental es esencial para construir modelos predictivos robustos que puedan generar insights procesables e informar decisiones estratégicas en la gestión de relaciones con clientes.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the retail dataset
df = pd.read_csv('retail_cltv_data.csv')
# Display basic information and first few rows
print("Dataset Information:")
print(df.info())
print("\nFirst Few Rows of Data:")
print(df.head())
# Basic statistical summary
print("\nStatistical Summary:")
print(df.describe())
# Check for missing values
print("\nMissing Values:")
print(df.isnull().sum())
# Unique values in categorical columns
categorical_columns = df.select_dtypes(include=['object']).columns
for col in categorical_columns:
print(f"\nUnique values in {col}:")
print(df[col].value_counts())
# Visualize the distribution of a numerical column (e.g., 'Total Spend')
plt.figure(figsize=(10, 6))
sns.histplot(df['Total Spend'], kde=True)
plt.title('Distribution of Total Spend')
plt.xlabel('Total Spend')
plt.ylabel('Count')
plt.show()
# Correlation matrix for numerical columns
numerical_columns = df.select_dtypes(include=['int64', 'float64']).columns
correlation_matrix = df[numerical_columns].corr()
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Numerical Features')
plt.show()
retail_cltv_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c26cc3da0b9b307d3a_retail_cltv_data.csv
Desglosemos este ejemplo de código:
- Declaraciones de Importación:
- Importamos
pandas
para la manipulación de datos,matplotlib.pyplot
para gráficos básicos yseaborn
para visualizaciones estadísticas más avanzadas.
- Importamos
- Carga de Datos:
- El conjunto de datos de retail se carga desde un archivo CSV en un DataFrame de pandas.
- Visualización de Información Básica:
df.info()
proporciona una descripción general del DataFrame, incluyendo nombres de columnas, tipos de datos y conteos de valores no nulos.df.head()
muestra las primeras filas del DataFrame.
- Resumen Estadístico:
df.describe()
genera estadísticas descriptivas para columnas numéricas, incluyendo conteo, media, desviación estándar, valores mínimos, máximos y cuartiles.
- Verificación de Valores Faltantes:
df.isnull().sum()
calcula la cantidad de valores faltantes en cada columna.
- Análisis de Datos Categóricos:
- Identificamos columnas categóricas y mostramos el conteo de valores para cada categoría única.
- Visualización de Datos Numéricos:
- Se crea un histograma para la columna 'Total Spend' para visualizar su distribución.
- Usar
seaborn.histplot
conkde=True
agrega una curva de estimación de densidad kernel.
- Análisis de Correlación:
- Se calcula una matriz de correlación para todas las columnas numéricas.
- La matriz se visualiza usando un mapa de calor, que ayuda a identificar relaciones entre variables.
Este código ofrece una exploración inicial exhaustiva de los datos, examinando tipos de datos, valores faltantes, distribución de datos numéricos y correlaciones entre características. Estos insights son esenciales para comprender las sutilezas del conjunto de datos antes de avanzar hacia la ingeniería de características y el desarrollo del modelo.
2.2.2 Paso 2: Creación de Características Predictivas
Una vez que comprendemos a fondo el conjunto de datos, podemos embarcarnos en el proceso crucial de ingeniería de características. Esto implica crear nuevas características o transformar las existentes para revelar patrones y relaciones que se alineen con nuestra variable objetivo, ya sea para una tarea de clasificación o regresión. El objetivo es extraer información significativa de los datos en bruto que pueda mejorar el poder predictivo de nuestros modelos.
Para problemas de clasificación, como predecir el abandono de clientes, podemos enfocarnos en características que capturen el comportamiento y nivel de compromiso del cliente. Estos podrían incluir métricas como la frecuencia de compras, la recencia de la última interacción o cambios en los patrones de gasto a lo largo del tiempo.
En tareas de regresión, como estimar el Valor de Vida del Cliente (CLTV), podríamos diseñar características que reflejen el valor a largo plazo del cliente. Esto podría incluir el cálculo de valores promedio de pedidos, la identificación de tendencias de compra estacionales o el desarrollo de puntajes compuestos que combinen múltiples aspectos del comportamiento del cliente.
El arte de la ingeniería de características radica en combinar la experiencia en el dominio con insights basados en datos para crear variables que no solo sean estadísticamente significativas, sino también interpretables y accionables desde una perspectiva empresarial. A medida que avanzamos, exploraremos técnicas específicas y ejemplos de cómo diseñar estas características predictivas poderosas.
Característica 1: Recencia
Recencia mide el tiempo transcurrido desde la compra más reciente de un cliente. Este métrico es un indicador poderoso del compromiso del cliente y desempeña un papel crucial tanto en los modelos de predicción de CLTV como en los de clasificación de abandono. Las compras recientes a menudo indican un compromiso activo con la marca, lo que sugiere una mayor probabilidad de lealtad del cliente y un mayor valor.
En el contexto de la predicción de CLTV, la recencia puede ayudar a identificar a los clientes de alto valor que consistentemente realizan compras. Estos clientes probablemente continuarán con su comportamiento de compra, lo que podría conducir a un mayor valor de vida. Por el contrario, los clientes con alta recencia (es decir, mucho tiempo desde su última compra) podrían estar en riesgo de abandono, lo que podría impactar negativamente su CLTV proyectado.
Para la clasificación de abandono, la recencia sirve como un predictor clave. Los clientes que han realizado compras recientemente generalmente tienen menos probabilidades de abandonar, ya que su compromiso con la marca sigue activo. Por otro lado, aquellos con alta recencia podrían mostrar señales de desconexión, lo que los hace más susceptibles al abandono.
Es importante señalar que la interpretación de la recencia puede variar entre industrias y modelos de negocio. Por ejemplo, en un servicio basado en suscripciones, una alta recencia podría ser esperada y no necesariamente indicativa de riesgo de abandono. Por lo tanto, la recencia siempre debe considerarse junto con otras características relevantes y dentro del contexto específico del negocio para derivar los insights más precisos para la predicción de CLTV y clasificación de abandono.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate Recency
most_recent_date = df['PurchaseDate'].max()
df['Recency'] = (most_recent_date - df['PurchaseDate']).dt.days
# Calculate the last purchase date per customer
recency_df = df.groupby('CustomerID')['Recency'].min().reset_index()
# Merge Recency back to main dataset
df = df.merge(recency_df, on='CustomerID', suffixes=('', '_Overall'))
# Display the first few rows with the new Recency feature
print("\nData with Recency Feature:")
print(df[['CustomerID', 'PurchaseDate', 'Recency_Overall']].head())
# Visualize the distribution of Recency
plt.figure(figsize=(10, 6))
sns.histplot(df['Recency_Overall'], kde=True)
plt.title('Distribution of Customer Recency')
plt.xlabel('Recency (days)')
plt.ylabel('Count')
plt.show()
# Calculate additional statistics
avg_recency = df['Recency_Overall'].mean()
median_recency = df['Recency_Overall'].median()
max_recency = df['Recency_Overall'].max()
print(f"\nAverage Recency: {avg_recency:.2f} days")
print(f"Median Recency: {median_recency:.2f} days")
print(f"Maximum Recency: {max_recency:.2f} days")
# Identify customers with high recency (potential churn risk)
high_recency_threshold = df['Recency_Overall'].quantile(0.75) # 75th percentile
high_recency_customers = df[df['Recency_Overall'] > high_recency_threshold]
print(f"\nNumber of customers with high recency (potential churn risk): {len(high_recency_customers)}")
# Correlation between Recency and other features (if available)
if 'TotalSpend' in df.columns:
correlation = df['Recency_Overall'].corr(df['TotalSpend'])
print(f"\nCorrelation between Recency and Total Spend: {correlation:.2f}")
# Save the updated dataset
df.to_csv('retail_data_with_recency.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_recency.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Este ejemplo de código ofrece un enfoque completo para calcular y analizar la característica de Recencia. Desglosemos los componentes clave y sus funciones:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias y se carga el conjunto de datos.
- La columna 'PurchaseDate' se convierte al formato datetime para realizar cálculos precisos.
- Cálculo de Recencia:
- La recencia se calcula como el número de días entre la fecha más reciente en el conjunto de datos y cada fecha de compra.
- Luego se encuentra la recencia mínima para cada cliente, representando su compra más reciente.
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución de la recencia de los clientes.
- Esto ayuda a identificar patrones en el comportamiento del cliente y posibles oportunidades de segmentación.
- Análisis Estadístico:
- Se calculan y muestran los valores promedio, mediano y máximo de la recencia.
- Estas estadísticas ofrecen insights sobre los niveles generales de compromiso de los clientes.
- Segmentación de Clientes:
- Se identifican como riesgos potenciales de abandono a los clientes con alta recencia (por encima del percentil 75).
- Esta segmentación puede utilizarse para estrategias de retención específicas.
- Correlación de Características:
- Si está disponible una columna 'TotalSpend', se calcula su correlación con la recencia.
- Esto ayuda a entender la relación entre el gasto de los clientes y su compromiso.
- Persistencia de Datos:
- El conjunto de datos actualizado con la nueva característica de recencia se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral no solo calcula la característica de recencia, sino que también proporciona valiosos insights sobre el comportamiento de los clientes, riesgos potenciales de abandono y la relación entre la recencia y otras métricas importantes. Estos insights son cruciales para desarrollar estrategias efectivas de retención de clientes y mejorar modelos predictivos tanto para tareas de clasificación (predicción de abandono) como de regresión (estimación de CLTV).
Característica 2: Valor Monetario
Valor Monetario representa el gasto promedio por transacción y actúa como un indicador clave del comportamiento y el valor potencial del cliente. Este métrico ofrece valiosos insights sobre la lealtad del cliente, su capacidad de gasto y el riesgo de abandono. En la predicción del Valor de Vida del Cliente (CLTV), valores monetarios más altos suelen correlacionarse con clientes más rentables, ya que demuestran disposición a invertir más en cada interacción con la marca.
La importancia del valor monetario va más allá de las métricas financieras simples. Puede revelar preferencias de los clientes, sensibilidad al precio e incluso la efectividad de las estrategias de venta adicional (upselling) o venta cruzada (cross-selling). Por ejemplo, los clientes con valores monetarios consistentemente altos podrían ser más receptivos a productos o servicios premium, presentando oportunidades para campañas de marketing dirigidas.
En el contexto de la predicción de abandono, las fluctuaciones en el valor monetario a lo largo del tiempo pueden ser particularmente reveladoras. Una disminución repentina podría señalar insatisfacción o un cambio hacia competidores, mientras que valores constantes o en aumento sugieren un compromiso sostenido.
Al combinar el valor monetario con otras características como recencia y frecuencia, las empresas pueden desarrollar una comprensión más matizada del comportamiento del cliente, permitiendo predicciones más precisas y estrategias de retención personalizadas.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Calculate Monetary Value as the average purchase value for each customer
monetary_value_df = df.groupby('CustomerID')['Total Spend'].agg(['mean', 'sum', 'count']).reset_index()
monetary_value_df.columns = ['CustomerID', 'AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']
# Merge the monetary value features back to main dataset
df = df.merge(monetary_value_df, on='CustomerID')
# Display the first few rows with the new Monetary Value features
print("\nData with Monetary Value Features:")
print(df[['CustomerID', 'Total Spend', 'AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']].head())
# Visualize the distribution of Average Purchase Value
plt.figure(figsize=(10, 6))
sns.histplot(df['AvgPurchaseValue'], kde=True)
plt.title('Distribution of Average Purchase Value')
plt.xlabel('Average Purchase Value')
plt.ylabel('Count')
plt.show()
# Calculate additional statistics
avg_purchase_value = df['AvgPurchaseValue'].mean()
median_purchase_value = df['AvgPurchaseValue'].median()
max_purchase_value = df['AvgPurchaseValue'].max()
print(f"\nAverage Purchase Value: ${avg_purchase_value:.2f}")
print(f"Median Purchase Value: ${median_purchase_value:.2f}")
print(f"Maximum Purchase Value: ${max_purchase_value:.2f}")
# Identify high-value customers (top 20%)
high_value_threshold = df['AvgPurchaseValue'].quantile(0.8)
high_value_customers = df[df['AvgPurchaseValue'] > high_value_threshold]
print(f"\nNumber of high-value customers: {len(high_value_customers)}")
# Correlation between Monetary Value and other features
correlation_matrix = df[['AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Monetary Value Features')
plt.show()
# Save the updated dataset
df.to_csv('retail_data_with_monetary_value.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_monetary_value.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Este fragmento de código muestra un método para calcular y analizar la característica de Valor Monetario. Analicemos sus componentes clave y sus roles:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias (
pandas
para manipulación de datos,matplotlib
yseaborn
para visualización). - El conjunto de datos se carga desde un archivo CSV en un DataFrame de pandas.
- Se importan las bibliotecas necesarias (
- Cálculo del Valor Monetario:
- Se utiliza la función
groupby
para agregar datos porCustomerID
. - Se calculan tres métricas: promedio (
AvgPurchaseValue
), suma (TotalSpend
) y conteo (PurchaseCount
) de 'Total Spend'. - Estas características ofrecen una visión más completa del comportamiento de gasto de los clientes.
- Se utiliza la función
- Fusión de Datos:
- Las nuevas características de valor monetario se fusionan nuevamente en el conjunto de datos principal.
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución del valor promedio de compra (
AvgPurchaseValue
). - Esto ayuda a identificar patrones en el gasto de los clientes y posibles oportunidades de segmentación.
- Se crea un histograma para visualizar la distribución del valor promedio de compra (
- Análisis Estadístico:
- Se calculan y muestran los valores promedio, mediano y máximo de compra.
- Estas estadísticas ofrecen insights sobre los patrones generales de gasto de los clientes.
- Segmentación de Clientes:
- Se identifican clientes de alto valor (el 20% superior basado en el valor promedio de compra).
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o programas de fidelización.
- Correlación de Características:
- Se calcula una matriz de correlación para las características de valor monetario.
- Esto se visualiza usando un mapa de calor, lo que ayuda a entender las relaciones entre diferentes aspectos del gasto de los clientes.
- Persistencia de Datos:
- El conjunto de datos actualizado con las nuevas características de valor monetario se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral no solo calcula la característica de valor monetario, sino que también ofrece valiosos insights sobre los patrones de gasto de los clientes, identifica a los clientes de alto valor y explora relaciones entre diversas métricas monetarias. Estos insights son cruciales para desarrollar estrategias de marketing efectivas, refinar la segmentación de clientes y mejorar modelos predictivos tanto para tareas de clasificación (como predicción de abandono) como de regresión (como estimación de CLTV).
Característica 3: Frecuencia
Frecuencia mide con qué frecuencia un cliente realiza compras dentro de un período de tiempo determinado. Este métrico proporciona valiosos insights sobre el comportamiento y la lealtad del cliente. Las compras frecuentes a menudo indican un alto nivel de compromiso, convirtiéndolo en una característica valiosa tanto para la predicción del Valor de Vida del Cliente (CLTV) como para la clasificación de abandono.
En el contexto de la predicción de CLTV, la frecuencia puede ayudar a identificar a los clientes que probablemente generen un mayor valor a largo plazo. Los clientes con frecuencias de compra más altas tienden a tener una relación más sólida con la marca, lo que potencialmente lleva a un mayor valor de vida. Para la clasificación de abandono, una disminución en la frecuencia de compra puede ser una señal de advertencia temprana de posible desconexión o abandono inminente.
Además, la frecuencia puede analizarse en conjunto con otras características para obtener insights más profundos. Por ejemplo, combinar la frecuencia con el valor monetario puede ayudar a identificar clientes frecuentes de alto valor que podrían ser candidatos ideales para programas de fidelización o campañas de marketing personalizadas. De manera similar, analizar la relación entre frecuencia y recencia puede revelar patrones en el comportamiento del cliente, como hábitos de compra estacionales o la efectividad de las estrategias de retención.
Al diseñar esta característica, es importante considerar el período de tiempo apropiado para el cálculo, ya que puede variar según el modelo de negocio y el ciclo de vida del producto. Para algunos negocios, la frecuencia semanal podría ser relevante, mientras que para otros, frecuencias mensuales o trimestrales podrían ser más informativas. Además, rastrear los cambios en la frecuencia a lo largo del tiempo puede proporcionar insights dinámicos sobre el comportamiento cambiante del cliente y las tendencias del mercado.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate Frequency by counting transactions per customer
frequency_df = df.groupby('CustomerID').agg({
'PurchaseDate': 'count',
'Total Spend': 'sum'
}).reset_index()
frequency_df.columns = ['CustomerID', 'Frequency', 'TotalSpend']
# Calculate average time between purchases
df_sorted = df.sort_values(['CustomerID', 'PurchaseDate'])
df_sorted['PrevPurchaseDate'] = df_sorted.groupby('CustomerID')['PurchaseDate'].shift(1)
df_sorted['DaysBetweenPurchases'] = (df_sorted['PurchaseDate'] - df_sorted['PrevPurchaseDate']).dt.days
avg_time_between_purchases = df_sorted.groupby('CustomerID')['DaysBetweenPurchases'].mean().reset_index()
avg_time_between_purchases.columns = ['CustomerID', 'AvgDaysBetweenPurchases']
# Merge frequency features back to the main dataset
df = df.merge(frequency_df, on='CustomerID')
df = df.merge(avg_time_between_purchases, on='CustomerID')
# Calculate additional metrics
df['AvgPurchaseValue'] = df['TotalSpend'] / df['Frequency']
print("\nData with Frequency Features:")
print(df[['CustomerID', 'PurchaseDate', 'Frequency', 'TotalSpend', 'AvgDaysBetweenPurchases', 'AvgPurchaseValue']].head())
# Visualize the distribution of Frequency
plt.figure(figsize=(10, 6))
sns.histplot(df['Frequency'], kde=True)
plt.title('Distribution of Purchase Frequency')
plt.xlabel('Number of Purchases')
plt.ylabel('Count of Customers')
plt.show()
# Analyze correlation between Frequency and other metrics
correlation_matrix = df[['Frequency', 'TotalSpend', 'AvgDaysBetweenPurchases', 'AvgPurchaseValue']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Frequency-related Features')
plt.show()
# Identify high-frequency customers (top 20%)
high_frequency_threshold = df['Frequency'].quantile(0.8)
high_frequency_customers = df[df['Frequency'] > high_frequency_threshold]
print(f"\nNumber of high-frequency customers: {len(high_frequency_customers)}")
print(f"Average spend of high-frequency customers: ${high_frequency_customers['TotalSpend'].mean():.2f}")
# Save the updated dataset
df.to_csv('retail_data_with_frequency.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_frequency.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Desglosemos los componentes clave y sus funciones:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias (
pandas
para manipulación de datos,matplotlib
yseaborn
para visualización). - El conjunto de datos se carga desde un archivo CSV en un DataFrame de pandas.
- La columna 'PurchaseDate' se convierte al formato datetime para realizar cálculos precisos.
- Se importan las bibliotecas necesarias (
- Cálculo de Frecuencia:
- Se utiliza la función
groupby
para agregar datos porCustomerID
. - Se calculan dos métricas: el conteo de compras (Frecuencia) y la suma de
Total Spend
.
- Se utiliza la función
- Tiempo Entre Compras:
- Los datos se ordenan por
CustomerID
yPurchaseDate
. - Se calcula la diferencia de tiempo entre compras consecutivas para cada cliente.
- Se calcula el tiempo promedio entre compras para cada cliente.
- Los datos se ordenan por
- Fusión de Datos:
- Las nuevas características de frecuencia se fusionan nuevamente en el conjunto de datos principal.
- Métricas Adicionales:
- Se calcula el valor promedio de compra dividiendo
Total Spend
por la frecuencia.
- Se calcula el valor promedio de compra dividiendo
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución de la frecuencia de compra.
- Esto ayuda a identificar patrones en el comportamiento del cliente y posibles oportunidades de segmentación.
- Análisis de Correlación:
- Se calcula una matriz de correlación para las características relacionadas con la frecuencia.
- Esto se visualiza con un mapa de calor, lo que ayuda a comprender las relaciones entre diferentes aspectos del comportamiento del cliente.
- Segmentación de Clientes:
- Se identifican clientes de alta frecuencia (el 20% superior basado en Frecuencia).
- Se calcula y muestra el número de clientes de alta frecuencia y su gasto promedio.
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o programas de fidelización.
- Persistencia de Datos:
- El conjunto de datos actualizado con las nuevas características de frecuencia se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral calcula la característica de Frecuencia y ofrece valiosos insights sobre el comportamiento de los clientes. Identifica clientes de alta frecuencia y explora relaciones entre diversas métricas relacionadas con la frecuencia. Estos insights son esenciales para desarrollar estrategias de marketing efectivas, refinar la segmentación de clientes y mejorar modelos predictivos tanto para tareas de clasificación (como predicción de abandono) como de regresión (como estimación de CLTV).
Característica 4: Tendencia de Compra
Para modelos de clasificación o regresión, la Tendencia de Compra es una característica crucial que captura la naturaleza dinámica del comportamiento del cliente a lo largo del tiempo. Esta característica cuantifica cómo han evolucionado los patrones de gasto de un cliente, proporcionando valiosos insights sobre sus niveles de compromiso y lealtad.
Las tendencias positivas, caracterizadas por un aumento en la frecuencia de compra o el valor, suelen sugerir una creciente satisfacción del cliente y un fortalecimiento de la relación con la marca. Estos clientes pueden ser candidatos ideales para iniciativas de upselling o cross-selling.
Por el contrario, las tendencias negativas podrían señalar problemas potenciales como insatisfacción del cliente, mayor competencia o necesidades cambiantes. Estas tendencias pueden manifestarse como una disminución en la frecuencia de compra, valores de transacción más bajos o intervalos más largos entre compras. Identificar estas tendencias negativas de manera temprana permite a las empresas implementar estrategias de retención específicas, previniendo potencialmente el abandono antes de que ocurra.
La característica de Tendencia de Compra puede ser particularmente poderosa cuando se combina con otras métricas como Recencia y Frecuencia. Por ejemplo, un cliente con alta frecuencia pero una tendencia de compra negativa podría requerir estrategias de intervención diferentes a las de un cliente con baja frecuencia pero una tendencia positiva.
Al incorporar esta dimensión temporal en los modelos predictivos, las empresas pueden desarrollar estrategias de segmentación de clientes más matizadas y efectivas, campañas de marketing personalizadas e iniciativas proactivas de servicio al cliente.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate average spend over time by grouping data by month and CustomerID
df['PurchaseMonth'] = df['PurchaseDate'].dt.to_period('M')
monthly_spend = df.groupby(['CustomerID', 'PurchaseMonth'])['Total Spend'].sum().reset_index()
# Calculate trend as the slope of spending over time for each customer
def calculate_trend(customer_df):
x = np.arange(len(customer_df))
y = customer_df['Total Spend'].values
if len(x) > 1:
return np.polyfit(x, y, 1)[0] # Linear trend slope
return 0
# Apply trend calculation
trend_df = monthly_spend.groupby('CustomerID').apply(calculate_trend).reset_index(name='PurchaseTrend')
# Merge trend feature back to main dataset
df = df.merge(trend_df, on='CustomerID')
print("\nData with Purchase Trend Feature:")
print(df[['CustomerID', 'PurchaseMonth', 'Total Spend', 'PurchaseTrend']].head())
# Visualize Purchase Trend distribution
plt.figure(figsize=(10, 6))
sns.histplot(df['PurchaseTrend'], kde=True)
plt.title('Distribution of Purchase Trends')
plt.xlabel('Purchase Trend (Slope)')
plt.ylabel('Count of Customers')
plt.show()
# Identify customers with positive and negative trends
positive_trend = df[df['PurchaseTrend'] > 0]
negative_trend = df[df['PurchaseTrend'] < 0]
print(f"\nCustomers with positive trend: {len(positive_trend['CustomerID'].unique())}")
print(f"Customers with negative trend: {len(negative_trend['CustomerID'].unique())}")
# Calculate correlation between Purchase Trend and other features
correlation = df[['PurchaseTrend', 'Total Spend', 'Frequency']].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(correlation, annot=True, cmap='coolwarm')
plt.title('Correlation between Purchase Trend and Other Features')
plt.show()
# Example: Using Purchase Trend for customer segmentation
df['TrendCategory'] = pd.cut(df['PurchaseTrend'],
bins=[-np.inf, -10, 0, 10, np.inf],
labels=['Strong Negative', 'Slight Negative', 'Slight Positive', 'Strong Positive'])
trend_segment = df.groupby('TrendCategory').agg({
'CustomerID': 'nunique',
'Total Spend': 'mean',
'Frequency': 'mean'
}).reset_index()
print("\nCustomer Segmentation based on Purchase Trend:")
print(trend_segment)
# Save the updated dataset with the new feature
df.to_csv('retail_data_with_trend.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_trend.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Desglosemos este ejemplo de código integral:
- Carga y Preprocesamiento de Datos:
- Se importan las bibliotecas necesarias:
pandas
para manipulación de datos,numpy
para operaciones numéricas, ymatplotlib
/seaborn
para visualización. - El conjunto de datos se carga desde un archivo CSV y la columna 'PurchaseDate' se convierte al formato datetime.
- Se importan las bibliotecas necesarias:
- Cálculo de la Tendencia de Compra:
- Los datos se agrupan por cliente y mes para obtener patrones de gasto mensual.
- Se define una función
calculate_trend
para calcular la tendencia lineal (pendiente) del gasto a lo largo del tiempo para cada cliente. - Esta tendencia se calcula para cada cliente y se fusiona nuevamente en el conjunto de datos principal.
- Visualización de la Tendencia de Compra:
- Se crea un histograma para mostrar la distribución de las tendencias de compra entre todos los clientes.
- Esta visualización ayuda a identificar los patrones generales de tendencia en la base de clientes.
- Análisis de Tendencias Positivas y Negativas:
- Se separan los clientes con tendencias positivas y negativas, y se cuentan.
- Esto proporciona una visión rápida de cuántos clientes están aumentando o disminuyendo su gasto con el tiempo.
- Análisis de Correlación:
- Se calcula y visualiza la correlación entre la Tendencia de Compra y otras características como Total Spend y Frecuencia.
- Esto ayuda a comprender cómo la tendencia se relaciona con otras métricas importantes de los clientes.
- Segmentación de Clientes:
- Los clientes se categorizan según su Tendencia de Compra en cuatro grupos: Negativa Fuerte, Negativa Leve, Positiva Leve y Positiva Fuerte.
- Para cada segmento, se calcula el número de clientes, el gasto total promedio y la frecuencia de compra promedio.
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o para identificar clientes en riesgo.
- Persistencia de Datos:
- El conjunto de datos actualizado con la nueva característica de Tendencia de Compra se guarda en un nuevo archivo CSV.
- Esto facilita el acceso para análisis futuros o entrenamiento de modelos.
Este código ofrece un análisis exhaustivo de la característica de Tendencia de Compra, mostrando su distribución, correlaciones con otras características y aplicación en la segmentación de clientes. Estos insights son valiosos tanto para tareas de clasificación—como la predicción de abandono—como para tareas de regresión, como la estimación del Valor de Vida del Cliente (CLTV).
2.2.3 Uso de Ingeniería de Características para Entrenamiento de Modelos
Una vez que estas características han sido creadas, sirven como base para entrenar modelos predictivos potentes. En esta sección, exploraremos cómo aprovechar estas características para tareas de clasificación y regresión, centrándonos específicamente en la predicción de abandono y la estimación del CLTV.
Para la predicción de abandono, una tarea de clasificación, utilizaremos un modelo de Regresión Logística. Este modelo es ideal para predecir resultados binarios, lo que lo hace perfecto para determinar si un cliente tiene probabilidades de abandonar o no. Las características que hemos creado, como Recencia, Frecuencia y Tendencia de Compra, proporcionan insights cruciales sobre el comportamiento del cliente que pueden señalar un posible abandono.
Por otro lado, para la predicción de CLTV, una tarea de regresión, emplearemos un modelo de Regresión Lineal. Este modelo es adecuado para predecir valores continuos, permitiéndonos estimar el valor futuro que un cliente puede aportar al negocio. Características como Valor Monetario y Tendencia de Compra son particularmente valiosas aquí, ya que capturan patrones de gasto y el comportamiento a largo plazo del cliente.
Al incorporar estas características en nuestros modelos, mejoramos significativamente su poder predictivo. Esto permite a las empresas tomar decisiones basadas en datos, implementar estrategias de retención dirigidas y optimizar los esfuerzos de compromiso con el cliente. Vamos a profundizar en la implementación práctica de estos modelos utilizando nuestras características recién creadas.
Ejemplo: Entrenamiento de un Modelo de Regresión Logística para la Predicción de Abandono
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data_with_features.csv')
df = pd.read_csv('retail_data_with_features.csv')
# Select features and target
features = ['Recency_Overall', 'AvgPurchaseValue', 'Frequency', 'PurchaseTrend']
X = df[features]
y = df['Churn'] # Target variable for churn
# Standardize the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# Train logistic regression model
log_reg = LogisticRegression(random_state=42)
log_reg.fit(X_train, y_train)
# Predictions
y_pred = log_reg.predict(X_test)
y_pred_proba = log_reg.predict_proba(X_test)[:, 1]
# Model evaluation
print("Model Accuracy:", accuracy_score(y_test, y_pred))
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.show()
# Feature importance
feature_importance = pd.DataFrame({'feature': features, 'importance': abs(log_reg.coef_[0])})
feature_importance = feature_importance.sort_values('importance', ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='importance', y='feature', data=feature_importance)
plt.title('Feature Importance')
plt.show()
# Cross-validation
cv_scores = cross_val_score(log_reg, X_scaled, y, cv=5)
print("\nCross-validation scores:", cv_scores)
print("Mean CV score:", np.mean(cv_scores))
# ROC Curve
from sklearn.metrics import roc_curve, auc
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()
Este ejemplo de código muestra un enfoque integral para entrenar y evaluar un modelo de Regresión Logística para la predicción de abandono. Analicemos sus componentes clave:
- Preparación de Datos:
- Se carga el conjunto de datos y se seleccionan las características relevantes y la variable objetivo.
- Las características se estandarizan usando
StandardScaler
para garantizar que todas estén en la misma escala.
- Entrenamiento del Modelo:
- Se utiliza
train_test_split
para dividir los datos en conjuntos de entrenamiento y prueba. - Se inicializa un modelo de
LogisticRegression
y se entrena con los datos de entrenamiento.
- Se utiliza
- Predicciones:
- El modelo realiza predicciones en el conjunto de prueba.
- También se calculan las probabilidades de predicción, que se utilizarán para la curva ROC.
- Evaluación del Modelo:
- Se calcula la precisión (accuracy) como métrica general de desempeño.
- Se imprime un informe de clasificación detallado que incluye precisión (precision), sensibilidad (recall) y puntaje F1 para cada clase.
- Se visualiza una matriz de confusión usando un mapa de calor, proporcionando una vista clara de verdaderos positivos, verdaderos negativos, falsos positivos y falsos negativos.
- Importancia de Características:
- Se utilizan los valores absolutos de los coeficientes del modelo para clasificar la importancia de las características.
- Un gráfico de barras visualiza la importancia de cada característica en el modelo.
- Validación Cruzada:
- Se realiza validación cruzada para evaluar el desempeño del modelo en diferentes subconjuntos de los datos.
- Esto ayuda a garantizar que el desempeño del modelo sea consistente y no dependa excesivamente de una división particular entre entrenamiento y prueba.
- Curva ROC:
- Se traza la curva Característica Operativa del Receptor (ROC).
- Se calcula el Área Bajo la Curva (AUC), proporcionando un único puntaje que resume el desempeño del modelo en todos los posibles umbrales de clasificación.
Este enfoque integral va más allá del simple entrenamiento del modelo: proporciona una evaluación exhaustiva de su desempeño. Las visualizaciones (matriz de confusión, importancia de características y curva ROC) ofrecen insights intuitivos sobre el comportamiento del modelo. Además, el paso de validación cruzada mejora la robustez de la evaluación, asegurando que el desempeño del modelo se mantenga consistente en diversos subconjuntos de datos.
Ejemplo: Entrenamiento de un Modelo de Regresión Lineal para la Predicción de CLTV
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset
df = pd.read_csv('retail_data_with_features.csv')
# Select features and target
features = ['Recency_Overall', 'AvgPurchaseValue', 'Frequency', 'PurchaseTrend']
X = df[features]
y_cltv = df['CLTV']
# Standardize the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train-test split for CLTV
X_train_cltv, X_test_cltv, y_train_cltv, y_test_cltv = train_test_split(X_scaled, y_cltv, test_size=0.3, random_state=42)
# Train linear regression model
lin_reg = LinearRegression()
lin_reg.fit(X_train_cltv, y_train_cltv)
# Predictions and evaluation
y_pred_cltv = lin_reg.predict(X_test_cltv)
mse = mean_squared_error(y_test_cltv, y_pred_cltv)
r2 = r2_score(y_test_cltv, y_pred_cltv)
print("Mean Squared Error:", mse)
print("R-squared Score:", r2)
# Feature importance
feature_importance = pd.DataFrame({'feature': features, 'importance': abs(lin_reg.coef_)})
feature_importance = feature_importance.sort_values('importance', ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='importance', y='feature', data=feature_importance)
plt.title('Feature Importance for CLTV Prediction')
plt.show()
# Residual plot
residuals = y_test_cltv - y_pred_cltv
plt.figure(figsize=(10, 6))
plt.scatter(y_pred_cltv, residuals)
plt.xlabel('Predicted CLTV')
plt.ylabel('Residuals')
plt.title('Residual Plot')
plt.axhline(y=0, color='r', linestyle='--')
plt.show()
# Cross-validation
cv_scores = cross_val_score(lin_reg, X_scaled, y_cltv, cv=5, scoring='neg_mean_squared_error')
cv_rmse = np.sqrt(-cv_scores)
print("\nCross-validation RMSE scores:", cv_rmse)
print("Mean CV RMSE score:", np.mean(cv_rmse))
# Actual vs Predicted plot
plt.figure(figsize=(10, 6))
plt.scatter(y_test_cltv, y_pred_cltv, alpha=0.5)
plt.plot([y_test_cltv.min(), y_test_cltv.max()], [y_test_cltv.min(), y_test_cltv.max()], 'r--', lw=2)
plt.xlabel('Actual CLTV')
plt.ylabel('Predicted CLTV')
plt.title('Actual vs Predicted CLTV')
plt.show()
Este ejemplo de código ofrece un enfoque integral para entrenar y evaluar un modelo de Regresión Lineal para la predicción del Valor de Vida del Cliente (CLTV). Desglosemos sus componentes clave:
- Preparación de Datos:
- Se carga el conjunto de datos y se seleccionan las características relevantes para la predicción de CLTV.
- Las características se estandarizan utilizando
StandardScaler
para garantizar que todas estén en la misma escala.
- Entrenamiento del Modelo:
- Los datos se dividen en conjuntos de entrenamiento y prueba utilizando
train_test_split
. - Se inicializa un modelo de
LinearRegression
y se entrena con los datos de entrenamiento.
- Los datos se dividen en conjuntos de entrenamiento y prueba utilizando
- Predicciones y Evaluación:
- El modelo realiza predicciones en el conjunto de prueba.
- Se calcula el Error Cuadrático Medio (MSE) para cuantificar el error de predicción del modelo.
- Se computa el puntaje R-cuadrado para medir la proporción de la variabilidad en la variable objetivo que es explicada por las características.
- Importancia de Características:
- Los valores absolutos de los coeficientes del modelo se utilizan para clasificar la importancia de las características.
- Un gráfico de barras visualiza la importancia de cada característica en la predicción de CLTV.
- Análisis de Residuales:
- Se crea un gráfico de residuales para visualizar la diferencia entre los valores reales y los predichos.
- Esto ayuda a identificar patrones en los errores del modelo y evaluar si se cumplen los supuestos de regresión lineal.
- Validación Cruzada:
- Se realiza validación cruzada para evaluar el desempeño del modelo en diferentes subconjuntos de los datos.
- Se utiliza la Raíz del Error Cuadrático Medio (RMSE) como métrica de evaluación en la validación cruzada.
- Gráfico de Valores Reales vs Predichos:
- Se crea un gráfico de dispersión para comparar los valores reales de CLTV con los valores predichos.
- Esta herramienta visual ayuda a comprender qué tan bien se alinean las predicciones del modelo con los valores reales.
Este enfoque integral no solo entrena el modelo, sino que también proporciona una evaluación exhaustiva de su desempeño. Las visualizaciones (importancia de características, gráfico de residuales y gráfico de valores reales vs predichos) ofrecen insights intuitivos sobre el comportamiento y rendimiento del modelo. El paso de validación cruzada mejora la robustez de la evaluación, asegurando que el rendimiento del modelo sea consistente en diversos subconjuntos de datos.
Al implementar estas técnicas de evaluación adicionales y visualizaciones, obtenemos una comprensión más profunda de las fortalezas y limitaciones del modelo en la predicción del CLTV. Esta información puede ser invaluable para refinar el modelo, seleccionar características y tomar decisiones basadas en datos en estrategias de gestión de relaciones con clientes.
2.2.4 Conclusiones Clave y Sus Implicaciones
- La ingeniería de características mejora la precisión predictiva al crear características que capturan patrones y tendencias subyacentes. Este proceso transforma datos en bruto en representaciones significativas que los algoritmos pueden interpretar mejor, lo que conduce a modelos más robustos y precisos.
- Para tareas de clasificación como la predicción de abandono, características como Recencia, Frecuencia y Tendencia de Compra proporcionan insights cruciales sobre la lealtad y el compromiso del cliente. Estas métricas ayudan a identificar clientes en riesgo, permitiendo a las empresas implementar estrategias de retención específicas.
- En tareas de regresión como la predicción de CLTV, las características que capturan hábitos de gasto y comportamiento a lo largo del tiempo, como Valor Monetario y Tendencia de Compra, mejoran significativamente la capacidad del modelo para predecir el valor de vida. Esto permite a las empresas asignar recursos de manera más efectiva y personalizar las experiencias de los clientes.
- La selección de características apropiadas depende del contexto y requiere experiencia en el dominio. Por ejemplo, en salud, características como la frecuencia de citas y la adherencia al tratamiento pueden ser más relevantes para predecir resultados de pacientes.
- El análisis de importancia de características, como se demostró en los ejemplos de código, proporciona valiosos insights sobre qué factores influyen más significativamente en la variable objetivo. Esta información puede guiar decisiones empresariales y la formulación de estrategias.
- La validación cruzada y el análisis de residuales son pasos cruciales para evaluar el desempeño del modelo e identificar posibles áreas de mejora en la ingeniería de características o selección del modelo.
2.2 Ingeniería de Características para Modelos de Clasificación y Regresión
La ingeniería de características para modelos de clasificación y regresión es un proceso crítico que mejora la precisión predictiva mediante la creación de características que capturan patrones subyacentes en los datos. A diferencia de las técnicas de aprendizaje no supervisado como el agrupamiento o el análisis exploratorio, los modelos de clasificación y regresión dependen de datos etiquetados para predecir una variable objetivo específica. Este enfoque es esencial tanto si el objetivo es clasificar a los clientes por nivel de lealtad, predecir precios de viviendas o estimar el valor de vida del cliente (CLTV).
El proceso de ingeniería de características implica varias estrategias clave:
- Creación de Características: Desarrollo de nuevas características que encapsulen información relevante a partir de los datos existentes. Por ejemplo, en un contexto de retail, crear una característica de "frecuencia de compra" a partir de datos de transacciones.
- Transformación de Características: Modificación de características existentes para representar mejor las relaciones subyacentes. Esto puede incluir transformaciones logarítmicas para datos sesgados o la codificación de variables categóricas.
- Selección de Características: Identificación de las características más relevantes que contribuyen significativamente al poder predictivo del modelo, evitando al mismo tiempo el sobreajuste.
Estas estrategias son aplicables tanto a modelos de clasificación, que predicen categorías discretas (como el abandono de clientes), como a modelos de regresión, que predicen valores continuos (como precios de viviendas o CLTV).
Para ilustrar estos conceptos, exploraremos un ejemplo práctico utilizando un conjunto de datos de retail. Nuestro enfoque será predecir el Valor de Vida del Cliente (CLTV), una métrica clave en la gestión de relaciones con clientes. Este ejemplo demostrará cómo las características cuidadosamente diseñadas pueden mejorar significativamente la precisión e interpretabilidad de los modelos predictivos en escenarios empresariales del mundo real.
2.2.1 Paso 1: Preparación y Comprensión de Datos
Antes de profundizar en la ingeniería de características, es crucial comprender a fondo el conjunto de datos y evaluar las variables disponibles. Este paso inicial sienta las bases para crear características significativas que puedan mejorar significativamente el poder predictivo de nuestros modelos. Comencemos cargando nuestro conjunto de datos y examinando su estructura y contenido.
En este caso, trabajamos con un conjunto de datos de retail que contiene información valiosa sobre transacciones de clientes. Nuestros objetivos principales son dos:
- Predecir el Valor de Vida del Cliente (CLTV): Este es un problema de regresión donde buscamos estimar el valor total que un cliente aportará al negocio a lo largo de su relación.
- Predecir el Abandono: Este es un problema de clasificación binaria donde intentamos identificar a los clientes que probablemente dejarán de hacer negocios con nosotros.
Al analizar cuidadosamente las variables disponibles, podemos identificar posibles predictores que podrían ser particularmente útiles para estas tareas. Por ejemplo, el historial de transacciones, la frecuencia de compra y el valor promedio de los pedidos pueden proporcionar valiosos insights tanto para el CLTV como para la probabilidad de abandono.
A medida que avanzamos en nuestro análisis, buscaremos patrones y relaciones dentro de los datos que puedan informar nuestro proceso de ingeniería de características. Esto puede implicar explorar correlaciones entre variables, identificar valores atípicos o anomalías, y considerar conocimientos específicos del dominio sobre el comportamiento del cliente en el sector retail.
El objetivo de esta exploración inicial es obtener una comprensión integral de nuestros datos, que nos guiará en la creación de características sofisticadas y significativas que capturen las dinámicas subyacentes del comportamiento y valor del cliente. Este trabajo fundamental es esencial para construir modelos predictivos robustos que puedan generar insights procesables e informar decisiones estratégicas en la gestión de relaciones con clientes.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the retail dataset
df = pd.read_csv('retail_cltv_data.csv')
# Display basic information and first few rows
print("Dataset Information:")
print(df.info())
print("\nFirst Few Rows of Data:")
print(df.head())
# Basic statistical summary
print("\nStatistical Summary:")
print(df.describe())
# Check for missing values
print("\nMissing Values:")
print(df.isnull().sum())
# Unique values in categorical columns
categorical_columns = df.select_dtypes(include=['object']).columns
for col in categorical_columns:
print(f"\nUnique values in {col}:")
print(df[col].value_counts())
# Visualize the distribution of a numerical column (e.g., 'Total Spend')
plt.figure(figsize=(10, 6))
sns.histplot(df['Total Spend'], kde=True)
plt.title('Distribution of Total Spend')
plt.xlabel('Total Spend')
plt.ylabel('Count')
plt.show()
# Correlation matrix for numerical columns
numerical_columns = df.select_dtypes(include=['int64', 'float64']).columns
correlation_matrix = df[numerical_columns].corr()
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Numerical Features')
plt.show()
retail_cltv_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c26cc3da0b9b307d3a_retail_cltv_data.csv
Desglosemos este ejemplo de código:
- Declaraciones de Importación:
- Importamos
pandas
para la manipulación de datos,matplotlib.pyplot
para gráficos básicos yseaborn
para visualizaciones estadísticas más avanzadas.
- Importamos
- Carga de Datos:
- El conjunto de datos de retail se carga desde un archivo CSV en un DataFrame de pandas.
- Visualización de Información Básica:
df.info()
proporciona una descripción general del DataFrame, incluyendo nombres de columnas, tipos de datos y conteos de valores no nulos.df.head()
muestra las primeras filas del DataFrame.
- Resumen Estadístico:
df.describe()
genera estadísticas descriptivas para columnas numéricas, incluyendo conteo, media, desviación estándar, valores mínimos, máximos y cuartiles.
- Verificación de Valores Faltantes:
df.isnull().sum()
calcula la cantidad de valores faltantes en cada columna.
- Análisis de Datos Categóricos:
- Identificamos columnas categóricas y mostramos el conteo de valores para cada categoría única.
- Visualización de Datos Numéricos:
- Se crea un histograma para la columna 'Total Spend' para visualizar su distribución.
- Usar
seaborn.histplot
conkde=True
agrega una curva de estimación de densidad kernel.
- Análisis de Correlación:
- Se calcula una matriz de correlación para todas las columnas numéricas.
- La matriz se visualiza usando un mapa de calor, que ayuda a identificar relaciones entre variables.
Este código ofrece una exploración inicial exhaustiva de los datos, examinando tipos de datos, valores faltantes, distribución de datos numéricos y correlaciones entre características. Estos insights son esenciales para comprender las sutilezas del conjunto de datos antes de avanzar hacia la ingeniería de características y el desarrollo del modelo.
2.2.2 Paso 2: Creación de Características Predictivas
Una vez que comprendemos a fondo el conjunto de datos, podemos embarcarnos en el proceso crucial de ingeniería de características. Esto implica crear nuevas características o transformar las existentes para revelar patrones y relaciones que se alineen con nuestra variable objetivo, ya sea para una tarea de clasificación o regresión. El objetivo es extraer información significativa de los datos en bruto que pueda mejorar el poder predictivo de nuestros modelos.
Para problemas de clasificación, como predecir el abandono de clientes, podemos enfocarnos en características que capturen el comportamiento y nivel de compromiso del cliente. Estos podrían incluir métricas como la frecuencia de compras, la recencia de la última interacción o cambios en los patrones de gasto a lo largo del tiempo.
En tareas de regresión, como estimar el Valor de Vida del Cliente (CLTV), podríamos diseñar características que reflejen el valor a largo plazo del cliente. Esto podría incluir el cálculo de valores promedio de pedidos, la identificación de tendencias de compra estacionales o el desarrollo de puntajes compuestos que combinen múltiples aspectos del comportamiento del cliente.
El arte de la ingeniería de características radica en combinar la experiencia en el dominio con insights basados en datos para crear variables que no solo sean estadísticamente significativas, sino también interpretables y accionables desde una perspectiva empresarial. A medida que avanzamos, exploraremos técnicas específicas y ejemplos de cómo diseñar estas características predictivas poderosas.
Característica 1: Recencia
Recencia mide el tiempo transcurrido desde la compra más reciente de un cliente. Este métrico es un indicador poderoso del compromiso del cliente y desempeña un papel crucial tanto en los modelos de predicción de CLTV como en los de clasificación de abandono. Las compras recientes a menudo indican un compromiso activo con la marca, lo que sugiere una mayor probabilidad de lealtad del cliente y un mayor valor.
En el contexto de la predicción de CLTV, la recencia puede ayudar a identificar a los clientes de alto valor que consistentemente realizan compras. Estos clientes probablemente continuarán con su comportamiento de compra, lo que podría conducir a un mayor valor de vida. Por el contrario, los clientes con alta recencia (es decir, mucho tiempo desde su última compra) podrían estar en riesgo de abandono, lo que podría impactar negativamente su CLTV proyectado.
Para la clasificación de abandono, la recencia sirve como un predictor clave. Los clientes que han realizado compras recientemente generalmente tienen menos probabilidades de abandonar, ya que su compromiso con la marca sigue activo. Por otro lado, aquellos con alta recencia podrían mostrar señales de desconexión, lo que los hace más susceptibles al abandono.
Es importante señalar que la interpretación de la recencia puede variar entre industrias y modelos de negocio. Por ejemplo, en un servicio basado en suscripciones, una alta recencia podría ser esperada y no necesariamente indicativa de riesgo de abandono. Por lo tanto, la recencia siempre debe considerarse junto con otras características relevantes y dentro del contexto específico del negocio para derivar los insights más precisos para la predicción de CLTV y clasificación de abandono.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate Recency
most_recent_date = df['PurchaseDate'].max()
df['Recency'] = (most_recent_date - df['PurchaseDate']).dt.days
# Calculate the last purchase date per customer
recency_df = df.groupby('CustomerID')['Recency'].min().reset_index()
# Merge Recency back to main dataset
df = df.merge(recency_df, on='CustomerID', suffixes=('', '_Overall'))
# Display the first few rows with the new Recency feature
print("\nData with Recency Feature:")
print(df[['CustomerID', 'PurchaseDate', 'Recency_Overall']].head())
# Visualize the distribution of Recency
plt.figure(figsize=(10, 6))
sns.histplot(df['Recency_Overall'], kde=True)
plt.title('Distribution of Customer Recency')
plt.xlabel('Recency (days)')
plt.ylabel('Count')
plt.show()
# Calculate additional statistics
avg_recency = df['Recency_Overall'].mean()
median_recency = df['Recency_Overall'].median()
max_recency = df['Recency_Overall'].max()
print(f"\nAverage Recency: {avg_recency:.2f} days")
print(f"Median Recency: {median_recency:.2f} days")
print(f"Maximum Recency: {max_recency:.2f} days")
# Identify customers with high recency (potential churn risk)
high_recency_threshold = df['Recency_Overall'].quantile(0.75) # 75th percentile
high_recency_customers = df[df['Recency_Overall'] > high_recency_threshold]
print(f"\nNumber of customers with high recency (potential churn risk): {len(high_recency_customers)}")
# Correlation between Recency and other features (if available)
if 'TotalSpend' in df.columns:
correlation = df['Recency_Overall'].corr(df['TotalSpend'])
print(f"\nCorrelation between Recency and Total Spend: {correlation:.2f}")
# Save the updated dataset
df.to_csv('retail_data_with_recency.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_recency.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Este ejemplo de código ofrece un enfoque completo para calcular y analizar la característica de Recencia. Desglosemos los componentes clave y sus funciones:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias y se carga el conjunto de datos.
- La columna 'PurchaseDate' se convierte al formato datetime para realizar cálculos precisos.
- Cálculo de Recencia:
- La recencia se calcula como el número de días entre la fecha más reciente en el conjunto de datos y cada fecha de compra.
- Luego se encuentra la recencia mínima para cada cliente, representando su compra más reciente.
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución de la recencia de los clientes.
- Esto ayuda a identificar patrones en el comportamiento del cliente y posibles oportunidades de segmentación.
- Análisis Estadístico:
- Se calculan y muestran los valores promedio, mediano y máximo de la recencia.
- Estas estadísticas ofrecen insights sobre los niveles generales de compromiso de los clientes.
- Segmentación de Clientes:
- Se identifican como riesgos potenciales de abandono a los clientes con alta recencia (por encima del percentil 75).
- Esta segmentación puede utilizarse para estrategias de retención específicas.
- Correlación de Características:
- Si está disponible una columna 'TotalSpend', se calcula su correlación con la recencia.
- Esto ayuda a entender la relación entre el gasto de los clientes y su compromiso.
- Persistencia de Datos:
- El conjunto de datos actualizado con la nueva característica de recencia se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral no solo calcula la característica de recencia, sino que también proporciona valiosos insights sobre el comportamiento de los clientes, riesgos potenciales de abandono y la relación entre la recencia y otras métricas importantes. Estos insights son cruciales para desarrollar estrategias efectivas de retención de clientes y mejorar modelos predictivos tanto para tareas de clasificación (predicción de abandono) como de regresión (estimación de CLTV).
Característica 2: Valor Monetario
Valor Monetario representa el gasto promedio por transacción y actúa como un indicador clave del comportamiento y el valor potencial del cliente. Este métrico ofrece valiosos insights sobre la lealtad del cliente, su capacidad de gasto y el riesgo de abandono. En la predicción del Valor de Vida del Cliente (CLTV), valores monetarios más altos suelen correlacionarse con clientes más rentables, ya que demuestran disposición a invertir más en cada interacción con la marca.
La importancia del valor monetario va más allá de las métricas financieras simples. Puede revelar preferencias de los clientes, sensibilidad al precio e incluso la efectividad de las estrategias de venta adicional (upselling) o venta cruzada (cross-selling). Por ejemplo, los clientes con valores monetarios consistentemente altos podrían ser más receptivos a productos o servicios premium, presentando oportunidades para campañas de marketing dirigidas.
En el contexto de la predicción de abandono, las fluctuaciones en el valor monetario a lo largo del tiempo pueden ser particularmente reveladoras. Una disminución repentina podría señalar insatisfacción o un cambio hacia competidores, mientras que valores constantes o en aumento sugieren un compromiso sostenido.
Al combinar el valor monetario con otras características como recencia y frecuencia, las empresas pueden desarrollar una comprensión más matizada del comportamiento del cliente, permitiendo predicciones más precisas y estrategias de retención personalizadas.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Calculate Monetary Value as the average purchase value for each customer
monetary_value_df = df.groupby('CustomerID')['Total Spend'].agg(['mean', 'sum', 'count']).reset_index()
monetary_value_df.columns = ['CustomerID', 'AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']
# Merge the monetary value features back to main dataset
df = df.merge(monetary_value_df, on='CustomerID')
# Display the first few rows with the new Monetary Value features
print("\nData with Monetary Value Features:")
print(df[['CustomerID', 'Total Spend', 'AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']].head())
# Visualize the distribution of Average Purchase Value
plt.figure(figsize=(10, 6))
sns.histplot(df['AvgPurchaseValue'], kde=True)
plt.title('Distribution of Average Purchase Value')
plt.xlabel('Average Purchase Value')
plt.ylabel('Count')
plt.show()
# Calculate additional statistics
avg_purchase_value = df['AvgPurchaseValue'].mean()
median_purchase_value = df['AvgPurchaseValue'].median()
max_purchase_value = df['AvgPurchaseValue'].max()
print(f"\nAverage Purchase Value: ${avg_purchase_value:.2f}")
print(f"Median Purchase Value: ${median_purchase_value:.2f}")
print(f"Maximum Purchase Value: ${max_purchase_value:.2f}")
# Identify high-value customers (top 20%)
high_value_threshold = df['AvgPurchaseValue'].quantile(0.8)
high_value_customers = df[df['AvgPurchaseValue'] > high_value_threshold]
print(f"\nNumber of high-value customers: {len(high_value_customers)}")
# Correlation between Monetary Value and other features
correlation_matrix = df[['AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Monetary Value Features')
plt.show()
# Save the updated dataset
df.to_csv('retail_data_with_monetary_value.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_monetary_value.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Este fragmento de código muestra un método para calcular y analizar la característica de Valor Monetario. Analicemos sus componentes clave y sus roles:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias (
pandas
para manipulación de datos,matplotlib
yseaborn
para visualización). - El conjunto de datos se carga desde un archivo CSV en un DataFrame de pandas.
- Se importan las bibliotecas necesarias (
- Cálculo del Valor Monetario:
- Se utiliza la función
groupby
para agregar datos porCustomerID
. - Se calculan tres métricas: promedio (
AvgPurchaseValue
), suma (TotalSpend
) y conteo (PurchaseCount
) de 'Total Spend'. - Estas características ofrecen una visión más completa del comportamiento de gasto de los clientes.
- Se utiliza la función
- Fusión de Datos:
- Las nuevas características de valor monetario se fusionan nuevamente en el conjunto de datos principal.
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución del valor promedio de compra (
AvgPurchaseValue
). - Esto ayuda a identificar patrones en el gasto de los clientes y posibles oportunidades de segmentación.
- Se crea un histograma para visualizar la distribución del valor promedio de compra (
- Análisis Estadístico:
- Se calculan y muestran los valores promedio, mediano y máximo de compra.
- Estas estadísticas ofrecen insights sobre los patrones generales de gasto de los clientes.
- Segmentación de Clientes:
- Se identifican clientes de alto valor (el 20% superior basado en el valor promedio de compra).
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o programas de fidelización.
- Correlación de Características:
- Se calcula una matriz de correlación para las características de valor monetario.
- Esto se visualiza usando un mapa de calor, lo que ayuda a entender las relaciones entre diferentes aspectos del gasto de los clientes.
- Persistencia de Datos:
- El conjunto de datos actualizado con las nuevas características de valor monetario se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral no solo calcula la característica de valor monetario, sino que también ofrece valiosos insights sobre los patrones de gasto de los clientes, identifica a los clientes de alto valor y explora relaciones entre diversas métricas monetarias. Estos insights son cruciales para desarrollar estrategias de marketing efectivas, refinar la segmentación de clientes y mejorar modelos predictivos tanto para tareas de clasificación (como predicción de abandono) como de regresión (como estimación de CLTV).
Característica 3: Frecuencia
Frecuencia mide con qué frecuencia un cliente realiza compras dentro de un período de tiempo determinado. Este métrico proporciona valiosos insights sobre el comportamiento y la lealtad del cliente. Las compras frecuentes a menudo indican un alto nivel de compromiso, convirtiéndolo en una característica valiosa tanto para la predicción del Valor de Vida del Cliente (CLTV) como para la clasificación de abandono.
En el contexto de la predicción de CLTV, la frecuencia puede ayudar a identificar a los clientes que probablemente generen un mayor valor a largo plazo. Los clientes con frecuencias de compra más altas tienden a tener una relación más sólida con la marca, lo que potencialmente lleva a un mayor valor de vida. Para la clasificación de abandono, una disminución en la frecuencia de compra puede ser una señal de advertencia temprana de posible desconexión o abandono inminente.
Además, la frecuencia puede analizarse en conjunto con otras características para obtener insights más profundos. Por ejemplo, combinar la frecuencia con el valor monetario puede ayudar a identificar clientes frecuentes de alto valor que podrían ser candidatos ideales para programas de fidelización o campañas de marketing personalizadas. De manera similar, analizar la relación entre frecuencia y recencia puede revelar patrones en el comportamiento del cliente, como hábitos de compra estacionales o la efectividad de las estrategias de retención.
Al diseñar esta característica, es importante considerar el período de tiempo apropiado para el cálculo, ya que puede variar según el modelo de negocio y el ciclo de vida del producto. Para algunos negocios, la frecuencia semanal podría ser relevante, mientras que para otros, frecuencias mensuales o trimestrales podrían ser más informativas. Además, rastrear los cambios en la frecuencia a lo largo del tiempo puede proporcionar insights dinámicos sobre el comportamiento cambiante del cliente y las tendencias del mercado.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate Frequency by counting transactions per customer
frequency_df = df.groupby('CustomerID').agg({
'PurchaseDate': 'count',
'Total Spend': 'sum'
}).reset_index()
frequency_df.columns = ['CustomerID', 'Frequency', 'TotalSpend']
# Calculate average time between purchases
df_sorted = df.sort_values(['CustomerID', 'PurchaseDate'])
df_sorted['PrevPurchaseDate'] = df_sorted.groupby('CustomerID')['PurchaseDate'].shift(1)
df_sorted['DaysBetweenPurchases'] = (df_sorted['PurchaseDate'] - df_sorted['PrevPurchaseDate']).dt.days
avg_time_between_purchases = df_sorted.groupby('CustomerID')['DaysBetweenPurchases'].mean().reset_index()
avg_time_between_purchases.columns = ['CustomerID', 'AvgDaysBetweenPurchases']
# Merge frequency features back to the main dataset
df = df.merge(frequency_df, on='CustomerID')
df = df.merge(avg_time_between_purchases, on='CustomerID')
# Calculate additional metrics
df['AvgPurchaseValue'] = df['TotalSpend'] / df['Frequency']
print("\nData with Frequency Features:")
print(df[['CustomerID', 'PurchaseDate', 'Frequency', 'TotalSpend', 'AvgDaysBetweenPurchases', 'AvgPurchaseValue']].head())
# Visualize the distribution of Frequency
plt.figure(figsize=(10, 6))
sns.histplot(df['Frequency'], kde=True)
plt.title('Distribution of Purchase Frequency')
plt.xlabel('Number of Purchases')
plt.ylabel('Count of Customers')
plt.show()
# Analyze correlation between Frequency and other metrics
correlation_matrix = df[['Frequency', 'TotalSpend', 'AvgDaysBetweenPurchases', 'AvgPurchaseValue']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Frequency-related Features')
plt.show()
# Identify high-frequency customers (top 20%)
high_frequency_threshold = df['Frequency'].quantile(0.8)
high_frequency_customers = df[df['Frequency'] > high_frequency_threshold]
print(f"\nNumber of high-frequency customers: {len(high_frequency_customers)}")
print(f"Average spend of high-frequency customers: ${high_frequency_customers['TotalSpend'].mean():.2f}")
# Save the updated dataset
df.to_csv('retail_data_with_frequency.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_frequency.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Desglosemos los componentes clave y sus funciones:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias (
pandas
para manipulación de datos,matplotlib
yseaborn
para visualización). - El conjunto de datos se carga desde un archivo CSV en un DataFrame de pandas.
- La columna 'PurchaseDate' se convierte al formato datetime para realizar cálculos precisos.
- Se importan las bibliotecas necesarias (
- Cálculo de Frecuencia:
- Se utiliza la función
groupby
para agregar datos porCustomerID
. - Se calculan dos métricas: el conteo de compras (Frecuencia) y la suma de
Total Spend
.
- Se utiliza la función
- Tiempo Entre Compras:
- Los datos se ordenan por
CustomerID
yPurchaseDate
. - Se calcula la diferencia de tiempo entre compras consecutivas para cada cliente.
- Se calcula el tiempo promedio entre compras para cada cliente.
- Los datos se ordenan por
- Fusión de Datos:
- Las nuevas características de frecuencia se fusionan nuevamente en el conjunto de datos principal.
- Métricas Adicionales:
- Se calcula el valor promedio de compra dividiendo
Total Spend
por la frecuencia.
- Se calcula el valor promedio de compra dividiendo
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución de la frecuencia de compra.
- Esto ayuda a identificar patrones en el comportamiento del cliente y posibles oportunidades de segmentación.
- Análisis de Correlación:
- Se calcula una matriz de correlación para las características relacionadas con la frecuencia.
- Esto se visualiza con un mapa de calor, lo que ayuda a comprender las relaciones entre diferentes aspectos del comportamiento del cliente.
- Segmentación de Clientes:
- Se identifican clientes de alta frecuencia (el 20% superior basado en Frecuencia).
- Se calcula y muestra el número de clientes de alta frecuencia y su gasto promedio.
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o programas de fidelización.
- Persistencia de Datos:
- El conjunto de datos actualizado con las nuevas características de frecuencia se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral calcula la característica de Frecuencia y ofrece valiosos insights sobre el comportamiento de los clientes. Identifica clientes de alta frecuencia y explora relaciones entre diversas métricas relacionadas con la frecuencia. Estos insights son esenciales para desarrollar estrategias de marketing efectivas, refinar la segmentación de clientes y mejorar modelos predictivos tanto para tareas de clasificación (como predicción de abandono) como de regresión (como estimación de CLTV).
Característica 4: Tendencia de Compra
Para modelos de clasificación o regresión, la Tendencia de Compra es una característica crucial que captura la naturaleza dinámica del comportamiento del cliente a lo largo del tiempo. Esta característica cuantifica cómo han evolucionado los patrones de gasto de un cliente, proporcionando valiosos insights sobre sus niveles de compromiso y lealtad.
Las tendencias positivas, caracterizadas por un aumento en la frecuencia de compra o el valor, suelen sugerir una creciente satisfacción del cliente y un fortalecimiento de la relación con la marca. Estos clientes pueden ser candidatos ideales para iniciativas de upselling o cross-selling.
Por el contrario, las tendencias negativas podrían señalar problemas potenciales como insatisfacción del cliente, mayor competencia o necesidades cambiantes. Estas tendencias pueden manifestarse como una disminución en la frecuencia de compra, valores de transacción más bajos o intervalos más largos entre compras. Identificar estas tendencias negativas de manera temprana permite a las empresas implementar estrategias de retención específicas, previniendo potencialmente el abandono antes de que ocurra.
La característica de Tendencia de Compra puede ser particularmente poderosa cuando se combina con otras métricas como Recencia y Frecuencia. Por ejemplo, un cliente con alta frecuencia pero una tendencia de compra negativa podría requerir estrategias de intervención diferentes a las de un cliente con baja frecuencia pero una tendencia positiva.
Al incorporar esta dimensión temporal en los modelos predictivos, las empresas pueden desarrollar estrategias de segmentación de clientes más matizadas y efectivas, campañas de marketing personalizadas e iniciativas proactivas de servicio al cliente.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate average spend over time by grouping data by month and CustomerID
df['PurchaseMonth'] = df['PurchaseDate'].dt.to_period('M')
monthly_spend = df.groupby(['CustomerID', 'PurchaseMonth'])['Total Spend'].sum().reset_index()
# Calculate trend as the slope of spending over time for each customer
def calculate_trend(customer_df):
x = np.arange(len(customer_df))
y = customer_df['Total Spend'].values
if len(x) > 1:
return np.polyfit(x, y, 1)[0] # Linear trend slope
return 0
# Apply trend calculation
trend_df = monthly_spend.groupby('CustomerID').apply(calculate_trend).reset_index(name='PurchaseTrend')
# Merge trend feature back to main dataset
df = df.merge(trend_df, on='CustomerID')
print("\nData with Purchase Trend Feature:")
print(df[['CustomerID', 'PurchaseMonth', 'Total Spend', 'PurchaseTrend']].head())
# Visualize Purchase Trend distribution
plt.figure(figsize=(10, 6))
sns.histplot(df['PurchaseTrend'], kde=True)
plt.title('Distribution of Purchase Trends')
plt.xlabel('Purchase Trend (Slope)')
plt.ylabel('Count of Customers')
plt.show()
# Identify customers with positive and negative trends
positive_trend = df[df['PurchaseTrend'] > 0]
negative_trend = df[df['PurchaseTrend'] < 0]
print(f"\nCustomers with positive trend: {len(positive_trend['CustomerID'].unique())}")
print(f"Customers with negative trend: {len(negative_trend['CustomerID'].unique())}")
# Calculate correlation between Purchase Trend and other features
correlation = df[['PurchaseTrend', 'Total Spend', 'Frequency']].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(correlation, annot=True, cmap='coolwarm')
plt.title('Correlation between Purchase Trend and Other Features')
plt.show()
# Example: Using Purchase Trend for customer segmentation
df['TrendCategory'] = pd.cut(df['PurchaseTrend'],
bins=[-np.inf, -10, 0, 10, np.inf],
labels=['Strong Negative', 'Slight Negative', 'Slight Positive', 'Strong Positive'])
trend_segment = df.groupby('TrendCategory').agg({
'CustomerID': 'nunique',
'Total Spend': 'mean',
'Frequency': 'mean'
}).reset_index()
print("\nCustomer Segmentation based on Purchase Trend:")
print(trend_segment)
# Save the updated dataset with the new feature
df.to_csv('retail_data_with_trend.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_trend.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Desglosemos este ejemplo de código integral:
- Carga y Preprocesamiento de Datos:
- Se importan las bibliotecas necesarias:
pandas
para manipulación de datos,numpy
para operaciones numéricas, ymatplotlib
/seaborn
para visualización. - El conjunto de datos se carga desde un archivo CSV y la columna 'PurchaseDate' se convierte al formato datetime.
- Se importan las bibliotecas necesarias:
- Cálculo de la Tendencia de Compra:
- Los datos se agrupan por cliente y mes para obtener patrones de gasto mensual.
- Se define una función
calculate_trend
para calcular la tendencia lineal (pendiente) del gasto a lo largo del tiempo para cada cliente. - Esta tendencia se calcula para cada cliente y se fusiona nuevamente en el conjunto de datos principal.
- Visualización de la Tendencia de Compra:
- Se crea un histograma para mostrar la distribución de las tendencias de compra entre todos los clientes.
- Esta visualización ayuda a identificar los patrones generales de tendencia en la base de clientes.
- Análisis de Tendencias Positivas y Negativas:
- Se separan los clientes con tendencias positivas y negativas, y se cuentan.
- Esto proporciona una visión rápida de cuántos clientes están aumentando o disminuyendo su gasto con el tiempo.
- Análisis de Correlación:
- Se calcula y visualiza la correlación entre la Tendencia de Compra y otras características como Total Spend y Frecuencia.
- Esto ayuda a comprender cómo la tendencia se relaciona con otras métricas importantes de los clientes.
- Segmentación de Clientes:
- Los clientes se categorizan según su Tendencia de Compra en cuatro grupos: Negativa Fuerte, Negativa Leve, Positiva Leve y Positiva Fuerte.
- Para cada segmento, se calcula el número de clientes, el gasto total promedio y la frecuencia de compra promedio.
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o para identificar clientes en riesgo.
- Persistencia de Datos:
- El conjunto de datos actualizado con la nueva característica de Tendencia de Compra se guarda en un nuevo archivo CSV.
- Esto facilita el acceso para análisis futuros o entrenamiento de modelos.
Este código ofrece un análisis exhaustivo de la característica de Tendencia de Compra, mostrando su distribución, correlaciones con otras características y aplicación en la segmentación de clientes. Estos insights son valiosos tanto para tareas de clasificación—como la predicción de abandono—como para tareas de regresión, como la estimación del Valor de Vida del Cliente (CLTV).
2.2.3 Uso de Ingeniería de Características para Entrenamiento de Modelos
Una vez que estas características han sido creadas, sirven como base para entrenar modelos predictivos potentes. En esta sección, exploraremos cómo aprovechar estas características para tareas de clasificación y regresión, centrándonos específicamente en la predicción de abandono y la estimación del CLTV.
Para la predicción de abandono, una tarea de clasificación, utilizaremos un modelo de Regresión Logística. Este modelo es ideal para predecir resultados binarios, lo que lo hace perfecto para determinar si un cliente tiene probabilidades de abandonar o no. Las características que hemos creado, como Recencia, Frecuencia y Tendencia de Compra, proporcionan insights cruciales sobre el comportamiento del cliente que pueden señalar un posible abandono.
Por otro lado, para la predicción de CLTV, una tarea de regresión, emplearemos un modelo de Regresión Lineal. Este modelo es adecuado para predecir valores continuos, permitiéndonos estimar el valor futuro que un cliente puede aportar al negocio. Características como Valor Monetario y Tendencia de Compra son particularmente valiosas aquí, ya que capturan patrones de gasto y el comportamiento a largo plazo del cliente.
Al incorporar estas características en nuestros modelos, mejoramos significativamente su poder predictivo. Esto permite a las empresas tomar decisiones basadas en datos, implementar estrategias de retención dirigidas y optimizar los esfuerzos de compromiso con el cliente. Vamos a profundizar en la implementación práctica de estos modelos utilizando nuestras características recién creadas.
Ejemplo: Entrenamiento de un Modelo de Regresión Logística para la Predicción de Abandono
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data_with_features.csv')
df = pd.read_csv('retail_data_with_features.csv')
# Select features and target
features = ['Recency_Overall', 'AvgPurchaseValue', 'Frequency', 'PurchaseTrend']
X = df[features]
y = df['Churn'] # Target variable for churn
# Standardize the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# Train logistic regression model
log_reg = LogisticRegression(random_state=42)
log_reg.fit(X_train, y_train)
# Predictions
y_pred = log_reg.predict(X_test)
y_pred_proba = log_reg.predict_proba(X_test)[:, 1]
# Model evaluation
print("Model Accuracy:", accuracy_score(y_test, y_pred))
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.show()
# Feature importance
feature_importance = pd.DataFrame({'feature': features, 'importance': abs(log_reg.coef_[0])})
feature_importance = feature_importance.sort_values('importance', ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='importance', y='feature', data=feature_importance)
plt.title('Feature Importance')
plt.show()
# Cross-validation
cv_scores = cross_val_score(log_reg, X_scaled, y, cv=5)
print("\nCross-validation scores:", cv_scores)
print("Mean CV score:", np.mean(cv_scores))
# ROC Curve
from sklearn.metrics import roc_curve, auc
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()
Este ejemplo de código muestra un enfoque integral para entrenar y evaluar un modelo de Regresión Logística para la predicción de abandono. Analicemos sus componentes clave:
- Preparación de Datos:
- Se carga el conjunto de datos y se seleccionan las características relevantes y la variable objetivo.
- Las características se estandarizan usando
StandardScaler
para garantizar que todas estén en la misma escala.
- Entrenamiento del Modelo:
- Se utiliza
train_test_split
para dividir los datos en conjuntos de entrenamiento y prueba. - Se inicializa un modelo de
LogisticRegression
y se entrena con los datos de entrenamiento.
- Se utiliza
- Predicciones:
- El modelo realiza predicciones en el conjunto de prueba.
- También se calculan las probabilidades de predicción, que se utilizarán para la curva ROC.
- Evaluación del Modelo:
- Se calcula la precisión (accuracy) como métrica general de desempeño.
- Se imprime un informe de clasificación detallado que incluye precisión (precision), sensibilidad (recall) y puntaje F1 para cada clase.
- Se visualiza una matriz de confusión usando un mapa de calor, proporcionando una vista clara de verdaderos positivos, verdaderos negativos, falsos positivos y falsos negativos.
- Importancia de Características:
- Se utilizan los valores absolutos de los coeficientes del modelo para clasificar la importancia de las características.
- Un gráfico de barras visualiza la importancia de cada característica en el modelo.
- Validación Cruzada:
- Se realiza validación cruzada para evaluar el desempeño del modelo en diferentes subconjuntos de los datos.
- Esto ayuda a garantizar que el desempeño del modelo sea consistente y no dependa excesivamente de una división particular entre entrenamiento y prueba.
- Curva ROC:
- Se traza la curva Característica Operativa del Receptor (ROC).
- Se calcula el Área Bajo la Curva (AUC), proporcionando un único puntaje que resume el desempeño del modelo en todos los posibles umbrales de clasificación.
Este enfoque integral va más allá del simple entrenamiento del modelo: proporciona una evaluación exhaustiva de su desempeño. Las visualizaciones (matriz de confusión, importancia de características y curva ROC) ofrecen insights intuitivos sobre el comportamiento del modelo. Además, el paso de validación cruzada mejora la robustez de la evaluación, asegurando que el desempeño del modelo se mantenga consistente en diversos subconjuntos de datos.
Ejemplo: Entrenamiento de un Modelo de Regresión Lineal para la Predicción de CLTV
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset
df = pd.read_csv('retail_data_with_features.csv')
# Select features and target
features = ['Recency_Overall', 'AvgPurchaseValue', 'Frequency', 'PurchaseTrend']
X = df[features]
y_cltv = df['CLTV']
# Standardize the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train-test split for CLTV
X_train_cltv, X_test_cltv, y_train_cltv, y_test_cltv = train_test_split(X_scaled, y_cltv, test_size=0.3, random_state=42)
# Train linear regression model
lin_reg = LinearRegression()
lin_reg.fit(X_train_cltv, y_train_cltv)
# Predictions and evaluation
y_pred_cltv = lin_reg.predict(X_test_cltv)
mse = mean_squared_error(y_test_cltv, y_pred_cltv)
r2 = r2_score(y_test_cltv, y_pred_cltv)
print("Mean Squared Error:", mse)
print("R-squared Score:", r2)
# Feature importance
feature_importance = pd.DataFrame({'feature': features, 'importance': abs(lin_reg.coef_)})
feature_importance = feature_importance.sort_values('importance', ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='importance', y='feature', data=feature_importance)
plt.title('Feature Importance for CLTV Prediction')
plt.show()
# Residual plot
residuals = y_test_cltv - y_pred_cltv
plt.figure(figsize=(10, 6))
plt.scatter(y_pred_cltv, residuals)
plt.xlabel('Predicted CLTV')
plt.ylabel('Residuals')
plt.title('Residual Plot')
plt.axhline(y=0, color='r', linestyle='--')
plt.show()
# Cross-validation
cv_scores = cross_val_score(lin_reg, X_scaled, y_cltv, cv=5, scoring='neg_mean_squared_error')
cv_rmse = np.sqrt(-cv_scores)
print("\nCross-validation RMSE scores:", cv_rmse)
print("Mean CV RMSE score:", np.mean(cv_rmse))
# Actual vs Predicted plot
plt.figure(figsize=(10, 6))
plt.scatter(y_test_cltv, y_pred_cltv, alpha=0.5)
plt.plot([y_test_cltv.min(), y_test_cltv.max()], [y_test_cltv.min(), y_test_cltv.max()], 'r--', lw=2)
plt.xlabel('Actual CLTV')
plt.ylabel('Predicted CLTV')
plt.title('Actual vs Predicted CLTV')
plt.show()
Este ejemplo de código ofrece un enfoque integral para entrenar y evaluar un modelo de Regresión Lineal para la predicción del Valor de Vida del Cliente (CLTV). Desglosemos sus componentes clave:
- Preparación de Datos:
- Se carga el conjunto de datos y se seleccionan las características relevantes para la predicción de CLTV.
- Las características se estandarizan utilizando
StandardScaler
para garantizar que todas estén en la misma escala.
- Entrenamiento del Modelo:
- Los datos se dividen en conjuntos de entrenamiento y prueba utilizando
train_test_split
. - Se inicializa un modelo de
LinearRegression
y se entrena con los datos de entrenamiento.
- Los datos se dividen en conjuntos de entrenamiento y prueba utilizando
- Predicciones y Evaluación:
- El modelo realiza predicciones en el conjunto de prueba.
- Se calcula el Error Cuadrático Medio (MSE) para cuantificar el error de predicción del modelo.
- Se computa el puntaje R-cuadrado para medir la proporción de la variabilidad en la variable objetivo que es explicada por las características.
- Importancia de Características:
- Los valores absolutos de los coeficientes del modelo se utilizan para clasificar la importancia de las características.
- Un gráfico de barras visualiza la importancia de cada característica en la predicción de CLTV.
- Análisis de Residuales:
- Se crea un gráfico de residuales para visualizar la diferencia entre los valores reales y los predichos.
- Esto ayuda a identificar patrones en los errores del modelo y evaluar si se cumplen los supuestos de regresión lineal.
- Validación Cruzada:
- Se realiza validación cruzada para evaluar el desempeño del modelo en diferentes subconjuntos de los datos.
- Se utiliza la Raíz del Error Cuadrático Medio (RMSE) como métrica de evaluación en la validación cruzada.
- Gráfico de Valores Reales vs Predichos:
- Se crea un gráfico de dispersión para comparar los valores reales de CLTV con los valores predichos.
- Esta herramienta visual ayuda a comprender qué tan bien se alinean las predicciones del modelo con los valores reales.
Este enfoque integral no solo entrena el modelo, sino que también proporciona una evaluación exhaustiva de su desempeño. Las visualizaciones (importancia de características, gráfico de residuales y gráfico de valores reales vs predichos) ofrecen insights intuitivos sobre el comportamiento y rendimiento del modelo. El paso de validación cruzada mejora la robustez de la evaluación, asegurando que el rendimiento del modelo sea consistente en diversos subconjuntos de datos.
Al implementar estas técnicas de evaluación adicionales y visualizaciones, obtenemos una comprensión más profunda de las fortalezas y limitaciones del modelo en la predicción del CLTV. Esta información puede ser invaluable para refinar el modelo, seleccionar características y tomar decisiones basadas en datos en estrategias de gestión de relaciones con clientes.
2.2.4 Conclusiones Clave y Sus Implicaciones
- La ingeniería de características mejora la precisión predictiva al crear características que capturan patrones y tendencias subyacentes. Este proceso transforma datos en bruto en representaciones significativas que los algoritmos pueden interpretar mejor, lo que conduce a modelos más robustos y precisos.
- Para tareas de clasificación como la predicción de abandono, características como Recencia, Frecuencia y Tendencia de Compra proporcionan insights cruciales sobre la lealtad y el compromiso del cliente. Estas métricas ayudan a identificar clientes en riesgo, permitiendo a las empresas implementar estrategias de retención específicas.
- En tareas de regresión como la predicción de CLTV, las características que capturan hábitos de gasto y comportamiento a lo largo del tiempo, como Valor Monetario y Tendencia de Compra, mejoran significativamente la capacidad del modelo para predecir el valor de vida. Esto permite a las empresas asignar recursos de manera más efectiva y personalizar las experiencias de los clientes.
- La selección de características apropiadas depende del contexto y requiere experiencia en el dominio. Por ejemplo, en salud, características como la frecuencia de citas y la adherencia al tratamiento pueden ser más relevantes para predecir resultados de pacientes.
- El análisis de importancia de características, como se demostró en los ejemplos de código, proporciona valiosos insights sobre qué factores influyen más significativamente en la variable objetivo. Esta información puede guiar decisiones empresariales y la formulación de estrategias.
- La validación cruzada y el análisis de residuales son pasos cruciales para evaluar el desempeño del modelo e identificar posibles áreas de mejora en la ingeniería de características o selección del modelo.
2.2 Ingeniería de Características para Modelos de Clasificación y Regresión
La ingeniería de características para modelos de clasificación y regresión es un proceso crítico que mejora la precisión predictiva mediante la creación de características que capturan patrones subyacentes en los datos. A diferencia de las técnicas de aprendizaje no supervisado como el agrupamiento o el análisis exploratorio, los modelos de clasificación y regresión dependen de datos etiquetados para predecir una variable objetivo específica. Este enfoque es esencial tanto si el objetivo es clasificar a los clientes por nivel de lealtad, predecir precios de viviendas o estimar el valor de vida del cliente (CLTV).
El proceso de ingeniería de características implica varias estrategias clave:
- Creación de Características: Desarrollo de nuevas características que encapsulen información relevante a partir de los datos existentes. Por ejemplo, en un contexto de retail, crear una característica de "frecuencia de compra" a partir de datos de transacciones.
- Transformación de Características: Modificación de características existentes para representar mejor las relaciones subyacentes. Esto puede incluir transformaciones logarítmicas para datos sesgados o la codificación de variables categóricas.
- Selección de Características: Identificación de las características más relevantes que contribuyen significativamente al poder predictivo del modelo, evitando al mismo tiempo el sobreajuste.
Estas estrategias son aplicables tanto a modelos de clasificación, que predicen categorías discretas (como el abandono de clientes), como a modelos de regresión, que predicen valores continuos (como precios de viviendas o CLTV).
Para ilustrar estos conceptos, exploraremos un ejemplo práctico utilizando un conjunto de datos de retail. Nuestro enfoque será predecir el Valor de Vida del Cliente (CLTV), una métrica clave en la gestión de relaciones con clientes. Este ejemplo demostrará cómo las características cuidadosamente diseñadas pueden mejorar significativamente la precisión e interpretabilidad de los modelos predictivos en escenarios empresariales del mundo real.
2.2.1 Paso 1: Preparación y Comprensión de Datos
Antes de profundizar en la ingeniería de características, es crucial comprender a fondo el conjunto de datos y evaluar las variables disponibles. Este paso inicial sienta las bases para crear características significativas que puedan mejorar significativamente el poder predictivo de nuestros modelos. Comencemos cargando nuestro conjunto de datos y examinando su estructura y contenido.
En este caso, trabajamos con un conjunto de datos de retail que contiene información valiosa sobre transacciones de clientes. Nuestros objetivos principales son dos:
- Predecir el Valor de Vida del Cliente (CLTV): Este es un problema de regresión donde buscamos estimar el valor total que un cliente aportará al negocio a lo largo de su relación.
- Predecir el Abandono: Este es un problema de clasificación binaria donde intentamos identificar a los clientes que probablemente dejarán de hacer negocios con nosotros.
Al analizar cuidadosamente las variables disponibles, podemos identificar posibles predictores que podrían ser particularmente útiles para estas tareas. Por ejemplo, el historial de transacciones, la frecuencia de compra y el valor promedio de los pedidos pueden proporcionar valiosos insights tanto para el CLTV como para la probabilidad de abandono.
A medida que avanzamos en nuestro análisis, buscaremos patrones y relaciones dentro de los datos que puedan informar nuestro proceso de ingeniería de características. Esto puede implicar explorar correlaciones entre variables, identificar valores atípicos o anomalías, y considerar conocimientos específicos del dominio sobre el comportamiento del cliente en el sector retail.
El objetivo de esta exploración inicial es obtener una comprensión integral de nuestros datos, que nos guiará en la creación de características sofisticadas y significativas que capturen las dinámicas subyacentes del comportamiento y valor del cliente. Este trabajo fundamental es esencial para construir modelos predictivos robustos que puedan generar insights procesables e informar decisiones estratégicas en la gestión de relaciones con clientes.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the retail dataset
df = pd.read_csv('retail_cltv_data.csv')
# Display basic information and first few rows
print("Dataset Information:")
print(df.info())
print("\nFirst Few Rows of Data:")
print(df.head())
# Basic statistical summary
print("\nStatistical Summary:")
print(df.describe())
# Check for missing values
print("\nMissing Values:")
print(df.isnull().sum())
# Unique values in categorical columns
categorical_columns = df.select_dtypes(include=['object']).columns
for col in categorical_columns:
print(f"\nUnique values in {col}:")
print(df[col].value_counts())
# Visualize the distribution of a numerical column (e.g., 'Total Spend')
plt.figure(figsize=(10, 6))
sns.histplot(df['Total Spend'], kde=True)
plt.title('Distribution of Total Spend')
plt.xlabel('Total Spend')
plt.ylabel('Count')
plt.show()
# Correlation matrix for numerical columns
numerical_columns = df.select_dtypes(include=['int64', 'float64']).columns
correlation_matrix = df[numerical_columns].corr()
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Numerical Features')
plt.show()
retail_cltv_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c26cc3da0b9b307d3a_retail_cltv_data.csv
Desglosemos este ejemplo de código:
- Declaraciones de Importación:
- Importamos
pandas
para la manipulación de datos,matplotlib.pyplot
para gráficos básicos yseaborn
para visualizaciones estadísticas más avanzadas.
- Importamos
- Carga de Datos:
- El conjunto de datos de retail se carga desde un archivo CSV en un DataFrame de pandas.
- Visualización de Información Básica:
df.info()
proporciona una descripción general del DataFrame, incluyendo nombres de columnas, tipos de datos y conteos de valores no nulos.df.head()
muestra las primeras filas del DataFrame.
- Resumen Estadístico:
df.describe()
genera estadísticas descriptivas para columnas numéricas, incluyendo conteo, media, desviación estándar, valores mínimos, máximos y cuartiles.
- Verificación de Valores Faltantes:
df.isnull().sum()
calcula la cantidad de valores faltantes en cada columna.
- Análisis de Datos Categóricos:
- Identificamos columnas categóricas y mostramos el conteo de valores para cada categoría única.
- Visualización de Datos Numéricos:
- Se crea un histograma para la columna 'Total Spend' para visualizar su distribución.
- Usar
seaborn.histplot
conkde=True
agrega una curva de estimación de densidad kernel.
- Análisis de Correlación:
- Se calcula una matriz de correlación para todas las columnas numéricas.
- La matriz se visualiza usando un mapa de calor, que ayuda a identificar relaciones entre variables.
Este código ofrece una exploración inicial exhaustiva de los datos, examinando tipos de datos, valores faltantes, distribución de datos numéricos y correlaciones entre características. Estos insights son esenciales para comprender las sutilezas del conjunto de datos antes de avanzar hacia la ingeniería de características y el desarrollo del modelo.
2.2.2 Paso 2: Creación de Características Predictivas
Una vez que comprendemos a fondo el conjunto de datos, podemos embarcarnos en el proceso crucial de ingeniería de características. Esto implica crear nuevas características o transformar las existentes para revelar patrones y relaciones que se alineen con nuestra variable objetivo, ya sea para una tarea de clasificación o regresión. El objetivo es extraer información significativa de los datos en bruto que pueda mejorar el poder predictivo de nuestros modelos.
Para problemas de clasificación, como predecir el abandono de clientes, podemos enfocarnos en características que capturen el comportamiento y nivel de compromiso del cliente. Estos podrían incluir métricas como la frecuencia de compras, la recencia de la última interacción o cambios en los patrones de gasto a lo largo del tiempo.
En tareas de regresión, como estimar el Valor de Vida del Cliente (CLTV), podríamos diseñar características que reflejen el valor a largo plazo del cliente. Esto podría incluir el cálculo de valores promedio de pedidos, la identificación de tendencias de compra estacionales o el desarrollo de puntajes compuestos que combinen múltiples aspectos del comportamiento del cliente.
El arte de la ingeniería de características radica en combinar la experiencia en el dominio con insights basados en datos para crear variables que no solo sean estadísticamente significativas, sino también interpretables y accionables desde una perspectiva empresarial. A medida que avanzamos, exploraremos técnicas específicas y ejemplos de cómo diseñar estas características predictivas poderosas.
Característica 1: Recencia
Recencia mide el tiempo transcurrido desde la compra más reciente de un cliente. Este métrico es un indicador poderoso del compromiso del cliente y desempeña un papel crucial tanto en los modelos de predicción de CLTV como en los de clasificación de abandono. Las compras recientes a menudo indican un compromiso activo con la marca, lo que sugiere una mayor probabilidad de lealtad del cliente y un mayor valor.
En el contexto de la predicción de CLTV, la recencia puede ayudar a identificar a los clientes de alto valor que consistentemente realizan compras. Estos clientes probablemente continuarán con su comportamiento de compra, lo que podría conducir a un mayor valor de vida. Por el contrario, los clientes con alta recencia (es decir, mucho tiempo desde su última compra) podrían estar en riesgo de abandono, lo que podría impactar negativamente su CLTV proyectado.
Para la clasificación de abandono, la recencia sirve como un predictor clave. Los clientes que han realizado compras recientemente generalmente tienen menos probabilidades de abandonar, ya que su compromiso con la marca sigue activo. Por otro lado, aquellos con alta recencia podrían mostrar señales de desconexión, lo que los hace más susceptibles al abandono.
Es importante señalar que la interpretación de la recencia puede variar entre industrias y modelos de negocio. Por ejemplo, en un servicio basado en suscripciones, una alta recencia podría ser esperada y no necesariamente indicativa de riesgo de abandono. Por lo tanto, la recencia siempre debe considerarse junto con otras características relevantes y dentro del contexto específico del negocio para derivar los insights más precisos para la predicción de CLTV y clasificación de abandono.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate Recency
most_recent_date = df['PurchaseDate'].max()
df['Recency'] = (most_recent_date - df['PurchaseDate']).dt.days
# Calculate the last purchase date per customer
recency_df = df.groupby('CustomerID')['Recency'].min().reset_index()
# Merge Recency back to main dataset
df = df.merge(recency_df, on='CustomerID', suffixes=('', '_Overall'))
# Display the first few rows with the new Recency feature
print("\nData with Recency Feature:")
print(df[['CustomerID', 'PurchaseDate', 'Recency_Overall']].head())
# Visualize the distribution of Recency
plt.figure(figsize=(10, 6))
sns.histplot(df['Recency_Overall'], kde=True)
plt.title('Distribution of Customer Recency')
plt.xlabel('Recency (days)')
plt.ylabel('Count')
plt.show()
# Calculate additional statistics
avg_recency = df['Recency_Overall'].mean()
median_recency = df['Recency_Overall'].median()
max_recency = df['Recency_Overall'].max()
print(f"\nAverage Recency: {avg_recency:.2f} days")
print(f"Median Recency: {median_recency:.2f} days")
print(f"Maximum Recency: {max_recency:.2f} days")
# Identify customers with high recency (potential churn risk)
high_recency_threshold = df['Recency_Overall'].quantile(0.75) # 75th percentile
high_recency_customers = df[df['Recency_Overall'] > high_recency_threshold]
print(f"\nNumber of customers with high recency (potential churn risk): {len(high_recency_customers)}")
# Correlation between Recency and other features (if available)
if 'TotalSpend' in df.columns:
correlation = df['Recency_Overall'].corr(df['TotalSpend'])
print(f"\nCorrelation between Recency and Total Spend: {correlation:.2f}")
# Save the updated dataset
df.to_csv('retail_data_with_recency.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_recency.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Este ejemplo de código ofrece un enfoque completo para calcular y analizar la característica de Recencia. Desglosemos los componentes clave y sus funciones:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias y se carga el conjunto de datos.
- La columna 'PurchaseDate' se convierte al formato datetime para realizar cálculos precisos.
- Cálculo de Recencia:
- La recencia se calcula como el número de días entre la fecha más reciente en el conjunto de datos y cada fecha de compra.
- Luego se encuentra la recencia mínima para cada cliente, representando su compra más reciente.
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución de la recencia de los clientes.
- Esto ayuda a identificar patrones en el comportamiento del cliente y posibles oportunidades de segmentación.
- Análisis Estadístico:
- Se calculan y muestran los valores promedio, mediano y máximo de la recencia.
- Estas estadísticas ofrecen insights sobre los niveles generales de compromiso de los clientes.
- Segmentación de Clientes:
- Se identifican como riesgos potenciales de abandono a los clientes con alta recencia (por encima del percentil 75).
- Esta segmentación puede utilizarse para estrategias de retención específicas.
- Correlación de Características:
- Si está disponible una columna 'TotalSpend', se calcula su correlación con la recencia.
- Esto ayuda a entender la relación entre el gasto de los clientes y su compromiso.
- Persistencia de Datos:
- El conjunto de datos actualizado con la nueva característica de recencia se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral no solo calcula la característica de recencia, sino que también proporciona valiosos insights sobre el comportamiento de los clientes, riesgos potenciales de abandono y la relación entre la recencia y otras métricas importantes. Estos insights son cruciales para desarrollar estrategias efectivas de retención de clientes y mejorar modelos predictivos tanto para tareas de clasificación (predicción de abandono) como de regresión (estimación de CLTV).
Característica 2: Valor Monetario
Valor Monetario representa el gasto promedio por transacción y actúa como un indicador clave del comportamiento y el valor potencial del cliente. Este métrico ofrece valiosos insights sobre la lealtad del cliente, su capacidad de gasto y el riesgo de abandono. En la predicción del Valor de Vida del Cliente (CLTV), valores monetarios más altos suelen correlacionarse con clientes más rentables, ya que demuestran disposición a invertir más en cada interacción con la marca.
La importancia del valor monetario va más allá de las métricas financieras simples. Puede revelar preferencias de los clientes, sensibilidad al precio e incluso la efectividad de las estrategias de venta adicional (upselling) o venta cruzada (cross-selling). Por ejemplo, los clientes con valores monetarios consistentemente altos podrían ser más receptivos a productos o servicios premium, presentando oportunidades para campañas de marketing dirigidas.
En el contexto de la predicción de abandono, las fluctuaciones en el valor monetario a lo largo del tiempo pueden ser particularmente reveladoras. Una disminución repentina podría señalar insatisfacción o un cambio hacia competidores, mientras que valores constantes o en aumento sugieren un compromiso sostenido.
Al combinar el valor monetario con otras características como recencia y frecuencia, las empresas pueden desarrollar una comprensión más matizada del comportamiento del cliente, permitiendo predicciones más precisas y estrategias de retención personalizadas.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Calculate Monetary Value as the average purchase value for each customer
monetary_value_df = df.groupby('CustomerID')['Total Spend'].agg(['mean', 'sum', 'count']).reset_index()
monetary_value_df.columns = ['CustomerID', 'AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']
# Merge the monetary value features back to main dataset
df = df.merge(monetary_value_df, on='CustomerID')
# Display the first few rows with the new Monetary Value features
print("\nData with Monetary Value Features:")
print(df[['CustomerID', 'Total Spend', 'AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']].head())
# Visualize the distribution of Average Purchase Value
plt.figure(figsize=(10, 6))
sns.histplot(df['AvgPurchaseValue'], kde=True)
plt.title('Distribution of Average Purchase Value')
plt.xlabel('Average Purchase Value')
plt.ylabel('Count')
plt.show()
# Calculate additional statistics
avg_purchase_value = df['AvgPurchaseValue'].mean()
median_purchase_value = df['AvgPurchaseValue'].median()
max_purchase_value = df['AvgPurchaseValue'].max()
print(f"\nAverage Purchase Value: ${avg_purchase_value:.2f}")
print(f"Median Purchase Value: ${median_purchase_value:.2f}")
print(f"Maximum Purchase Value: ${max_purchase_value:.2f}")
# Identify high-value customers (top 20%)
high_value_threshold = df['AvgPurchaseValue'].quantile(0.8)
high_value_customers = df[df['AvgPurchaseValue'] > high_value_threshold]
print(f"\nNumber of high-value customers: {len(high_value_customers)}")
# Correlation between Monetary Value and other features
correlation_matrix = df[['AvgPurchaseValue', 'TotalSpend', 'PurchaseCount']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Monetary Value Features')
plt.show()
# Save the updated dataset
df.to_csv('retail_data_with_monetary_value.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_monetary_value.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Este fragmento de código muestra un método para calcular y analizar la característica de Valor Monetario. Analicemos sus componentes clave y sus roles:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias (
pandas
para manipulación de datos,matplotlib
yseaborn
para visualización). - El conjunto de datos se carga desde un archivo CSV en un DataFrame de pandas.
- Se importan las bibliotecas necesarias (
- Cálculo del Valor Monetario:
- Se utiliza la función
groupby
para agregar datos porCustomerID
. - Se calculan tres métricas: promedio (
AvgPurchaseValue
), suma (TotalSpend
) y conteo (PurchaseCount
) de 'Total Spend'. - Estas características ofrecen una visión más completa del comportamiento de gasto de los clientes.
- Se utiliza la función
- Fusión de Datos:
- Las nuevas características de valor monetario se fusionan nuevamente en el conjunto de datos principal.
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución del valor promedio de compra (
AvgPurchaseValue
). - Esto ayuda a identificar patrones en el gasto de los clientes y posibles oportunidades de segmentación.
- Se crea un histograma para visualizar la distribución del valor promedio de compra (
- Análisis Estadístico:
- Se calculan y muestran los valores promedio, mediano y máximo de compra.
- Estas estadísticas ofrecen insights sobre los patrones generales de gasto de los clientes.
- Segmentación de Clientes:
- Se identifican clientes de alto valor (el 20% superior basado en el valor promedio de compra).
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o programas de fidelización.
- Correlación de Características:
- Se calcula una matriz de correlación para las características de valor monetario.
- Esto se visualiza usando un mapa de calor, lo que ayuda a entender las relaciones entre diferentes aspectos del gasto de los clientes.
- Persistencia de Datos:
- El conjunto de datos actualizado con las nuevas características de valor monetario se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral no solo calcula la característica de valor monetario, sino que también ofrece valiosos insights sobre los patrones de gasto de los clientes, identifica a los clientes de alto valor y explora relaciones entre diversas métricas monetarias. Estos insights son cruciales para desarrollar estrategias de marketing efectivas, refinar la segmentación de clientes y mejorar modelos predictivos tanto para tareas de clasificación (como predicción de abandono) como de regresión (como estimación de CLTV).
Característica 3: Frecuencia
Frecuencia mide con qué frecuencia un cliente realiza compras dentro de un período de tiempo determinado. Este métrico proporciona valiosos insights sobre el comportamiento y la lealtad del cliente. Las compras frecuentes a menudo indican un alto nivel de compromiso, convirtiéndolo en una característica valiosa tanto para la predicción del Valor de Vida del Cliente (CLTV) como para la clasificación de abandono.
En el contexto de la predicción de CLTV, la frecuencia puede ayudar a identificar a los clientes que probablemente generen un mayor valor a largo plazo. Los clientes con frecuencias de compra más altas tienden a tener una relación más sólida con la marca, lo que potencialmente lleva a un mayor valor de vida. Para la clasificación de abandono, una disminución en la frecuencia de compra puede ser una señal de advertencia temprana de posible desconexión o abandono inminente.
Además, la frecuencia puede analizarse en conjunto con otras características para obtener insights más profundos. Por ejemplo, combinar la frecuencia con el valor monetario puede ayudar a identificar clientes frecuentes de alto valor que podrían ser candidatos ideales para programas de fidelización o campañas de marketing personalizadas. De manera similar, analizar la relación entre frecuencia y recencia puede revelar patrones en el comportamiento del cliente, como hábitos de compra estacionales o la efectividad de las estrategias de retención.
Al diseñar esta característica, es importante considerar el período de tiempo apropiado para el cálculo, ya que puede variar según el modelo de negocio y el ciclo de vida del producto. Para algunos negocios, la frecuencia semanal podría ser relevante, mientras que para otros, frecuencias mensuales o trimestrales podrían ser más informativas. Además, rastrear los cambios en la frecuencia a lo largo del tiempo puede proporcionar insights dinámicos sobre el comportamiento cambiante del cliente y las tendencias del mercado.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate Frequency by counting transactions per customer
frequency_df = df.groupby('CustomerID').agg({
'PurchaseDate': 'count',
'Total Spend': 'sum'
}).reset_index()
frequency_df.columns = ['CustomerID', 'Frequency', 'TotalSpend']
# Calculate average time between purchases
df_sorted = df.sort_values(['CustomerID', 'PurchaseDate'])
df_sorted['PrevPurchaseDate'] = df_sorted.groupby('CustomerID')['PurchaseDate'].shift(1)
df_sorted['DaysBetweenPurchases'] = (df_sorted['PurchaseDate'] - df_sorted['PrevPurchaseDate']).dt.days
avg_time_between_purchases = df_sorted.groupby('CustomerID')['DaysBetweenPurchases'].mean().reset_index()
avg_time_between_purchases.columns = ['CustomerID', 'AvgDaysBetweenPurchases']
# Merge frequency features back to the main dataset
df = df.merge(frequency_df, on='CustomerID')
df = df.merge(avg_time_between_purchases, on='CustomerID')
# Calculate additional metrics
df['AvgPurchaseValue'] = df['TotalSpend'] / df['Frequency']
print("\nData with Frequency Features:")
print(df[['CustomerID', 'PurchaseDate', 'Frequency', 'TotalSpend', 'AvgDaysBetweenPurchases', 'AvgPurchaseValue']].head())
# Visualize the distribution of Frequency
plt.figure(figsize=(10, 6))
sns.histplot(df['Frequency'], kde=True)
plt.title('Distribution of Purchase Frequency')
plt.xlabel('Number of Purchases')
plt.ylabel('Count of Customers')
plt.show()
# Analyze correlation between Frequency and other metrics
correlation_matrix = df[['Frequency', 'TotalSpend', 'AvgDaysBetweenPurchases', 'AvgPurchaseValue']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix of Frequency-related Features')
plt.show()
# Identify high-frequency customers (top 20%)
high_frequency_threshold = df['Frequency'].quantile(0.8)
high_frequency_customers = df[df['Frequency'] > high_frequency_threshold]
print(f"\nNumber of high-frequency customers: {len(high_frequency_customers)}")
print(f"Average spend of high-frequency customers: ${high_frequency_customers['TotalSpend'].mean():.2f}")
# Save the updated dataset
df.to_csv('retail_data_with_frequency.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_frequency.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Desglosemos los componentes clave y sus funciones:
- Carga y Procesamiento Inicial de Datos:
- Se importan las bibliotecas necesarias (
pandas
para manipulación de datos,matplotlib
yseaborn
para visualización). - El conjunto de datos se carga desde un archivo CSV en un DataFrame de pandas.
- La columna 'PurchaseDate' se convierte al formato datetime para realizar cálculos precisos.
- Se importan las bibliotecas necesarias (
- Cálculo de Frecuencia:
- Se utiliza la función
groupby
para agregar datos porCustomerID
. - Se calculan dos métricas: el conteo de compras (Frecuencia) y la suma de
Total Spend
.
- Se utiliza la función
- Tiempo Entre Compras:
- Los datos se ordenan por
CustomerID
yPurchaseDate
. - Se calcula la diferencia de tiempo entre compras consecutivas para cada cliente.
- Se calcula el tiempo promedio entre compras para cada cliente.
- Los datos se ordenan por
- Fusión de Datos:
- Las nuevas características de frecuencia se fusionan nuevamente en el conjunto de datos principal.
- Métricas Adicionales:
- Se calcula el valor promedio de compra dividiendo
Total Spend
por la frecuencia.
- Se calcula el valor promedio de compra dividiendo
- Visualización de Datos:
- Se crea un histograma para visualizar la distribución de la frecuencia de compra.
- Esto ayuda a identificar patrones en el comportamiento del cliente y posibles oportunidades de segmentación.
- Análisis de Correlación:
- Se calcula una matriz de correlación para las características relacionadas con la frecuencia.
- Esto se visualiza con un mapa de calor, lo que ayuda a comprender las relaciones entre diferentes aspectos del comportamiento del cliente.
- Segmentación de Clientes:
- Se identifican clientes de alta frecuencia (el 20% superior basado en Frecuencia).
- Se calcula y muestra el número de clientes de alta frecuencia y su gasto promedio.
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o programas de fidelización.
- Persistencia de Datos:
- El conjunto de datos actualizado con las nuevas características de frecuencia se guarda en un archivo CSV.
- Esto permite un acceso fácil para análisis futuros o entrenamiento de modelos.
Este enfoque integral calcula la característica de Frecuencia y ofrece valiosos insights sobre el comportamiento de los clientes. Identifica clientes de alta frecuencia y explora relaciones entre diversas métricas relacionadas con la frecuencia. Estos insights son esenciales para desarrollar estrategias de marketing efectivas, refinar la segmentación de clientes y mejorar modelos predictivos tanto para tareas de clasificación (como predicción de abandono) como de regresión (como estimación de CLTV).
Característica 4: Tendencia de Compra
Para modelos de clasificación o regresión, la Tendencia de Compra es una característica crucial que captura la naturaleza dinámica del comportamiento del cliente a lo largo del tiempo. Esta característica cuantifica cómo han evolucionado los patrones de gasto de un cliente, proporcionando valiosos insights sobre sus niveles de compromiso y lealtad.
Las tendencias positivas, caracterizadas por un aumento en la frecuencia de compra o el valor, suelen sugerir una creciente satisfacción del cliente y un fortalecimiento de la relación con la marca. Estos clientes pueden ser candidatos ideales para iniciativas de upselling o cross-selling.
Por el contrario, las tendencias negativas podrían señalar problemas potenciales como insatisfacción del cliente, mayor competencia o necesidades cambiantes. Estas tendencias pueden manifestarse como una disminución en la frecuencia de compra, valores de transacción más bajos o intervalos más largos entre compras. Identificar estas tendencias negativas de manera temprana permite a las empresas implementar estrategias de retención específicas, previniendo potencialmente el abandono antes de que ocurra.
La característica de Tendencia de Compra puede ser particularmente poderosa cuando se combina con otras métricas como Recencia y Frecuencia. Por ejemplo, un cliente con alta frecuencia pero una tendencia de compra negativa podría requerir estrategias de intervención diferentes a las de un cliente con baja frecuencia pero una tendencia positiva.
Al incorporar esta dimensión temporal en los modelos predictivos, las empresas pueden desarrollar estrategias de segmentación de clientes más matizadas y efectivas, campañas de marketing personalizadas e iniciativas proactivas de servicio al cliente.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data.csv')
df = pd.read_csv('retail_data.csv')
# Convert 'PurchaseDate' to datetime
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])
# Calculate average spend over time by grouping data by month and CustomerID
df['PurchaseMonth'] = df['PurchaseDate'].dt.to_period('M')
monthly_spend = df.groupby(['CustomerID', 'PurchaseMonth'])['Total Spend'].sum().reset_index()
# Calculate trend as the slope of spending over time for each customer
def calculate_trend(customer_df):
x = np.arange(len(customer_df))
y = customer_df['Total Spend'].values
if len(x) > 1:
return np.polyfit(x, y, 1)[0] # Linear trend slope
return 0
# Apply trend calculation
trend_df = monthly_spend.groupby('CustomerID').apply(calculate_trend).reset_index(name='PurchaseTrend')
# Merge trend feature back to main dataset
df = df.merge(trend_df, on='CustomerID')
print("\nData with Purchase Trend Feature:")
print(df[['CustomerID', 'PurchaseMonth', 'Total Spend', 'PurchaseTrend']].head())
# Visualize Purchase Trend distribution
plt.figure(figsize=(10, 6))
sns.histplot(df['PurchaseTrend'], kde=True)
plt.title('Distribution of Purchase Trends')
plt.xlabel('Purchase Trend (Slope)')
plt.ylabel('Count of Customers')
plt.show()
# Identify customers with positive and negative trends
positive_trend = df[df['PurchaseTrend'] > 0]
negative_trend = df[df['PurchaseTrend'] < 0]
print(f"\nCustomers with positive trend: {len(positive_trend['CustomerID'].unique())}")
print(f"Customers with negative trend: {len(negative_trend['CustomerID'].unique())}")
# Calculate correlation between Purchase Trend and other features
correlation = df[['PurchaseTrend', 'Total Spend', 'Frequency']].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(correlation, annot=True, cmap='coolwarm')
plt.title('Correlation between Purchase Trend and Other Features')
plt.show()
# Example: Using Purchase Trend for customer segmentation
df['TrendCategory'] = pd.cut(df['PurchaseTrend'],
bins=[-np.inf, -10, 0, 10, np.inf],
labels=['Strong Negative', 'Slight Negative', 'Slight Positive', 'Strong Positive'])
trend_segment = df.groupby('TrendCategory').agg({
'CustomerID': 'nunique',
'Total Spend': 'mean',
'Frequency': 'mean'
}).reset_index()
print("\nCustomer Segmentation based on Purchase Trend:")
print(trend_segment)
# Save the updated dataset with the new feature
df.to_csv('retail_data_with_trend.csv', index=False)
print("\nUpdated dataset saved as 'retail_data_with_trend.csv'")
retail_data.csv: https://cdn.prod.website-files.com/661b9e736a74273c4f628d5f/67d1a0c21f2a5e17fcd69098_retail_data.csv
Desglosemos este ejemplo de código integral:
- Carga y Preprocesamiento de Datos:
- Se importan las bibliotecas necesarias:
pandas
para manipulación de datos,numpy
para operaciones numéricas, ymatplotlib
/seaborn
para visualización. - El conjunto de datos se carga desde un archivo CSV y la columna 'PurchaseDate' se convierte al formato datetime.
- Se importan las bibliotecas necesarias:
- Cálculo de la Tendencia de Compra:
- Los datos se agrupan por cliente y mes para obtener patrones de gasto mensual.
- Se define una función
calculate_trend
para calcular la tendencia lineal (pendiente) del gasto a lo largo del tiempo para cada cliente. - Esta tendencia se calcula para cada cliente y se fusiona nuevamente en el conjunto de datos principal.
- Visualización de la Tendencia de Compra:
- Se crea un histograma para mostrar la distribución de las tendencias de compra entre todos los clientes.
- Esta visualización ayuda a identificar los patrones generales de tendencia en la base de clientes.
- Análisis de Tendencias Positivas y Negativas:
- Se separan los clientes con tendencias positivas y negativas, y se cuentan.
- Esto proporciona una visión rápida de cuántos clientes están aumentando o disminuyendo su gasto con el tiempo.
- Análisis de Correlación:
- Se calcula y visualiza la correlación entre la Tendencia de Compra y otras características como Total Spend y Frecuencia.
- Esto ayuda a comprender cómo la tendencia se relaciona con otras métricas importantes de los clientes.
- Segmentación de Clientes:
- Los clientes se categorizan según su Tendencia de Compra en cuatro grupos: Negativa Fuerte, Negativa Leve, Positiva Leve y Positiva Fuerte.
- Para cada segmento, se calcula el número de clientes, el gasto total promedio y la frecuencia de compra promedio.
- Esta segmentación puede utilizarse para estrategias de marketing dirigidas o para identificar clientes en riesgo.
- Persistencia de Datos:
- El conjunto de datos actualizado con la nueva característica de Tendencia de Compra se guarda en un nuevo archivo CSV.
- Esto facilita el acceso para análisis futuros o entrenamiento de modelos.
Este código ofrece un análisis exhaustivo de la característica de Tendencia de Compra, mostrando su distribución, correlaciones con otras características y aplicación en la segmentación de clientes. Estos insights son valiosos tanto para tareas de clasificación—como la predicción de abandono—como para tareas de regresión, como la estimación del Valor de Vida del Cliente (CLTV).
2.2.3 Uso de Ingeniería de Características para Entrenamiento de Modelos
Una vez que estas características han sido creadas, sirven como base para entrenar modelos predictivos potentes. En esta sección, exploraremos cómo aprovechar estas características para tareas de clasificación y regresión, centrándonos específicamente en la predicción de abandono y la estimación del CLTV.
Para la predicción de abandono, una tarea de clasificación, utilizaremos un modelo de Regresión Logística. Este modelo es ideal para predecir resultados binarios, lo que lo hace perfecto para determinar si un cliente tiene probabilidades de abandonar o no. Las características que hemos creado, como Recencia, Frecuencia y Tendencia de Compra, proporcionan insights cruciales sobre el comportamiento del cliente que pueden señalar un posible abandono.
Por otro lado, para la predicción de CLTV, una tarea de regresión, emplearemos un modelo de Regresión Lineal. Este modelo es adecuado para predecir valores continuos, permitiéndonos estimar el valor futuro que un cliente puede aportar al negocio. Características como Valor Monetario y Tendencia de Compra son particularmente valiosas aquí, ya que capturan patrones de gasto y el comportamiento a largo plazo del cliente.
Al incorporar estas características en nuestros modelos, mejoramos significativamente su poder predictivo. Esto permite a las empresas tomar decisiones basadas en datos, implementar estrategias de retención dirigidas y optimizar los esfuerzos de compromiso con el cliente. Vamos a profundizar en la implementación práctica de estos modelos utilizando nuestras características recién creadas.
Ejemplo: Entrenamiento de un Modelo de Regresión Logística para la Predicción de Abandono
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset (assuming we have a CSV file named 'retail_data_with_features.csv')
df = pd.read_csv('retail_data_with_features.csv')
# Select features and target
features = ['Recency_Overall', 'AvgPurchaseValue', 'Frequency', 'PurchaseTrend']
X = df[features]
y = df['Churn'] # Target variable for churn
# Standardize the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# Train logistic regression model
log_reg = LogisticRegression(random_state=42)
log_reg.fit(X_train, y_train)
# Predictions
y_pred = log_reg.predict(X_test)
y_pred_proba = log_reg.predict_proba(X_test)[:, 1]
# Model evaluation
print("Model Accuracy:", accuracy_score(y_test, y_pred))
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.show()
# Feature importance
feature_importance = pd.DataFrame({'feature': features, 'importance': abs(log_reg.coef_[0])})
feature_importance = feature_importance.sort_values('importance', ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='importance', y='feature', data=feature_importance)
plt.title('Feature Importance')
plt.show()
# Cross-validation
cv_scores = cross_val_score(log_reg, X_scaled, y, cv=5)
print("\nCross-validation scores:", cv_scores)
print("Mean CV score:", np.mean(cv_scores))
# ROC Curve
from sklearn.metrics import roc_curve, auc
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()
Este ejemplo de código muestra un enfoque integral para entrenar y evaluar un modelo de Regresión Logística para la predicción de abandono. Analicemos sus componentes clave:
- Preparación de Datos:
- Se carga el conjunto de datos y se seleccionan las características relevantes y la variable objetivo.
- Las características se estandarizan usando
StandardScaler
para garantizar que todas estén en la misma escala.
- Entrenamiento del Modelo:
- Se utiliza
train_test_split
para dividir los datos en conjuntos de entrenamiento y prueba. - Se inicializa un modelo de
LogisticRegression
y se entrena con los datos de entrenamiento.
- Se utiliza
- Predicciones:
- El modelo realiza predicciones en el conjunto de prueba.
- También se calculan las probabilidades de predicción, que se utilizarán para la curva ROC.
- Evaluación del Modelo:
- Se calcula la precisión (accuracy) como métrica general de desempeño.
- Se imprime un informe de clasificación detallado que incluye precisión (precision), sensibilidad (recall) y puntaje F1 para cada clase.
- Se visualiza una matriz de confusión usando un mapa de calor, proporcionando una vista clara de verdaderos positivos, verdaderos negativos, falsos positivos y falsos negativos.
- Importancia de Características:
- Se utilizan los valores absolutos de los coeficientes del modelo para clasificar la importancia de las características.
- Un gráfico de barras visualiza la importancia de cada característica en el modelo.
- Validación Cruzada:
- Se realiza validación cruzada para evaluar el desempeño del modelo en diferentes subconjuntos de los datos.
- Esto ayuda a garantizar que el desempeño del modelo sea consistente y no dependa excesivamente de una división particular entre entrenamiento y prueba.
- Curva ROC:
- Se traza la curva Característica Operativa del Receptor (ROC).
- Se calcula el Área Bajo la Curva (AUC), proporcionando un único puntaje que resume el desempeño del modelo en todos los posibles umbrales de clasificación.
Este enfoque integral va más allá del simple entrenamiento del modelo: proporciona una evaluación exhaustiva de su desempeño. Las visualizaciones (matriz de confusión, importancia de características y curva ROC) ofrecen insights intuitivos sobre el comportamiento del modelo. Además, el paso de validación cruzada mejora la robustez de la evaluación, asegurando que el desempeño del modelo se mantenga consistente en diversos subconjuntos de datos.
Ejemplo: Entrenamiento de un Modelo de Regresión Lineal para la Predicción de CLTV
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset
df = pd.read_csv('retail_data_with_features.csv')
# Select features and target
features = ['Recency_Overall', 'AvgPurchaseValue', 'Frequency', 'PurchaseTrend']
X = df[features]
y_cltv = df['CLTV']
# Standardize the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train-test split for CLTV
X_train_cltv, X_test_cltv, y_train_cltv, y_test_cltv = train_test_split(X_scaled, y_cltv, test_size=0.3, random_state=42)
# Train linear regression model
lin_reg = LinearRegression()
lin_reg.fit(X_train_cltv, y_train_cltv)
# Predictions and evaluation
y_pred_cltv = lin_reg.predict(X_test_cltv)
mse = mean_squared_error(y_test_cltv, y_pred_cltv)
r2 = r2_score(y_test_cltv, y_pred_cltv)
print("Mean Squared Error:", mse)
print("R-squared Score:", r2)
# Feature importance
feature_importance = pd.DataFrame({'feature': features, 'importance': abs(lin_reg.coef_)})
feature_importance = feature_importance.sort_values('importance', ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='importance', y='feature', data=feature_importance)
plt.title('Feature Importance for CLTV Prediction')
plt.show()
# Residual plot
residuals = y_test_cltv - y_pred_cltv
plt.figure(figsize=(10, 6))
plt.scatter(y_pred_cltv, residuals)
plt.xlabel('Predicted CLTV')
plt.ylabel('Residuals')
plt.title('Residual Plot')
plt.axhline(y=0, color='r', linestyle='--')
plt.show()
# Cross-validation
cv_scores = cross_val_score(lin_reg, X_scaled, y_cltv, cv=5, scoring='neg_mean_squared_error')
cv_rmse = np.sqrt(-cv_scores)
print("\nCross-validation RMSE scores:", cv_rmse)
print("Mean CV RMSE score:", np.mean(cv_rmse))
# Actual vs Predicted plot
plt.figure(figsize=(10, 6))
plt.scatter(y_test_cltv, y_pred_cltv, alpha=0.5)
plt.plot([y_test_cltv.min(), y_test_cltv.max()], [y_test_cltv.min(), y_test_cltv.max()], 'r--', lw=2)
plt.xlabel('Actual CLTV')
plt.ylabel('Predicted CLTV')
plt.title('Actual vs Predicted CLTV')
plt.show()
Este ejemplo de código ofrece un enfoque integral para entrenar y evaluar un modelo de Regresión Lineal para la predicción del Valor de Vida del Cliente (CLTV). Desglosemos sus componentes clave:
- Preparación de Datos:
- Se carga el conjunto de datos y se seleccionan las características relevantes para la predicción de CLTV.
- Las características se estandarizan utilizando
StandardScaler
para garantizar que todas estén en la misma escala.
- Entrenamiento del Modelo:
- Los datos se dividen en conjuntos de entrenamiento y prueba utilizando
train_test_split
. - Se inicializa un modelo de
LinearRegression
y se entrena con los datos de entrenamiento.
- Los datos se dividen en conjuntos de entrenamiento y prueba utilizando
- Predicciones y Evaluación:
- El modelo realiza predicciones en el conjunto de prueba.
- Se calcula el Error Cuadrático Medio (MSE) para cuantificar el error de predicción del modelo.
- Se computa el puntaje R-cuadrado para medir la proporción de la variabilidad en la variable objetivo que es explicada por las características.
- Importancia de Características:
- Los valores absolutos de los coeficientes del modelo se utilizan para clasificar la importancia de las características.
- Un gráfico de barras visualiza la importancia de cada característica en la predicción de CLTV.
- Análisis de Residuales:
- Se crea un gráfico de residuales para visualizar la diferencia entre los valores reales y los predichos.
- Esto ayuda a identificar patrones en los errores del modelo y evaluar si se cumplen los supuestos de regresión lineal.
- Validación Cruzada:
- Se realiza validación cruzada para evaluar el desempeño del modelo en diferentes subconjuntos de los datos.
- Se utiliza la Raíz del Error Cuadrático Medio (RMSE) como métrica de evaluación en la validación cruzada.
- Gráfico de Valores Reales vs Predichos:
- Se crea un gráfico de dispersión para comparar los valores reales de CLTV con los valores predichos.
- Esta herramienta visual ayuda a comprender qué tan bien se alinean las predicciones del modelo con los valores reales.
Este enfoque integral no solo entrena el modelo, sino que también proporciona una evaluación exhaustiva de su desempeño. Las visualizaciones (importancia de características, gráfico de residuales y gráfico de valores reales vs predichos) ofrecen insights intuitivos sobre el comportamiento y rendimiento del modelo. El paso de validación cruzada mejora la robustez de la evaluación, asegurando que el rendimiento del modelo sea consistente en diversos subconjuntos de datos.
Al implementar estas técnicas de evaluación adicionales y visualizaciones, obtenemos una comprensión más profunda de las fortalezas y limitaciones del modelo en la predicción del CLTV. Esta información puede ser invaluable para refinar el modelo, seleccionar características y tomar decisiones basadas en datos en estrategias de gestión de relaciones con clientes.
2.2.4 Conclusiones Clave y Sus Implicaciones
- La ingeniería de características mejora la precisión predictiva al crear características que capturan patrones y tendencias subyacentes. Este proceso transforma datos en bruto en representaciones significativas que los algoritmos pueden interpretar mejor, lo que conduce a modelos más robustos y precisos.
- Para tareas de clasificación como la predicción de abandono, características como Recencia, Frecuencia y Tendencia de Compra proporcionan insights cruciales sobre la lealtad y el compromiso del cliente. Estas métricas ayudan a identificar clientes en riesgo, permitiendo a las empresas implementar estrategias de retención específicas.
- En tareas de regresión como la predicción de CLTV, las características que capturan hábitos de gasto y comportamiento a lo largo del tiempo, como Valor Monetario y Tendencia de Compra, mejoran significativamente la capacidad del modelo para predecir el valor de vida. Esto permite a las empresas asignar recursos de manera más efectiva y personalizar las experiencias de los clientes.
- La selección de características apropiadas depende del contexto y requiere experiencia en el dominio. Por ejemplo, en salud, características como la frecuencia de citas y la adherencia al tratamiento pueden ser más relevantes para predecir resultados de pacientes.
- El análisis de importancia de características, como se demostró en los ejemplos de código, proporciona valiosos insights sobre qué factores influyen más significativamente en la variable objetivo. Esta información puede guiar decisiones empresariales y la formulación de estrategias.
- La validación cruzada y el análisis de residuales son pasos cruciales para evaluar el desempeño del modelo e identificar posibles áreas de mejora en la ingeniería de características o selección del modelo.