library(ggplot2)
library(dplyr)
library(broom)
library(ggpubr)
library(readr)
library(readxl)
Datos
accidentes <- read.csv("Accidentalidad_en_Barranquilla.csv", fileEncoding = "UTF-8-BOM")
accidentes$FECHA_ACCIDENTE <- as.POSIXct(accidentes$FECHA_ACCIDENTE, format="%d/%m/%Y %H:%M")
accidentes$MES_ACCIDENTE <- as.numeric(accidentes$MES_ACCIDENTE)
accidentes$AÑO_ACCIDENTE <- as.factor(accidentes$AÑO_ACCIDENTE)
accidentes$CANTIDAD_ACCIDENTES <- as.numeric(accidentes$CANTIDAD_ACCIDENTES)
summary(accidentes)
## FECHA_ACCIDENTE AÑO_ACCIDENTE MES_ACCIDENTE
## Min. :2015-01-01 12:00:00 2015:6237 Min. : 1.000
## 1st Qu.:2016-04-01 12:00:00 2016:6520 1st Qu.: 3.000
## Median :2017-06-04 12:00:00 2017:6389 Median : 6.000
## Mean :2017-06-26 09:45:41 2018:5898 Mean : 6.467
## 3rd Qu.:2018-09-10 12:00:00 2019:5645 3rd Qu.:10.000
## Max. :2020-12-02 12:00:00 2020: 853 Max. :12.000
## NA's :19255
## DIA_ACCIDENTE HORA_ACCIDENTE GRAVEDAD_ACCIDENTE CLASE_ACCIDENTE
## Length:31542 Length:31542 Length:31542 Length:31542
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## SITIO_EXACTO_ACCIDENTE CANT_HERIDOS_EN._SITIO_ACCIDENTE
## Length:31542 Min. : 1.000
## Class :character 1st Qu.: 1.000
## Mode :character Median : 1.000
## Mean : 1.438
## 3rd Qu.: 2.000
## Max. :22.000
## NA's :25652
## CANT_MUERTOS_EN._SITIO_ACCIDENTE CANTIDAD_ACCIDENTES
## Min. :1.000 Min. :1
## 1st Qu.:1.000 1st Qu.:1
## Median :1.000 Median :1
## Mean :1.031 Mean :1
## 3rd Qu.:1.000 3rd Qu.:1
## Max. :2.000 Max. :2
## NA's :31351
Independencia
cor_data <- accidentes %>%
select_if(is.numeric) %>%
na.omit()
cor(cor_data)
## Warning in cor(cor_data): La desviación estándar es cero
## MES_ACCIDENTE CANT_HERIDOS_EN._SITIO_ACCIDENTE
## MES_ACCIDENTE 1.00000000 0.18818646
## CANT_HERIDOS_EN._SITIO_ACCIDENTE 0.18818646 1.00000000
## CANT_MUERTOS_EN._SITIO_ACCIDENTE 0.02106369 -0.04510406
## CANTIDAD_ACCIDENTES NA NA
## CANT_MUERTOS_EN._SITIO_ACCIDENTE
## MES_ACCIDENTE 0.02106369
## CANT_HERIDOS_EN._SITIO_ACCIDENTE -0.04510406
## CANT_MUERTOS_EN._SITIO_ACCIDENTE 1.00000000
## CANTIDAD_ACCIDENTES NA
## CANTIDAD_ACCIDENTES
## MES_ACCIDENTE NA
## CANT_HERIDOS_EN._SITIO_ACCIDENTE NA
## CANT_MUERTOS_EN._SITIO_ACCIDENTE NA
## CANTIDAD_ACCIDENTES 1
Cantidad Total de Accidentes por Año
accidentes_por_año <- accidentes %>%
group_by(AÑO_ACCIDENTE) %>%
summarise(TOTAL_ACCIDENTES = sum(CANTIDAD_ACCIDENTES, na.rm = TRUE))
ggplot(accidentes_por_año, aes(x = AÑO_ACCIDENTE, y = TOTAL_ACCIDENTES)) +
geom_col(fill = "steelblue") +
labs(title = "Cantidad Total de Accidentes por Año",
x = "Año",
y = "Total de Accidentes") +
theme_minimal()
Linealidad
pairs(~ CANTIDAD_ACCIDENTES + MES_ACCIDENTE, data = accidentes)
plot(CANTIDAD_ACCIDENTES ~ MES_ACCIDENTE, data=accidentes)
Modelo
modelo.lm <- lm(CANTIDAD_ACCIDENTES ~ MES_ACCIDENTE + AÑO_ACCIDENTE, data = accidentes)
summary(modelo.lm)
##
## Call:
## lm(formula = CANTIDAD_ACCIDENTES ~ MES_ACCIDENTE + AÑO_ACCIDENTE,
## data = accidentes)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.00118 -0.00024 -0.00019 -0.00014 0.99984
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.000e+00 2.513e-04 3980.205 <2e-16 ***
## MES_ACCIDENTE 1.324e-05 2.481e-05 0.534 0.5936
## AÑO_ACCIDENTE2016 -1.669e-04 2.638e-04 -0.633 0.5270
## AÑO_ACCIDENTE2017 -1.625e-04 2.652e-04 -0.613 0.5401
## AÑO_ACCIDENTE2018 -1.496e-04 2.706e-04 -0.553 0.5804
## AÑO_ACCIDENTE2019 -1.411e-04 2.737e-04 -0.515 0.6062
## AÑO_ACCIDENTE2020 9.201e-04 5.587e-04 1.647 0.0996 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0149 on 31535 degrees of freedom
## Multiple R-squared: 0.00014, Adjusted R-squared: -5.021e-05
## F-statistic: 0.7361 on 6 and 31535 DF, p-value: 0.6205
Homocedasticidad
par(mfrow=c(2,2))
plot(modelo.lm)
par(mfrow=c(1,1))
Gráfico del Modelo
plotting.data <- expand.grid(
MES_ACCIDENTE = seq(min(accidentes$MES_ACCIDENTE), max(accidentes$MES_ACCIDENTE), length.out = 12),
AÑO_ACCIDENTE = levels(accidentes$AÑO_ACCIDENTE)
)
plotting.data$predicted.y <- predict(modelo.lm, newdata = plotting.data)
ggplot(accidentes, aes(x = MES_ACCIDENTE, y = CANTIDAD_ACCIDENTES)) +
geom_point(alpha = 0.5) +
geom_line(data = plotting.data, aes(x = MES_ACCIDENTE, y = predicted.y, color = AÑO_ACCIDENTE), size = 1.2) +
theme_minimal() +
labs(title = "Modelo de Regresión Lineal Múltiple",
x = "Mes del Accidente",
y = "Cantidad de Accidentes",
color = "Año")
## 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.
Tipo de Regresión Utilizado Para este análisis se ha seleccionado una regresión lineal múltiple. Esta decisión se basa en que la variable dependiente de interés, CANTIDAD_ACCIDENTES, es cuantitativa continua, y se desea explicar su comportamiento a partir de varias variables independientes o explicativas.
Las variables utilizadas como predictoras en el modelo fueron:
MES_ACCIDENTE: variable numérica que representa el mes del año en que ocurrió el accidente.
AÑO_ACCIDENTE: tratada como variable categórica, permite observar diferencias entre años (incluyendo efectos como la pandemia en 2020).
CLASE_ACCIDENTE y GRAVEDAD_ACCIDENTE: ambas categóricas, nos permiten incluir la naturaleza y severidad del accidente.
Este tipo de regresión nos permite analizar cómo cada una de estas variables (de forma simultánea) influye en la cantidad total de accidentes reportados, identificando patrones que no se observarían si se analizaran las variables de forma individual.
La elección del modelo de regresión lineal múltiple cumple con los requisitos del proyecto porque:
Permite modelar múltiples variables explicativas.
Facilita la interpretación de los efectos individuales controlando por el resto.
Es coherente con la estructura de los datos disponibles.
Los resultados son interpretables y útiles para diseñar políticas públicas.