1. Introducción

Este informe aplica un modelo de regresión múltiple a datos sobre accidentes en Barranquilla, con el objetivo de identificar qué factores numéricos están asociados a la cantidad de accidentes.

2. Carga de Librerías y Datos

# Librerías necesarias
library(tidyverse)
library(car)
library(corrplot)

# Leer el archivo CSV (ajusta si el archivo está en otra ruta)
datos <- read.csv("Accidentalidad_en_Barranquilla.csv", encoding = "UTF-8")
# Instalar (si no tienes) y cargar librerías útiles
if (!require("skimr")) install.packages("skimr")
if (!require("DT")) install.packages("DT")

library(skimr)
library(DT)

# 1. Vista general del conjunto de datos
skim(datos)
Data summary
Name datos
Number of rows 31542
Number of columns 11
_______________________
Column type frequency:
character 6
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
FECHA_ACCIDENTE 0 1 22 22 0 1886 0
DIA_ACCIDENTE 0 1 3 3 0 7 0
HORA_ACCIDENTE 0 1 11 11 0 871 0
GRAVEDAD_ACCIDENTE 0 1 10 11 0 3 0
CLASE_ACCIDENTE 0 1 4 14 0 6 0
SITIO_EXACTO_ACCIDENTE 0 1 0 64 1 17398 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
AÑO_ACCIDENTE 0 1.00 2017.02 1.46 2015 2016 2017 2018 2020 ▇▅▃▃▁
MES_ACCIDENTE 0 1.00 6.47 3.48 1 3 6 10 12 ▇▅▅▅▇
CANT_HERIDOS_EN._SITIO_ACCIDENTE 25652 0.19 1.44 1.07 1 1 1 2 22 ▇▁▁▁▁
CANT_MUERTOS_EN._SITIO_ACCIDENTE 31351 0.01 1.03 0.17 1 1 1 1 2 ▇▁▁▁▁
CANTIDAD_ACCIDENTES 0 1.00 1.00 0.01 1 1 1 1 2 ▇▁▁▁▁
# 2. Tabla interactiva para explorar los datos fácilmente
datatable(head(datos, 100), 
          options = list(pageLength = 10), 
          caption = "Vista previa de los primeros 100 registros")
# 3. Ver cuántos valores faltan por columna
colSums(is.na(datos))
##                  FECHA_ACCIDENTE                    AÑO_ACCIDENTE 
##                                0                                0 
##                    MES_ACCIDENTE                    DIA_ACCIDENTE 
##                                0                                0 
##                   HORA_ACCIDENTE               GRAVEDAD_ACCIDENTE 
##                                0                                0 
##                  CLASE_ACCIDENTE           SITIO_EXACTO_ACCIDENTE 
##                                0                                0 
## CANT_HERIDOS_EN._SITIO_ACCIDENTE CANT_MUERTOS_EN._SITIO_ACCIDENTE 
##                            25652                            31351 
##              CANTIDAD_ACCIDENTES 
##                                0
# Ver nombres de columnas
colnames(datos)
##  [1] "FECHA_ACCIDENTE"                  "AÑO_ACCIDENTE"                   
##  [3] "MES_ACCIDENTE"                    "DIA_ACCIDENTE"                   
##  [5] "HORA_ACCIDENTE"                   "GRAVEDAD_ACCIDENTE"              
##  [7] "CLASE_ACCIDENTE"                  "SITIO_EXACTO_ACCIDENTE"          
##  [9] "CANT_HERIDOS_EN._SITIO_ACCIDENTE" "CANT_MUERTOS_EN._SITIO_ACCIDENTE"
## [11] "CANTIDAD_ACCIDENTES"
# Ver estructura general
glimpse(datos)
## Rows: 31,542
## Columns: 11
## $ FECHA_ACCIDENTE                  <chr> "01/01/2015 12:00:00 AM", "01/01/2015…
## $ AÑO_ACCIDENTE                    <int> 2015, 2015, 2015, 2015, 2015, 2015, 2…
## $ MES_ACCIDENTE                    <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ DIA_ACCIDENTE                    <chr> "Jue", "Jue", "Jue", "Jue", "Jue", "J…
## $ HORA_ACCIDENTE                   <chr> "02:10:00:PM", "02:15:00:PM", "02:20:…
## $ GRAVEDAD_ACCIDENTE               <chr> "Con heridos", "Solo daños", "Solo da…
## $ CLASE_ACCIDENTE                  <chr> "Choque", "Choque", "Choque", "Choque…
## $ SITIO_EXACTO_ACCIDENTE           <chr> "VIA 40 CON 77", "CALLE 14 CR 13", "C…
## $ CANT_HERIDOS_EN._SITIO_ACCIDENTE <int> 1, NA, NA, 2, NA, 2, 1, NA, NA, NA, N…
## $ CANT_MUERTOS_EN._SITIO_ACCIDENTE <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ CANTIDAD_ACCIDENTES              <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…

