La empresa Monopoly (retail) enfrenta el desafío de identificar de manera predictiva qué clientes tienen mayor probabilidad de realizar compras de alto valor, permitiendo así optimizar estrategias de marketing y asignación de recursos comerciales.
Este análisis busca transformar grandes volúmenes de datos demográficos y comportamentales en insights accionables para la toma de decisiones comerciales.
¿Podemos predecir qué clientes realizarán compras de alto valor basándonos en su información demográfica y comportamiento de compra histórico?
Para responder esta pregunta, desarrollamos un modelo de red neuronal artificial (MLP - Perceptrón Multicapa) para clasificación binaria de clientes según su potencial de compra.
El enfoque de deep learning nos permite capturar patrones complejos y no lineales en los datos que métodos tradicionales podrían pasar por alto.
Se verificaron y eliminaron registros duplicados
Imputación con mediana (numéricas) y moda (categóricas)
Estandarización del formato de columnas
Optimización de tipos para procesamiento eficiente
35,786 muestras
7,669 muestras
7,669 muestras
Enfoque: Winsorización con percentiles 1-99
Beneficio: Reducción de sensibilidad a outliers sin pérdida de datos
Impacto: Mejora de +1.2% en precisión del modelo
Método: Análisis de Componentes Principales (PCA)
Reducción: De 575 a 157 variables (73% reducción)
Varianza explicada: 94.8% mantenida
Variables | Correlación |
---|---|
flgactcn_t01 × compra_alto_valor | 0.58 |
flgactccpc_t04 × txs_t01 | 0.53 |
flgactcn_t03 × flgactccot_t05 | 0.47 |
txs_t02 × compra_alto_valor | 0.42 |
flgactcc_t01 × flgactcn_t01 | 0.39 |
Trimestres 1 y 4 (temporada alta)
Trimestres 2 y 3 (temporada baja)
Capa | Dimensión | Activación |
---|---|---|
Input | 599 características | - |
Hidden 1 | 128 neuronas | Sigmoid |
Hidden 2 | 64 neuronas | Sigmoid |
Output | 1 neurona | Sigmoid |
Activación | Precisión | F1-Score | Recall |
---|---|---|---|
Sigmoid | 0.9266 | 0.9205 | 0.9266 |
Tanh | 0.9259 | 0.9204 | 0.9259 |
ReLU | 0.9229 | 0.9146 | 0.9229 |
LeakyReLU | 0.9257 | 0.9174 | 0.9257 |
Función | Precisión | Sensibilidad | F1-Score | Épocas |
---|---|---|---|---|
Sigmoid | 0.9266 | 0.4380 | 0.9205 | 23 |
Tanh | 0.9259 | 0.4375 | 0.9204 | 25 |
ReLU | 0.9229 | 0.4290 | 0.9146 | 18 |
LeakyReLU | 0.9257 | 0.4320 | 0.9174 | 20 |
ELU | 0.9242 | 0.4310 | 0.9168 | 19 |
Curvas de aprendizaje
Velocidad: ReLU converge más rápido pero con menor
precisión
Estabilidad: Sigmoid muestra mejor estabilidad durante las
últimas épocas
Tasa | Precisión | Épocas |
---|---|---|
0.01 | 0.9229 | 29 |
0.001 | 0.9216 | 18 |
Configuración | Precisión | F1 |
---|---|---|
Sin regularización | 0.9232 | 0.9176 |
L2+Dropout+BatchNorm | 0.9085 | 0.8658 |
Estructura | F1-Score | Épocas |
---|---|---|
64 | 0.9159 | 23 |
128 → 64 | 0.9200 | 16 |
Durante la fase de experimentación, evaluamos diferentes configuraciones de capas para encontrar la arquitectura óptima que capturara la complejidad del problema sin caer en sobreajuste.
Arquitectura | Capas | Parámetros | F1-Score | Tiempo (s) |
---|---|---|---|---|
Simple | 1 (64) | 38,465 | 0.9159 | 18.4 |
Media | 2 (128→64) | 85,569 | 0.9200 | 23.7 |
Profunda | 3 (256→128→64) | 190,273 | 0.9174 | 36.2 |
Compleja | 4 (512→256→128→64) | 446,017 | 0.9183 | 48.9 |
Configuración | Parámetros | F1-Score | Memoria (MB) |
---|---|---|---|
1 capa (64) | 38,465 | 0.9159 | 0.15 |
2 capas (128→64) | 85,569 | 0.9200 | 0.33 |
3 capas (128→64→32) | 93,857 | 0.9182 | 0.36 |
5 capas (256→128→64→32→16) | 210,289 | 0.9167 | 0.81 |
Técnica | Precisión Test | Diff. Train-Test |
---|---|---|
Sin regularización | 0.9232 | 0.0124 |
Dropout (0.2) | 0.9207 | 0.0095 |
L2 (λ=0.01) | 0.9215 | 0.0087 |
BatchNorm | 0.9193 | 0.0142 |
L2+Dropout+BatchNorm | 0.9085 | 0.0052 |
Oportunidades perdidas: 407 clientes potencialmente valiosos no fueron identificados.
Inversión ineficiente: Campañas dirigidas a 171 clientes con baja probabilidad de compra.
Característica | Importancia |
---|---|
num__flgactcn_t01 | 0.0030 |
num__flgactccpc_t04 | 0.0023 |
num__flgactcn_t03 | 0.0018 |
num__txs_t01 | 0.0018 |
num__flgactccot_t05 | 0.0016 |
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping
# Definir arquitectura del modelo
model = Sequential([
Dense(128, activation='sigmoid', input_shape=(X_train.shape[1],)),
Dense(64, activation='sigmoid'),
Dense(1, activation='sigmoid')
])
# Compilar el modelo
model.compile(
optimizer=Adam(learning_rate=0.01),
loss='binary_crossentropy',
metrics=['accuracy']
)
# Configurar early stopping
early_stopping = EarlyStopping(
monitor='val_loss',
patience=5,
restore_best_weights=True
)
# Entrenar el modelo
history = model.fit(
X_train, y_train,
validation_split=0.2,
epochs=100,
batch_size=64,
callbacks=[early_stopping],
verbose=1
)
El 56% de clientes de alto valor no son detectados (falsos negativos), lo que representa una oportunidad para aplicar técnicas específicas de manejo de desbalance.
Se puede ajustar el umbral de decisión según objetivos comerciales específicos y considerar costos asimétricos de errores.
El modelo desarrollado proporciona a Monopoly una herramienta poderosa para priorizar esfuerzos comerciales hacia clientes con alta probabilidad de realizar compras de alto valor.
La combinación de alta precisión global (92.5%) y excelente capacidad discriminativa (AUC 0.936) confirma la solidez del enfoque y su potencial para generar impacto comercial significativo.
La identificación de patrones temporales y comportamentales específicos ofrece además insights accionables que trascienden la simple predicción, permitiendo desarrollar estrategias fundamentadas en comportamientos reales de los clientes.