Bank Marketing

Entrega P1 — Exploración y Preprocesamiento

Daniel Guillermo Sandoval Toro — Grupo 9

Introducción a Ciencia de Datos e Inteligencia Artificial

25 de septiembre de 2026

1. El dataset

El problema

Un banco portugués llamó por teléfono a sus clientes entre 2008 y 2010 para ofrecerles un depósito a plazo fijo.

La pregunta: ¿a quién conviene llamar?

Llamar cuesta dinero. Con una tasa de éxito del 11.27%, nueve de cada diez llamadas terminan en un “no”.

Registros 41,188
Variables 21
Período 2008–2010
Tasa de éxito 11.27%

Fuente: UCI Machine Learning Repository — Bank Marketing (Moro, Cortez y Rita, 2014). Se eligió la versión ampliada, que incluye 5 indicadores macroeconómicos.

Las 21 variables

Perfil del cliente

  • edad
  • ocupación
  • estado civil
  • educación
  • préstamos

Contacto actual

  • canal
  • mes
  • día de la semana
  • duración

Historial

  • n.º de contactos
  • días desde el último
  • resultado previo

Macroeconomía

  • euríbor 3m
  • variación de empleo
  • índice de precios
  • confianza
  • n.º de empleados

Objetivo: suscribio — ¿el cliente contrató el depósito?

2. Limpieza y decisiones

El dataset decía estar limpio. No lo estaba.

La documentación afirma cero valores faltantes.

is.na() lo confirma: cero.

Es falso.

Los faltantes están codificados como el texto "unknown", que R y pandas leen como una categoría válida más.

Un faltante que no se declara es más peligroso que uno que sí: atraviesa en silencio todas las etapas posteriores.

Decisión 1 — No imputar por moda

El faltante no es ruido: es información.

Grupo Conversión
Educación declarada 11.3%
Educación unknown 14.5%
Declara no tener impago 12.9%
Impago unknown 5.2%

Imputar por moda destruiría esa señal.

Peor aún: afirmaría que 8,597 clientes no tienen deudas impagas, cuando lo único que sabemos es que no contestaron.

Decisión: conservar el faltante como categoría propia, desconocido.

Decisión 2 — El centinela 999

En pdays, el valor 999 no significa “hace 999 días”: codifica “nunca fue contactado antes”. Afecta al 96.32% de los registros.

Si se deja como número:

  • La media es de 962.5 días — un valor que no describe a ningún cliente real
  • Genera una correlación falsa de -0.588 con previous

Solución: separar en dos variables

  • contactado_antes → 0 / 1
  • dias_ultimo_contacto → NA si no aplica

La correlación falsa baja a -0.04: era un artefacto del código.

Decisión 3 — Una variable con 3 casos

default (impago de crédito) se distribuye así:

Categoría Registros
no 32,588
unknown 8,597
yes 3

Tres casos positivos entre 41,188 no permiten estimar nada: cualquier partición dejaría la categoría con cero o un caso.

Decisión: sustituir por impago_desconocido, que sí discrimina (5.2% frente a 12.9%).

Resumen del preprocesamiento

Paso Resultado
Renombrado 21 columnas a snake_case
Duplicados -12 filas
Nulos encubiertos 6 columnas → desconocido
Centinela 999 pdays → 2 variables
Variable degenerada default → impago_desconocido
Tipos de dato 3 factores ordenados
Enriquecimiento +5 variables derivadas


41,188 × 21

↓

41,176 × 28

La bitácora completa, con la justificación de cada paso, está en el informe.

3. Hallazgos

El desbalance manda sobre todo lo demás

Solo el 11.27% suscribe.

Consecuencia para la Entrega 2: un modelo que prediga “no” siempre acertaría el 88.7% de las veces sin haber aprendido nada.

La exactitud es inútil aquí. Habrá que evaluar con precisión, exhaustividad, F1 y AUC.

Cuatro variables miden lo mismo

euribor_3m ~ var_empleo: r = 0.972. Una explica el 94.5% de la varianza de la otra.

