Descripción General

La base de datos proporcionada representa información sobre los accidentes de tránsito ocurridos en el distrito de Barranquilla según los informes policiales de accidentes de tránsito (IPAT).

Las variables se describen como:

  1. FECHA_ACCIDENTE: Indica la fecha en la que ocurrió el accidente.

  2. HORA_ACCIDENTE: Hora exacta en la que ocurrió el accidente.

  3. GRAVEDAD_ACCIDENTE: Indica la gravedad del accidente. Dividido en: heridos o daños materiales.

  4. CLASE_ACCIDENTE: Tipo de accidente según su naturaleza.

  5. SITIO_EXACTO_ACCIDENTE: Dirección o ubicación específica donde ocurrió el accidente.

  6. CANT_HERIDOS_EN_SITIO_ACCIDENTE: Número de personas heridas o lesionadas en el accidente.

  7. CANT_MUERTOS_EN_SITIO_ACCIDENTE: Número de personas fallecidas en el accidente.

  8. CANTIDAD_ACCIDENTES: Número de accidentes ocurridos.

  9. AÑO_ACCIDENTE: Año en el que ocurrió el accidente.

  10. MES_ACCIDENTE: Mes en el que pasó el accidente.

  11. DIA_ACCIDENTE: Día en el que sucedió el accidente.

summary(Accidentalidad_en_Barranquilla_20240816)
##  FECHA_ACCIDENTE                  HORA_ACCIDENTE     GRAVEDAD_ACCIDENTE
##  Min.   :2018-01-01 00:00:00.00   Length:25610       Length:25610      
##  1st Qu.:2019-02-02 00:00:00.00   Class :character   Class :character  
##  Median :2020-04-23 12:00:00.00   Mode  :character   Mode  :character  
##  Mean   :2020-07-31 19:57:36.05                                        
##  3rd Qu.:2021-12-13 00:00:00.00                                        
##  Max.   :2024-06-30 00:00:00.00                                        
##                                                                        
##  CLASE_ACCIDENTE    SITIO_EXACTO_ACCIDENTE CANT_HERIDOS_EN _SITIO_ACCIDENTE
##  Length:25610       Length:25610           Min.   : 1.000                  
##  Class :character   Class :character       1st Qu.: 1.000                  
##  Mode  :character   Mode  :character       Median : 1.000                  
##                                            Mean   : 1.472                  
##                                            3rd Qu.: 2.000                  
##                                            Max.   :42.000                  
##                                            NA's   :15626                   
##  CANT_MUERTOS_EN _SITIO_ACCIDENTE CANTIDAD_ACCIDENTES AÑO_ACCIDENTE 
##  Min.   :1.000                    Min.   :1           Min.   :2018  
##  1st Qu.:1.000                    1st Qu.:1           1st Qu.:2019  
##  Median :1.000                    Median :1           Median :2020  
##  Mean   :1.036                    Mean   :1           Mean   :2020  
##  3rd Qu.:1.000                    3rd Qu.:1           3rd Qu.:2021  
##  Max.   :2.000                    Max.   :2           Max.   :2024  
##  NA's   :25358                                                      
##  MES_ACCIDENTE      DIA_ACCIDENTE     
##  Length:25610       Length:25610      
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 

Características Generales

Veamos la dimensión de la base de datos

dim(Accidentalidad_en_Barranquilla_20240816) #Dimensión de la base de datos
## [1] 25610    11

La base de datos tiene 25610 columnas y 11 filas (variables).

colnames(Accidentalidad_en_Barranquilla_20240816) #Nombre de las columnas o variables
##  [1] "FECHA_ACCIDENTE"                  "HORA_ACCIDENTE"                  
##  [3] "GRAVEDAD_ACCIDENTE"               "CLASE_ACCIDENTE"                 
##  [5] "SITIO_EXACTO_ACCIDENTE"           "CANT_HERIDOS_EN _SITIO_ACCIDENTE"
##  [7] "CANT_MUERTOS_EN _SITIO_ACCIDENTE" "CANTIDAD_ACCIDENTES"             
##  [9] "AÑO_ACCIDENTE"                    "MES_ACCIDENTE"                   
## [11] "DIA_ACCIDENTE"

Clasifiquemos las variables por sus tipos:

