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:
FECHA_ACCIDENTE: Indica la fecha en la que ocurrió el accidente.
HORA_ACCIDENTE: Hora exacta en la que ocurrió el accidente.
GRAVEDAD_ACCIDENTE: Indica la gravedad del accidente. Dividido en: heridos o daños materiales.
CLASE_ACCIDENTE: Tipo de accidente según su naturaleza.
SITIO_EXACTO_ACCIDENTE: Dirección o ubicación específica donde ocurrió el accidente.
CANT_HERIDOS_EN_SITIO_ACCIDENTE: Número de personas heridas o lesionadas en el accidente.
CANT_MUERTOS_EN_SITIO_ACCIDENTE: Número de personas fallecidas en el accidente.
CANTIDAD_ACCIDENTES: Número de accidentes ocurridos.
AÑO_ACCIDENTE: Año en el que ocurrió el accidente.
MES_ACCIDENTE: Mes en el que pasó el accidente.
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
##
##
##
##
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"
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
A continuación aplicaremos varios filtros para poder analizar más detalladamente algunas variables.
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()
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
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()
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()
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()
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()
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
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)
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
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")
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
##
##
##
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.
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.
Gracias a los filtros aplicados, se pudo hacer un análisis más detallado.
Se utilizaron gráficos para ayudar a comprender mejor la información de las variables categóricas.
El resultado de los diagramas de caja mostró valores atípicos muy altos o muy bajos.
Como se pudo observar, solo hay valores NA en la cantidad de muertos y cantidad heridos.
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”.
Convertimos fecha a caracter para mayor facilidad a la hora de manipular.
Para reemplazar los valores NA se utilizo la mediana.
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.