Introducción

Este documento presenta un análisis de regresión lineal múltiple para entender cómo el contexto macroeconómico y el comportamiento de contacto bancario se relacionan con la tasa Euribor a 3 meses (euribor3m - Variable Dependiente).

Contexto del Problema

Los bancos promueven los depósitos a plazo mediante campañas de mercadeo directo, especialmente llamadas telefónicas, donde agentes contactan a clientes para ofrecer la suscripción; sin embargo, estas campañas implican altos costos operacionales y de personal, por lo que es importante mejorar su efectividad identificando qué perfiles de clientes tienen mayor probabilidad de suscribir y cómo influyen las diferentes variables operativas.

El conjunto de datos contiene registros relacionados con una campaña de marketing directo de una institución bancaria portuguesa. La campaña de marketing se ejecutó mediante llamadas telefónicas. A menudo, es necesario realizar más de una llamada a un solo cliente antes de que acepte o rechace una suscripción a un depósito a plazo.

  • age (edad): Variable numérica que representa la edad del cliente en años
  • campaign (campaña): Número de contactos realizados durante esta campaña y para este cliente (incluye el último contacto). Indica la intensidad de la campaña
  • pdays: Número de días transcurridos después de que el cliente fue contactado por última vez en una campaña anterior (999 significa que el cliente no fue contactado previamente)
  • previous (anterior): Número de contactos realizados antes de esta campaña para este cliente específico
  • emp.var.rate: Tasa de variación del empleo - indicador trimestral que refleja cambios en el mercado laboral
  • cons.price.idx: Índice de precios al consumidor - indicador mensual que mide la inflación
  • cons.conf.idx: Índice de confianza del consumidor - indicador mensual que refleja el optimismo económico
  • euribor3m: Tasa del Euribor a 3 meses - indicador diario que representa el tipo de interés al que los bancos se prestan dinero entre sí
  • nr.employed: Número de empleados - indicador trimestral del nivel de empleo total

El banco desea construir un modelo predictivo que explique la variación de la tasa Euribor utilizando:

  • Variables demográficas: edad del cliente
  • Variables de campaña: intensidad de contacto (campaign, pdays, previous)
  • Variables macroeconómicas: variación de empleo, índice de precios, ídice de confianza del consumidor, número de empleados

Nota: El Euribor es fundamental para determinar las tasas de interés de productos bancarios como hipotecas y depósitos a plazo.


1. Carga de Datos

# Cargar el conjunto de datos
data1 <- read.csv("datos-banco.csv")

# Visualizar estructura de los datos
str(data1)
## 'data.frame':    41188 obs. of  9 variables:
##  $ age           : int  56 57 37 40 56 45 59 41 24 25 ...
##  $ campaign      : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ pdays         : int  999 999 999 999 999 999 999 999 999 999 ...
##  $ previous      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ emp.var.rate  : num  1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 ...
##  $ cons.price.idx: num  94 94 94 94 94 ...
##  $ cons.conf.idx : num  -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 ...
##  $ euribor3m     : num  4.86 4.86 4.86 4.86 4.86 ...
##  $ nr.employed   : num  5191 5191 5191 5191 5191 ...
# Primeras filas del conjunto de datos
head(data1)
##   age campaign pdays previous emp.var.rate cons.price.idx cons.conf.idx
## 1  56        1   999        0          1.1         93.994         -36.4
## 2  57        1   999        0          1.1         93.994         -36.4
## 3  37        1   999        0          1.1         93.994         -36.4
## 4  40        1   999        0          1.1         93.994         -36.4
## 5  56        1   999        0          1.1         93.994         -36.4
## 6  45        1   999        0          1.1         93.994         -36.4
##   euribor3m nr.employed
## 1     4.857        5191
## 2     4.857        5191
## 3     4.857        5191
## 4     4.857        5191
## 5     4.857        5191
## 6     4.857        5191

