Parte I
n=300
set.seed(6120)
zona = factor(sample(c("Centro", "Norte", "Sur"), n,replace= TRUE, prob = c(.25 , 0.4, 0)))
zona = relevel(zona, ref="Centro")
publicidad_TV = runif(n, 10, 50) # gasto mensual en miles
publicidad_red = runif(n, 5, 25) # gasto mensual en cientos
tamano = runif(n, 75, 111) # metros cuadrados
competidores = round(runif(n, 1, 6)) #Num de competidores
ruido = round(rnorm(n, 0, 6),2)
B0 = 51
B1 = .42
B2 = .35 #publicidad_red
B3 = .03 #tamano
B4 = .16 # 1 comp de cada 6
a1 = 3 # zona norte
a2 = -2 # zona sur
B5 = .08 # cambio en a1 norte
B6 = -.25 # cambio en a2 sur
ventas = round( B0 + B1*publicidad_TV + B2*publicidad_red + B3*tamano + B4*competidores + ifelse(zona=="Norte", a1,0) + ifelse(zona=="Sur", a2, 0) + ifelse(zona=="Norte", B5*publicidad_red, 0) + ifelse(zona=="Sur", B6*publicidad_red, 0) + ruido , 2)
data =data.frame(ventas,publicidad_TV, publicidad_red, tamano,competidores,zona )
mod = lm(ventas~ publicidad_TV + publicidad_red + tamano + competidores + zona + zona*publicidad_red, data= data)
summary(mod)
##
## Call:
## lm(formula = ventas ~ publicidad_TV + publicidad_red + tamano +
## competidores + zona + zona * publicidad_red, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.9161 -3.6174 -0.1945 3.8175 17.5451
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 51.22679 3.40904 15.027 < 2e-16 ***
## publicidad_TV 0.40974 0.02951 13.883 < 2e-16 ***
## publicidad_red 0.44039 0.08954 4.918 1.46e-06 ***
## tamano 0.02157 0.03223 0.669 0.5038
## competidores 0.07175 0.23237 0.309 0.7577
## zonaNorte 4.10354 1.84168 2.228 0.0266 *
## publicidad_red:zonaNorte -0.02027 0.11884 -0.171 0.8647
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.832 on 293 degrees of freedom
## Multiple R-squared: 0.4955, Adjusted R-squared: 0.4852
## F-statistic: 47.96 on 6 and 293 DF, p-value: < 2.2e-16
Interpretación: Por cada mil dólares invertidos en publicidad en
televisión, las ventas aumentan en promedio $409.74, y por cada $1,000
en redes sociales, aumentan $440.39. El tamaño del local y la
competencia no tienen un efecto significativo sobre las ventas. Las
tiendas del Norte venden en promedio $4,103.54 más que las del Sur, y la
interacción con publicidad digital no es significativa, lo que indica un
impacto similar entre zonas. El modelo explica el 49.6% de la
variabilidad de las ventas, por lo que se recomienda fortalecer la
inversión en publicidad en TV y redes sociales.
Supuesto 1: Normalidad
install.packages("ggplot2")
install.packages("broom")
library(ggplot2)
library(broom)
df <- data.frame(
yhat = fitted.values(mod),
res = rstandard(mod)
)
# Gráfico
ggplot(df, aes(sample = res)) +
stat_qq(color = "blue") +
stat_qq_line(linewidth = 1) +
labs(title = "Gráfico Q-Q de Residuos",
x = "Cuantiles Teóricos",
y = "Cuantiles de los Residuos") +
theme_minimal(base_size = 14)

shapiro.test(df$res)
##
## Shapiro-Wilk normality test
##
## data: df$res
## W = 0.99776, p-value = 0.9585
mean(df$res)
## [1] 0.0001418717
El gráfico Q-Q muestra que los residuos se alinean casi
completamente con la línea, con desviaciones mínimas en los extremos,
mostrando normalidad. La prueba de Shapiro-Wilk resultó con un p-value =
0.9585 > 0.05, por lo que no se rechaza la normalidad. Además, la
media de los residuos es prácticamente cero (0.00014). El supuesto de
normalidad se cumple.
Supuesto 2: Varianza constante (homocedasticidad)
df <- data.frame(
yhat = fitted.values(mod),
res = rstandard(mod)
)
ggplot(df, aes(x = yhat, y = res)) +
geom_point(alpha = 0.6, color = "blue") +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey40") +
labs(title = "Residuos vs Valores Ajustados",
x = "Valores ajustados (ŷ)",
y = "Residuos estandarizados") +
theme_minimal(base_size = 14)

install.packages("lmtest")
library(lmtest)
bptest(mod)
##
## studentized Breusch-Pagan test
##
## data: mod
## BP = 7.3391, df = 6, p-value = 0.2906
El gráfico muestra una dispersión aleatoria alrededor de la línea
horizontal, sin patrones claros o concentración específica, mostrando
varianza constante. Además, la prueba de Breusch-Pagan dio un p-value =
0.2906 > 0.05, por lo que no se rechaza la homocedasticidad. El
supuesto de varianza constante se cumple.
Supuesto 3: Independencia (autocorrelación)
library(ggplot2)
library(dplyr)
# Crear un dataframe con los residuos estandarizados y su orden
df3 <- data.frame(res = rstandard(mod)) %>%
mutate(orden = 1:length(res))
# Gráfico para evaluar independencia
ggplot(df3, aes(x = orden, y = res)) +
geom_point(alpha = 0.6, color = "blue") +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey40") +
labs(title = "Residuos estandarizados en función del orden de observación",
x = "Orden / tiempo",
y = "Residuos estandarizados") +
theme_minimal(base_size = 14)

