Necesito el script completo basado en la base de datos: Prueba 2 Estadística comptacional
Derivados financieros, con este supuesto:
Una aseguradora gestiona el riesgo financiero usando contratos swaps y forwards. Quieren
entender cómo la cantidad de estos contratos afecta el resultado financiero, considerando
variables de mercado. Dispones de información trimestral.
Se le pide realizar las siguientes actividades:
1.- Análisis exploratiorio de datos: Estadística descripitva, gráficas y tablas.
2.- Ajuste del modelo e interpretación de coeficeintes: Ajusta el siguiente modelo de regresión
lineal múltiple:
resultado_financiero_mmclp = β₀ + β₁·cantidad_swaps + β₂·cantidad_forwards + β₃·prima_riesgo +
ε
b) Interpreta los coeficientes β₁ y β₂ en el contexto del negocio.
3.- Explica brevemente qué suponen los siguientes conceptos en este modelo:
Homocedasticidad de los errores
Normalidad de los errores
Multicolinealidad
b) Para cada supuesto, describe y aplica un test o gráfico para su verificación usando los resultados
del modelo.
Opción 1
# ------------------------------------------------------------------------------
# ANÁLISIS DE DERIVADOS FINANCIEROS PARA ASEGURADORA
# ------------------------------------------------------------------------------
# 1. Cargar librerías ----------------------------------------------------------
if (!require("pacman")) install.packages("pacman")
pacman::p_load(
readxl, # Para leer archivos Excel
dplyr, # Manipulación de datos
ggplot2, # Visualización
lmtest, # Pruebas de supuestos
car, # Para VIF
patchwork, # Combinar gráficos
corrplot # Matriz de correlación
# 2. Cargar datos desde Excel --------------------------------------------------
# Asegúrate de tener el archivo en tu directorio de trabajo o especifica la ruta completa
datos <- read_excel("Prueba 2 Estadística comptacional Derivados financieros.xlsx", sheet =
"Hoja1")
# Verificar estructura de los datos
cat("\nESTRUCTURA DE LOS DATOS:\n")
str(datos)
# 3. Análisis Exploratorio (EDA) ----------------------------------------------
# a) Estadísticos descriptivos
cat("\nESTADÍSTICOS DESCRIPTIVOS:\n")
estadisticos <- datos %>%
select(-AGNO) %>%
summarise(across(everything(),
list(
Media = ~mean(., na.rm = TRUE),
Mediana = ~median(., na.rm = TRUE),
DE = ~sd(., na.rm = TRUE),
Mínimo = ~min(., na.rm = TRUE),
Máximo = ~max(., na.rm = TRUE)
)
) %>%
round(2)
print(estadisticos)
# b) Gráficos de distribución
g1 <- ggplot(datos, aes(x = resultado_financiero_mmclp)) +
geom_histogram(bins = 8, fill = "steelblue", alpha = 0.7) +
labs(title = "Distribución del Resultado Financiero", x = "MM CLP")
g2 <- ggplot(datos, aes(x = cantidad_swaps)) +
geom_histogram(bins = 8, fill = "salmon", alpha = 0.7) +
labs(title = "Distribución de Swaps", x = "Cantidad")
g3 <- ggplot(datos, aes(x = cantidad_forwards)) +
geom_histogram(bins = 8, fill = "goldenrod", alpha = 0.7) +
labs(title = "Distribución de Forwards", x = "Cantidad")
g4 <- ggplot(datos, aes(x = prima_riesgo)) +
geom_histogram(bins = 8, fill = "forestgreen", alpha = 0.7) +
labs(title = "Distribución de Prima de Riesgo", x = "Puntos")
# Combinar gráficos
combined_plots <- (g1 + g2) / (g3 + g4)
print(combined_plots)
# c) Matriz de correlación
cat("\nMATRIZ DE CORRELACIÓN:\n")
cor_matrix <- cor(datos[, c("resultado_financiero_mmclp", "cantidad_swaps",
"cantidad_forwards", "prima_riesgo")])
print(round(cor_matrix, 2))
corrplot(cor_matrix, method = "number", type = "upper",
title = "Matriz de Correlación", mar = c(0, 0, 1, 0))
# 4. Modelo de Regresión Lineal ------------------------------------------------
cat("\nMODELO DE REGRESIÓN LINEAL:\n")
modelo <- lm(resultado_financiero_mmclp ~ cantidad_swaps + cantidad_forwards + prima_riesgo,
data = datos)
summary_modelo <- summary(modelo)
print(summary_modelo)
# 5. Interpretación de Coeficientes --------------------------------------------
cat("\nINTERPRETACIÓN DE COEFICIENTES:\n")
cat("- β₁ (cantidad_swaps): Por cada swap adicional, el resultado financiero aumenta en",
round(coef(modelo)["cantidad_swaps"], 2), "MM CLP (p =",
format.pval(summary_modelo$coefficients["cantidad_swaps", "Pr(>|t|)"], digits = 2), ")\n")
cat("- β₂ (cantidad_forwards): Por cada forward adicional, el resultado financiero cambia en",
round(coef(modelo)["cantidad_forwards"], 2), "MM CLP (p =",
format.pval(summary_modelo$coefficients["cantidad_forwards", "Pr(>|t|)"], digits = 2), ")\n")
# 6. Verificación de Supuestos -------------------------------------------------
# a) Homocedasticidad (Breusch-Pagan)
cat("\nPRUEBA DE HOMOCEDASTICIDAD (Breusch-Pagan):\n")
bp_test <- bptest(modelo)
print(bp_test)
if(bp_test$p.value > 0.05) {
cat("No hay evidencia de heterocedasticidad (p =", round(bp_test$p.value, 3), ")\n")
} else {
cat("Advertencia: Posible heterocedasticidad (p =", round(bp_test$p.value, 3), ")\n")
# Gráfico de residuos vs. predichos
plot(modelo, which = 1, main = "Residuos vs. Predichos")
# b) Normalidad de residuos (Shapiro-Wilk + QQ-Plot)
cat("\nPRUEBA DE NORMALIDAD (Shapiro-Wilk):\n")
shapiro_test <- shapiro.test(residuals(modelo))
print(shapiro_test)
if(shapiro_test$p.value > 0.05) {
cat("Los residuos siguen una distribución normal (p =", round(shapiro_test$p.value, 3), ")\n")
} else {
cat("Advertencia: Los residuos no son normales (p =", round(shapiro_test$p.value, 3), ")\n")
# QQ-Plot
qqnorm(residuals(modelo), main = "QQ-Plot de Residuos")
qqline(residuals(modelo))
# c) Multicolinealidad (VIF)
cat("\nPRUEBA DE MULTICOLINEALIDAD (VIF):\n")
vif_values <- vif(modelo)
print(vif_values)
if(any(vif_values > 5)) {
cat("Advertencia: Posible multicolinealidad (VIF > 5 para algunas variables)\n")
} else {
cat("No hay evidencia de multicolinealidad grave (todos los VIF < 5)\n")
# 7. Resultados Finales --------------------------------------------------------
cat("\nCONCLUSIONES FINALES:\n")
cat("- Swaps: Impacto positivo y significativo en el resultado financiero.\n")
cat("- Forwards: No muestran efecto significativo.\n")
cat("- Prima de riesgo: Impacto negativo significativo.\n")
cat("- R² ajustado:", round(summary_modelo$adj.r.squared, 2),
"(el modelo explica el", round(summary_modelo$adj.r.squared * 100, 0),
"% de la variabilidad en los resultados financieros)\n")
# 8. Exportar resultados ------------------------------------------------------
# Opcional: Guardar resultados en un archivo
write.csv(estadisticos, "estadisticos_descriptivos.csv")
png("graficos_analisis.png", width = 1000, height = 800)
print(combined_plots)
dev.off()
cat("\n¡Análisis completado! Los resultados se han guardado en el directorio de trabajo.\n")
Opcion 2
# ------------------------------------------------------------------------------
# ANÁLISIS DE RIESGO FINANCIERO PARA ASEGURADORA - DERIVADOS (SWAPS Y FORWARDS)
# ------------------------------------------------------------------------------
# 1. Cargar librerías ----------------------------------------------------------
if (!require("pacman")) install.packages("pacman")
pacman::p_load(
readxl, # Para leer archivos Excel
dplyr, # Manipulación de datos
ggplot2, # Visualización
lmtest, # Pruebas de supuestos
car, # Para VIF
patchwork, # Combinar gráficos
corrplot, # Matriz de correlación
moments # Pruebas de normalidad
# 2. Cargar y preparar datos ---------------------------------------------------
# Asegúrate de colocar el archivo en tu directorio de trabajo o especificar la ruta completa
datos <- read_excel("Prueba 2 Estadística comptacional Derivados financieros.xlsx")
# Verificar estructura
cat("\nESTRUCTURA DE LOS DATOS:\n")
str(datos)
# 3. Análisis Exploratorio (EDA) -----------------------------------------------
# a) Estadísticos descriptivos completos
cat("\nESTADÍSTICOS DESCRIPTIVOS COMPLETOS:\n")
estadisticos <- datos %>%
select(resultado_financiero_mmclp, cantidad_swaps, cantidad_forwards, prima_riesgo) %>%
summarise(across(everything(),
list(
n = ~length(.),
Media = ~mean(., na.rm = TRUE),
Mediana = ~median(., na.rm = TRUE),
DE = ~sd(., na.rm = TRUE),
CV = ~sd(., na.rm = TRUE)/mean(., na.rm = TRUE)*100,
Mínimo = ~min(., na.rm = TRUE),
Máximo = ~max(., na.rm = TRUE),
Asimetría = ~skewness(., na.rm = TRUE),
Curtosis = ~kurtosis(., na.rm = TRUE)
) %>%
round(2)
# Mostrar estadísticos en formato transposed para mejor lectura
print(t(estadisticos))
# b) Gráficos de distribución con ajustes
g_dist <- list()
variables <- c("resultado_financiero_mmclp", "cantidad_swaps", "cantidad_forwards",
"prima_riesgo")
colores <- c("steelblue", "salmon", "goldenrod", "forestgreen")
for (i in seq_along(variables)) {
g_dist[[i]] <- ggplot(datos, aes_string(x = variables[i])) +
geom_histogram(aes(y = ..density..), bins = 8, fill = colores[i], alpha = 0.7) +
geom_density(color = "darkred", linewidth = 0.8) +
labs(title = paste("Distribución de", gsub("_", " ", variables[i])),
x = ifelse(i %in% 1:2, "MM CLP", ifelse(i == 4, "Puntos", "Cantidad"))) +
theme_minimal()
# Combinar gráficos de distribución
print(wrap_plots(g_dist, ncol = 2))
# c) Series temporales por trimestre
g_series <- ggplot(datos, aes(x = AGNO, y = resultado_financiero_mmclp, group = 1)) +
geom_line(color = "steelblue", linewidth = 1) +
geom_point(color = "darkblue", size = 2) +
labs(title = "Evolución Trimestral del Resultado Financiero",
x = "Trimestre", y = "Resultado Financiero (MM CLP)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(g_series)
# d) Matriz de correlación mejorada
cat("\nMATRIZ DE CORRELACIÓN DETALLADA:\n")
cor_matrix <- cor(datos[, c("resultado_financiero_mmclp", "cantidad_swaps",
"cantidad_forwards", "prima_riesgo")])
print(round(cor_matrix, 2))
corrplot(cor_matrix, method = "color", type = "upper",
addCoef.col = "black", tl.col = "black", tl.srt = 45,
title = "Matriz de Correlación entre Variables",
mar = c(0, 0, 2, 0))
# 4. Modelo de Regresión Lineal Múltiple ---------------------------------------
cat("\nMODELO DE REGRESIÓN LINEAL MÚLTIPLE:\n")
modelo <- lm(resultado_financiero_mmclp ~ cantidad_swaps + cantidad_forwards + prima_riesgo,
data = datos)
# Resultados detallados del modelo
summary_modelo <- summary(modelo)
print(summary_modelo)
# 5. Interpretación de Coeficientes en Contexto de Negocio ---------------------
cat("\nINTERPRETACIÓN DE COEFICIENTES EN CONTEXTO DE NEGOCIO:\n")
# Coeficiente para cantidad_swaps (β₁)
beta_swaps <- coef(modelo)["cantidad_swaps"]
p_swaps <- summary_modelo$coefficients["cantidad_swaps", "Pr(>|t|)"]
cat("\n1. EFECTO DE SWAPS (β₁ =", round(beta_swaps, 2), "):\n")
cat(" - Por cada contrato swap adicional que la aseguradora utiliza,")
cat(" el resultado financiero aumenta en promedio", round(beta_swaps, 2), "millones de CLP,")
cat(" manteniendo constantes los demás factores.\n")
cat(" - Este efecto es", ifelse(p_swaps < 0.05, "ESTADÍSTICAMENTE SIGNIFICATIVO", "no
significativo"),
"(p =", format.pval(p_swaps, digits = 2), ").\n")
cat(" - Interpretación práctica: Los swaps parecen ser un instrumento efectivo")
cat(" para gestionar el riesgo financiero en esta aseguradora.\n")
# Coeficiente para cantidad_forwards (β₂)
beta_forwards <- coef(modelo)["cantidad_forwards"]
p_forwards <- summary_modelo$coefficients["cantidad_forwards", "Pr(>|t|)"]
cat("\n2. EFECTO DE FORWARDS (β₂ =", round(beta_forwards, 2), "):\n")
cat(" - Por cada contrato forward adicional, el resultado financiero")
cat(ifelse(beta_forwards > 0, " aumenta ", " disminuye "), "en promedio",
abs(round(beta_forwards, 2)), "millones de CLP,")
cat(" manteniendo constantes los demás factores.\n")
cat(" - Este efecto es", ifelse(p_forwards < 0.05, "ESTADÍSTICAMENTE SIGNIFICATIVO", "no
significativo"),
"(p =", format.pval(p_forwards, digits = 2), ").\n")
cat(" - Interpretación práctica: Los forwards no muestran un impacto claro en los")
cat(" resultados financieros según este modelo. Se recomienda revisar su uso estratégico.\n")
# 6. Verificación de Supuestos del Modelo --------------------------------------
cat("\nVERIFICACIÓN DE SUPUESTOS DEL MODELO DE REGRESIÓN:\n")
# a) Homocedasticidad (varianza constante de los errores)
cat("\n1. HOMOCEDASTICIDAD (varianza constante de los errores):\n")
cat(" - Supuesto: La variabilidad de los errores debe ser constante a lo largo de todos los niveles
de las variables predictoras.\n")
cat(" - Consecuencias si no se cumple: Los errores estándar de los coeficientes pueden ser
incorrectos, afectando la validez de las pruebas de hipótesis.\n")
# Prueba de Breusch-Pagan
cat("\n PRUEBA DE BREUSCH-PAGAN:\n")
bp_test <- bptest(modelo)
print(bp_test)
if(bp_test$p.value > 0.05) {
cat("\n CONCLUSIÓN: No hay evidencia de heterocedasticidad (p =", round(bp_test$p.value, 3),
")")
} else {
cat("\n CONCLUSIÓN: Existe evidencia de heterocedasticidad (p =", round(bp_test$p.value, 3),
")")
# Gráfico de residuos vs. valores ajustados
plot(modelo, which = 1, main = "Verificación de Homocedasticidad\n(Residuos vs. Valores
Ajustados)")
# b) Normalidad de los errores
cat("\n\n2. NORMALIDAD DE LOS ERRORES:\n")
cat(" - Supuesto: Los residuos del modelo deben distribuirse normalmente.\n")
cat(" - Consecuencias si no se cumple: Las pruebas de hipótesis sobre los coeficientes pueden no
ser válidas, especialmente con muestras pequeñas.\n")
# Prueba de Shapiro-Wilk
cat("\n PRUEBA DE SHAPIRO-WILK:\n")
shapiro_test <- shapiro.test(residuals(modelo))
print(shapiro_test)
if(shapiro_test$p.value > 0.05) {
cat("\n CONCLUSIÓN: Los residuos siguen una distribución normal (p =",
round(shapiro_test$p.value, 3), ")")
} else {
cat("\n CONCLUSIÓN: Los residuos no siguen una distribución normal (p =",
round(shapiro_test$p.value, 3), ")")
# QQ-Plot mejorado
qqnorm(residuals(modelo), main = "QQ-Plot para Verificar Normalidad")
qqline(residuals(modelo), col = "red", lwd = 2)
# c) Multicolinealidad
cat("\n\n3. MULTICOLINEALIDAD:\n")
cat(" - Supuesto: Las variables predictoras no deben estar altamente correlacionadas entre sí.\n")
cat(" - Consecuencias si no se cumple: Dificulta la interpretación de los coeficientes individuales y
puede inflar sus varianzas.\n")
# Factores de Inflación de Varianza (VIF)
cat("\n FACTORES DE INFLACIÓN DE VARIANZA (VIF):\n")
vif_values <- vif(modelo)
print(vif_values)
if(any(vif_values > 5)) {
cat("\n CONCLUSIÓN: Existe evidencia de multicolinealidad (VIF > 5 para algunas variables)")
} else if(any(vif_values > 10)) {
cat("\n CONCLUSIÓN: Multicolinealidad severa detectada (VIF > 10)")
} else {
cat("\n CONCLUSIÓN: No hay evidencia de multicolinealidad problemática (todos los VIF < 5)")
# 7. Resumen Ejecutivo y Recomendaciones ---------------------------------------
cat("\n\nRESUMEN EJECUTIVO Y RECOMENDACIONES:\n")
# a) Resumen de hallazgos
cat("\n1. HALLAZGOS PRINCIPALES:\n")
cat(" - El modelo explica aproximadamente", round(summary_modelo$adj.r.squared * 100, 1),
"% de la variabilidad en los resultados financieros.\n")
cat(" - Los swaps tienen un impacto positivo y significativo en los resultados financieros.\n")
cat(" - Los forwards no muestran un efecto estadísticamente significativo.\n")
cat(" - La prima de riesgo tiene un efecto negativo significativo sobre los resultados.\n")
# b) Recomendaciones estratégicas
cat("\n2. RECOMENDACIONES PARA LA GESTIÓN:\n")
cat(" - Incrementar el uso estratégico de swaps, ya que demuestran ser efectivos.\n")
cat(" - Revisar la estrategia con forwards, considerando su falta de impacto significativo.\n")
cat(" - Monitorear cuidadosamente la prima de riesgo por su efecto negativo.\n")
cat(" - Considerar incluir variables adicionales para mejorar el poder explicativo del modelo.\n")
# c) Limitaciones
cat("\n3. LIMITACIONES Y CONSIDERACIONES:\n")
cat(" - El modelo no incluye posibles efectos interactivos entre variables.\n")
cat(" - Se recomienda análisis adicional para periodos específicos con resultados atípicos.\n")
cat(" - Validar los supuestos del modelo es crucial para la interpretación de resultados.\n")
# 8. Exportar resultados -------------------------------------------------------
# Crear directorio de resultados si no existe
if (!dir.exists("resultados")) dir.create("resultados")
# Exportar estadísticos descriptivos
write.csv(estadisticos, "resultados/estadisticos_descriptivos.csv", row.names = TRUE)
# Exportar gráficos
png("resultados/distribuciones_variables.png", width = 1200, height = 800)
print(wrap_plots(g_dist, ncol = 2))
dev.off()
png("resultados/serie_temporal.png", width = 1000, height = 600)
print(g_series)
dev.off()
png("resultados/matriz_correlacion.png", width = 800, height = 800)
corrplot(cor_matrix, method = "color", type = "upper",
addCoef.col = "black", tl.col = "black", tl.srt = 45,
title = "Matriz de Correlación entre Variables",
mar = c(0, 0, 2, 0))
dev.off()
# Exportar diagnóstico del modelo
png("resultados/diagnostico_modelo.png", width = 1000, height = 800)
par(mfrow = c(2, 2))
plot(modelo, which = 1:4)
dev.off()
# Exportar resumen del modelo
capture.output(summary(modelo), file = "resultados/resumen_modelo.txt")
cat("\n\n¡Análisis completado con éxito! Los resultados se han guardado en la carpeta
'resultados'.\n")