Observaciones iniciales:

  • El conjunto de datos contiene 41188 registros y 9 variables
  • Variables numéricas clave: age, campaign, pdays, previous, emp.var.rate, cons.price.idx, cons.conf.idx, nr.employed, euribor3m
  • La variable pdays tiene un valor especial (999) que indica “no contactado previamente”

2. Análisis de Correlaciones

Antes de construir el modelo, es fundamental explorar las relaciones entre variables mediante análisis visual y numérico.

# Matriz de correlación
cor_matrix <- cor(data1, use = "complete.obs")

# Visualización con pairs (R base)
pairs(data1, 
      main = "Matriz de Dispersión entre Variables",
      pch = 19, 
      col = rgb(0, 0, 1, 0.3),
      cex = 0.5)

# Mostrar matriz de correlación numérica
cat("\nMatriz de Correlaciones con euribor3m:\n")
## 
## Matriz de Correlaciones con euribor3m:
print(round(cor_matrix[, "euribor3m"], 2))
##            age       campaign          pdays       previous   emp.var.rate 
##           0.01           0.14           0.30          -0.45           0.97 
## cons.price.idx  cons.conf.idx      euribor3m    nr.employed 
##           0.69           0.28           1.00           0.95

Imagen adicional de dispersión

Matriz de Dispersión entre Variables

Figura: Matriz de dispersión detallada de las variables del modelo

Interpretación:

  • Las variables macroeconómicas muestran alta correlación con euribor3m
  • emp.var.rate, cons.price.idx y nr.employed parecen ser predictores fuertes
  • Algunas variables están altamente correlacionadas entre sí (posible multicolinealidad)

3. Construcción de Modelos

3.1 Modelo Completo

Incluimos todas las variables explicativas disponibles:

# Modelo con todas las variables
m_full1 <- lm(euribor3m ~ age + campaign + pdays + previous +
                emp.var.rate + cons.price.idx + cons.conf.idx + nr.employed,
              data = data1)

summary(m_full1)
## 
## Call:
## lm(formula = euribor3m ~ age + campaign + pdays + previous + 
##     emp.var.rate + cons.price.idx + cons.conf.idx + nr.employed, 
##     data = data1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.57922 -0.17533  0.00282  0.13957  1.04191 
## 
## Coefficients:
##                  Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)    -9.220e+01  6.275e-01 -146.932  < 2e-16 ***
## age             2.914e-04  1.032e-04    2.824  0.00475 ** 
## campaign       -6.659e-03  3.897e-04  -17.087  < 2e-16 ***
## pdays           1.858e-05  7.239e-06    2.567  0.01027 *  
## previous        3.567e-03  2.885e-03    1.236  0.21636    
## emp.var.rate    4.118e-01  3.331e-03  123.610  < 2e-16 ***
## cons.price.idx  3.378e-01  4.325e-03   78.112  < 2e-16 ***
## cons.conf.idx   5.397e-02  2.639e-04  204.479  < 2e-16 ***
## nr.employed     1.284e-02  5.369e-05  239.162  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2162 on 41179 degrees of freedom
## Multiple R-squared:  0.9845, Adjusted R-squared:  0.9845 
## F-statistic: 3.26e+05 on 8 and 41179 DF,  p-value: < 2.2e-16

Análisis del Modelo Completo:

  • R² = 0.9845: El modelo explica el 98.45% de la variabilidad en euribor3m
  • Todas las variables están incluidas, pero no todas son significativas
  • F-statistic: Altamente significativo (p < 2.2e-16), indicando que al menos un predictor es significativo
  • Se observa que la variable previous tiene un p-valor alto (no significativa)

3.2 Modelo Nulo (Solo Intercepto)

Este modelo sirve como punto de partida para la selección forward:

# Modelo mínimo (solo intercepto)
m_null1 <- lm(euribor3m ~ 1, data = data1)

summary(m_null1)
## 
## Call:
## lm(formula = euribor3m ~ 1, data = data1)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -2.987 -2.277  1.236  1.340  1.424 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 3.621291   0.008546   423.7   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.734 on 41187 degrees of freedom