sapply(Accidentalidad_en_Barranquilla_20240816, class) #Aplicamos la función class para determinar que tipo son.
## $FECHA_ACCIDENTE
## [1] "POSIXct" "POSIXt" 
## 
## $HORA_ACCIDENTE
## [1] "character"
## 
## $GRAVEDAD_ACCIDENTE
## [1] "character"
## 
## $CLASE_ACCIDENTE
## [1] "character"
## 
## $SITIO_EXACTO_ACCIDENTE
## [1] "character"
## 
## $`CANT_HERIDOS_EN _SITIO_ACCIDENTE`
## [1] "numeric"
## 
## $`CANT_MUERTOS_EN _SITIO_ACCIDENTE`
## [1] "numeric"
## 
## $CANTIDAD_ACCIDENTES
## [1] "numeric"
## 
## $AÑO_ACCIDENTE
## [1] "numeric"
## 
## $MES_ACCIDENTE
## [1] "character"
## 
## $DIA_ACCIDENTE
## [1] "character"

Tipos de variable

Las variables númericas son:

library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
num_var <- Accidentalidad_en_Barranquilla_20240816 %>% select_if(is.numeric) #Seleccionamos las númericas.
print(head(num_var, 10)) #Nada más mostramos las primeras 10 filas
## # A tibble: 10 × 4
##    `CANT_HERIDOS_EN _SITIO_ACCIDENTE` CANT_MUERTOS_EN _SIT…¹ CANTIDAD_ACCIDENTES
##                                 <dbl>                  <dbl>               <dbl>
##  1                                  1                     NA                   1
##  2                                 NA                     NA                   1
##  3                                 NA                     NA                   1
##  4                                 NA                     NA                   1
##  5                                 NA                     NA                   1
##  6                                  3                     NA                   1
##  7                                  1                     NA                   1
##  8                                 NA                     NA                   1
##  9                                 NA                     NA                   1
## 10                                 NA                     NA                   1
## # ℹ abbreviated name: ¹​`CANT_MUERTOS_EN _SITIO_ACCIDENTE`
## # ℹ 1 more variable: AÑO_ACCIDENTE <dbl>

Las variables categóricas son:

library(dplyr)
 #Seleccionamos si son categóricas. 
cate_var <- Accidentalidad_en_Barranquilla_20240816 %>%
  select_if(is.character)

#Creamos una variable aparte para almacenar la columna "Fecha" como caracter.
fecha_factor <- as.character(Accidentalidad_en_Barranquilla_20240816$FECHA_ACCIDENTE)

cate_var <- cbind(cate_var, FECHA_ACCIDENTE = fecha_factor)

print(head(cate_var, 10)) #Nada más mostramos las primeras 10 filas
##    HORA_ACCIDENTE GRAVEDAD_ACCIDENTE CLASE_ACCIDENTE SITIO_EXACTO_ACCIDENTE
## 1     01:30:00:am        Con heridos       Atropello            CL 87 9H 24
## 2     02:00:00:pm         Solo daños          Choque           CL 110 CR 46
## 3     04:00:00:am         Solo daños          Choque   AV CIRCUNVALAR CR 9G
## 4     04:30:00:am         Solo daños          Choque         CLLE 72 CRA 29
## 5     05:20:00:pm         Solo daños          Choque        VIA 40 CALLE 75
## 6     06:00:00:pm        Con heridos          Choque             CR 8 CL 41
## 7     12:50:00:am        Con heridos       Atropello      CLLE 119B CRA 11B
## 8     02:30:00:pm         Solo daños          Choque       CARRERA 25 37-42
## 9     03:00:00:pm         Solo daños          Choque           CR 51B 1D 35
## 10    03:45:00:pm         Solo daños          Choque        VIA 40  CLLE 85
##    MES_ACCIDENTE DIA_ACCIDENTE FECHA_ACCIDENTE
## 1        January           Mon      2018-01-01
## 2        January           Mon      2018-01-01
## 3        January           Mon      2018-01-01
## 4        January           Mon      2018-01-01
## 5        January           Mon      2018-01-01
## 6        January           Mon      2018-01-01
## 7        January           Mon      2018-01-01
## 8        January           Tue      2018-01-02
## 9        January           Tue      2018-01-02
## 10       January           Tue      2018-01-02

Filtros

