1. Carga de datos

# Se Cargaron las librerías necesarias
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(lubridate)
library(broom)

# Se Cargaron los datos
datos <- read.csv("idh_colombia.csv", stringsAsFactors = FALSE)

2. Exploración y limpieza de datos

# Ver estructura
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…
datos <- read.csv("idh_colombia.csv", stringsAsFactors = FALSE)

# Renombrar columnas para facilitar su uso
colnames(datos) <- c("fecha", "anio", "mes", "dia", "hora", "gravedad", "clase", "sitio", "heridos", "muertos", "cantidad")

# Filtrar datos válidos y convertir hora
datos <- datos %>%
  filter(!is.na(heridos)) %>%
  mutate(
    hora_limpia = str_extract(hora, "^\\d{2}:\\d{2}"),
    am_pm = str_extract(hora, "AM|PM"),
    hora_dt = parse_time(paste(hora_limpia, am_pm), "%I:%M %p"),
    hora_decimal = hour(hora_dt) + minute(hora_dt) / 60
  ) %>%
  filter(!is.na(hora_decimal))

3. Modelo de regresión lineal múltiple

# Modelo
modelo <- lm(heridos ~ anio + mes + hora_decimal + clase, data = datos)
summary(modelo)
## 
## Call:
## lm(formula = heridos ~ anio + mes + hora_decimal + clase, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.4753 -0.4720 -0.4254  0.4854 20.5474 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         56.616125  19.418667   2.916  0.00356 ** 
## anio                -0.027431   0.009624  -2.850  0.00438 ** 
## mes                 -0.004830   0.003784  -1.277  0.20182    
## hora_decimal         0.001191   0.002424   0.491  0.62329    
## claseCaida Ocupante -0.202750   0.097136  -2.087  0.03691 *  
## claseChoque          0.224853   0.034641   6.491 9.23e-11 ***
## claseIncendio       20.750645   1.025891  20.227  < 2e-16 ***
## claseOtro            0.093328   0.126362   0.739  0.46019    
## claseVolcamiento     1.141925   0.161271   7.081 1.60e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.025 on 5881 degrees of freedom
## Multiple R-squared:  0.07898,    Adjusted R-squared:  0.07773 
## F-statistic: 63.04 on 8 and 5881 DF,  p-value: < 2.2e-16

4. Diagnóstico del modelo

# Visualización diagnóstica
par(mfrow = c(2,2))
plot(modelo)
## Warning: not plotting observations with leverage one:
##   1869

5. Resultados

El modelo incluye como variables predictoras el año, el mes, la hora decimal y el tipo de clase de accidente. A partir del resumen del modelo, observamos:

Coeficientes significativos para varias variables.

El valor de R² nos indica qué proporción de la variabilidad en el número de heridos es explicada por el modelo.

Algunas observaciones presentan valores de leverage altos (ej. caso 1869), lo que sugiere que tienen influencia elevada en los resultados.

6. Recomendaciones

Profundizar en el análisis de outliers y valores con alto leverage.

Incluir otras variables contextuales si están disponibles: condiciones climáticas, estado de la vía, etc.

Aplicar validación cruzada para mejorar la robustez del modelo.

7. Conclusiones

El modelo es útil para identificar factores temporales y de tipo de accidente asociados al número de heridos.

A pesar de sus limitaciones, puede ser usado como punto de partida para análisis predictivos.

Es importante seguir refinando el modelo con nuevos datos y variables externas.