Interpretación del Modelo Nulo:

  • Sin predictores, este modelo solo estima la media de euribor3m
  • R² = 0: No explica ninguna variabilidad (referencia mínima)
  • El intercepto representa la tasa Euribor promedio: 3.6213

4. Selección de Variables

Aplicaremos tres métodos de selección para identificar el mejor conjunto de variables. Estos métodos usan el criterio AIC (Akaike Information Criterion) para equilibrar bondad de ajuste. Valores más bajos indican mejor modelo.

4.1 Backward Elimination (Eliminación hacia atrás)

Comienza con todas las variables y elimina las menos significativas:

# Backward elimination
m_back1 <- step(m_full1, direction = "backward", trace = 1)
## Start:  AIC=-126135.6
## euribor3m ~ age + campaign + pdays + previous + emp.var.rate + 
##     cons.price.idx + cons.conf.idx + nr.employed
## 
##                  Df Sum of Sq    RSS     AIC
## - previous        1      0.07 1925.7 -126136
## <none>                        1925.7 -126136
## - pdays           1      0.31 1926.0 -126131
## - age             1      0.37 1926.0 -126130
## - campaign        1     13.65 1939.3 -125847
## - cons.price.idx  1    285.33 2211.0 -120447
## - emp.var.rate    1    714.52 2640.2 -113140
## - cons.conf.idx   1   1955.26 3880.9  -97273
## - nr.employed     1   2674.80 4600.5  -90268
## 
## Step:  AIC=-126136.1
## euribor3m ~ age + campaign + pdays + emp.var.rate + cons.price.idx + 
##     cons.conf.idx + nr.employed
## 
##                  Df Sum of Sq    RSS     AIC
## <none>                        1925.7 -126136
## - pdays           1      0.24 1926.0 -126133
## - age             1      0.38 1926.1 -126130
## - campaign        1     13.68 1939.4 -125846
## - cons.price.idx  1    285.39 2211.1 -120446
## - emp.var.rate    1    716.85 2642.6 -113104
## - cons.conf.idx   1   1971.09 3896.8  -97107
## - nr.employed     1   2742.35 4668.1  -89669
# Resumen del modelo seleccionado
summary(m_back1)
## 
## Call:
## lm(formula = euribor3m ~ age + campaign + pdays + emp.var.rate + 
##     cons.price.idx + cons.conf.idx + nr.employed, data = data1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.57374 -0.17530  0.00285  0.13938  1.04186 
## 
## Coefficients:
##                  Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)    -9.212e+01  6.243e-01 -147.555  < 2e-16 ***
## age             2.933e-04  1.032e-04    2.842  0.00448 ** 
## campaign       -6.665e-03  3.897e-04  -17.104  < 2e-16 ***
## pdays           1.412e-05  6.275e-06    2.250  0.02446 *  
## emp.var.rate    4.120e-01  3.327e-03  123.811  < 2e-16 ***
## cons.price.idx  3.376e-01  4.322e-03   78.121  < 2e-16 ***
## cons.conf.idx   5.394e-02  2.627e-04  205.304  < 2e-16 ***
## nr.employed     1.283e-02  5.298e-05  242.162  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2162 on 41180 degrees of freedom
## Multiple R-squared:  0.9845, Adjusted R-squared:  0.9845 
## F-statistic: 3.726e+05 on 7 and 41180 DF,  p-value: < 2.2e-16

Resultados del Método Backward:

  • Variables eliminadas: previous

  • Variables que permanecen: age, campaign, pdays, emp.var.rate, cons.price.idx, cons.conf.idx, nr.employed

  • AIC final: -1.2613608^{5}

  • El proceso eliminó solo 1 variable, indicando que la mayoría son relevantes

La variable previous (contactos previos) no aporta información significativa una vez que se controlan las demás variables.


4.2 Forward Elimination (Eliminación hacia adelante)