A continuación aplicaremos varios filtros para poder analizar más detalladamente algunas variables.

Filtro 1 - Cantidad de heridos en los primeros seis meses

Como primer filtro, estaremos analizando la cantidad de heridos que hubo en los años 2018-2024 en los primeros seis meses.

library(dplyr)
library(ggplot2)

# Filtramos datos para el primer semestre (Enero-Junio).
primeros_seis_meses <- Accidentalidad_en_Barranquilla_20240816 %>%
  filter(MES_ACCIDENTE %in% c("January", "February", "March", "April", "May", "June"))

# Agrupamos por mes y se suma la cantidad de heridos.
heridos_por_mes <- primeros_seis_meses %>%
  group_by(MES_ACCIDENTE) %>%
  summarise(Total_Heridos = sum(`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, na.rm = TRUE))


# Graficamos para más claridad.
ggplot(heridos_por_mes, aes(x = MES_ACCIDENTE, y = Total_Heridos)) +
  geom_bar(stat = "identity", fill = "brown") +
  labs(title = "Cantidad de Heridos por Mes en el Primer Semestre", x = "Mes", y = "Cantidad Total de Heridos") +
  theme_minimal()

Filtro 2 - Número de accidentes en Enero y Diciembre

Analizaremos el número de accidentes entre el primer mes (Enero) y el último mes del año (Diciembre).

library(dplyr)
library(ggplot2)

Accidentes_Enero <- Accidentalidad_en_Barranquilla_20240816 %>% filter(MES_ACCIDENTE == "January") #Filtramos datos para el mes de Enero

Accidentes_Diciembre <- Accidentalidad_en_Barranquilla_20240816 %>% filter(MES_ACCIDENTE == "December") #Filtramos datos para el mes de Diciembre

num_accidentes_enero <- nrow(Accidentes_Enero) #Contamos los datos con la función nrow
num_accidentes_dici <- nrow(Accidentes_Diciembre) #Contamos los datos con la función nrow

head(num_accidentes_enero) #Mostramos el resultado
## [1] 2349
head(num_accidentes_dici)
## [1] 2189
Mes <- c("Enero", "Diciembre") #Almacenamos en un vector las cadenas enero y diciembre.

Numero_Accidente <- c(num_accidentes_enero, num_accidentes_dici)  #Almacenamos en un vector los datos de los accidentes de enero y diciembre, anteriormente calculados.

datos_grafico <- data.frame(Mes, Numero_Accidente) #Creamos un dataframe para poder graficar después. 

ggplot(datos_grafico, aes(x = Mes, y = Numero_Accidente, fill = Mes)) + geom_bar(stat = "identity") + labs(title = "Número de Accidentes en Enero y Diciembre", x = "Mes", y = "Número de accidentes") + theme_minimal() #Realizamos el grafico

Filtro 3 - Número de accidentes en el año 2022 y 2023

Observaremos el número de accidentes entre el año 2022 y 2023. Para analizar que tanto subió o bajó en un año.

library(dplyr)
library(ggplot2)

Accidentes_2022 <- Accidentalidad_en_Barranquilla_20240816 %>% filter(AÑO_ACCIDENTE == 2022) #Filtrar datos para el año 2022

Accidentes_2023 <- Accidentalidad_en_Barranquilla_20240816 %>% filter(AÑO_ACCIDENTE == 2023) #Filtrar datos para el año 2023

num_accidentes_2022 <- nrow(Accidentes_2022) #Contamos los accidentes para el año 2022
num_accidentes_2023 <- nrow(Accidentes_2023) #Contamos los accidentes para el año 2023

head(num_accidentes_2022)
## [1] 3683
head(num_accidentes_2023)
## [1] 1662
#Creamos dos vectores
Año <- c("2022", "2023")
Numero2_Accidente <- c(num_accidentes_2022, num_accidentes_2023) 
datos_grafico <- data.frame(Año, Numero_Accidente)

#Graficamos
ggplot(datos_grafico, aes(x = Año, y = Numero2_Accidente, fill = Año)) + geom_bar(stat = "identity") + labs(title = "Número de Accidentes en 2022 y 2023", x = "Año", y = "Número de accidentes") + theme_minimal()

Filtro 4 - Cantidad de muertos por mes

Se analiza la cantidad de muertos por mes. Considerando todos los años de la base de datos.

library(dplyr)
library(ggplot2)

Muertos_Mes <- Accidentalidad_en_Barranquilla_20240816 %>% 
  group_by(MES_ACCIDENTE) %>% 
  summarise(Total_Muertos = sum(`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, na.rm = TRUE)) #Agrupamos por mes y sumamos la cantidad de muertos

