summary(Datos)
## Lugar 2005 2006 2007
## Length:8 Min. : 8.730 Min. : 8.590 Min. : 7.810
## Class :character 1st Qu.: 9.705 1st Qu.: 8.675 1st Qu.: 8.055
## Mode :character Median :10.330 Median : 9.155 Median : 9.150
## Mean :10.471 Mean : 9.630 Mean :10.366
## 3rd Qu.:11.357 3rd Qu.: 9.682 3rd Qu.:11.568
## Max. :12.110 Max. :12.910 Max. :17.410
## 2008 2009 2010 2011
## Min. : 7.880 Min. : 8.500 Min. : 7.960 Min. : 6.890
## 1st Qu.: 9.270 1st Qu.: 9.262 1st Qu.: 8.582 1st Qu.: 8.190
## Median : 9.635 Median : 9.565 Median : 9.135 Median : 8.645
## Mean :10.196 Mean : 9.800 Mean : 9.331 Mean : 9.179
## 3rd Qu.:10.535 3rd Qu.:10.310 3rd Qu.: 9.715 3rd Qu.: 9.223
## Max. :14.560 Max. :11.740 Max. :11.170 Max. :14.220
## 2012 2013 2014 2015
## Min. : 7.020 Min. : 5.430 Min. : 7.620 Min. : 7.660
## 1st Qu.: 8.005 1st Qu.: 7.918 1st Qu.: 8.463 1st Qu.: 8.740
## Median : 8.255 Median : 8.470 Median : 9.700 Median : 9.065
## Mean : 8.399 Mean : 8.795 Mean : 9.456 Mean : 9.974
## 3rd Qu.: 8.720 3rd Qu.: 9.248 3rd Qu.:10.242 3rd Qu.:10.143
## Max. :10.160 Max. :13.090 Max. :11.310 Max. :15.350
## 2016 2017 2018 2019
## Min. : 8.160 Min. : 8.550 Min. : 7.940 Min. : 7.470
## 1st Qu.: 9.057 1st Qu.: 9.217 1st Qu.: 9.768 1st Qu.: 9.315
## Median : 9.740 Median : 9.540 Median :10.160 Median :10.905
## Mean : 9.806 Mean :10.223 Mean :10.838 Mean :10.941
## 3rd Qu.:10.693 3rd Qu.:10.895 3rd Qu.:12.008 3rd Qu.:12.605
## Max. :11.410 Max. :13.440 Max. :13.880 Max. :15.090
## 2020 2021 2022 2023p
## Min. : 7.560 Min. : 7.34 Min. : 5.860 Min. : 8.07
## 1st Qu.: 9.902 1st Qu.:10.17 1st Qu.: 9.795 1st Qu.:10.06
## Median :10.585 Median :10.71 Median :10.260 Median :10.99
## Mean :11.115 Mean :10.98 Mean :10.250 Mean :10.72
## 3rd Qu.:11.758 3rd Qu.:12.29 3rd Qu.:11.315 3rd Qu.:11.46
## Max. :16.570 Max. :13.96 Max. :12.720 Max. :12.96
## 2024p
## Min. :5.020
## 1st Qu.:5.985
## Median :6.290
## Mean :6.508
## 3rd Qu.:7.348
## Max. :8.030
# Transformar a formato largo
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
datos <- Datos
datos_largos <- datos %>%
pivot_longer(
cols = -Lugar,
names_to = "Año",
values_to = "Tasa"
) %>%
mutate(
Año = gsub("p", "", Año), # Eliminar sufijo "p"
Año = as.integer(Año)
)
library(dplyr)
library(tidyverse)
library(ggrepel)
# Filtrar solo Tasa Nacional
tasa_nacional <- datos_largos %>%
filter(Lugar == "Tasa_Nacional")
# Graficar con colores azul y turquesa + etiquetas
ggplot(tasa_nacional, aes(x = Año, y = Tasa)) +
geom_line(color = "blue", size = 1.2) +
geom_point(color = "turquoise4", size = 2) +
geom_text_repel(aes(label = round(Tasa, 2)), size = 3, color = "black") +
labs(
title = "Tendencia de la Tasa Nacional de Mortalidad por CCU",
x = "Año",
y = "Tasa de Mortalidad (por 100,000 habitantes)"
) +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
summary(tasa_nacional)
## Lugar Año Tasa
## Length:20 Min. :2005 Min. : 6.190
## Class :character 1st Qu.:2010 1st Qu.: 9.335
## Mode :character Median :2014 Median : 9.525
## Mean :2014 Mean : 9.392
## 3rd Qu.:2019 3rd Qu.: 9.930
## Max. :2024 Max. :10.390
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
# Separar nacional y ciudades
nacional <- datos_largos %>% filter(Lugar == "Tasa_Nacional")
ciudades <- datos_largos %>% filter(Lugar != "Tasa_Nacional")
# Crear gráfico interactivo
plot_ly() %>%
# Línea nacional (resaltada)
add_trace(
data = nacional,
x = ~Año,
y = ~Tasa,
type = 'scatter',
mode = 'lines+markers',
name = 'Tasa Nacional',
line = list(color = 'blue', width = 3),
marker = list(size = 5)
) %>%
# Líneas por ciudad (opcionales al pasar el mouse)
add_trace(
data = ciudades,
x = ~Año,
y = ~Tasa,
type = 'scatter',
mode = 'lines+markers',
color = ~Lugar,
text = ~paste("Ciudad:", Lugar, "<br>Tasa:", round(Tasa,2)),
hoverinfo = "text",
line = list(width = 1),
marker = list(size = 4)
) %>%
layout(
title = "Comparación Interactiva: Tasas mortalidad CCU",
xaxis = list(title = "Año"),
yaxis = list(title = "Tasa de Mortalidad (por 100,000)"),
legend = list(title = list(text = "<b>Selecciona ciudad</b>"))
)
antioquia <- datos_largos %>% filter(Lugar == "Tasa_Antioquia")
summary(antioquia)
## Lugar Año Tasa
## Length:20 Min. :2005 Min. :5.370
## Class :character 1st Qu.:2010 1st Qu.:7.635
## Mode :character Median :2014 Median :8.070
## Mean :2014 Mean :8.061
## 3rd Qu.:2019 3rd Qu.:8.523
## Max. :2024 Max. :9.630
arauca <- datos_largos %>% filter(Lugar == "Tasa_Arauca")
summary(arauca)
## Lugar Año Tasa
## Length:20 Min. :2005 Min. : 5.02
## Class :character 1st Qu.:2010 1st Qu.:10.52
## Mode :character Median :2014 Median :11.43
## Mean :2014 Mean :11.82
## 3rd Qu.:2019 3rd Qu.:14.30
## Max. :2024 Max. :17.41
atlantico <- datos_largos %>% filter(Lugar == "Tasa_Atlantico")
summary(atlantico)
## Lugar Año Tasa
## Length:20 Min. :2005 Min. : 6.89
## Class :character 1st Qu.:2010 1st Qu.: 8.75
## Mode :character Median :2014 Median : 9.93
## Mean :2014 Mean :10.41
## 3rd Qu.:2019 3rd Qu.:12.59
## Max. :2024 Max. :13.96
bogota <- datos_largos %>% filter(Lugar == "Tasa_Bogotá")
summary(bogota)
## Lugar Año Tasa
## Length:20 Min. :2005 Min. : 6.240
## Class :character 1st Qu.:2010 1st Qu.: 8.550
## Mode :character Median :2014 Median : 9.025
## Mean :2014 Mean : 9.162
## 3rd Qu.:2019 3rd Qu.: 9.992
## Max. :2024 Max. :11.430
Norte_Santander <- datos_largos %>% filter(Lugar == "Tasa_Norte_Santander")
summary(Norte_Santander)
## Lugar Año Tasa
## Length:20 Min. :2005 Min. : 7.260
## Class :character 1st Qu.:2010 1st Qu.: 8.553
## Mode :character Median :2014 Median : 9.470
## Mean :2014 Mean : 9.937
## 3rd Qu.:2019 3rd Qu.:11.590
## Max. :2024 Max. :13.110
Santander <- datos_largos %>% filter(Lugar == "Tasa_Santander")
summary(Santander)
## Lugar Año Tasa
## Length:20 Min. :2005 Min. : 5.430
## Class :character 1st Qu.:2010 1st Qu.: 8.425
## Mode :character Median :2014 Median : 9.325
## Mean :2014 Mean : 8.970
## 3rd Qu.:2019 3rd Qu.: 9.795
## Max. :2024 Max. :10.990
valle <- datos_largos %>% filter(Lugar == "Tasa_Valle")
summary(valle)
## Lugar Año Tasa
## Length:20 Min. :2005 Min. : 8.03
## Class :character 1st Qu.:2010 1st Qu.:10.46
## Mode :character Median :2014 Median :11.36
## Mean :2014 Mean :11.04
## 3rd Qu.:2019 3rd Qu.:11.68
## Max. :2024 Max. :12.72
library(tidyverse)
library(forecast)
## Warning: package 'forecast' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(Metrics)
## Warning: package 'Metrics' was built under R version 4.3.3
##
## Attaching package: 'Metrics'
## The following object is masked from 'package:forecast':
##
## accuracy
library(ggplot2)
library(ggrepel)
library(purrr)
library(dplyr)
# --- 1. Leer y preparar datos ---
datos <- Datos
# Transformar a formato largo eliminando año 2024 de la medición
df_largo <- datos %>%
pivot_longer(cols = -Lugar, names_to = "Año", values_to = "Tasa") %>%
mutate(
Año = gsub("p", "", Año),
Año = as.integer(Año),
Tasa = as.numeric(Tasa)
) %>%
filter(Año != 2024)
# Definir función de modelado por lugar
modelar_y_predecir <- function(df_lugar, lugar) {
serie <- df_lugar %>% filter(Lugar == lugar) %>% arrange(Año)
# Separar set de entrenamiento (2005–2017) y set de validación (2018–2020)
train <- serie %>% filter(Año <= 2017)
test <- serie %>% filter(Año >= 2018 & Año <= 2020)
ts_train <- ts(train$Tasa, start = min(train$Año), frequency = 1)
# Entrenar modelos
modelo_arima <- auto.arima(ts_train)
modelo_ets <- ets(ts_train)
# Predicción para años de validación y futuros (2018–2025) con intervalos de confianza al 95%
forecast_arima <- forecast(modelo_arima, h = 8, level = 95)
forecast_ets <- forecast(modelo_ets, h = 8, level = 95)
# Evaluación de modelos para años 2018–2020
real_vals <- test$Tasa
pred_arima <- forecast_arima$mean[1:3]
pred_ets <- forecast_ets$mean[1:3]
evaluacion <- tibble(
Lugar = lugar,
Modelo = c("ARIMA", "ETS"),
MAE = c(mae(real_vals, pred_arima), mae(real_vals, pred_ets)),
RMSE = c(rmse(real_vals, pred_arima), rmse(real_vals, pred_ets)),
MAPE = c(mape(real_vals, pred_arima)*100, mape(real_vals, pred_ets)*100)
)
# Predicciones solo para 2021–2025 = posiciones 4:8
años_pred <- 2021:2025
pred_arima_df <- tibble(
Año = años_pred,
Predicción = as.numeric(forecast_arima$mean[4:8]),
Lower = as.numeric(forecast_arima$lower[4:8, "95%"]),
Upper = as.numeric(forecast_arima$upper[4:8, "95%"]),
Modelo = "ARIMA",
Lugar = lugar
)
pred_ets_df <- tibble(
Año = años_pred,
Predicción = as.numeric(forecast_ets$mean[4:8]),
Lower = as.numeric(forecast_ets$lower[4:8, "95%"]),
Upper = as.numeric(forecast_ets$upper[4:8, "95%"]),
Modelo = "ETS",
Lugar = lugar
)
# Combinar ambos
pred_df <- bind_rows(pred_arima_df, pred_ets_df)
# Gráfico con intervalos de confianza al 95%
grafico <- ggplot() +
geom_line(data = serie, aes(x = Año, y = Tasa), color = "gray30") +
geom_point(data = serie, aes(x = Año, y = Tasa), color = "gray30", size = 1.5) +
geom_ribbon(data = pred_df, aes(x = Año, ymin = Lower, ymax = Upper, fill = Modelo), alpha = 0.2) +
geom_line(data = pred_df, aes(x = Año, y = Predicción, color = Modelo), size = 1.2) +
geom_point(data = pred_df, aes(x = Año, y = Predicción, color = Modelo), size = 2) +
labs(
title = paste("Predicción con IC95% -", lugar),
x = "Año",
y = "Tasa por 100.000",
color = "Modelo",
fill = "Modelo"
) +
theme_minimal()
return(list(evaluacion = evaluacion, predicciones = pred_df, grafico = grafico))
}
# Aplicar función a cada ciudad
lugares <- unique(df_largo$Lugar)
resultados <- map(lugares, ~modelar_y_predecir(df_largo, .x))
# Unir evaluaciones y predicciones
evaluaciones <- bind_rows(map(resultados, "evaluacion"))
predicciones <- bind_rows(map(resultados, "predicciones"))
# Mostrar tabla de evaluación completa de estadisticos: MAE, RMSE, MAPE por modelo y lugar
print(evaluaciones)
## # A tibble: 16 × 5
## Lugar Modelo MAE RMSE MAPE
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Tasa_Nacional ARIMA 0.349 0.380 3.51
## 2 Tasa_Nacional ETS 0.148 0.176 1.49
## 3 Tasa_Antioquia ARIMA 0.467 0.510 6.18
## 4 Tasa_Antioquia ETS 0.765 0.791 10.1
## 5 Tasa_Bogotá ARIMA 1.24 1.24 12.3
## 6 Tasa_Bogotá ETS 1.24 1.24 12.3
## 7 Tasa_Valle ARIMA 0.656 0.665 5.86
## 8 Tasa_Valle ETS 0.656 0.665 5.86
## 9 Tasa_Atlantico ARIMA 3.57 3.60 27.1
## 10 Tasa_Atlantico ETS 0.840 0.961 6.28
## 11 Tasa_Santander ARIMA 1.49 1.59 15.7
## 12 Tasa_Santander ETS 1.49 1.59 15.7
## 13 Tasa_Norte_Santander ARIMA 2.18 2.41 18.7
## 14 Tasa_Norte_Santander ETS 2.24 2.51 19.2
## 15 Tasa_Arauca ARIMA 2.74 2.95 17.6
## 16 Tasa_Arauca ETS 2.73 2.94 17.6
# Calcular promedios por modelo en todos los lugares
resumen_general <- evaluaciones %>%
group_by(Modelo) %>%
summarise(
Promedio_MAE = mean(MAE, na.rm = TRUE),
Promedio_RMSE = mean(RMSE, na.rm = TRUE),
Promedio_MAPE = mean(MAPE, na.rm = TRUE)
)
print(resumen_general)
## # A tibble: 2 × 4
## Modelo Promedio_MAE Promedio_RMSE Promedio_MAPE
## <chr> <dbl> <dbl> <dbl>
## 1 ARIMA 1.59 1.67 13.4
## 2 ETS 1.26 1.36 11.1
# Visualizar gráficos
print(resultados[[1]]$grafico)
# Para graficar todos: usar bucle
walk(resultados, ~print(.x$grafico))
# Exportar resultados
# write.csv(evaluaciones, "Errores_Modelos_Validacion.csv", row.names = FALSE)
# write.csv(predicciones, "Predicciones_Modelos.csv", row.names = FALSE)
El modelo ARIMA las predicciones se desvían en promedio 0.35 unidades (MAE) de la tasa de mortalidad del valor real. Mientras que en el modelo ETS, el MAE (error medio absoluto) es mucho menor (0.15 unidades), lo que indica un ajuste más preciso respecto al valor de tasa real. Es decir, que el modelo ETS tiene mejor precisión promedio que ARIMA.
El modelo ARIMA tiene una Raíz del Error Cuadrático Medio (RMSE) de 0.38 que indica mayor dispersión de los errores. Mientras que el modelo ETS tiene un RMSE de 0.176 confirma que las predicciones están más cercanas a los valores reales y con menos errores extremos.Es decir que, ETS nuevamente muestra menor variabilidad en los errores.
En cuanto al error Porcentual Absoluto Medio que mide el porcentaje de error relativo en promedio. Para el modelo ARIMA, Las predicciones tienen un error porcentual medio de 3.5%. Mientras que para el modelo ETS, Las predicciones solo se desvían un 1.5% en promedio respecto a los valores reales. Esto sugiere que ETS es más confiable en términos relativos que el modelo ARIMA.
# tabla ordenada por MAPE descendente para identificar mejores modelos
evaluaciones %>%
arrange(desc(MAPE)) %>%
print(n = Inf)
## # A tibble: 16 × 5
## Lugar Modelo MAE RMSE MAPE
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Tasa_Atlantico ARIMA 3.57 3.60 27.1
## 2 Tasa_Norte_Santander ETS 2.24 2.51 19.2
## 3 Tasa_Norte_Santander ARIMA 2.18 2.41 18.7
## 4 Tasa_Arauca ARIMA 2.74 2.95 17.6
## 5 Tasa_Arauca ETS 2.73 2.94 17.6
## 6 Tasa_Santander ARIMA 1.49 1.59 15.7
## 7 Tasa_Santander ETS 1.49 1.59 15.7
## 8 Tasa_Bogotá ARIMA 1.24 1.24 12.3
## 9 Tasa_Bogotá ETS 1.24 1.24 12.3
## 10 Tasa_Antioquia ETS 0.765 0.791 10.1
## 11 Tasa_Atlantico ETS 0.840 0.961 6.28
## 12 Tasa_Antioquia ARIMA 0.467 0.510 6.18
## 13 Tasa_Valle ETS 0.656 0.665 5.86
## 14 Tasa_Valle ARIMA 0.656 0.665 5.86
## 15 Tasa_Nacional ARIMA 0.349 0.380 3.51
## 16 Tasa_Nacional ETS 0.148 0.176 1.49
library(readxl)
Datos2 <- read_excel("E:/One_Drive_PUJ/OneDrive - PUJ Cali/PERSONAL/ARTICULOS_CIENTÍFICOS/VPH/Datos/Datos2.xlsx")
View(Datos2)
summary(Datos2)
## Lugar 1998 1999 2000
## Length:34 Min. : 0.000 Min. : 0.000 Min. : 0.000
## Class :character 1st Qu.: 4.859 1st Qu.: 5.648 1st Qu.: 6.582
## Mode :character Median : 6.923 Median : 8.005 Median : 7.736
## Mean : 7.207 Mean : 7.854 Mean : 8.514
## 3rd Qu.:10.552 3rd Qu.: 9.684 3rd Qu.:10.855
## Max. :13.907 Max. :14.104 Max. :16.141
## 2001 2002 2003 2004
## Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 6.402 1st Qu.: 4.394 1st Qu.: 5.648 1st Qu.: 5.966
## Median : 7.692 Median : 7.844 Median : 7.648 Median : 7.443
## Mean : 8.039 Mean : 7.246 Mean : 8.220 Mean : 7.749
## 3rd Qu.: 9.946 3rd Qu.: 9.809 3rd Qu.:10.355 3rd Qu.: 9.929
## Max. :15.459 Max. :13.181 Max. :21.422 Max. :18.191
## 2005 2006 2007 2008
## Min. : 2.846 Min. : 0.000 Min. : 2.674 Min. : 0.000
## 1st Qu.: 6.579 1st Qu.: 5.974 1st Qu.: 5.877 1st Qu.: 6.161
## Median : 7.791 Median : 7.315 Median : 7.291 Median : 7.198
## Mean : 8.396 Mean : 7.064 Mean : 7.761 Mean : 7.533
## 3rd Qu.:10.207 3rd Qu.: 8.589 3rd Qu.: 9.830 3rd Qu.: 9.324
## Max. :18.347 Max. :12.600 Max. :14.660 Max. :14.562
## 2009 2010 2011 2012
## Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 6.255 1st Qu.: 5.922 1st Qu.: 5.385 1st Qu.: 5.556
## Median : 7.103 Median : 7.305 Median : 6.633 Median : 6.709
## Mean : 7.638 Mean : 7.429 Mean : 6.802 Mean : 6.652
## 3rd Qu.: 8.325 3rd Qu.: 9.413 3rd Qu.: 8.020 3rd Qu.: 7.403
## Max. :27.473 Max. :12.834 Max. :13.373 Max. :18.464
## 2013 2014 2015 2016
## Min. : 0.000 Min. : 0.000 Min. : 2.155 Min. : 0.000
## 1st Qu.: 5.191 1st Qu.: 5.462 1st Qu.: 5.788 1st Qu.: 6.000
## Median : 6.307 Median : 6.853 Median : 7.192 Median : 7.608
## Mean : 6.941 Mean : 6.627 Mean : 7.627 Mean : 7.118
## 3rd Qu.: 8.884 3rd Qu.: 8.138 3rd Qu.: 9.134 3rd Qu.: 8.498
## Max. :17.596 Max. :13.206 Max. :14.501 Max. :13.803
## 2017 2018 2019 2020
## Min. : 0.000 Min. : 0.000 Min. : 2.561 Min. : 0.000
## 1st Qu.: 5.925 1st Qu.: 5.956 1st Qu.: 5.761 1st Qu.: 5.057
## Median : 7.307 Median : 6.961 Median : 7.396 Median : 7.271
## Mean : 7.915 Mean : 7.185 Mean : 7.765 Mean : 7.340
## 3rd Qu.: 9.626 3rd Qu.: 8.432 3rd Qu.: 9.631 3rd Qu.: 8.965
## Max. :26.893 Max. :15.582 Max. :13.657 Max. :18.272
## 2021 2022 2023 2024
## Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 4.209 1st Qu.: 5.226 1st Qu.: 4.726 1st Qu.: 5.370
## Median : 7.156 Median : 6.916 Median : 6.740 Median : 7.334
## Mean : 6.389 Mean : 6.656 Mean : 6.580 Mean : 6.440
## 3rd Qu.: 8.362 3rd Qu.: 7.813 3rd Qu.: 8.464 3rd Qu.: 8.085
## Max. :12.465 Max. :13.990 Max. :15.170 Max. :10.964
# Transformar a formato largo
library(dplyr)
library(tidyverse)
datos2 <- Datos2
datos_largos2 <- datos2 %>%
pivot_longer(
cols = -Lugar,
names_to = "Año",
values_to = "Tasa"
) %>%
mutate(
Año = as.integer(Año))
library(dplyr)
library(tidyverse)
library(ggrepel)
# Filtrar solo Tasa Nacional
tasa_nacional2 <- datos_largos2 %>%
filter(Lugar == "Nacional")
# Graficar con colores azul y turquesa + etiquetas
ggplot(tasa_nacional2, aes(x = Año, y = Tasa)) +
geom_line(color = "blue", size = 1.2) +
geom_point(color = "turquoise4", size = 2) +
geom_text_repel(aes(label = round(Tasa, 2)), size = 3, color = "black") +
labs(
title = "Tendencia de la Tasa Nacional de Mortalidad por CCU",
x = "Año",
y = "Tasa de Mortalidad (por 100,000 mujeres)"
) +
theme_minimal()
summary(tasa_nacional2)
## Lugar Año Tasa
## Length:27 Min. :1998 Min. :6.484
## Class :character 1st Qu.:2004 1st Qu.:7.070
## Mode :character Median :2011 Median :7.262
## Mean :2011 Mean :7.384
## 3rd Qu.:2018 3rd Qu.:7.784
## Max. :2024 Max. :8.357
library(plotly)
# Separar nacional y ciudades
nacional2 <- datos_largos2 %>% filter(Lugar == "Nacional")
ciudades2 <- datos_largos2 %>% filter(Lugar != "Nacional")
# Crear gráfico interactivo
plot_ly() %>%
# Línea nacional (resaltada)
add_trace(
data = nacional2,
x = ~Año,
y = ~Tasa,
type = 'scatter',
mode = 'lines+markers',
name = 'Tasa Nacional',
line = list(color = 'blue', width = 3),
marker = list(size = 5)
) %>%
# Líneas por ciudad (opcionales al pasar el mouse)
add_trace(
data = ciudades2,
x = ~Año,
y = ~Tasa,
type = 'scatter',
mode = 'lines+markers',
color = ~Lugar,
text = ~paste("Ciudad:", Lugar, "<br>Tasa:", round(Tasa,2)),
hoverinfo = "text",
line = list(width = 1),
marker = list(size = 4)
) %>%
layout(
title = "Comparación Interactiva: Tasas mortalidad CCU",
xaxis = list(title = "Año"),
yaxis = list(title = "Tasa de Mortalidad (por 100,000)"),
legend = list(title = list(text = "<b>Selecciona ciudad</b>"))
)
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
antioquia2 <- datos_largos2 %>% filter(Lugar == "Antioquia")
summary(antioquia2)
## Lugar Año Tasa
## Length:27 Min. :1998 Min. :4.490
## Class :character 1st Qu.:2004 1st Qu.:5.588
## Mode :character Median :2011 Median :6.060
## Mean :2011 Mean :6.224
## 3rd Qu.:2018 3rd Qu.:6.973
## Max. :2024 Max. :8.898
arauca2 <- datos_largos2 %>% filter(Lugar == "Arauca")
summary(arauca2)
## Lugar Año Tasa
## Length:27 Min. :1998 Min. : 3.689
## Class :character 1st Qu.:2004 1st Qu.: 7.246
## Mode :character Median :2011 Median : 9.191
## Mean :2011 Mean : 9.470
## 3rd Qu.:2018 3rd Qu.:10.818
## Max. :2024 Max. :14.660
atlantico2 <- datos_largos2 %>% filter(Lugar == "Atlántico")
summary(atlantico2)
## Lugar Año Tasa
## Length:27 Min. :1998 Min. : 5.071
## Class :character 1st Qu.:2004 1st Qu.: 6.731
## Mode :character Median :2011 Median : 7.924
## Mean :2011 Mean : 8.302
## 3rd Qu.:2018 3rd Qu.:10.194
## Max. :2024 Max. :12.465
bogota2 <- datos_largos2 %>% filter(Lugar == "Bogotá")
summary(bogota2)
## Lugar Año Tasa
## Length:27 Min. :1998 Min. :5.228
## Class :character 1st Qu.:2004 1st Qu.:5.889
## Mode :character Median :2011 Median :6.481
## Mean :2011 Mean :6.574
## 3rd Qu.:2018 3rd Qu.:6.941
## Max. :2024 Max. :8.616
Norte_Santander2 <- datos_largos2 %>% filter(Lugar == "Norte de Santander")
summary(Norte_Santander2)
## Lugar Año Tasa
## Length:27 Min. :1998 Min. : 5.648
## Class :character 1st Qu.:2004 1st Qu.: 6.857
## Mode :character Median :2011 Median : 8.158
## Mean :2011 Mean : 8.241
## 3rd Qu.:2018 3rd Qu.: 9.732
## Max. :2024 Max. :12.069
Santander2 <- datos_largos2 %>% filter(Lugar == "Santander")
summary(Santander2)
## Lugar Año Tasa
## Length:27 Min. :1998 Min. : 4.480
## Class :character 1st Qu.:2004 1st Qu.: 6.776
## Mode :character Median :2011 Median : 7.372
## Mean :2011 Mean : 7.406
## 3rd Qu.:2018 3rd Qu.: 7.876
## Max. :2024 Max. :10.601
valle2 <- datos_largos2 %>% filter(Lugar == "Valle del Cauca")
summary(valle2)
## Lugar Año Tasa
## Length:27 Min. :1998 Min. : 7.406
## Class :character 1st Qu.:2004 1st Qu.: 8.271
## Mode :character Median :2011 Median : 8.591
## Mean :2011 Mean : 8.891
## 3rd Qu.:2018 3rd Qu.: 9.304
## Max. :2024 Max. :10.815
library(readxl)
library(tidyverse)
library(forecast)
library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
library(Metrics)
library(ggfortify)
## Warning: package 'ggfortify' was built under R version 4.3.3
## Registered S3 methods overwritten by 'ggfortify':
## method from
## autoplot.Arima forecast
## autoplot.acf forecast
## autoplot.ar forecast
## autoplot.bats forecast
## autoplot.decomposed.ts forecast
## autoplot.ets forecast
## autoplot.forecast forecast
## autoplot.stl forecast
## autoplot.ts forecast
## fitted.ar forecast
## fortify.ts forecast
## residuals.ar forecast
# Leer datos
data <- Datos2 #FUENTE DANE
# Transformar a formato largo
data_long <- data %>%
pivot_longer(cols = -Lugar, names_to = "Año", values_to = "Tasa") %>%
mutate(Año = as.integer(Año)) %>%
filter(Lugar %in% c("Nacional", "Bogotá", "Valle del Cauca", "Antioquia",
"Arauca", "Atlántico", "Santander", "Norte de Santander"))
# Definir función para análisis, modelado y evaluación por ciudad
analizar_modelos <- function(df, lugar) {
mensaje <- paste0("📊 Procesando: ", lugar)
print(mensaje)
serie <- df %>% filter(Lugar == lugar) %>% arrange(Año)
ts_total <- ts(serie$Tasa, start = min(serie$Año), frequency = 1)
# Análisis exploratorio
autoplot(ts_total) +
labs(title = paste("Tasa de Mortalidad -", lugar),
x = "Año", y = "Tasa") +
theme_minimal()
# Estacionariedad
print(adf.test(ts_total)) # Dickey-Fuller
# Entrenamiento (1998-2015) y Validación (2016-2019)
train <- window(ts_total, end = 2015)
valid <- window(ts_total, start = 2016, end = 2019)
# Años para predecir (solo los que pide la usuaria)
años_futuros <- c(2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031)
h_futuro <- max(años_futuros) - 2015
# ---- ARIMA
modelo_arima <- auto.arima(train)
pred_arima <- forecast(modelo_arima, h = h_futuro, level = 95)
# ---- ETS
modelo_ets <- ets(train)
pred_ets <- forecast(modelo_ets, h = h_futuro, level = 95)
# Subconjunto de predicciones solo para los años solicitados
idx_pred <- (años_futuros - 2015)
pred_arima_df <- data.frame(
Año = años_futuros,
Pred = pred_arima$mean[idx_pred],
Lower = pred_arima$lower[idx_pred],
Upper = pred_arima$upper[idx_pred],
Modelo = "ARIMA"
)
pred_ets_df <- data.frame(
Año = años_futuros,
Pred = pred_ets$mean[idx_pred],
Lower = pred_ets$lower[idx_pred],
Upper = pred_ets$upper[idx_pred],
Modelo = "ETS"
)
pred_df <- bind_rows(pred_arima_df, pred_ets_df)
# Evaluación en set de validación
arima_valid <- forecast(modelo_arima, h = length(valid))
ets_valid <- forecast(modelo_ets, h = length(valid))
errores <- tibble(
Lugar = lugar,
Modelo = c("ARIMA", "ETS"),
MAE = c(mae(valid, arima_valid$mean), mae(valid, ets_valid$mean)),
RMSE = c(rmse(valid, arima_valid$mean), rmse(valid, ets_valid$mean)),
MAPE = c(mape(valid, arima_valid$mean)*100, mape(valid, ets_valid$mean)*100)
)
# Visualización
# Combinar serie original con predicciones
observado_df <- serie %>%
select(Año, Tasa) %>%
mutate(Modelo = "Observado")
# Crear gráfico combinado
print(
ggplot() +
geom_line(data = observado_df, aes(x = Año, y = Tasa, color = Modelo), size = 1.2) +
geom_line(data = pred_df, aes(x = Año, y = Pred, color = Modelo), size = 1.2) +
geom_ribbon(data = pred_df, aes(x = Año, ymin = Lower, ymax = Upper, fill = Modelo),
alpha = 0.2, linetype = "dashed") +
scale_color_manual(values = c("Observado" = "black", "ARIMA" = "#0072B2", "ETS" = "#56B4E9")) +
scale_fill_manual(values = c("ARIMA" = "#0072B2", "ETS" = "#56B4E9")) +
labs(title = paste("Tasa de Mortalidad CCU-", lugar),
x = "Año", y = "Tasa de Mortalidad",
color = "Modelo", fill = "Modelo") +
theme_minimal()
)
return(list(errores = errores, predicciones = pred_df))
}
# Lista completa con ambos outputs
resultados_completos <- map(unique(data_long$Lugar), ~analizar_modelos(data_long, .x))
## [1] "📊 Procesando: Nacional"
##
## Augmented Dickey-Fuller Test
##
## data: ts_total
## Dickey-Fuller = -0.91862, Lag order = 2, p-value = 0.9329
## alternative hypothesis: stationary
## [1] "📊 Procesando: Antioquia"
##
## Augmented Dickey-Fuller Test
##
## data: ts_total
## Dickey-Fuller = -1.3938, Lag order = 2, p-value = 0.8039
## alternative hypothesis: stationary
## [1] "📊 Procesando: Atlántico"
##
## Augmented Dickey-Fuller Test
##
## data: ts_total
## Dickey-Fuller = -1.7053, Lag order = 2, p-value = 0.6849
## alternative hypothesis: stationary
## [1] "📊 Procesando: Bogotá"
## Warning in adf.test(ts_total): p-value greater than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: ts_total
## Dickey-Fuller = 0.011307, Lag order = 2, p-value = 0.99
## alternative hypothesis: stationary
## [1] "📊 Procesando: Norte de Santander"
##
## Augmented Dickey-Fuller Test
##
## data: ts_total
## Dickey-Fuller = -1.4172, Lag order = 2, p-value = 0.7949
## alternative hypothesis: stationary
## [1] "📊 Procesando: Santander"
##
## Augmented Dickey-Fuller Test
##
## data: ts_total
## Dickey-Fuller = -1.8159, Lag order = 2, p-value = 0.6427
## alternative hypothesis: stationary
## [1] "📊 Procesando: Valle del Cauca"
##
## Augmented Dickey-Fuller Test
##
## data: ts_total
## Dickey-Fuller = -2.4129, Lag order = 2, p-value = 0.4148
## alternative hypothesis: stationary
## [1] "📊 Procesando: Arauca"
##
## Augmented Dickey-Fuller Test
##
## data: ts_total
## Dickey-Fuller = -3.1504, Lag order = 2, p-value = 0.1333
## alternative hypothesis: stationary
# Extraer y combinar errores
errores_df <- map_dfr(resultados_completos, "errores")
# Extraer y combinar predicciones con el nombre del lugar
lugares <- unique(data_long$Lugar)
predicciones_df <- map2_dfr(resultados_completos, lugares,
~mutate(.x$predicciones, Lugar = .y))
# Mostrar resultados
print(errores_df)
## # A tibble: 16 × 5
## Lugar Modelo MAE RMSE MAPE
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Nacional ARIMA 0.217 0.251 3.02
## 2 Nacional ETS 0.223 0.257 3.11
## 3 Antioquia ARIMA 0.656 0.664 13.0
## 4 Antioquia ETS 0.512 0.669 9.01
## 5 Atlántico ARIMA 3.31 3.52 31.0
## 6 Atlántico ETS 3.31 3.52 31.0
## 7 Bogotá ARIMA 0.632 0.794 9.94
## 8 Bogotá ETS 0.522 0.674 8.33
## 9 Norte de Santander ARIMA 2.07 2.34 24.1
## 10 Norte de Santander ETS 1.93 2.23 22.4
## 11 Santander ARIMA 0.743 0.960 12.6
## 12 Santander ETS 0.438 0.699 7.72
## 13 Valle del Cauca ARIMA 1.01 1.11 12.7
## 14 Valle del Cauca ETS 0.741 0.876 9.42
## 15 Arauca ARIMA 1.58 2.12 13.3
## 16 Arauca ETS 1.58 2.22 13.0
print(predicciones_df %>% filter(Año %in% 2020:2030))
## Año Pred Lower Upper Modelo Lugar
## 1 2020 6.892015 5.54947952 8.234550 ARIMA Nacional
## 2 2021 6.892015 5.42134112 8.362688 ARIMA Nacional
## 3 2022 6.892015 5.30350569 8.480523 ARIMA Nacional
## 4 2023 6.892015 5.19382715 8.590202 ARIMA Nacional
## 5 2024 6.892015 5.09081481 8.693214 ARIMA Nacional
## 6 2025 6.892015 4.99338332 8.790646 ARIMA Nacional
## 7 2026 6.892015 4.90071332 8.883316 ARIMA Nacional
## 8 2027 6.892015 4.81216824 8.971861 ARIMA Nacional
## 9 2028 6.892015 4.72724188 9.056787 ARIMA Nacional
## 10 2029 6.892015 4.64552378 9.138505 ARIMA Nacional
## 11 2030 6.892015 4.56667569 9.217353 ARIMA Nacional
## 12 2020 6.885830 5.81207479 7.959586 ETS Nacional
## 13 2021 6.885830 5.72289783 8.048763 ETS Nacional
## 14 2022 6.885830 5.64008836 8.131572 ETS Nacional
## 15 2023 6.885830 5.56245053 8.209210 ETS Nacional
## 16 2024 6.885830 5.48912164 8.282539 ETS Nacional
## 17 2025 6.885830 5.41945514 8.352205 ETS Nacional
## 18 2026 6.885830 5.35295158 8.418709 ETS Nacional
## 19 2027 6.885830 5.28921569 8.482445 ETS Nacional
## 20 2028 6.885830 5.22792824 8.543732 ETS Nacional
## 21 2029 6.885830 5.16882701 8.602833 ETS Nacional
## 22 2030 6.885830 5.11169352 8.659967 ETS Nacional
## 23 2020 5.180271 3.19196669 7.168574 ARIMA Antioquia
## 24 2021 5.140299 3.01417532 7.266423 ARIMA Antioquia
## 25 2022 5.164161 2.88895250 7.439370 ARIMA Antioquia
## 26 2023 5.149916 2.74601045 7.553822 ARIMA Antioquia
## 27 2024 5.158420 2.62605013 7.690791 ARIMA Antioquia
## 28 2025 5.153343 2.50233183 7.804355 ARIMA Antioquia
## 29 2026 5.156374 2.38974516 7.923003 ARIMA Antioquia
## 30 2027 5.154565 2.27814590 8.030984 ARIMA Antioquia
## 31 2028 5.155645 2.17279315 8.138497 ARIMA Antioquia
## 32 2029 5.155000 2.06977840 8.240222 ARIMA Antioquia
## 33 2030 5.155385 1.97085498 8.339915 ARIMA Antioquia
## 34 2020 4.267085 3.63320973 4.900961 ETS Antioquia
## 35 2021 4.088578 3.48105442 4.696102 ETS Antioquia
## 36 2022 3.910071 3.32883464 4.491307 ETS Antioquia
## 37 2023 3.731564 3.17653541 4.286592 ETS Antioquia
## 38 2024 3.553057 3.02413933 4.081974 ETS Antioquia
## 39 2025 3.374550 2.87162602 3.877473 ETS Antioquia
## 40 2026 3.196042 2.71897129 3.673113 ETS Antioquia
## 41 2027 3.017535 2.56614609 3.468924 ETS Antioquia
## 42 2028 2.839028 2.41311511 3.264941 ETS Antioquia
## 43 2029 2.660521 2.25983489 3.061207 ETS Antioquia
## 44 2030 2.482014 2.10625134 2.857776 ETS Antioquia
## 45 2020 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 46 2021 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 47 2022 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 48 2023 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 49 2024 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 50 2025 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 51 2026 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 52 2027 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 53 2028 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 54 2029 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 55 2030 7.022771 4.73074453 9.314797 ARIMA Atlántico
## 56 2020 7.022829 4.66014504 9.385512 ETS Atlántico
## 57 2021 7.022829 4.66014503 9.385512 ETS Atlántico
## 58 2022 7.022829 4.66014501 9.385512 ETS Atlántico
## 59 2023 7.022829 4.66014500 9.385512 ETS Atlántico
## 60 2024 7.022829 4.66014499 9.385512 ETS Atlántico
## 61 2025 7.022829 4.66014498 9.385512 ETS Atlántico
## 62 2026 7.022829 4.66014496 9.385512 ETS Atlántico
## 63 2027 7.022829 4.66014495 9.385512 ETS Atlántico
## 64 2028 7.022829 4.66014494 9.385512 ETS Atlántico
## 65 2029 7.022829 4.66014493 9.385512 ETS Atlántico
## 66 2030 7.022829 4.66014492 9.385512 ETS Atlántico
## 67 2020 5.464074 2.78192963 8.146219 ARIMA Bogotá
## 68 2021 5.464074 2.52593204 8.402216 ARIMA Bogotá
## 69 2022 5.464074 2.29051796 8.637630 ARIMA Bogotá
## 70 2023 5.464074 2.07139988 8.856748 ARIMA Bogotá
## 71 2024 5.464074 1.86559968 9.062549 ARIMA Bogotá
## 72 2025 5.464074 1.67094901 9.257199 ARIMA Bogotá
## 73 2026 5.464074 1.48581094 9.442337 ARIMA Bogotá
## 74 2027 5.464074 1.30891374 9.619234 ARIMA Bogotá
## 75 2028 5.464074 1.13924608 9.788902 ARIMA Bogotá
## 76 2029 5.464074 0.97598796 9.952160 ARIMA Bogotá
## 77 2030 5.464074 0.81846359 10.109685 ARIMA Bogotá
## 78 2020 5.683648 4.55748455 6.809812 ETS Bogotá
## 79 2021 5.683648 4.49978098 6.867516 ETS Bogotá
## 80 2022 5.683648 4.44470495 6.922592 ETS Bogotá
## 81 2023 5.683648 4.39192028 6.975376 ETS Bogotá
## 82 2024 5.683648 4.34115660 7.026140 ETS Bogotá
## 83 2025 5.683648 4.29219264 7.075104 ETS Bogotá
## 84 2026 5.683648 4.24484461 7.122452 ETS Bogotá
## 85 2027 5.683648 4.19895784 7.168339 ETS Bogotá
## 86 2028 5.683648 4.15440073 7.212896 ETS Bogotá
## 87 2029 5.683648 4.11106022 7.256236 ETS Bogotá
## 88 2030 5.683648 4.06883830 7.298458 ETS Bogotá
## 89 2020 6.058293 0.81395450 11.302632 ARIMA Norte de Santander
## 90 2021 6.082219 0.46208161 11.702357 ARIMA Norte de Santander
## 91 2022 6.068489 0.05528556 12.081693 ARIMA Norte de Santander
## 92 2023 6.076368 -0.28341300 12.436149 ARIMA Norte de Santander
## 93 2024 6.071847 -0.62868631 12.772380 ARIMA Norte de Santander
## 94 2025 6.074441 -0.94368266 13.092565 ARIMA Norte de Santander
## 95 2026 6.072952 -1.25265104 13.398556 ARIMA Norte de Santander
## 96 2027 6.073807 -1.54486352 13.692477 ARIMA Norte de Santander
## 97 2028 6.073317 -1.82867253 13.975306 ARIMA Norte de Santander
## 98 2029 6.073598 -2.10127874 14.248474 ARIMA Norte de Santander
## 99 2030 6.073436 -2.36585196 14.512725 ARIMA Norte de Santander
## 100 2020 6.189644 2.59306422 9.786224 ETS Norte de Santander
## 101 2021 6.189644 2.35499546 10.024293 ETS Norte de Santander
## 102 2022 6.189644 2.12845929 10.250829 ETS Norte de Santander
## 103 2023 6.189644 1.91159801 10.467690 ETS Norte de Santander
## 104 2024 6.189644 1.70298415 10.676304 ETS Norte de Santander
## 105 2025 6.189644 1.50149305 10.877795 ETS Norte de Santander
## 106 2026 6.189644 1.30622010 11.073068 ETS Norte de Santander
## 107 2027 6.189644 1.11642497 11.262863 ETS Norte de Santander
## 108 2028 6.189644 0.93149276 11.447795 ETS Norte de Santander
## 109 2029 6.189644 0.75090618 11.628382 ETS Norte de Santander
## 110 2030 6.189644 0.57422518 11.805063 ETS Norte de Santander
## 111 2020 7.204415 0.50750000 13.901331 ARIMA Santander
## 112 2021 7.204415 -0.13168786 14.540519 ARIMA Santander
## 113 2022 7.204415 -0.71948177 15.128313 ARIMA Santander
## 114 2023 7.204415 -1.26658700 15.675418 ARIMA Santander
## 115 2024 7.204415 -1.78043946 16.189270 ARIMA Santander
## 116 2025 7.204415 -2.26645321 16.675284 ARIMA Santander
## 117 2026 7.204415 -2.72871540 17.137546 ARIMA Santander
## 118 2027 7.204415 -3.17040136 17.579232 ARIMA Santander
## 119 2028 7.204415 -3.59403625 18.002867 ARIMA Santander
## 120 2029 7.204415 -4.00166747 18.410498 ARIMA Santander
## 121 2030 7.204415 -4.39498237 18.803813 ARIMA Santander
## 122 2020 6.805061 3.36284736 10.247275 ETS Santander
## 123 2021 6.805061 3.21203740 10.398085 ETS Santander
## 124 2022 6.805061 3.06730735 10.542815 ETS Santander
## 125 2023 6.805061 2.92797624 10.682146 ETS Santander
## 126 2024 6.805061 2.79348151 10.816641 ETS Santander
## 127 2025 6.805061 2.66335195 10.946771 ETS Santander
## 128 2026 6.805061 2.53718826 11.072934 ETS Santander
## 129 2027 6.805061 2.41464854 11.195474 ETS Santander
## 130 2028 6.805061 2.29543736 11.314685 ETS Santander
## 131 2029 6.805061 2.17929737 11.430825 ETS Santander
## 132 2030 6.805061 2.06600276 11.544120 ETS Santander
## 133 2020 9.205424 5.51921328 12.891634 ARIMA Valle del Cauca
## 134 2021 9.205424 5.16738251 13.243465 ARIMA Valle del Cauca
## 135 2022 9.205424 4.84384073 13.567006 ARIMA Valle del Cauca
## 136 2023 9.205424 4.54269538 13.868152 ARIMA Valle del Cauca
## 137 2024 9.205424 4.25985348 14.150994 ARIMA Valle del Cauca
## 138 2025 9.205424 3.99233496 14.418512 ARIMA Valle del Cauca
## 139 2026 9.205424 3.73789011 14.672957 ARIMA Valle del Cauca
## 140 2027 9.205424 3.49477112 14.916076 ARIMA Valle del Cauca
## 141 2028 9.205424 3.26158805 15.149259 ARIMA Valle del Cauca
## 142 2029 9.205424 3.03721394 15.373633 ARIMA Valle del Cauca
## 143 2030 9.205424 2.82072003 15.590127 ARIMA Valle del Cauca
## 144 2020 8.933744 6.74547285 11.122014 ETS Valle del Cauca
## 145 2021 8.933744 6.59398259 11.273504 ETS Valle del Cauca
## 146 2022 8.933744 6.45141699 11.416070 ETS Valle del Cauca
## 147 2023 8.933744 6.31631669 11.551170 ETS Valle del Cauca
## 148 2024 8.933744 6.18757907 11.679908 ETS Valle del Cauca
## 149 2025 8.933744 6.06434701 11.803140 ETS Valle del Cauca
## 150 2026 8.933744 5.94593866 11.921548 ETS Valle del Cauca
## 151 2027 8.933744 5.83180102 12.035686 ETS Valle del Cauca
## 152 2028 8.933744 5.72147830 12.146009 ETS Valle del Cauca
## 153 2029 8.933744 5.61458957 12.252897 ETS Valle del Cauca
## 154 2030 8.933744 5.51081260 12.356674 ETS Valle del Cauca
## 155 2020 9.673201 3.51534554 15.831057 ARIMA Arauca
## 156 2021 9.673201 3.51534554 15.831057 ARIMA Arauca
## 157 2022 9.673201 3.51534554 15.831057 ARIMA Arauca
## 158 2023 9.673201 3.51534554 15.831057 ARIMA Arauca
## 159 2024 9.673201 3.51534554 15.831057 ARIMA Arauca
## 160 2025 9.673201 3.51534554 15.831057 ARIMA Arauca
## 161 2026 9.673201 3.51534554 15.831057 ARIMA Arauca
## 162 2027 9.673201 3.51534554 15.831057 ARIMA Arauca
## 163 2028 9.673201 3.51534554 15.831057 ARIMA Arauca
## 164 2029 9.673201 3.51534554 15.831057 ARIMA Arauca
## 165 2030 9.673201 3.51534554 15.831057 ARIMA Arauca
## 166 2020 9.461260 3.09826885 15.824252 ETS Arauca
## 167 2021 9.461260 3.09826882 15.824252 ETS Arauca
## 168 2022 9.461260 3.09826879 15.824252 ETS Arauca
## 169 2023 9.461260 3.09826876 15.824252 ETS Arauca
## 170 2024 9.461260 3.09826873 15.824252 ETS Arauca
## 171 2025 9.461260 3.09826869 15.824252 ETS Arauca
## 172 2026 9.461260 3.09826866 15.824252 ETS Arauca
## 173 2027 9.461260 3.09826863 15.824252 ETS Arauca
## 174 2028 9.461260 3.09826860 15.824252 ETS Arauca
## 175 2029 9.461260 3.09826857 15.824252 ETS Arauca
## 176 2030 9.461260 3.09826853 15.824252 ETS Arauca
Con relacion al Test Dickey-Fuller para la tasa nacional (hipotesis nula la serie no es estacionaria) dado que el p-valor es mucho mayor (0.9074) al umbral usual de significancia (0.05) no se rechaza la hipótesis nula, es decir no es estacionaria. No se puede usar ARIMA a menos que se transforme diferenciando la serie. Solo Arauca es estacionaria.
# Extraer la serie para un lugar específico, por ejemplo "Bogotá"
serie_bogota <- data_long %>%
filter(Lugar == "Bogotá") %>%
arrange(Año)
# Crear objeto ts fuera de la función
ts_total <- ts(serie_bogota$Tasa, start = min(serie_bogota$Año), frequency = 1)
# Diferenciar y aplicar prueba ADF
ts_diff <- diff(ts_total)
adf.test(ts_diff)
##
## Augmented Dickey-Fuller Test
##
## data: ts_diff
## Dickey-Fuller = -3.9116, Lag order = 2, p-value = 0.02774
## alternative hypothesis: stationary
#vuelve a ejecutar el test Dickey-Fuller para verificar si la diferencia sí la vuelve estacionaria
Este test se utiliza para evaluar si una serie temporal es estacionaria, es decir, si sus propiedades estadísticas (media, varianza, autocorrelación) no cambian con el tiempo. El p-valor es 0.02774, que es menor a 0.05, por tanto, se rechaza la hipótesis nula al 95% de confianza.Esto significa que la serie diferenciada sí es estacionaria para Bogotá cuando se hace una diferenciación.
library(ggplot2)
library(tibble)
# Crear data frame para graficar la serie diferenciada
df_diff <- tibble(
Año = time(ts_diff),
Diferencia = as.numeric(ts_diff)
)
# Gráfico de la serie diferenciada
ggplot(df_diff, aes(x = Año, y = Diferencia)) +
geom_line(color = "#0072B2", size = 1) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray40") +
labs(
title = "Serie Diferenciada (Cambio anual en la Tasa de Bogota)",
x = "Año",
y = "Diferencia (Tasa_t - Tasa_t-1)"
) +
theme_minimal()
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
library(forecast)
library(ggplot2)
library(tibble)
library(dplyr)
# 1. Crear la serie temporal original
serie <- data_long %>%
filter(Lugar == "Bogotá") %>% # Cambia "Bogotá" por el lugar deseado
arrange(Año)
ts_total <- ts(serie$Tasa, start = min(serie$Año), frequency = 1)
# 2. Aplicar diferenciación (opcional para visualización)
ts_diff <- diff(ts_total)
# 3. Ajustar modelo ARIMA con diferenciación automática (detecta d = 1)
modelo_arima <- auto.arima(ts_total)
# 4. Generar predicciones desde 2020 hasta 2030
año_inicio_pred <- 2020
año_fin_pred <- 2030
años_existentes <- time(ts_total)
año_último <- max(años_existentes)
h <- año_fin_pred - año_último
pred_arima <- forecast(modelo_arima, h = h, level = 95)
# 5. Crear data frame para graficar
pred_df <- tibble(
Año = (año_último + 1):(año_último + h),
Pred = as.numeric(pred_arima$mean),
Lower = as.numeric(pred_arima$lower),
Upper = as.numeric(pred_arima$upper)
)
# Observado
observado_df <- tibble(
Año = as.numeric(time(ts_total)),
Tasa = as.numeric(ts_total)
)
# 6. Gráfico
ggplot() +
geom_line(data = observado_df, aes(x = Año, y = Tasa), color = "black", size = 1.2) +
geom_line(data = pred_df, aes(x = Año, y = Pred), color = "#0072B2", size = 1.2) +
geom_ribbon(data = pred_df, aes(x = Año, ymin = Lower, ymax = Upper),
fill = "#0072B2", alpha = 0.2) +
labs(
title = "Predicción ARIMA de Tasa de Mortalidad (2020–2030)",
x = "Año",
y = "Tasa",
caption = "Modelo ajustado con auto.arima sobre serie diferenciada"
) +
theme_minimal()
# --- Crear data frame con predicciones
pred_df <- tibble(
Año = (año_último + 1):(año_último + h),
Pred = as.numeric(pred_arima$mean),
Lower = as.numeric(pred_arima$lower),
Upper = as.numeric(pred_arima$upper)
)
# --- Ver el data frame
print(pred_df)
## # A tibble: 6 × 4
## Año Pred Lower Upper
## <int> <dbl> <dbl> <dbl>
## 1 2025 7.78 6.38 9.19
## 2 2026 7.37 5.72 9.03
## 3 2027 7.11 5.37 8.86
## 4 2028 6.95 5.17 8.73
## 5 2029 6.85 5.06 8.64
## 6 2030 6.79 4.99 8.58