Comienza sin variables y agrega las más significativas:

# Forward selection
m_forw1 <- step(m_null1,
                scope = list(lower = m_null1, upper = m_full1),
                direction = "forward", trace = 1)
## Start:  AIC=45364.55
## euribor3m ~ 1
## 
##                  Df Sum of Sq    RSS    AIC
## + emp.var.rate    1    117121   6782 -74291
## + nr.employed     1    110685  13218 -46808
## + cons.price.idx  1     58688  65215  18932
## + previous        1     25594  98309  35836
## + pdays           1     10922 112981  41566
## + cons.conf.idx   1      9554 114349  42061
## + campaign        1      2263 121641  44607
## + age             1        14 123889  45362
## <none>                        123903  45365
## 
## Step:  AIC=-74290.98
## euribor3m ~ emp.var.rate
## 
##                  Df Sum of Sq    RSS    AIC
## + nr.employed     1   2803.58 3978.9 -96256
## + cons.price.idx  1   1336.18 5446.3 -83326
## + cons.conf.idx   1    977.24 5805.3 -80697
## + previous        1    314.01 6468.5 -76241
## + pdays           1    149.33 6633.2 -75206
## + campaign        1     16.58 6765.9 -74390
## + age             1     15.34 6767.2 -74382
## <none>                        6782.5 -74291
## 
## Step:  AIC=-96256.03
## euribor3m ~ emp.var.rate + nr.employed
## 
##                  Df Sum of Sq    RSS     AIC
## + cons.conf.idx   1   1756.42 2222.5 -120241
## + age             1     37.31 3941.6  -96642
## + campaign        1     25.10 3953.8  -96515
## + pdays           1     20.89 3958.0  -96471
## + previous        1      1.34 3977.6  -96268
## + cons.price.idx  1      0.45 3978.5  -96259
## <none>                        3978.9  -96256
## 
## Step:  AIC=-120241
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx
## 
##                  Df Sum of Sq    RSS     AIC
## + cons.price.idx  1   282.525 1940.0 -125839
## + campaign        1    10.553 2211.9 -120435
## + age             1     0.653 2221.8 -120251
## <none>                        2222.5 -120241
## + pdays           1     0.107 2222.4 -120241
## + previous        1     0.012 2222.5 -120239
## 
## Step:  AIC=-125838.9
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + cons.price.idx
## 
##            Df Sum of Sq    RSS     AIC
## + campaign  1   13.6204 1926.3 -126127
## + age       1    0.3257 1939.6 -125844
## + pdays     1    0.2160 1939.8 -125841
## <none>                  1940.0 -125839
## + previous  1    0.0025 1940.0 -125837
## 
## Step:  AIC=-126127.1
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + cons.price.idx + 
##     campaign
## 
##            Df Sum of Sq    RSS     AIC
## + age       1   0.37149 1926.0 -126133
## + pdays     1   0.23045 1926.1 -126130
## <none>                  1926.3 -126127
## + previous  1   0.00000 1926.3 -126125
## 
## Step:  AIC=-126133
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + cons.price.idx + 
##     campaign + age
## 
##            Df Sum of Sq    RSS     AIC
## + pdays     1  0.236737 1925.7 -126136
## <none>                  1926.0 -126133
## + previous  1  0.000118 1926.0 -126131
## 
## Step:  AIC=-126136.1
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + cons.price.idx + 
##     campaign + age + pdays
## 
##            Df Sum of Sq    RSS     AIC
## <none>                  1925.7 -126136
## + previous  1  0.071472 1925.7 -126136
# Resumen del modelo seleccionado
summary(m_forw1)
## 
## Call:
## lm(formula = euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + 
##     cons.price.idx + campaign + age + pdays, data = data1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.57374 -0.17530  0.00285  0.13938  1.04186 
## 
## Coefficients:
##                  Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)    -9.212e+01  6.243e-01 -147.555  < 2e-16 ***
## emp.var.rate    4.120e-01  3.327e-03  123.811  < 2e-16 ***
## nr.employed     1.283e-02  5.298e-05  242.162  < 2e-16 ***
## cons.conf.idx   5.394e-02  2.627e-04  205.304  < 2e-16 ***
## cons.price.idx  3.376e-01  4.322e-03   78.121  < 2e-16 ***
## campaign       -6.665e-03  3.897e-04  -17.104  < 2e-16 ***
## age             2.933e-04  1.032e-04    2.842  0.00448 ** 
## pdays           1.412e-05  6.275e-06    2.250  0.02446 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2162 on 41180 degrees of freedom
## Multiple R-squared:  0.9845, Adjusted R-squared:  0.9845 
## F-statistic: 3.726e+05 on 7 and 41180 DF,  p-value: < 2.2e-16