print(Muertos_Mes)
## # A tibble: 12 × 2
##    MES_ACCIDENTE Total_Muertos
##    <chr>                 <dbl>
##  1 April                    18
##  2 August                   19
##  3 December                 22
##  4 February                 27
##  5 January                  20
##  6 July                     18
##  7 June                     21
##  8 March                    30
##  9 May                      14
## 10 November                 20
## 11 October                  22
## 12 September                30
#Graficamos
ggplot(Muertos_Mes, aes(x = MES_ACCIDENTE, y = Total_Muertos)) +
  geom_bar(stat = "identity", fill = "gray") +
  labs(title = "Cantidad de Fallecidos por Mes", x = "Mes", y = "Cantidad Total de fallecidos") +
  theme_minimal()

Filtro 5 - Cantidad de heridos por día

Veamos la cantidad de heridos por día, para ver que día de la semana hay más accidentados.

library(dplyr)
library(ggplot2)


Heridos_dia <- Accidentalidad_en_Barranquilla_20240816 %>% group_by(DIA_ACCIDENTE) %>% summarise(Total_Heridos2 = sum(`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, na.rm = TRUE)) #Agrupamos por día y sumamos la cantidad total de heridos.

head(Heridos_dia)
## # A tibble: 6 × 2
##   DIA_ACCIDENTE Total_Heridos2
##   <chr>                  <dbl>
## 1 Fri                     2100
## 2 Mon                     2414
## 3 Sat                     2112
## 4 Sun                     1981
## 5 Thu                     1934
## 6 Tue                     2134
#Graficamos
ggplot(Heridos_dia, aes(x = DIA_ACCIDENTE, y = Total_Heridos2)) +
  geom_bar(stat = "identity", fill = "darkblue") +
  labs(title = "Cantidad de Heridos por Dia", x = "Dia", y = "Cantidad Total de Heridos") +
  theme_minimal()

Filtro 6 - Cantidad de choques por día

library(dplyr)
library(ggplot2)

Choque <- Accidentalidad_en_Barranquilla_20240816 %>% filter(CLASE_ACCIDENTE == "Choque") #Filtramos los accidentes por clase, específicamente, los que fueron "choque".

choque_dia <- Choque %>% group_by(DIA_ACCIDENTE) %>% summarise(Total_Acci = n())
#Contamos cuántos choques hubo agrupandolo por día de la semana.

print(choque_dia)
## # A tibble: 7 × 2
##   DIA_ACCIDENTE Total_Acci
##   <chr>              <int>
## 1 Fri                 3664
## 2 Mon                 3492
## 3 Sat                 3481
## 4 Sun                 2341
## 5 Thu                 3521
## 6 Tue                 3756
## 7 Wed                 3564
#Graficamos
ggplot(choque_dia, aes(x = DIA_ACCIDENTE, y = Total_Acci)) +
  geom_bar(stat = "identity", fill = "black") +
  labs(title = "Cantidad de Choques por Día de la Semana", x = "Día", y = "Cantidad Total de Choques") +
  theme_minimal()

Función table

Tablas de frecuencia para las variables categóricas

library(dplyr)

categoricas <- Accidentalidad_en_Barranquilla_20240816 %>% select_if(is.character) #Filtramos las variables categóricas y las almacenamos en un dataframe.

#Hacemos una tabla para cada variable categorica junto con un gráfico
for (columna in names(categoricas)){
  cat("Tabla de frecuencias para ", columna, "")
  tablas <- table(categoricas[[columna]])
  tabla_ord <- sort(tablas, decreasing = TRUE) #Ordenamos de mayor a menor
  print(head(tabla_ord, 10))
  cat("\n")
  #Mostramos tabla de frecuencia
  barplot(tabla_ord, main = columna, col = "lightblue", las = 2, cex.names = 0.5)
}
## Tabla de frecuencias para  HORA_ACCIDENTE 
## 03:00:00:pm 04:00:00:pm 12:30:00:pm 05:00:00:pm 08:00:00:am 02:00:00:pm 
##         408         408         387         384         384         371 
## 01:00:00:pm 08:30:00:am 04:30:00:pm 10:00:00:am 
##         368         344         332         328

## Tabla de frecuencias para  GRAVEDAD_ACCIDENTE 
##  Solo daños Con heridos Con muertos 
##       15457        9901         252

## Tabla de frecuencias para  CLASE_ACCIDENTE 
##         Choque      Atropello Caida Ocupante           Otro    Volcamiento 
##          23819           1344            194            123            117 
##       Incendio 
##             13

## Tabla de frecuencias para  SITIO_EXACTO_ACCIDENTE 
##         CL 110 CR 9G          CL 110 CR 6         CL 110 CR 43 
##                   77                   66                   55 
##           CL 17 CR 8           CL 30 CR 8         VIA 40 CL 85 
##                   53                   53                   53 
##         CL 110 CR 38 AV CIRCUNVALAR CR 9G         CL 110 CR 27 
##                   49                   41                   33 
##           CL 19 CR 1 
##                   32

## Tabla de frecuencias para  MES_ACCIDENTE 
##  February     March   January  December       May      June   October     April 
##      2477      2446      2349      2189      2121      2103      2090      2010 
##  November September 
##      1995      1980

## Tabla de frecuencias para  DIA_ACCIDENTE 
##  Tue  Fri  Wed  Mon  Thu  Sat  Sun 
## 4009 3920 3839 3774 3756 3735 2577

Tabla de frecuencia entre gravedad del accidente y clase

tabla2 <- table(Accidentalidad_en_Barranquilla_20240816$GRAVEDAD_ACCIDENTE, Accidentalidad_en_Barranquilla_20240816$CLASE_ACCIDENTE) #Creamos una tabla de frecuencia con variables cruzadas (clase y accidente)
head(tabla2)
##              
##               Atropello Caida Ocupante Choque Incendio  Otro Volcamiento
##   Con heridos      1266            188   8277        1    83          86
##   Con muertos        78              6    157        0     8           3
##   Solo daños          0              0  15385       12    32          28
#Graficamos la tabla de frecuencias cruzadas
barplot(tabla2,
        main = "Frecuencia de Accidentes por Gravedad y Clase",
        xlab = "Clase de Accidente",
        ylab = "Número de Accidentes",
        col = rainbow(ncol(tabla2)),
        legend.text = rownames(tabla2),
        beside = TRUE)

Valores NA

Veamos el total de valores NA de la base de datos:

num_na <- sum(is.na(Accidentalidad_en_Barranquilla_20240816)) #Sumamos todos los valores NA de la base de datos.

head(num_na) #Mostramos el resultado.
## [1] 40984

Veamos por columna:

num_na_columna <- colSums(is.na(Accidentalidad_en_Barranquilla_20240816)) #Sumamos los NA por columna.

print(num_na_columna) #Se muestra el resultado.
##                  FECHA_ACCIDENTE                   HORA_ACCIDENTE 
##                                0                                0 
##               GRAVEDAD_ACCIDENTE                  CLASE_ACCIDENTE 
##                                0                                0 
##           SITIO_EXACTO_ACCIDENTE CANT_HERIDOS_EN _SITIO_ACCIDENTE 
##                                0                            15626 
## CANT_MUERTOS_EN _SITIO_ACCIDENTE              CANTIDAD_ACCIDENTES 
##                            25358                                0 
##                    AÑO_ACCIDENTE                    MES_ACCIDENTE 
##                                0                                0 
##                    DIA_ACCIDENTE 
##                                0

Valores atípicos

Primero que todo, analizemos las medidas de tendencia:

library(dplyr)
# Seleccionamos solo las columnas numéricas
numericas <- Accidentalidad_en_Barranquilla_20240816 %>% select_if(is.numeric)

summary(numericas)
##  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.472                   Mean   :1.036                   
##  3rd Qu.: 2.000                   3rd Qu.:1.000                   
##  Max.   :42.000                   Max.   :2.000                   
##  NA's   :15626                    NA's   :25358                   
##  CANTIDAD_ACCIDENTES AÑO_ACCIDENTE 
##  Min.   :1           Min.   :2018  
##  1st Qu.:1           1st Qu.:2019  
##  Median :1           Median :2020  
##  Mean   :1           Mean   :2020  
##  3rd Qu.:1           3rd Qu.:2021  
##  Max.   :2           Max.   :2024  
## 
#Hacemos un diagrama de caja para poder visualizar mejor.
par(mfrow=c(1,4))
for (columna in names(numericas)){
  boxplot(numericas[[columna]], main = columna)
  cat("\n")
  
} 

# Función para identificar y contar valores atípicos
filtrar_atipicos <- function(columna) {
  Q1 <- quantile(columna, 0.25, na.rm = TRUE)
  Q3 <- quantile(columna, 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  
  lim_inf <- Q1 - 1.5 * IQR
  lim_sup <- Q3 + 1.5 * IQR
  
  valores_ati <- columna[columna < lim_inf | columna > lim_sup]
  cantidad_ati <- length(valores_ati)
  
  return(cantidad_ati)
}

# Contar los valores atípicos en cada columna
atipicos_por_columna <- sapply(numericas, filtrar_atipicos)
cat("Cantidad de valores atipícos por columna: \n")
## Cantidad de valores atipícos por columna:
# Mostrar los resultados
print(atipicos_por_columna)
## CANT_HERIDOS_EN _SITIO_ACCIDENTE CANT_MUERTOS_EN _SITIO_ACCIDENTE 
##                            15929                            25367 
##              CANTIDAD_ACCIDENTES                    AÑO_ACCIDENTE 
##                                5                                0
require(dplyr)

#Filtramos los datos sin los valores atípicos de las variables "CANT_HERIDOS_EN _SITIO_ACCIDENTE", "CANT_MUERTOS_EN _SITIO_ACCIDENTE" y "CANTIDAD_ACCIDENTE"

filter(Accidentalidad_en_Barranquilla_20240816, `CANT_HERIDOS_EN _SITIO_ACCIDENTE` > 3)
## # A tibble: 303 × 11
##    FECHA_ACCIDENTE     HORA_ACCIDENTE GRAVEDAD_ACCIDENTE CLASE_ACCIDENTE
##    <dttm>              <chr>          <chr>              <chr>          
##  1 2018-01-07 00:00:00 08:30:00:pm    Con heridos        Choque         
##  2 2018-01-11 00:00:00 09:40:00:am    Con heridos        Choque         
##  3 2018-01-15 00:00:00 03:00:00:am    Con heridos        Choque         
##  4 2018-01-18 00:00:00 11:30:00:am    Con heridos        Choque         
##  5 2018-01-19 00:00:00 11:50:00:pm    Con heridos        Choque         
##  6 2018-02-09 00:00:00 01:30:00:am    Con heridos        Choque         
##  7 2018-02-11 00:00:00 11:50:00:pm    Con heridos        Choque         
##  8 2018-02-28 00:00:00 08:45:00:pm    Con heridos        Choque         
##  9 2018-03-06 00:00:00 05:00:00:am    Con heridos        Choque         
## 10 2018-03-06 00:00:00 07:00:00:am    Con heridos        Choque         
## # ℹ 293 more rows
## # ℹ 7 more variables: SITIO_EXACTO_ACCIDENTE <chr>,
## #   `CANT_HERIDOS_EN _SITIO_ACCIDENTE` <dbl>,
## #   `CANT_MUERTOS_EN _SITIO_ACCIDENTE` <dbl>, CANTIDAD_ACCIDENTES <dbl>,
## #   AÑO_ACCIDENTE <dbl>, MES_ACCIDENTE <chr>, DIA_ACCIDENTE <chr>
filter(Accidentalidad_en_Barranquilla_20240816, `CANT_MUERTOS_EN _SITIO_ACCIDENTE` > 1)
## # A tibble: 9 × 11
##   FECHA_ACCIDENTE     HORA_ACCIDENTE GRAVEDAD_ACCIDENTE CLASE_ACCIDENTE
##   <dttm>              <chr>          <chr>              <chr>          
## 1 2018-03-22 00:00:00 02:30:00:pm    Con muertos        Atropello      
## 2 2018-08-09 00:00:00 08:15:00:pm    Con muertos        Choque         
## 3 2019-03-16 00:00:00 11:35:00:pm    Con muertos        Choque         
## 4 2019-12-26 00:00:00 02:00:00:am    Con muertos        Choque         
## 5 2021-09-27 00:00:00 01:35:00:pm    Con muertos        Atropello      
## 6 2022-02-10 00:00:00 06:54:00:am    Con muertos        Choque         
## 7 2022-02-28 00:00:00 07:30:00:am    Con muertos        Choque         
## 8 2024-02-11 00:00:00 11:53:00:pm    Con muertos        Choque         
## 9 2024-04-15 00:00:00 07:30:00:pm    Con muertos        Choque         
## # ℹ 7 more variables: SITIO_EXACTO_ACCIDENTE <chr>,
## #   `CANT_HERIDOS_EN _SITIO_ACCIDENTE` <dbl>,
## #   `CANT_MUERTOS_EN _SITIO_ACCIDENTE` <dbl>, CANTIDAD_ACCIDENTES <dbl>,
## #   AÑO_ACCIDENTE <dbl>, MES_ACCIDENTE <chr>, DIA_ACCIDENTE <chr>
filter(Accidentalidad_en_Barranquilla_20240816, `CANTIDAD_ACCIDENTES` > 1)
## # A tibble: 5 × 11
##   FECHA_ACCIDENTE     HORA_ACCIDENTE GRAVEDAD_ACCIDENTE CLASE_ACCIDENTE
##   <dttm>              <chr>          <chr>              <chr>          
## 1 2018-06-09 00:00:00 09:35:00:am    Solo daños         Choque         
## 2 2019-12-28 00:00:00 12:28:00:pm    Solo daños         Choque         
## 3 2020-02-06 00:00:00 09:00:00:am    Solo daños         Choque         
## 4 2020-05-02 00:00:00 07:40:00:pm    Solo daños         Choque         
## 5 2020-11-05 00:00:00 05:25:00:pm    Solo daños         Choque         
## # ℹ 7 more variables: SITIO_EXACTO_ACCIDENTE <chr>,
## #   `CANT_HERIDOS_EN _SITIO_ACCIDENTE` <dbl>,
## #   `CANT_MUERTOS_EN _SITIO_ACCIDENTE` <dbl>, CANTIDAD_ACCIDENTES <dbl>,
## #   AÑO_ACCIDENTE <dbl>, MES_ACCIDENTE <chr>, DIA_ACCIDENTE <chr>
#Reemplazamos los valores atípicos por NA
Accidentalidad_en_Barranquilla_20240816$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`[Accidentalidad_en_Barranquilla_20240816$`CANT_HERIDOS_EN _SITIO_ACCIDENTE` > 3] <- NA

Accidentalidad_en_Barranquilla_20240816$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`[Accidentalidad_en_Barranquilla_20240816$`CANT_MUERTOS_EN _SITIO_ACCIDENTE` > 1] <- NA

Accidentalidad_en_Barranquilla_20240816$CANTIDAD_ACCIDENTES[Accidentalidad_en_Barranquilla_20240816$CANTIDAD_ACCIDENTES > 1] <- NA

#Graficamos para ver la diferencia
par(mfrow=c(1,4))
 boxplot(Accidentalidad_en_Barranquilla_20240816$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`,main="Heridos")
 boxplot(Accidentalidad_en_Barranquilla_20240816$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`,main="Muertos")
 boxplot(Accidentalidad_en_Barranquilla_20240816$CANTIDAD_ACCIDENTES, main="Accidentes")
 boxplot(Accidentalidad_en_Barranquilla_20240816$AÑO_ACCIDENTE, main="Año")

Reemplanzando los valores NA

Modificaremos los valores NA por la mediana, ya que los datos no tienen una distribución normal.

#Verificamos que las columnas solo sean númericas y que tengan algún valor NA
solo_numericas <- Accidentalidad_en_Barranquilla_20240816 %>% select_if(function(col) is.numeric(col) && any(is.na(col)))

#Calculamos la mediana.
mediana <- apply(solo_numericas, 2, median, na.rm=TRUE)

#Mostramos resultado.
head(mediana)
## CANT_HERIDOS_EN _SITIO_ACCIDENTE CANT_MUERTOS_EN _SITIO_ACCIDENTE 
##                                1                                1 
##              CANTIDAD_ACCIDENTES 
##                                1
require(tidyr)  # Cargamos el paquete
## Cargando paquete requerido: tidyr
# Creamos una lista con los reemplazos:
reemplazos <- list(`CANT_HERIDOS_EN _SITIO_ACCIDENTE` = mediana[1], `CANT_MUERTOS_EN _SITIO_ACCIDENTE` = mediana[2], `CANTIDAD_ACCIDENTES` = mediana[3])

# Reemplazamos y guardamos en la base de datos.
Accidentalidad_en_Barranquilla_20240816 <- replace_na(Accidentalidad_en_Barranquilla_20240816, reemplazos)

#Mostramos resultado final
summary(Accidentalidad_en_Barranquilla_20240816)
##  FECHA_ACCIDENTE                  HORA_ACCIDENTE     GRAVEDAD_ACCIDENTE
##  Min.   :2018-01-01 00:00:00.00   Length:25610       Length:25610      
##  1st Qu.:2019-02-02 00:00:00.00   Class :character   Class :character  
##  Median :2020-04-23 12:00:00.00   Mode  :character   Mode  :character  
##  Mean   :2020-07-31 19:57:36.05                                        
##  3rd Qu.:2021-12-13 00:00:00.00                                        
##  Max.   :2024-06-30 00:00:00.00                                        
##  CLASE_ACCIDENTE    SITIO_EXACTO_ACCIDENTE CANT_HERIDOS_EN _SITIO_ACCIDENTE
##  Length:25610       Length:25610           Min.   :1.000                   
##  Class :character   Class :character       1st Qu.:1.000                   
##  Mode  :character   Mode  :character       Median :1.000                   
##                                            Mean   :1.126                   
##                                            3rd Qu.:1.000                   
##                                            Max.   :3.000                   
##  CANT_MUERTOS_EN _SITIO_ACCIDENTE CANTIDAD_ACCIDENTES AÑO_ACCIDENTE 
##  Min.   :1                        Min.   :1           Min.   :2018  
##  1st Qu.:1                        1st Qu.:1           1st Qu.:2019  
##  Median :1                        Median :1           Median :2020  
##  Mean   :1                        Mean   :1           Mean   :2020  
##  3rd Qu.:1                        3rd Qu.:1           3rd Qu.:2021  
##  Max.   :1                        Max.   :1           Max.   :2024  
##  MES_ACCIDENTE      DIA_ACCIDENTE     
##  Length:25610       Length:25610      
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 

Comentarios

  1. En algunos algoritmos se utilizo la función “is.na” para no tomar en cuenta los valores NA a la hora de realizar los gráficos.

  2. Las medidas de tendencia central nos ayudan a identificar los valores atípicos de cada variable númerica. Sin embargo, la media se puede ver afectada si es que no lleva una distribución normal.

  3. Gracias a los filtros aplicados, se pudo hacer un análisis más detallado.

  4. Se utilizaron gráficos para ayudar a comprender mejor la información de las variables categóricas.

  5. El resultado de los diagramas de caja mostró valores atípicos muy altos o muy bajos.

  6. Como se pudo observar, solo hay valores NA en la cantidad de muertos y cantidad heridos.

  7. Al reemplazar los valores atípicos por NA, se puede ver una mejor distribución de los datos con valores atípicos dentro de lo “normal”.

  8. Convertimos fecha a caracter para mayor facilidad a la hora de manipular.

  9. Para reemplazar los valores NA se utilizo la mediana.

  10. Respecto a los filtros: en el filtro 1, se pudo ver que aunque en febrero hubo más accidentes, la cantidad de heridos fue mayor en marzo; filtro 2, se calculo la cantidad de accidentes en el primer y último mes (Enero y Diciembre) del año 2023, y el valor más alto fue para enero; filtro 3, básicamente se calculo los accidentes del año 2022 y 2023 para ver que tanto aumentó o disminuyo en un año, y se pudo ver una reducción significativa respecto al año pasado; filtro 4, calculamos la cantidad de fallecidos por mes, y quedo febrero con la mayor frecuencia; filtro 5, en la cantidad heridos por día, la mayor frecuencia se concentró en el lunes, por lo que, la mayor cantidad de heridos por día fue en el día lunes; y filtro 6, la mayor cantidad de choques por día fue el martes.