Entrega P1 — Exploración y Preprocesamiento
Introducción a Ciencia de Datos e Inteligencia Artificial
25 de septiembre de 2026
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.
Perfil del cliente
Contacto actual
Historial
Macroeconomía
Objetivo: suscribio — ¿el cliente contrató el depósito?
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.
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.
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:
previousSolución: separar en dos variables
contactado_antes → 0 / 1dias_ultimo_contacto → NA si no aplicaLa correlación falsa baja a -0.04: era un artefacto del código.
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%).
| 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.
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.
euribor_3m ~ var_empleo: r = 0.972. Una explica el 94.5% de la varianza de la otra.
Las cuatro macroeconómicas son manifestaciones del mismo ciclo económico, medidas mensualmente:
euribor_3m ~ var_empleo → 0.972euribor_3m ~ n_empleados → 0.945var_empleo ~ n_empleados → 0.907var_empleo ~ idx_precios → 0.775Incluirlas todas en un modelo lineal produce:
Recomendación: conservar una sola —euribor_3m— o aplicar reducción de dimensionalidad.
duracion es la variable más correlacionada con el objetivo (r = 0.405).
duracion debe excluirse1. 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.
65.11% de conversión entre quienes aceptaron una oferta anterior.
Casi 6× la media global. Son solo 1,373 personas, ya identificadas.
Móvil: 14.74%
Fijo: 5.23%
Casi el triple de efectividad por el mismo esfuerzo.
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.
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.
resultado_campana_previa — 65.1%mes / trimestre — 6.4% a 50.6%tipo_contacto — 14.7% vs 5.2%grupo_etario — efecto en Uocupacion — 6.9% a 31.4%duracion — fuga de informacióndefault — 3 casos en una categoríaprestamo_vivienda / prestamo_personal — 11.6% y 10.9%: no distinguen nadaEl dataset no estaba limpio
Las funciones estándar reportaban cero faltantes. En realidad había:
Ninguno se detecta sin inspeccionar el contenido de cada columna.
| 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