Resultados del Método Forward:

  • Orden de entrada de variables: Las variables con mayor impacto en AIC se agregan primero
  • Primera variable agregada: Típicamente la de mayor correlación con euribor3m
  • Variables incluidas: Mismo conjunto que backward elimination
  • AIC final: -1.2613608^{5}

El método forward es más conservador y puede detenerse antes si agregar más variables no mejora significativamente el AIC.


4.3 Método Híbrido (forward + backward)

Combina forward y backward en cada paso, permitiendo agregar y eliminar variables:

# Método híbrido (stepwise)
m_hyb1 <- step(m_null1,
               scope = list(lower = m_null1, upper = m_full1),
               direction = "both", trace = 1)
## Start:  AIC=45364.55
## euribor3m ~ 1
## 
##                  Df Sum of Sq    RSS    AIC
## + emp.var.rate    1    117121   6782 -74291
## + nr.employed     1    110685  13218 -46808
## + cons.price.idx  1     58688  65215  18932
## + previous        1     25594  98309  35836
## + pdays           1     10922 112981  41566
## + cons.conf.idx   1      9554 114349  42061
## + campaign        1      2263 121641  44607
## + age             1        14 123889  45362
## <none>                        123903  45365
## 
## Step:  AIC=-74290.98
## euribor3m ~ emp.var.rate
## 
##                  Df Sum of Sq    RSS    AIC
## + nr.employed     1      2804   3979 -96256
## + cons.price.idx  1      1336   5446 -83326
## + cons.conf.idx   1       977   5805 -80697
## + previous        1       314   6468 -76241
## + pdays           1       149   6633 -75206
## + campaign        1        17   6766 -74390
## + age             1        15   6767 -74382
## <none>                          6782 -74291
## - emp.var.rate    1    117121 123903  45365
## 
## Step:  AIC=-96256.03
## euribor3m ~ emp.var.rate + nr.employed
## 
##                  Df Sum of Sq     RSS     AIC
## + cons.conf.idx   1    1756.4  2222.5 -120241
## + age             1      37.3  3941.6  -96642
## + campaign        1      25.1  3953.8  -96515
## + pdays           1      20.9  3958.0  -96471
## + previous        1       1.3  3977.6  -96268
## + cons.price.idx  1       0.5  3978.5  -96259
## <none>                         3978.9  -96256
## - nr.employed     1    2803.6  6782.5  -74291
## - emp.var.rate    1    9239.5 13218.4  -46808
## 
## Step:  AIC=-120241
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx
## 
##                  Df Sum of Sq    RSS     AIC
## + cons.price.idx  1     282.5 1940.0 -125839
## + campaign        1      10.6 2211.9 -120435
## + age             1       0.7 2221.8 -120251
## <none>                        2222.5 -120241
## + pdays           1       0.1 2222.4 -120241
## + previous        1       0.0 2222.5 -120239
## - cons.conf.idx   1    1756.4 3978.9  -96256
## - nr.employed     1    3582.8 5805.3  -80697
## - emp.var.rate    1    6818.5 9041.0  -62450
## 
## Step:  AIC=-125838.9
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + cons.price.idx
## 
##                  Df Sum of Sq    RSS     AIC
## + campaign        1     13.62 1926.3 -126127
## + age             1      0.33 1939.6 -125844
## + pdays           1      0.22 1939.8 -125841
## <none>                        1940.0 -125839
## + previous        1      0.00 1940.0 -125837
## - cons.price.idx  1    282.53 2222.5 -120241
## - emp.var.rate    1    715.34 2655.3 -112912
## - cons.conf.idx   1   2038.49 3978.5  -96259
## - nr.employed     1   2826.88 4766.8  -88812
## 
## Step:  AIC=-126127.1
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + cons.price.idx + 
##     campaign
## 
##                  Df Sum of Sq    RSS     AIC
## + age             1      0.37 1926.0 -126133
## + pdays           1      0.23 1926.1 -126130
## <none>                        1926.3 -126127
## + previous        1      0.00 1926.3 -126125
## - campaign        1     13.62 1940.0 -125839
## - cons.price.idx  1    285.59 2211.9 -120435
## - emp.var.rate    1    716.48 2642.8 -113104
## - cons.conf.idx   1   2027.25 3953.6  -96515
## - nr.employed     1   2835.09 4761.4  -88857
## 
## Step:  AIC=-126133
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + cons.price.idx + 
##     campaign + age
## 
##                  Df Sum of Sq    RSS     AIC
## + pdays           1      0.24 1925.7 -126136
## <none>                        1926.0 -126133
## + previous        1      0.00 1926.0 -126131
## - age             1      0.37 1926.3 -126127
## - campaign        1     13.67 1939.6 -125844
## - cons.price.idx  1    285.25 2211.2 -120446
## - emp.var.rate    1    716.74 2642.7 -113104
## - cons.conf.idx   1   1990.13 3916.1  -96905
## - nr.employed     1   2835.19 4761.2  -88857
## 
## Step:  AIC=-126136.1
## euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + cons.price.idx + 
##     campaign + age + pdays
## 
##                  Df Sum of Sq    RSS     AIC
## <none>                        1925.7 -126136
## + previous        1      0.07 1925.7 -126136
## - pdays           1      0.24 1926.0 -126133
## - age             1      0.38 1926.1 -126130
## - campaign        1     13.68 1939.4 -125846
## - cons.price.idx  1    285.39 2211.1 -120446
## - emp.var.rate    1    716.85 2642.6 -113104
## - cons.conf.idx   1   1971.09 3896.8  -97107
## - nr.employed     1   2742.35 4668.1  -89669
# Resumen del modelo seleccionado
summary(m_hyb1)
## 
## Call:
## lm(formula = euribor3m ~ emp.var.rate + nr.employed + cons.conf.idx + 
##     cons.price.idx + campaign + age + pdays, data = data1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.57374 -0.17530  0.00285  0.13938  1.04186 
## 
## Coefficients:
##                  Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)    -9.212e+01  6.243e-01 -147.555  < 2e-16 ***
## emp.var.rate    4.120e-01  3.327e-03  123.811  < 2e-16 ***
## nr.employed     1.283e-02  5.298e-05  242.162  < 2e-16 ***
## cons.conf.idx   5.394e-02  2.627e-04  205.304  < 2e-16 ***
## cons.price.idx  3.376e-01  4.322e-03   78.121  < 2e-16 ***
## campaign       -6.665e-03  3.897e-04  -17.104  < 2e-16 ***
## age             2.933e-04  1.032e-04    2.842  0.00448 ** 
## pdays           1.412e-05  6.275e-06    2.250  0.02446 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2162 on 41180 degrees of freedom
## Multiple R-squared:  0.9845, Adjusted R-squared:  0.9845 
## F-statistic: 3.726e+05 on 7 and 41180 DF,  p-value: < 2.2e-16