install.packages("car")
library(car)
durbinWatsonTest(mod)
## lag Autocorrelation D-W Statistic p-value
## 1 -0.0008255451 2.001625 0.984
## Alternative hypothesis: rho != 0
El gráfico muestra un patrón aleatorio sin tendencias, ciclos o
secuencias repetitivas, mostrando independencia. Además, la prueba de
Durbin-Watson dio un p-value = 0.978 > 0.05, por lo que no se detecta
autocorrelación entre los residuos. El supuesto de independencia se
cumple.
Parte II
set.seed(6120)
n0 <- 600
# Variables simuladas
ingreso <- pmax(0,rnorm(n0,mean = 4 ,sd=1.2),1) # Por cada mil
deuda <- runif(n0, 0, 1)
edad <- runif(n0, 22, 44)
error = pmax(0, round(rnorm(n0, 0, .8),2) ,1)
historial <- factor(
sample(c("Bueno", "Malo", "Regular"), n0, replace = TRUE, prob = c(0.25, 0.45, 0.30)),
levels = c("Regular", "Malo", "Bueno")
)
historial <- relevel(historial, ref = "Bueno")
garantia <- factor(
sample(c("No", "Si"), n0, replace = TRUE, prob = c(0.8, 0.2)),
levels = c("No", "Si")
)
garantia <- relevel(garantia, ref = "No")
# Coeficientes
intercepto <- -4
B1 <- 0.1 # Ingreso
B2 <- -3.5 # Deuda
B3 <- 0.15 # Edad
a1 <- -1.5 # Regular
a2 <- -3 # Malo
B4 <- 1.4 # Garantía
B5 <- -1 # Deuda * Regular
B6 <- -1.5 # Deuda * Malo
# Ecuación lineal (modelo verdadero)
aprobado <- intercepto +
B1 * ingreso +
B2 * deuda +
B3 * edad +
a1 * (historial == "Regular") +
a2 * (historial == "Malo") +
B4 * (garantia == "Si") +
B5 * deuda * (historial == "Regular") +
B6 * deuda * (historial == "Malo") + error
# Probabilidad y variable binaria simulada
p3 <- 1 / (1 + exp(-aprobado))
hace <- rbinom(n0, 1, p3)
# Dataset final
dat1 <- data.frame(hace, ingreso, deuda, edad, historial, garantia)
# Modelo logístico estimado
modelo3 <- glm(
formula = hace ~ ingreso + deuda + edad + garantia + historial + deuda*historial ,
family = binomial,
data = dat1)
coefs3 <- summary(modelo3)$coefficients
coefs3
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.37435841 0.83614182 -4.0356293 5.445614e-05
## ingreso 0.02931091 0.09880266 0.2966612 7.667252e-01
## deuda -3.08751965 0.71057394 -4.3451068 1.392079e-05
## edad 0.15304262 0.01999236 7.6550563 1.932275e-14
## garantiaSi 1.17742567 0.27158233 4.3354281 1.454767e-05
## historialRegular -1.19314483 0.59712241 -1.9981578 4.569955e-02
## historialMalo -2.10418855 0.56009105 -3.7568687 1.720527e-04
## deuda:historialRegular -1.02736143 1.08010786 -0.9511656 3.415203e-01
## deuda:historialMalo -1.94000273 1.14631348 -1.6923841 9.057276e-02
tabla_mod3 <- data.frame(
Termino = rownames(coefs3),
Logit = round(coefs3[, "Estimate"], 3),
Odds_Ratio = round(exp(coefs3[, "Estimate"]), 3),
row.names = NULL,
check.names = FALSE
)
tabla_mod3
## Termino Logit Odds_Ratio
## 1 (Intercept) -3.374 0.034
## 2 ingreso 0.029 1.030
## 3 deuda -3.088 0.046
## 4 edad 0.153 1.165
## 5 garantiaSi 1.177 3.246
## 6 historialRegular -1.193 0.303
## 7 historialMalo -2.104 0.122
## 8 deuda:historialRegular -1.027 0.358
## 9 deuda:historialMalo -1.940 0.144
1. Interpretación
El modelo demuestra que las variables deuda, edad, garantía e
historial crediticio influyen significativamente en la aprobación del
crédito. A mayor deuda, la probabilidad de aprobación disminuye
considerablemente, mientras que una mayor edad y la existencia de una
garantía real aumentan de forma importante las posibilidades de
aceptación. Los personas con historial “Regular” o “Malo” presentan
menores probabilidades de ser aprobados en comparación con aquellos con
historial “Bueno”. El ingreso no muestra un efecto estadísticamente
significativo, aunque mantiene una relación positiva con la
aprobación.
2. Interacciones
En comparación con personas con historial de crédito bueno, para
personas con historial regular, el efecto de tener deuda sobre las
probabilidades de aprobación se reduce por 64% odds ratio. Es decir, la
deuda ‘perjudica menos’ a personas con historial regular que a personas
con historial bueno. En comparación con personas con historial de
crédito bueno, para personas con historial malo, el efecto de tener
deuda sobre las probabilidades de aprobación se reduce por 86%.odds
ratio. Es decir, tener un historial malo reduce los efectos de la deuda
en la aprobación inclusive más que las personas con un crédito
regular.