I. Ejercicio I:

Una cadena de tiendas minoristas con presencia en todo Puerto Rico desea entender qué factores impulsan las ventas mensuales de sus sucursales. Cada tienda decide de forma autónoma cuánto invertir en publicidad televisiva y en redes sociales, lo que genera grandes variaciones en sus resultados. Además, las ventas pueden diferir según el tamaño físico del local y la competencia cercana, pues las tiendas grandes suelen tener mayor flujo de clientes, mientras que aquellas ubicadas en zonas con más competidores enfrentan mayores desafíos.

La gerencia quiere usar un modelo de regresión lineal múltiple para cuantificar el impacto de estas variables y orientar futuras decisiones de inversión en mercadeo.

Modelo por simular: Ventas = β₀ + β₁TV + β₂Redes + β₃Tamaño + β₄Competidores + αᵢZona + β₅(Redes × Zona)

1. Simulen la base de datos. En grupo deben decidir los rangos de valores para cada variable y tomar un valor dentro de los rangos dados para los coeficientes. Además, usar como numero de semilla la suma de las fechas de cumpleaños de los integrantes.

# Semilla según nuestros cumpleaños
semilla <- (6 + 23 + 2004) + (11 + 26 + 2003) + (10 + 30 + 2003)
semilla
## [1] 6116
library(ggplot2)
library(broom)
library(dplyr)
set.seed(6116)
n = 300
publicidad_tv <- round(runif(n, 300, 500),2)
publicidad_redes <- round(runif(n, 200, 300),2)
tamaño <- runif(n, 1400, 2800)
competidores <- rep(3, n)
Zona <- factor(
  sample(c("Centro","Norte","Sur"), n, replace = TRUE, prob = c(0.3, 0.6, 0.1)),
  levels = c("Centro","Norte","Sur"))
desviacion_error <- rnorm(n, 6, 10)
b0 <- 55
b1 <-0.30
b2<- 0.50
b3 <- 0.03
b4 <- 3
b5 <- -0.1
b6 <- -0.25
Z_Norte <- 5
Z_Sur <- -2
ventas <- b0 + b1*publicidad_tv + b2*publicidad_redes + b3*tamaño + b4*competidores + Z_Norte*(Zona== "Norte") + Z_Sur*(Zona=="Sur") + b5*publicidad_redes*(Zona=="Norte") + b6*publicidad_redes*(Zona=="Sur") + desviacion_error

data_rlm <- data.frame(publicidad_redes, publicidad_tv, tamaño, competidores, Zona, ventas) 

2. Ajusten el mejor modelo de regresión lineal múltiple.

Modelo_rlm <- lm(ventas ~ publicidad_redes + publicidad_tv + tamaño + competidores + Zona)

summary(Modelo_rlm)
## 
## Call:
## lm(formula = ventas ~ publicidad_redes + publicidad_tv + tamaño + 
##     competidores + Zona)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -30.9570  -7.6076   0.9785   7.4903  26.6313 
## 
## Coefficients: (1 not defined because of singularities)
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       85.238869   7.624459   11.18   <2e-16 ***
## publicidad_redes   0.409805   0.022037   18.60   <2e-16 ***
## publicidad_tv      0.319692   0.010912   29.30   <2e-16 ***
## tamaño             0.029345   0.001572   18.66   <2e-16 ***
## competidores             NA         NA      NA       NA    
## ZonaNorte        -18.477647   1.467484  -12.59   <2e-16 ***
## ZonaSur          -60.244862   2.498402  -24.11   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11.14 on 294 degrees of freedom
## Multiple R-squared:  0.8786, Adjusted R-squared:  0.8765 
## F-statistic: 425.4 on 5 and 294 DF,  p-value: < 2.2e-16

3. Interpreten la salida del modelo final.

Todos los interceptos del modelo aportan de manera positiva a la ventas de las sucursales, menos la variable de los competidores, que no es estadísticamente significante. El tamaño es una variable que, aunque significante, no tiene un nivel de influencia en las ventas tan altos como las otras variables. Tomando como referencia la Zona Central, la Zona Norte aporta menos, y la Zona Sur aporta aún menos. El R^2 ajustado implica que es un buen modelo a utilizar, pues explica el 88% de la variabilidad en las ventas

4. Evalúen los supuestos (normalidad, homocedasticidad e independencia).

# Verificación de los supuestos: Normalidad
dat_frame1  <- data.frame(
 yhat = fitted.values(Modelo_rlm),
 res  = rstandard(Modelo_rlm))