Resultados del Método Híbrido:

  • Flexibilidad máxima: Puede revertir decisiones previas
  • Variables finales: Mismo conjunto que los métodos anteriores
  • AIC final: -1.2613608^{5}
  • Ventaja: Reduce el riesgo de quedar atrapado en óptimos locales

Los tres métodos convergen al mismo modelo, lo cual es una fuerte señal de robustez en la selección.


5. Comparación de Modelos (Criterio AIC)

El AIC (Akaike Information Criterion) permite comparar modelos: valores más bajos indican mejor ajuste.

# Extraer AIC de cada método
AIC_back1 <- tail(m_back1$anova$AIC, 1)
AIC_forw1 <- tail(m_forw1$anova$AIC, 1)
AIC_hyb1  <- tail(m_hyb1$anova$AIC, 1)

# Tabla comparativa
AIC_comp1 <- data.frame(
  Metodo = c("Backward", "Forward", "Híbrido"),
  AIC = c(AIC_back1, AIC_forw1, AIC_hyb1)
)

# Mostrar tabla
knitr::kable(AIC_comp1, 
             caption = "Comparación de AIC entre métodos de selección",
             align = 'c')
Comparación de AIC entre métodos de selección
Metodo AIC
Backward -126136.1
Forward -126136.1
Híbrido -126136.1