Colinealidad: implicancia práctica

Las cuatro macroeconómicas son manifestaciones del mismo ciclo económico, medidas mensualmente:

  • euribor_3m ~ var_empleo → 0.972
  • euribor_3m ~ n_empleados → 0.945
  • var_empleo ~ n_empleados → 0.907
  • var_empleo ~ idx_precios → 0.775

Incluirlas todas en un modelo lineal produce:

  • Inflación de la varianza de los coeficientes
  • Signos erráticos
  • Interpretaciones sin sentido

Recomendación: conservar una sola —euribor_3m— o aplicar reducción de dimensionalidad.

La variable más predictiva es inutilizable

duracion es la variable más correlacionada con el objetivo (r = 0.405).

Por qué duracion debe excluirse

1. No está disponible a tiempo

La duración solo se conoce cuando la llamada terminó. Al decidir a quién llamar, el dato no existe.

2. La causalidad va al revés

No es que hablar mucho convenza al cliente: el cliente interesado prolonga la conversación.

3. Contiene el resultado

Una llamada de 0 segundos implica necesariamente un “no”.

Esto es fuga de información (data leakage). Un modelo que la incluyera tendría métricas excelentes y sería inútil en producción.

Quién sí compra

Tres segmentos accionables

Ya dijeron que sí

65.11% de conversión entre quienes aceptaron una oferta anterior.

Casi 6× la media global. Son solo 1,373 personas, ya identificadas.

El canal importa

Móvil: 14.74%

Fijo: 5.23%

Casi el triple de efectividad por el mismo esfuerzo.

La edad, en forma de U

60+ años: 45.5%

17–25 años: 21.0%

36–45 años: 8.5%

Los extremos compran; el centro, no.

La correlación lineal de la edad con el objetivo es de solo +0.030. El efecto en U es invisible para Pearson: por eso no basta con mirar correlaciones.

El hallazgo de mayor impacto operativo

Se llama cuando no funciona

Mayo concentra 13,767 llamadas —un tercio de toda la campaña— y convierte apenas al 6.44%: la peor tasa del año.

Marzo convierte al 50.55% con solo 546 llamadas. Diciembre, septiembre y octubre se sitúan entre el 43% y el 49%.

Lectura operativa: los recursos están mal asignados.

Lectura cautelosa: los meses buenos tienen volúmenes pequeños y mes está confundido con las variables macroeconómicas. Los datos no permiten separar ambos efectos.

4. Conclusiones

Qué nos llevamos

Variables clave

  1. resultado_campana_previa — 65.1%
  2. mes / trimestre — 6.4% a 50.6%
  3. Bloque macro (una sola)
  4. tipo_contacto — 14.7% vs 5.2%
  5. grupo_etario — efecto en U
  6. ocupacion — 6.9% a 31.4%

Variables a descartar

  • duracion — fuga de información
  • default — 3 casos en una categoría
  • prestamo_vivienda / prestamo_personal — 11.6% y 10.9%: no distinguen nada
  • 4 de 5 macroeconómicas — colinealidad

La lección metodológica

El dataset no estaba limpio


Las funciones estándar reportaban cero faltantes. En realidad había:

  • Valores ausentes en 6 variables, disfrazados de categoría
  • Un código centinela que distorsionaba una media en tres órdenes de magnitud
  • Una variable con 3 observaciones en una de sus categorías
  • Una correlación de -0.588 que era puro artefacto

Ninguno se detecta sin inspeccionar el contenido de cada columna.

Para la Entrega 2

Decisión Motivo
Excluir duracion de los predictores Fuga de información
Evaluar con F1 y AUC, nunca con exactitud Desbalance del 11.27%
Partición estratificada por el objetivo Preservar la proporción de clases
Considerar remuestreo o ponderación Clase minoritaria
Preferir modelos de árbol, o usar grupo_etario El efecto de la edad es no lineal

Gracias

Entrega P1 — Bank Marketing

Introducción a Ciencia de Datos e Inteligencia Artificial