ggplot(dat_frame1, aes(sample = res)) +
  stat_qq(color = "blue") +
  stat_qq_line(linewidth = 1) +  
  labs(x = "Cuantiles teóricos", y = "Cuantiles muestrales") +
  theme_minimal(base_size = 14)

# Verificación de los supuestos :Homocedasticidad
ggplot(dat_frame1, aes(x = yhat, y = res)) +
  geom_point(alpha = 0.6, color = "blue") +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey40") +
  labs(x = "Valores ajustados", y = "Residuales estandarizados") +
  theme_minimal(base_size = 14)

# Verificación de los supuestos : Independencia
df1 <- data.frame(
  res = rstandard(Modelo_rlm)
) %>%
  mutate(orden = 1:length(res))

ggplot(df1, aes(x = orden, y = res)) +
  geom_point(alpha = 0.6, color = "blue") +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey40") +
  labs(x = "Orden/tiempo", y = "Residuales estandarizados") +
  theme_minimal(base_size = 14)

Interpretación de supuestos

Todos los supuestos de los modelos se cumplen en su totalidad. La normalidad se cumple, puesto que los datos siguen relativamente constantes a la línea de los cuantiles teóricos. La homocedasticidad. se cumple, gracias a que los datos no presentan ninguna forma en particular y son aleatorios. Por último, la independencia se cumple porque los datos no siguen ningún patrón; es decir, no dependen los unos de los otros.

II. Ejercicio 2:

Una institución financiera desea identificar qué factores influyen en la aprobación de solicitudes de crédito personal. La dirección del banco sospecha que la probabilidad de aprobación depende de características financieras y demográficas de los solicitantes, como su nivel de ingresos, el grado de endeudamiento, la edad y la solidez de su historial crediticio. Además, se considera relevante si el cliente ofrece una garantía real al momento de solicitar el préstamo.

El objetivo es utilizar un modelo de regresión logística que permita estimar la probabilidad de aprobación y determinar qué variables aumentan o reducen las posibilidades de que una solicitud sea aceptada. Con esta información, la gerencia podrá diseñar políticas crediticias más claras y transparentes, equilibrando el riesgo con la oportunidad de captar nuevos clientes.

Modelo por simular:
logit[Y = 1] = β₀ + β₁Ingreso + β₂Deuda + β₃Edad + αᵢHistorial + β₄GarantiaNo + β₅(Deuda × Historial)

1. Simulen la base de datos. En grupo deben decidir los rangos de valores para cada variable y tomar un valor dentro de los rangos dados para los coeficientes. Además, usar como numero de semilla la suma de las fechas de cumpleaños de los integrantes.

# Semilla según nuestros cumpleaños
semilla <- (6 + 23 + 2004) + (11 + 26 + 2003) + (10 + 30 + 2003)
semilla
## [1] 6116
set.seed(6116)
n <- 600

# Predictores
Ingreso <- pmax(0, round(rlnorm(n, meanlog = log(4), sdlog = 0.5), 0))   # para simular ingresos mensuales en miles ($4,000)
Deuda <- pmax(0, round(runif(n, 0, 1), 2)) # nivel endeudamiento 
Edad <- sample(21:70, n, replace = TRUE)   

# Historial crediticio (Buena = referencia)
Historial <- factor(
  sample(c("Buena","Regular","Mala"), n, replace = TRUE, prob = c(0.5,0.3,0.2)),
  levels = c("Buena","Regular","Mala")
)

# Garantía (Si = referencia)
Garantia <- factor(
  sample(c("Si","No"), n, replace = TRUE, prob = c(0.6,0.4)),
  levels = c("Si","No")
)

# Coeficientes
b0   <- -3.5       # Intercepto: -6 a -2
b1   <-  0.06      # Ingreso: 0.03 a 0.10
b2   <- -2.2       # Deuda: -3.5 a -1.0
b3   <-  0.10      # Edad: 0.05 a 0.20
aReg <- -0.9       # Historial Regular: -1.5 a -0.5 (vs Buena)
aMal <- -2.0       # Historial Mala: -3.0 a -1.2 (vs Buena)
b4No <-  1.0       # GarantiaNo: 0.6 a 1.4 (ref = Si)
iReg <- -0.6       # Deuda×HistorialRegular: -1.0 a -0.2
iMal <- -1.0       # Deuda×HistorialMala: -1.5 a -0.4
sd_e <-  0.75      # Desviación de errores: 0.70 a 0.80