3. Limpieza de Datos

# Normalizar los nombres de columnas
names(datos) <- make.names(names(datos))

# Verifica los nombres corregidos
print(names(datos))
##  [1] "FECHA_ACCIDENTE"                  "AÑO_ACCIDENTE"                   
##  [3] "MES_ACCIDENTE"                    "DIA_ACCIDENTE"                   
##  [5] "HORA_ACCIDENTE"                   "GRAVEDAD_ACCIDENTE"              
##  [7] "CLASE_ACCIDENTE"                  "SITIO_EXACTO_ACCIDENTE"          
##  [9] "CANT_HERIDOS_EN._SITIO_ACCIDENTE" "CANT_MUERTOS_EN._SITIO_ACCIDENTE"
## [11] "CANTIDAD_ACCIDENTES"
# Seleccionar columnas relevantes y omitir NA
datos_numericos <- datos %>%
  select(CANT_HERIDOS_EN._SITIO_ACCIDENTE,
         CANT_MUERTOS_EN._SITIO_ACCIDENTE,
         CANTIDAD_ACCIDENTES) %>%
  na.omit()

# Ver resumen
summary(datos_numericos)
##  CANT_HERIDOS_EN._SITIO_ACCIDENTE CANT_MUERTOS_EN._SITIO_ACCIDENTE
##  Min.   : 1.000                   Min.   :1.000                   
##  1st Qu.: 1.000                   1st Qu.:1.000                   
##  Median : 1.000                   Median :1.000                   
##  Mean   : 1.706                   Mean   :1.044                   
##  3rd Qu.: 2.000                   3rd Qu.:1.000                   
##  Max.   :12.000                   Max.   :2.000                   
##  CANTIDAD_ACCIDENTES
##  Min.   :1          
##  1st Qu.:1          
##  Median :1          
##  Mean   :1          
##  3rd Qu.:1          
##  Max.   :1

4. Matriz de Correlación

# Correlación
correlaciones <- cor(datos_numericos);correlaciones
##                                  CANT_HERIDOS_EN._SITIO_ACCIDENTE
## CANT_HERIDOS_EN._SITIO_ACCIDENTE                       1.00000000
## CANT_MUERTOS_EN._SITIO_ACCIDENTE                      -0.04510406
## CANTIDAD_ACCIDENTES                                            NA
##                                  CANT_MUERTOS_EN._SITIO_ACCIDENTE
## CANT_HERIDOS_EN._SITIO_ACCIDENTE                      -0.04510406
## CANT_MUERTOS_EN._SITIO_ACCIDENTE                       1.00000000
## CANTIDAD_ACCIDENTES                                            NA
##                                  CANTIDAD_ACCIDENTES
## CANT_HERIDOS_EN._SITIO_ACCIDENTE                  NA
## CANT_MUERTOS_EN._SITIO_ACCIDENTE                  NA
## CANTIDAD_ACCIDENTES                                1
corrplot(correlaciones, method = "color", type = "upper", tl.cex = 0.9)

5. Modelo de Regresión Múltiple

# Ajustar modelo de regresión
modelo <- lm(CANTIDAD_ACCIDENTES ~ ., data = datos_numericos)

# Ver resumen
summary(modelo)
## 
## Call:
## lm(formula = CANTIDAD_ACCIDENTES ~ ., data = datos_numericos)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -3.265e-17 -3.265e-17 -3.265e-17 -2.645e-17  1.798e-15 
## 
## Coefficients:
##                                    Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)                       1.000e+00  1.451e-16  6.89e+15   <2e-16 ***
## CANT_HERIDOS_EN._SITIO_ACCIDENTE -6.196e-18  1.540e-17 -4.02e-01    0.689    
## CANT_MUERTOS_EN._SITIO_ACCIDENTE -3.058e-17  1.330e-16 -2.30e-01    0.819    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.251e-16 on 65 degrees of freedom
## Multiple R-squared:  0.4893, Adjusted R-squared:  0.4736 
## F-statistic: 31.14 on 2 and 65 DF,  p-value: 3.267e-10

Evaluación de Multicolinealidad

# Verificar VIF
vif(modelo)
## CANT_HERIDOS_EN._SITIO_ACCIDENTE CANT_MUERTOS_EN._SITIO_ACCIDENTE 
##                         1.002039                         1.002039

6. Evaluación de Supuestos del Modelo

# Diagnósticos gráficos
par(mfrow = c(2, 2))
plot(modelo)

7. Conclusiones