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.

4. Análisis

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.