# Variable dependiente
eta2 <- b0 + b1*Ingreso + b2*Deuda + b3*Edad +
       aReg*(Historial=="Regular") +
       aMal*(Historial=="Mala") +
       b4No*(Garantia=="No") +
       iReg*Deuda*(Historial=="Regular") +
       iMal*Deuda*(Historial=="Mala")

p2 <- 1/(1 + exp(-eta2))
Aprobado <- rbinom(n, 1, p2)

# Conjunto de datos
datos2 <- data.frame(Aprobado, Ingreso, Deuda, Edad, Historial, Garantia)
head(datos2)
##   Aprobado Ingreso Deuda Edad Historial Garantia
## 1        0       4  0.64   36     Buena       Si
## 2        1       1  0.81   64     Buena       No
## 3        0       4  0.63   51      Mala       No
## 4        1       5  0.88   50   Regular       Si
## 5        0       2  0.64   57     Buena       Si
## 6        1       7  0.66   67     Buena       Si

2. Ajusten un modelo de regresión logística.

# Ajuste del modelo logístico con interacción
modelo2 <- glm(Aprobado ~ Ingreso * Historial + Deuda * Historial + Edad + Garantia,family = binomial, data = datos2)

# Resumen de coeficientes
coefs2 <- summary(modelo2)$coefficients

# Tabla con Logit y Odds Ratio
tabla_mod2 <- data.frame(
  Termino = rownames(coefs2),
  Logit = round(coefs2[, "Estimate"], 3),
  Odds_Ratio = round(exp(coefs2[, "Estimate"]), 3),
  row.names = NULL,
  check.names = FALSE
)

tabla_mod2
##                     Termino  Logit Odds_Ratio
## 1               (Intercept) -3.469      0.031
## 2                   Ingreso  0.052      1.053
## 3          HistorialRegular -0.762      0.467
## 4             HistorialMala -2.400      0.091
## 5                     Deuda -2.793      0.061
## 6                      Edad  0.108      1.114
## 7                GarantiaNo  0.873      2.395
## 8  Ingreso:HistorialRegular  0.025      1.025
## 9     Ingreso:HistorialMala  0.110      1.117
## 10   HistorialRegular:Deuda -0.580      0.560
## 11      HistorialMala:Deuda -1.254      0.285

3. Interpreten la salida del modelo final.

Las referencias son Historial = “Buena” y Garantía = “Si”

  • Intercepto: Representa la situación base del solicitante: edad “0”, historial bueno, con garantía, ingresos bajos y poca deuda. En este escenario, la probabilidad de aprobación es baja (odds ≈ 0.03, un 3.1%). En otras palabras, la probabilidad base de aprobación es baja cuando todas las condiciones son favorables (historial crediticio bueno, sin deudas, con garantía). Este banco es sumamente exigente en esta simulación.

  • Ingreso: Por cada $1,000 adicionales de ingreso mensual, la probabilidad de aprobación aumenta en 5.3 %, a su vez manteniendo constantes las demás variables.

  • Deuda: Un aumento en el nivel de endeudamiento (de 0 a 1) reduce las probabilidades de aprobación en 94 %. Esto confirma que el exceso de deuda tiene un impacto negativo considerable en la decisión del banco.

  • Edad: Cada año adicional de edad incrementa las probabilidades de aprobación en 11 %, lo que sugiere que las personas mayores presentan un perfil crediticio más estable.

  • Historial crediticio Regular(OR = 0.467): Las probabilidades de aprobación son 53.3% menores que aquellos con un historial crediticio bueno.

  • Historial crediticio Mala (OR = 0.091):Las probabilidades de aprobación son meramente un 9% de aquellos con un historial crediticio bueno.

  • Garantía OR = 2.395): No proveerle garantia al banco te hace 2.4 veces más probable de ser aprobado por este banco, insinuando que este banco (simulado) no toma esta como una variable detrimental y toma otras variables con mayor peso. Aunque esto no sea muy realistico, ya que uno espera que tener garantía aumente la aprobación, no al revés.

  • Ingreso × HistorialRegular (OR = 1.025): Por cada incremento unitario de ingreso, las probabilidades de aprobación aumentan un 2.5% adicional en los clientes con historial regular.

  • Ingreso × HistorialMala: (OR = 1.117): Cuando el historial crediticio es malo, cada incremento unitario en el ingreso aumenta un 11.7% las probabilidades de aprobación, aunque sigue pesando más el riesgo crediticio.

  • Deuda × HistorialRegular: La deuda tiene un efecto aún más negativo cuando el historial es regular: las probabilidades se reducen 44 % adicionales.