Conclusión: Los tres métodos convergen al mismo modelo con AIC ≈ -126136.1

  • Convergencia perfecta indica que el modelo seleccionado es robusto
  • No hay ambigüedad sobre qué variables incluir
  • El AIC negativo y muy bajo indica excelente ajuste del modelo
  • La consistencia entre métodos valida la selección de variables

AIC negativo: AIC puede ser negativo cuando el modelo ajusta muy bien los datos. Lo importante es la comparación relativa (menor AIC = mejor modelo).


6. Modelo Final Seleccionado

# Seleccionar el modelo backward como modelo final
# (Los tres son equivalentes, elegimos backward por convención)
m_final1 <- m_back1

# Resumen detallado
summary(m_final1)
## 
## Call:
## lm(formula = euribor3m ~ age + campaign + pdays + emp.var.rate + 
##     cons.price.idx + cons.conf.idx + nr.employed, data = data1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.57374 -0.17530  0.00285  0.13938  1.04186 
## 
## Coefficients:
##                  Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)    -9.212e+01  6.243e-01 -147.555  < 2e-16 ***
## age             2.933e-04  1.032e-04    2.842  0.00448 ** 
## campaign       -6.665e-03  3.897e-04  -17.104  < 2e-16 ***
## pdays           1.412e-05  6.275e-06    2.250  0.02446 *  
## emp.var.rate    4.120e-01  3.327e-03  123.811  < 2e-16 ***
## cons.price.idx  3.376e-01  4.322e-03   78.121  < 2e-16 ***
## cons.conf.idx   5.394e-02  2.627e-04  205.304  < 2e-16 ***
## nr.employed     1.283e-02  5.298e-05  242.162  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2162 on 41180 degrees of freedom
## Multiple R-squared:  0.9845, Adjusted R-squared:  0.9845 
## F-statistic: 3.726e+05 on 7 and 41180 DF,  p-value: < 2.2e-16

Ecuación del Modelo Final

\[ \text{euribor3m} = \beta_0 + \beta_1 \cdot \text{age} + \beta_2 \cdot \text{campaign} + \beta_3 \cdot \text{pdays} + \] \[ \beta_4 \cdot \text{emp.var.rate} + \beta_5 \cdot \text{cons.price.idx} + \beta_6 \cdot \text{cons.conf.idx} + \beta_7 \cdot \text{nr.employed} \] Donde:

  • \(\beta_0\) = intercepto (tasa base de euribor3m)
  • \(\beta_1, ..., \beta_7\) = coeficientes de regresión (efectos parciales)
  • \(\epsilon\) = término de error aleatorio (supuestos: media 0, varianza constante, normalidad)

7. Interpretación de Coeficientes

# Extraer tabla de coeficientes del modelo final
# Incluye: Estimate, Std. Error, t value, Pr(>|t|)
coef_tabla <- summary(m_final1)$coefficients

# Mostrar tabla formateada con precisión de 6 decimales
knitr::kable(coef_tabla, 
             caption = "Tabla 2: Coeficientes estimados del Modelo Final de Regresión",
             digits = 6)
Tabla 2: Coeficientes estimados del Modelo Final de Regresión
Estimate Std. Error t value Pr(>|t|)
(Intercept) -92.121302 0.624316 -147.555489 0.000000
age 0.000293 0.000103 2.842248 0.004482
campaign -0.006665 0.000390 -17.104396 0.000000
pdays 0.000014 0.000006 2.249974 0.024456
emp.var.rate 0.411966 0.003327 123.810883 0.000000
cons.price.idx 0.337633 0.004322 78.120888 0.000000
cons.conf.idx 0.053941 0.000263 205.304002 0.000000
nr.employed 0.012830 0.000053 242.161682 0.000000

Interpretación Práctica (manteniendo otras variables constantes):

  1. emp.var.rate (β ≈ 0.412):
    • Si la variación de empleo aumenta en 1 unidad, el euribor3m aumenta ~0.412
    • Efecto más fuerte entre las variables
  2. cons.price.idx (β ≈ 0.338):
    • Si el índice de precios sube 1 punto, el euribor3m sube ~0.338
  3. cons.conf.idx (β ≈ 0.054):
    • Si la confianza del consumidor sube 1 punto, el euribor3m sube ~0.054
  4. nr.employed (β ≈ 0.013):
    • Por cada 100 empleados adicionales, el euribor3m sube ~1.28
  5. campaign (β ≈ -0.007):
    • Por cada contacto adicional, el euribor3m disminuye ligeramente (~0.007)
  6. age (β ≈ 0.0003):
    • Efecto muy pequeño: por cada año adicional, euribor3m sube 0.0003
  7. pdays (β ≈ 0.000014):
    • Efecto marginal: por cada día adicional desde último contacto

8. Calidad del Ajuste

# R-cuadrado
r2 <- summary(m_final1)$r.squared
r2_adj <- summary(m_final1)$adj.r.squared

# Error estándar residual
rse <- summary(m_final1)$sigma

# Crear tabla de métricas
metricas <- data.frame(
  Metrica = c("R²", "R² Ajustado", "Error Estándar Residual", "AIC"),
  Valor = c(r2, r2_adj, rse, tail(m_back1$anova$AIC, 1))
)

knitr::kable(metricas, 
             caption = "Métricas de Calidad del Modelo",
             digits = 4,
             align = 'c')
Métricas de Calidad del Modelo
Metrica Valor
0.9845
R² Ajustado 0.9845
Error Estándar Residual 0.2162
AIC -126136.0780

Observaciones:

  • R² = 0.9845: El modelo explica aproximadamente el 98.45% de la variabilidad en euribor3m
  • R² Ajustado = 0.9845: Ajuste muy alto, confirmando la robustez del modelo
  • El AIC muy negativo indica excelente ajuste

9. Conclusiones

  1. Modelo robusto: El R² de 98.45% indica un ajuste excelente

  2. Variables clave: Las variables macroeconómicas (emp.var.rate, cons.price.idx) son los predictores más importantes del euribor3m

  3. Selección consistente: Los tres métodos (backward, forward, híbrido) convergieron al mismo modelo, confirmando su solidez

  4. Variable eliminada: previous (contactos previos) no aporta valor significativo al modelo

  5. Aplicabilidad: Este modelo puede usarse para:

    • Predecir tasas euribor futuras basadas en indicadores económicos
    • Entender cómo factores macro afectan las tasas de interés
    • Planificar estrategias de campaña bancaria

10. Referencias

  • Dataset: datos-banco.csv
  • Métodos utilizados: Regresión Lineal Múltiple
  • Criterio de selección: AIC (Akaike Information Criterion)
  • Software: R versión R version 4.5.2 (2025-10-31)