En el presente informe se aborda el análisis exploratorio y descriptivo de un conjunto de datos relacionado a registros de suicidios o intentos de los mismos, posibles razones psicológicas, datos demográficos, entre otras variables de interés. El conjunto de datos posee registros de distintos países a nivel mundial, la población de los mismos y la tasa de suicidios por cada 10 mil habitantes.
Se iniciará con una inspección del conjunto de datos, su estructura, tipos de variables, datos faltantes y distribución de las variables. Posteriormente, se realizará una descripción gráfica de la información y posibles inferencias.
library(readr)
## Warning: package 'readr' was built under R version 4.2.3
master <- read_csv("master.csv")
## Rows: 27820 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): country, sex, age, country-year, generation
## dbl (6): year, suicides_no, population, suicides/100k pop, HDI for year, gdp...
## num (1): gdp_for_year ($)
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(master)
## # A tibble: 6 × 12
## country year sex age suicides_no population `suicides/100k pop`
## <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl>
## 1 Albania 1987 male 15-24 years 21 312900 6.71
## 2 Albania 1987 male 35-54 years 16 308000 5.19
## 3 Albania 1987 female 15-24 years 14 289700 4.83
## 4 Albania 1987 male 75+ years 1 21800 4.59
## 5 Albania 1987 male 25-34 years 9 274300 3.28
## 6 Albania 1987 female 75+ years 1 35600 2.81
## # ℹ 5 more variables: `country-year` <chr>, `HDI for year` <dbl>,
## # `gdp_for_year ($)` <dbl>, `gdp_per_capita ($)` <dbl>, generation <chr>
dim(master)
## [1] 27820 12
str(master)
## spc_tbl_ [27,820 × 12] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ country : chr [1:27820] "Albania" "Albania" "Albania" "Albania" ...
## $ year : num [1:27820] 1987 1987 1987 1987 1987 ...
## $ sex : chr [1:27820] "male" "male" "female" "male" ...
## $ age : chr [1:27820] "15-24 years" "35-54 years" "15-24 years" "75+ years" ...
## $ suicides_no : num [1:27820] 21 16 14 1 9 1 6 4 1 0 ...
## $ population : num [1:27820] 312900 308000 289700 21800 274300 ...
## $ suicides/100k pop : num [1:27820] 6.71 5.19 4.83 4.59 3.28 2.81 2.15 1.56 0.73 0 ...
## $ country-year : chr [1:27820] "Albania1987" "Albania1987" "Albania1987" "Albania1987" ...
## $ HDI for year : num [1:27820] NA NA NA NA NA NA NA NA NA NA ...
## $ gdp_for_year ($) : num [1:27820] 2.16e+09 2.16e+09 2.16e+09 2.16e+09 2.16e+09 ...
## $ gdp_per_capita ($): num [1:27820] 796 796 796 796 796 796 796 796 796 796 ...
## $ generation : chr [1:27820] "Generation X" "Silent" "Generation X" "G.I. Generation" ...
## - attr(*, "spec")=
## .. cols(
## .. country = col_character(),
## .. year = col_double(),
## .. sex = col_character(),
## .. age = col_character(),
## .. suicides_no = col_double(),
## .. population = col_double(),
## .. `suicides/100k pop` = col_double(),
## .. `country-year` = col_character(),
## .. `HDI for year` = col_double(),
## .. `gdp_for_year ($)` = col_number(),
## .. `gdp_per_capita ($)` = col_double(),
## .. generation = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
A partir del nombre de las variables podemos identificar cuáles son categóricas y cuáles son numéricas.
names(master)
## [1] "country" "year" "sex"
## [4] "age" "suicides_no" "population"
## [7] "suicides/100k pop" "country-year" "HDI for year"
## [10] "gdp_for_year ($)" "gdp_per_capita ($)" "generation"
Observamos de manera gráfica a través de una tabla la información del
conjunto de datos, en la cual se evidencia la presencia de datos
faltantes en la columna HDI for year para varias de las
observaciones.
library(knitr)
## Warning: package 'knitr' was built under R version 4.2.2
kable(head(master, 10), caption = "Base de datos: Registros de suicidios a nivel mundial")
| country | year | sex | age | suicides_no | population | suicides/100k pop | country-year | HDI for year | gdp_for_year (\()| gdp_per_capita (\)) | generation | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Albania | 1987 | male | 15-24 years | 21 | 312900 | 6.71 | Albania1987 | NA | 2156624900 | 796 | Generation X |
| Albania | 1987 | male | 35-54 years | 16 | 308000 | 5.19 | Albania1987 | NA | 2156624900 | 796 | Silent |
| Albania | 1987 | female | 15-24 years | 14 | 289700 | 4.83 | Albania1987 | NA | 2156624900 | 796 | Generation X |
| Albania | 1987 | male | 75+ years | 1 | 21800 | 4.59 | Albania1987 | NA | 2156624900 | 796 | G.I. Generation |
| Albania | 1987 | male | 25-34 years | 9 | 274300 | 3.28 | Albania1987 | NA | 2156624900 | 796 | Boomers |
| Albania | 1987 | female | 75+ years | 1 | 35600 | 2.81 | Albania1987 | NA | 2156624900 | 796 | G.I. Generation |
| Albania | 1987 | female | 35-54 years | 6 | 278800 | 2.15 | Albania1987 | NA | 2156624900 | 796 | Silent |
| Albania | 1987 | female | 25-34 years | 4 | 257200 | 1.56 | Albania1987 | NA | 2156624900 | 796 | Boomers |
| Albania | 1987 | male | 55-74 years | 1 | 137500 | 0.73 | Albania1987 | NA | 2156624900 | 796 | G.I. Generation |
| Albania | 1987 | female | 5-14 years | 0 | 311000 | 0.00 | Albania1987 | NA | 2156624900 | 796 | Generation X |
summary(master)
## country year sex age
## Length:27820 Min. :1985 Length:27820 Length:27820
## Class :character 1st Qu.:1995 Class :character Class :character
## Mode :character Median :2002 Mode :character Mode :character
## Mean :2001
## 3rd Qu.:2008
## Max. :2016
##
## suicides_no population suicides/100k pop country-year
## Min. : 0.0 Min. : 278 Min. : 0.00 Length:27820
## 1st Qu.: 3.0 1st Qu.: 97498 1st Qu.: 0.92 Class :character
## Median : 25.0 Median : 430150 Median : 5.99 Mode :character
## Mean : 242.6 Mean : 1844794 Mean : 12.82
## 3rd Qu.: 131.0 3rd Qu.: 1486143 3rd Qu.: 16.62
## Max. :22338.0 Max. :43805214 Max. :224.97
##
## HDI for year gdp_for_year ($) gdp_per_capita ($) generation
## Min. :0.483 Min. :4.692e+07 Min. : 251 Length:27820
## 1st Qu.:0.713 1st Qu.:8.985e+09 1st Qu.: 3447 Class :character
## Median :0.779 Median :4.811e+10 Median : 9372 Mode :character
## Mean :0.777 Mean :4.456e+11 Mean : 16866
## 3rd Qu.:0.855 3rd Qu.:2.602e+11 3rd Qu.: 24874
## Max. :0.944 Max. :1.812e+13 Max. :126352
## NA's :19456
library(e1071)
skewness <- apply(master[,sapply(master, is.numeric)], 2, skewness, na.rm = TRUE)
kurtosis <- apply(master[,sapply(master, is.numeric)], 2, kurtosis, na.rm = TRUE)
data.frame(Variable = names(skewness), Asimetría = skewness, Curtosis = kurtosis)
## Variable Asimetría Curtosis
## year year -0.1602240 -1.0519158
## suicides_no suicides_no 10.3517939 157.1288677
## population population 4.4589335 27.3998492
## suicides/100k pop suicides/100k pop 2.9630949 12.1622530
## HDI for year HDI for year -0.3007695 -0.6488063
## gdp_for_year ($) gdp_for_year ($) 7.2329750 64.2170326
## gdp_per_capita ($) gdp_per_capita ($) 1.9632583 4.9360844
suicides_no (Número de suicidios)gdp_per_capita ($) (PIB per cápita)population (Población)suicides/100k pop (Tasa de suicidios por cada 100,000 habitantes)gdp_for_year ($) (PIB anual)Rangos de curtosis
Platicúrtica (Colas delgadas, menos outliers): Curtosis
< 3Mesocúrtica (Distribución normal, colas moderadas:
Curtosis igual o cercana a 3.Leptocúrtica (Colas extremadamente pesadas, muchos outliers:
Curtosis > 3Se ejecuta la función de control o filtro de problemas en nuestro conjunto de datos para examinar si hay alguna inconsistencia en los mismos. Se observa que que no hay errores dentro del conjunto de datos.
prob1 <- problems(master)
prob1
## # A tibble: 0 × 5
## # ℹ 5 variables: row <int>, col <int>, expected <chr>, actual <chr>, file <chr>
La grafica muestra que la proporción entre hombres y mujeres dentro de cada grupo de edad es relativamente estable, con las secciones rojas (mujeres) siendo consistentemente más grandes que las azules (hombres), lo que sugiere una ligera predominancia de mujeres en todos los grupos de edad. La distribución no presenta grandes variaciones, lo que sugiere homogeneidad en la representación de ambos sexos a lo largo de los grupos de edad.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
ggplot(master, aes(x = age, fill = sex)) +
geom_bar(position = "stack") +
labs(title = "Distribución de Edad por Sexo (Apilado)", x = "Grupo de Edad", y = "Frecuencia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
La gráfica muestra una comparación del número total de suicidios entre hombres y mujeres. La barra correspondiente a los hombres es significativamente más alta, con un conteo que supera los 5 millones de suicidios, mientras que la barra para las mujeres muestra un conteo de alrededor de 1 millón de suicidios. Esto indica que, en los datos analizados, los hombres tienen una tasa de suicidios considerablemente mayor que las mujeres, con más de cinco veces la cantidad de suicidios
ggplot(master, aes(x = sex, y = suicides_no, fill = sex)) +
geom_bar(stat = "identity") +
labs(title = "Comparación del Número Total de Suicidios entre Hombres y Mujeres", x = "Sexo", y = "Número de Suicidios") +
theme_minimal()
lA gráfica muestra la frecuencia de suicidios según diferentes generaciones. La generación X presenta la frecuencia más alta, con más de 6,000 suicidios registrados. Le siguen la generación Silent y los Millennials, ambos con frecuencias cercanas a 6,000. Los Boomers también muestran una frecuencia alta, superando los 4,000 casos. En contraste, la G.I. Generation y la Generation Z tienen las frecuencias más bajas, con menos de 3,000 y alrededor de 2,000 casos respectivamente. Esta distribución sugiere que ciertas generaciones, como la generación X, tienen una mayor prevalencia de suicidios en comparación con otras, lo que podría reflejar diferencias generacionales en factores de riesgo y circunstancias sociales.
ggplot(master, aes(x = generation, fill = generation)) +
geom_bar() +
labs(title = "Frecuencia de Suicidios Según Generaciones", x = "Generación", y = "Frecuencia") +
scale_fill_manual(values = c("#cce5ff", "#99ccff", "#66b3ff", "#3399ff", "#0073e6", "#0059b3")) +
theme_minimal()
Agrupamos los rangos anuales para mejor modelado e inspección de los datos. Para ello realizamos una tabla de frecuencias y aplicamos la n de sturges. se muestran los resultados a continuación:
Frecuencia Absoluta (Freq)Frecuencia Relativa (Rel_Freq)Frecuencia Acumulada (Cum_Freq)Esta columna muestra el número total de suicidios acumulados hasta el final de cada periodo.
Interpretación General## year_group suicides_no Rel_Freq Cum_Freq
## 1 (1985,1992] 1131636 0.1706235 1131636
## 2 (1992,1999] 1690352 0.2548644 2821988
## 3 (1999,2006] 1727255 0.2604285 4549243
## 4 (2006,2013] 1640887 0.2474063 6190130
## 5 (2013,2020] 442227 0.0666772 6632357
Se observa que los rangos de edad 1999-2006 y 2006-2013 concentran el mayor número de observaciones o suicidios, con más de 7,000 registros cada uno. Esto sugiere un aumento significativo en la cantidad de datos o en la incidencia de los eventos durante estos años. Los periodos 1992-1999 y 1985-1992 presentan frecuencias más bajas, con alrededor de 6,324 y 4,752 observaciones respectivamente. Sin embargo, el periodo más reciente (2013-2020) muestra una fuerte disminución, con solo 1,840 observaciones, lo que podría indicar un cambio en la tendencia de los eventos o en la recolección de datos en los últimos años.
ggplot(master, aes(x = year_group)) +
geom_histogram(stat = "count", fill = "skyblue", color = "black") +
labs(title = "Histograma de los años", x = "Rango de años", y = "Frecuencia") + scale_fill_manual(values = c("#99ccff", "#66b3ff", "#3399ff", "#0073e6", "#0059b3")) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
El gráfico sugiere que, en la mayoría de los países, el PIB per cápita es bajo, independientemente del sexo. Sin embargo, hay algunas excepciones donde ciertos países presentan un PIB per cápita significativamente más alto, aunque estos son menos frecuentes. La similitud en la forma de los violines para ambos sexos indica que no hay una gran diferencia en la distribución del PIB per cápita entre hombres y mujeres en los datos analizados.
ggplot(master, aes(y = `gdp_per_capita ($)`, x = sex, fill = sex)) +
geom_violin(trim = FALSE) +
labs(title = "Distribución del PIB per Cápita por Sexo", y = "PIB per Cápita ($)", x = "Sexo") +
theme_minimal() +
scale_y_continuous(labels = scales::comma) +
scale_fill_manual(values = c("#a6cee3", "#1f78b4")) +
coord_flip()
## package 'reactable' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\CEDIS RECEPCION\AppData\Local\Temp\RtmpQHIB97\downloaded_packages
Realizamos una imspección de datos faltantes para analizar si se debe
inputar datos en algún momento, para ello a través de una tabla,
observamos que para la variable HDI for year posee 19456
valores vacíos por lo que debe recibir un tratamiento particular. A
partir de esta información verificamos mediante la matriz de datos
faltantes qué proporción de datos faltantes equivale esta cantidad de
registros (6%), posterior a ellos examinaremos la normalidad de la
variable y decidiremos como inputar los datos.
missing_values <- colSums(is.na(master))
print(missing_values)
## country year sex age
## 0 0 0 0
## suicides_no population suicides/100k pop country-year
## 0 0 0 0
## HDI for year gdp_for_year ($) gdp_per_capita ($) generation
## 19456 0 0 0
## year_group
## 576
library(Amelia)
missmap(master, col = c("lightblue", "blue"), legend = TRUE)
Se debe inspeccionar la distribución de los datos para evaluar algún método de inputación posible para la variable con datos faltantes. Dado que tenemos una muestra mayor a 200, se aplicará el test de kolmogrov-smirnov cuyas hipotesis son:
Examinamos la normalidad de la variable HDI for year y
se arroja el resultado de que p-valor < alfa, lo que indica que la
variable no sigue una distribución normal, por tanto se deben reemplazar
los datos faltantes por su mediana y nuevamente observamos la nueva
distribución de nuestros datos y la matriz de datos faltantes.
hdi_data <- master$`HDI for year`
# Usar la mediana
mediana_hdi <- median(hdi_data, na.rm = TRUE)
master$`HDI for year`[is.na(master$`HDI for year`)] <- mediana_hdi
ggplot(master, aes(x = `HDI for year`)) +
geom_histogram(binwidth = 0.01, fill = "steelblue", color = "black") +
labs(title = "Distribución del HDI (después de imputación)", x = "HDI", y = "Frecuencia") +
theme_minimal()
Este gráfico confirma que, tras la imputación, el conjunto de datos ya no contiene valores faltantes. Esto es crucial para garantizar que el análisis posterior no se vea afectado por la ausencia de datos,
missmap(master, col = c("lightblue", "blue"), legend = TRUE)
Considere la base de datos master y realice lo siguiente (utilice los operadores pipe de continuidad y compuesto):
Colombia y los de
EEUU, generando dos bases de datos,
llamadas master_col y master_eu.Primeros realizaremos una inspección de valores faltantes en nuestro conjunto de datos y observamos la presencia de N/A’s en la variable de agrupación por año en 576 registros, posterior a ello, verificamos si hay valores negativos o outliers en nuestro conjunto de datos, luego los calculamos mediante el rango intercuartílico y filtramos el conjunto de datos. Se obseva que no hay presencia de valores negativos en nuestros datos y adicionalmente, se prevee la presencia de 3899 datos atípicos en el número de suicidios. Finalmente creamos un nuevo conjunto de datos filtrado.
missing_values <- sapply(master, function(x) sum(is.na(x)))
print(missing_values)
## country year sex age
## 0 0 0 0
## suicides_no population suicides/100k pop country-year
## 0 0 0 0
## HDI for year gdp_for_year ($) gdp_per_capita ($) generation
## 0 0 0 0
## year_group
## 576
library(dplyr)
negative_values <- master %>%
filter(suicides_no < 0 | `gdp_per_capita ($)` < 0 | `HDI for year` < 0 | `suicides/100k pop` < 0)
print(negative_values)
## # A tibble: 0 × 13
## # ℹ 13 variables: country <chr>, year <dbl>, sex <chr>, age <chr>,
## # suicides_no <dbl>, population <dbl>, suicides/100k pop <dbl>,
## # country-year <chr>, HDI for year <dbl>, gdp_for_year ($) <dbl>,
## # gdp_per_capita ($) <dbl>, generation <chr>, year_group <fct>
library(dplyr)
library(kableExtra)
IQR_suicides <- IQR(master$suicides_no, na.rm = TRUE)
lower_bound <- quantile(master$suicides_no, 0.25, na.rm = TRUE) - 1.5 * IQR_suicides
upper_bound <- quantile(master$suicides_no, 0.75, na.rm = TRUE) + 1.5 * IQR_suicides
outliers_suicides <- master %>%
filter(suicides_no < lower_bound | suicides_no > upper_bound)
reactable(outliers_suicides, searchable = TRUE, pagination = TRUE, defaultPageSize = 10)
En las gráficas presentadas se muestra la evolución de tres indicadores clave en Colombia a lo largo de los años: la tasa de suicidios por cada 100.000 habitantes, el PIB per cápita y el Índice de Desarrollo Humano (IDH).
Evolución de Suicidios por cada 100.000 habitantesEvolución del PIB per cápitaEvolución del Índice de Desarrollo Humano (IDH)library(dplyr)
library(ggplot2)
library(gridExtra)
master_col <- master %>%
filter(country == "Colombia")
p1 <- ggplot(master_col, aes(x = year, y = `suicides/100k pop`)) +
geom_line(color = "#0059b3", size = 1) +
geom_point(color = "blue", size = 2) +
labs(title = "Evolución de Suicidios por cada 100.000 habitantes en Colombia",
x = "Año",
y = "Suicidios por cada 100.000 hab") +
theme_minimal() +
theme(axis.title.y = element_text(size = 10))
p2 <- ggplot(master_col, aes(x = year, y = `gdp_per_capita ($)`)) +
geom_line(color = "#0059b3", size = 1) +
geom_point(color = "#66b3ff", size = 2) +
labs(title = "Evolución del PIB per cápita en Colombia",
x = "Año",
y = "PIB per cápita ($)") +
theme_minimal() +
theme(axis.title.y = element_text(size = 10))
p3 <- ggplot(master_col, aes(x = year, y = `HDI for year`)) +
geom_line(color = "lightblue", size = 1) +
geom_point(color = "blue", size = 2) +
labs(title = "Evolución del IDH en Colombia",
x = "Año",
y = "IDH") +
theme_minimal() +
theme(axis.title.y = element_text(size = 10))
grid.arrange(p1, p2, p3, ncol = 1)
Evolución de Suicidios por cada 100.000 habitantes en ColombiaLa tendencia de los suicidios por cada 100.000 habitantes en Colombia para las mujeres muestra un ligero aumento a lo largo del tiempo, especialmente a partir de la década de 1990. Sin embargo, la tasa de suicidios se mantiene en general por debajo de 10 suicidios por cada 100.000 habitantes, con fluctuaciones menores.
Contraste: Los hombres en Colombia presentan tasas de suicidio consistentemente más altas que las mujeres. La diferencia en la tasa es notable, con los hombres alcanzando hasta el doble de la tasa de las mujeres en algunos años.
Evolución del PIB per cápita en ColombiaEl PIB per cápita para las mujeres en Colombia muestra una tendencia ascendente a lo largo de las décadas, con un crecimiento más pronunciado a partir del año 2000. Este aumento refleja una mejora en la economía a nivel nacional que afecta tanto a mujeres como a hombres.
Contraste: No se observa un contraste significativo en el PIB per cápita entre géneros, ya que ambos siguen tendencias muy similares.
Evolución del IDH en ColombiaLa evolución del IDH para las mujeres en Colombia muestra fluctuaciones, especialmente en los años 1980 y 1990. Sin embargo, a partir de 1995, el IDH se estabiliza con una tendencia al alza gradual, reflejando mejoras en indicadores clave como la salud, educación y nivel de vida.
Contraste: Al igual que con el PIB per cápita, no se observa un contraste significativo en el IDH entre géneros. Ambos muestran tendencias similares, lo que sugiere que los indicadores de desarrollo humano han mejorado de manera equitativa para hombres y mujeres en Colombia.
library(dplyr)
library(ggplot2)
library(gridExtra)
master_col_female <- master_col %>%
filter(sex == "female")
p1_col_female <- ggplot(master_col_female, aes(x = year, y = `suicides/100k pop`)) +
geom_line(size = 1, color = "lightblue") +
geom_point(size = 2, color = "blue") +
labs(title = "Evolución de Suicidios por cada 100.000 habitantes para Mujeres en Colombia",
x = "Año",
y = "Suicidios por cada 100.000 hab") +
theme_minimal()
p2_col_female <- ggplot(master_col_female, aes(x = year, y = `gdp_per_capita ($)`)) +
geom_line(size = 1, color = "blue") +
geom_point(size = 2, color = "lightblue") +
labs(title = "Evolución del PIB per cápita para Mujeres en Colombia",
x = "Año",
y = "PIB per cápita ($)") +
theme_minimal()
p3_col_female <- ggplot(master_col_female, aes(x = year, y = `HDI for year`)) +
geom_line(size = 1, color = "lightblue") +
geom_point(size = 2, color = "blue") +
labs(title = "Evolución del IDH para Mujeres en Colombia",
x = "Año",
y = "IDH") +
theme_minimal()
grid.arrange(p1_col_female, p2_col_female, p3_col_female, ncol = 1)
Evolución de Suicidios por cada 100.000 habitantes en ColombiaLa tendencia para los hombres en Colombia es similar en cuanto al patrón general de aumento, pero con una diferencia significativa en las tasas. La tasa de suicidios para los hombres es considerablemente mayor, superando los 15 suicidios por cada 100.000 habitantes en varios años, y mostrando picos que llegan a alrededor de 20 suicidios por cada 100.000 habitantes.
Contraste: Los hombres en Colombia presentan tasas de suicidio consistentemente más altas que las mujeres. La diferencia en la tasa es notable, con los hombres alcanzando hasta el doble de la tasa de las mujeres en algunos años.
Evolución del PIB per cápita en ColombiaEl PIB per cápita para los hombres sigue una tendencia casi idéntica a la de las mujeres, lo que indica que los cambios en la economía del país afectan de manera similar a ambos géneros. No hay diferencias significativas entre los géneros en esta métrica.
Contraste: No se observa un contraste significativo en el PIB per cápita entre géneros, ya que ambos siguen tendencias muy similares.
Evolución del IDH en ColombiaLa evolución del IDH para los hombres en Colombia es casi idéntica a la de las mujeres, con las mismas fluctuaciones y una tendencia general de mejora y estabilización hacia los últimos años.
Contraste: Al igual que con el PIB per cápita, no se observa un contraste significativo en el IDH entre géneros. Ambos muestran tendencias similares, lo que sugiere que los indicadores de desarrollo humano han mejorado de manera equitativa para hombres y mujeres en Colombia.
master_col_male <- master_col %>%
filter(sex == "male")
p1_col_male <- ggplot(master_col_male, aes(x = year, y = `suicides/100k pop`)) +
geom_line(size = 1, color = "blue") +
geom_point(size = 2, color = "lightblue") +
labs(title = "Evolución de Suicidios por cada 100.000 habitantes para Hombres en Colombia",
x = "Año",
y = "Suicidios por cada 100.000 hab") +
theme_minimal()
p2_col_male <- ggplot(master_col_male, aes(x = year, y = `gdp_per_capita ($)`)) +
geom_line(size = 1, color = "lightblue") +
geom_point(size = 2, color = "blue") +
labs(title = "Evolución del PIB per cápita para Hombres en Colombia",
x = "Año",
y = "PIB per cápita ($)") +
theme_minimal()
p3_col_male <- ggplot(master_col_male, aes(x = year, y = `HDI for year`)) +
geom_line(size = 1, color = "blue") +
geom_point(size = 2, color = "lightblue") +
labs(title = "Evolución del IDH para Hombres en Colombia",
x = "Año",
y = "IDH") +
theme_minimal()
grid.arrange(p1_col_male, p2_col_male, p3_col_male, ncol = 1)
colombia_suicides_age <- master %>%
filter(country == "Colombia") %>%
group_by(year, age) %>%
summarise(avg_suicides = mean(`suicides/100k pop`, na.rm = TRUE))
ggplot(colombia_suicides_age, aes(x = year, y = avg_suicides, color = age)) +
geom_line() +
geom_point() +
labs(title = "Evolución de Suicidios por cada 100.000 habitantes en Colombia por Grupo de Edad",
x = "Año", y = "Suicidios por cada 100.000 hab") +
theme_minimal()
Aumento Progresivo: Desde 1985 hasta 2010, hay un
aumento constante en el PIB per cápita para el grupo de 75+ años. El
crecimiento se vuelve más pronunciado después de 2000, alcanzando un
pico cercano a 2010.Pico y Disminución: Después del año 2010, el PIB per
cápita alcanza un máximo, seguido de una leve disminución en los últimos
años mostrados en la gráfica.colombia_gdp_age <- master %>%
filter(country == "Colombia") %>%
group_by(year, age) %>%
summarise(avg_gdp = mean(`gdp_per_capita ($)`, na.rm = TRUE))
ggplot(colombia_gdp_age, aes(x = year, y = avg_gdp, color = age)) +
geom_line() +
geom_point() +
labs(title = "Evolución del PIB per cápita en Colombia por Grupo de Edad",
x = "Año", y = "PIB per cápita ($)") +
theme_minimal()
A lo largo de los años, el IDH para el grupo de 75+ años ha mantenido un valor alto en Colombia, aunque las caídas abruptas en ciertos años merecen atención para comprender los factores subyacentes que causaron estas disminuciones temporales. La estabilidad observada después de 2005 sugiere mejoras en el desarrollo humano para este grupo, con un ligero aumento hacia el final del período analizado.
colombia_hdi_age <- master %>%
filter(country == "Colombia") %>%
group_by(year, age) %>%
summarise(avg_hdi = mean(`HDI for year`, na.rm = TRUE))
ggplot(colombia_hdi_age, aes(x = year, y = avg_hdi, color = age)) +
geom_line() +
geom_point() +
labs(title = "Evolución del IDH en Colombia por Grupo de Edad",
x = "Año", y = "IDH") +
theme_minimal()
En las gráficas presentadas se muestra la evolución de tres indicadores clave en Estados Unidos a lo largo de los años: la tasa de suicidios por cada 100.000 habitantes, el PIB per cápita y el Índice de Desarrollo Humano (IDH).
Evolución de Suicidios por cada 100.000 habitantesEvolución del PIB per cápitaEvolución del Índice de Desarrollo Humano (IDH)library(dplyr)
library(ggplot2)
library(gridExtra)
master_eu <- master %>%
filter(country == "United States")
g1 <- ggplot(master_eu, aes(x = year, y = `suicides/100k pop`)) +
geom_line(color = "#0059b3", size = 1) +
geom_point(color = "blue", size = 2) +
labs(title = "Evolución de Suicidios por cada 100.000 habitantes en
United States",
x = "Año",
y = "Suicidios por cada 100.000 hab") +
theme_minimal() +
theme(axis.title.y = element_text(size = 10))
g2 <- ggplot(master_eu, aes(x = year, y = `gdp_per_capita ($)`)) +
geom_line(color = "#0059b3", size = 1) +
geom_point(color = "#66b3ff", size = 2) +
labs(title = "Evolución del PIB per cápita en
United States",
x = "Año",
y = "PIB per cápita ($)") +
theme_minimal() +
theme(axis.title.y = element_text(size = 10))
g3 <- ggplot(master_eu, aes(x = year, y = `HDI for year`)) +
geom_line(color = "lightblue", size = 1) +
geom_point(color = "blue", size = 2) +
labs(title = "Evolución del IDH en
United States",
x = "Año",
y = "IDH") +
theme_minimal() +
theme(axis.title.y = element_text(size = 10))
grid.arrange(g1, g2, g3, ncol = 1)
Evolución de Suicidios por cada 100.000 habitantes en Estados UnidosEn Estados Unidos, la tendencia de suicidios por cada 100.000 habitantes para las mujeres muestra una estabilidad a lo largo del tiempo, con tasas generalmente oscilando entre 4 y 6 suicidios por cada 100.000 habitantes. Hay una ligera tendencia al alza, pero la variación anual no es significativa.
Contraste: Similar a lo observado en Colombia, las tasas de suicidio para los hombres en Estados Unidos son mucho más altas que para las mujeres, con los hombres presentando hasta cuatro veces la tasa de suicidios en comparación con las mujeres.
Evolución del PIB per cápita en Estados UnidosEl PIB per cápita para las mujeres en Estados Unidos muestra una tendencia constante al alza, sin fluctuaciones significativas. Este crecimiento es sostenido y refleja una mejora económica continua en el país.
No se observan diferencias significativas en la evolución del PIB per cápita entre géneros, indicando que los cambios económicos han impactado de manera similar a ambos géneros en Estados Unidos.
Evolución del IDH en Estados UnidosLa evolución del IDH para las mujeres en Estados Unidos muestra una tendencia general de estabilidad en niveles altos, con algunas fluctuaciones menores a lo largo de los años. A partir del año 2000, el IDH se estabiliza en torno a 0.9.
Al igual que con el PIB per cápita, no hay diferencias significativas en la evolución del IDH entre hombres y mujeres en Estados Unidos. Ambos géneros muestran una tendencia de estabilidad en los niveles de desarrollo humano.
master_eu_female <- master_eu %>%
filter(sex == "female")
p1_eu_female <- ggplot(master_eu_female, aes(x = year, y = `suicides/100k pop`)) +
geom_line(size = 1, color = "blue") +
geom_point(size = 2, color = "lightblue") +
labs(title = "Evolución de Suicidios por cada 100.000 habitantes para Mujeres en Estados Unidos",
x = "Año",
y = "Suicidios por cada 100.000 hab") +
theme_minimal()
p2_eu_female <- ggplot(master_eu_female, aes(x = year, y = `gdp_per_capita ($)`)) +
geom_line(size = 1, color = "lightblue") +
geom_point(size = 2, color = "blue") +
labs(title = "Evolución del PIB per cápita para Mujeres en Estados Unidos",
x = "Año",
y = "PIB per cápita ($)") +
theme_minimal()
p3_eu_female <- ggplot(master_eu_female, aes(x = year, y = `HDI for year`)) +
geom_line(size = 1, color = "blue") +
geom_point(size = 2, color = "lightblue") +
labs(title = "Evolución del IDH para Mujeres en Estados Unidos",
x = "Año",
y = "IDH") +
theme_minimal()
grid.arrange(p1_eu_female, p2_eu_female, p3_eu_female, ncol = 1)
Evolución de Suicidios por cada 100.000 habitantes en Estados UnidosPara los hombres, la tasa de suicidios es considerablemente más alta, con valores que fluctúan entre 15 y 25 suicidios por cada 100.000 habitantes, con una tendencia a mantenerse en este rango a lo largo del tiempo.
Similar a lo observado en Colombia, las tasas de suicidio para los hombres en Estados Unidos son mucho más altas que para las mujeres, con los hombres presentando hasta cuatro veces la tasa de suicidios en comparación con las mujeres.
Evolución del PIB per cápita en Estados UnidosLa tendencia del PIB per cápita para los hombres es prácticamente idéntica a la de las mujeres, con un crecimiento continuo y sostenido sin diferencias notables entre los géneros.
No se observan diferencias significativas en la evolución del PIB per cápita entre géneros, indicando que los cambios económicos han impactado de manera similar a ambos géneros en Estados Unidos.
Evolución del IDH en Estados UnidosLa tendencia del IDH para los hombres sigue un patrón muy similar al de las mujeres, con estabilidad en niveles altos y pequeñas fluctuaciones en los años previos al 2000, seguido de una estabilización en niveles altos.
Al igual que con el PIB per cápita, no hay diferencias significativas en la evolución del IDH entre hombres y mujeres en Estados Unidos. Ambos géneros muestran una tendencia de estabilidad en los niveles de desarrollo humano.
master_eu_male <- master_eu %>%
filter(sex == "male")
p1_eu_male <- ggplot(master_eu_male, aes(x = year, y = `suicides/100k pop`)) +
geom_line(size = 1, color = "blue") +
geom_point(size = 2, color = "blue") +
labs(title = "Evolución de Suicidios por cada 100.000 habitantes para Hombres en Estados Unidos",
x = "Año",
y = "Suicidios por cada 100.000 hab") +
theme_minimal()
p2_eu_male <- ggplot(master_eu_male, aes(x = year, y = `gdp_per_capita ($)`)) +
geom_line(size = 1, color = "blue") +
geom_point(size = 2, color = "blue") +
labs(title = "Evolución del PIB per cápita para Hombres en Estados Unidos",
x = "Año",
y = "PIB per cápita ($)") +
theme_minimal()
p3_eu_male <- ggplot(master_eu_male, aes(x = year, y = `HDI for year`)) +
geom_line(size = 1, color = "blue") +
geom_point(size = 2, color = "blue") +
labs(title = "Evolución del IDH para Hombres en Estados Unidos",
x = "Año",
y = "IDH") +
theme_minimal()
grid.arrange(p1_eu_male, p2_eu_male, p3_eu_male, ncol = 1)
Grupo de edad 75+ años: Este grupo presenta las
tasas de suicidio más altas a lo largo del período, aunque se observa
una tendencia decreciente desde finales de los años 80 hasta alrededor
del 2000, con una ligera estabilización y un leve aumento después del
2000.
Grupos de edad 55-74 y 35-54 años: Estos grupos
muestran una tasa de suicidio moderadamente alta, con una tendencia a la
baja en los años 90, seguida de un leve aumento y estabilización en los
años posteriores.
Grupos de edad 25-34 y 15-24 años: Estos grupos
tienen tasas de suicidio más bajas en comparación con los grupos
mayores. Sin embargo, ambos grupos presentan una tendencia relativamente
estable con ligeras fluctuaciones a lo largo del tiempo.
Grupo de edad 5-14 años: Este grupo presenta las
tasas más bajas de suicidios, con una línea casi plana y muy por debajo
de los demás grupos, lo que indica una incidencia muy baja en
comparación con los otros grupos de edad.
master_eu <- master %>% filter(country == "United States")
eu_data_age <- master_eu %>%
group_by(year, age) %>%
summarize(
avg_suicides = mean(`suicides/100k pop`, na.rm = TRUE),
avg_gdp = mean(`gdp_per_capita ($)`, na.rm = TRUE),
avg_hdi = mean(`HDI for year`, na.rm = TRUE)
)
ggplot(eu_data_age, aes(x = year, y = avg_suicides, color = age, group = age)) +
geom_line() +
geom_point() +
labs(title = "Evolución de Suicidios por cada 100.000 habitantes en Estados Unidos por Grupo de Edad",
x = "Año",
y = "Suicidios por cada 100.000 hab",
color = "Grupo de Edad") +
theme_minimal()
La gráfica muestra un crecimiento sostenido y constante del PIB per cápita en Estados Unidos a lo largo del tiempo. Desde aproximadamente 1985 hasta 2015, el PIB per cápita aumentó significativamente, pasando de alrededor de $20,000 a más de $60,000. Aunque la tendencia general es ascendente, se pueden observar pequeñas fluctuaciones alrededor del año 2000 y de nuevo alrededor de 2008, coincidiendo con la burbuja tecnológica y la crisis financiera, respectivamente
ggplot(eu_data_age, aes(x = year, y = avg_gdp, color = age, group = age)) +
geom_line() +
geom_point() +
labs(title = "Evolución del PIB per cápita en Estados Unidos por Grupo de Edad",
x = "Año",
y = "PIB per cápita ($)",
color = "Grupo de Edad") +
theme_minimal()
El IDH en Estados Unidos muestra un aumento constante y significativo a lo largo del tiempo, comenzando desde valores cercanos a 0.80 en 1985 hasta alcanzar valores superiores a 0.92 en 2015. Se observan picos notables en los valores del IDH en diferentes años, seguidos de caídas abruptas, especialmente antes del año 2000. Estos picos podrían estar relacionados con mejoras puntuales en la salud, educación o ingreso per cápita, que son los componentes del IDH. A partir de 2010, el IDH se mantiene en valores superiores a 0.90, lo que refleja un alto nivel de desarrollo humano en Estados Unidos en los años recientes.
ggplot(eu_data_age, aes(x = year, y = avg_hdi, color = age, group = age)) +
geom_line() +
geom_point() +
labs(title = "Evolución del IDH en Estados Unidos por Grupo de Edad",
x = "Año",
y = "IDH",
color = "Grupo de Edad") +
theme_minimal()
Accidentalidad_en_Barranquilla.csv.table para explorar la base de
datos.method:method="pmm"method="norm.predict"method="norm.nob"method="norm"Observamos el conjunto de datos inical correspondiente a los
registros de accidentes en la ciudad de Barranquilla, donde tenemos 11
variables para los 25610 registros de la información con presencia de
datos faltantes NA en columnas como
cantidad de heridos en acidente,
cantidad de muertos en accidente. Posterior a ello notamos
de acuerdo al nombre de cada variable que hay 6 de tipo caracter, 4 de
tipo numérico y 1 fecha.
library(readr)
ab <- read_csv("Accidentalidad_en_Barranquilla_20240831.csv")
## Rows: 25610 Columns: 11
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (6): HORA_ACCIDENTE, GRAVEDAD_ACCIDENTE, CLASE_ACCIDENTE, SITIO_EXACTO_...
## dbl (4): CANT_HERIDOS_EN _SITIO_ACCIDENTE, CANT_MUERTOS_EN _SITIO_ACCIDENTE...
## dttm (1): FECHA_ACCIDENTE
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
str(ab)
## spc_tbl_ [25,610 × 11] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ FECHA_ACCIDENTE : POSIXct[1:25610], format: "2018-01-01" "2018-01-01" ...
## $ HORA_ACCIDENTE : chr [1:25610] "01:30:00:am" "02:00:00:pm" "04:00:00:am" "04:30:00:am" ...
## $ GRAVEDAD_ACCIDENTE : chr [1:25610] "Con heridos" "Solo daños" "Solo daños" "Solo daños" ...
## $ CLASE_ACCIDENTE : chr [1:25610] "Atropello" "Choque" "Choque" "Choque" ...
## $ SITIO_EXACTO_ACCIDENTE : chr [1:25610] "CL 87 9H 24" "CL 110 CR 46" "AV CIRCUNVALAR CR 9G" "CLLE 72 CRA 29" ...
## $ CANT_HERIDOS_EN _SITIO_ACCIDENTE: num [1:25610] 1 NA NA NA NA 3 1 NA NA NA ...
## $ CANT_MUERTOS_EN _SITIO_ACCIDENTE: num [1:25610] NA NA NA NA NA NA NA NA NA NA ...
## $ CANTIDAD_ACCIDENTES : num [1:25610] 1 1 1 1 1 1 1 1 1 1 ...
## $ AÑO_ACCIDENTE : num [1:25610] 2018 2018 2018 2018 2018 ...
## $ MES_ACCIDENTE : chr [1:25610] "January" "January" "January" "January" ...
## $ DIA_ACCIDENTE : chr [1:25610] "Mon" "Mon" "Mon" "Mon" ...
## - attr(*, "spec")=
## .. cols(
## .. FECHA_ACCIDENTE = col_datetime(format = ""),
## .. HORA_ACCIDENTE = col_character(),
## .. GRAVEDAD_ACCIDENTE = col_character(),
## .. CLASE_ACCIDENTE = col_character(),
## .. SITIO_EXACTO_ACCIDENTE = col_character(),
## .. `CANT_HERIDOS_EN _SITIO_ACCIDENTE` = col_double(),
## .. `CANT_MUERTOS_EN _SITIO_ACCIDENTE` = col_double(),
## .. CANTIDAD_ACCIDENTES = col_double(),
## .. AÑO_ACCIDENTE = col_double(),
## .. MES_ACCIDENTE = col_character(),
## .. DIA_ACCIDENTE = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
dim(ab)
## [1] 25610 11
Con base a los nombres de las variables podemos identificar cuáles son categóricas y cuáles son numéricas.
names(ab)
## [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"
Observamos de manera gráfica a través de una tabla la información del
conjunto de datos, en la cual se evidencia la presencia de datos
faltantes en la columna Cantidad de heridos para varias de
las observaciones.
library(knitr)
reactable(ab, searchable = TRUE, pagination = TRUE, defaultPageSize = 10)
Cantidad de heridos en el sitio del accidente (CANT_HERIDOS_EN_SITIO_ACCIDENTE):
El número de heridos por accidente varía considerablemente, con un rango
que va desde 1 hasta 42 heridos en un solo accidente. La mediana,
situada en 1, indica que en al menos la mitad de los accidentes se
reportó un solo herido. Sin embargo, la media de 1.472 sugiere que hay
accidentes con un número de heridos significativamente mayor, lo que
podría señalar eventos con múltiples vehículos o situaciones de alta
gravedad.
Cantidad de muertos en el sitio del accidente (CANT_MUERTOS_EN_SITIO_ACCIDENTE):
Similar a la cantidad de heridos, el número de muertos por accidente
muestra variabilidad, aunque en menor medida. La mayoría de los
accidentes que resultan en fallecimientos tienden a tener solo un
muerto, como lo indica tanto la mediana como la media cercanas a 1. Sin
embargo, existen registros de accidentes con hasta 2
fallecidos.
summary(ab)
## 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
##
##
##
##
Distribución de accidentes por día de la semana:
martes es el día con mayor cantidad de accidentes,
alcanzando un máximo de 4,009 accidentes, lo que representa el 15.65%
del total.domingo presenta el mínimo de accidentes con 2,577
registros, representando el 10.06%.library(kableExtra)
library(dplyr)
library(knitr)
categorical_vars <- ab %>% select(where(is.character)) %>% colnames()
for(var in categorical_vars) {
freq_table <- ab %>%
group_by_at(var) %>%
summarise(Count = n()) %>%
mutate(Relative_Frequency = round(Count / sum(Count) * 100, 2)) %>%
arrange(desc(Count))
}
reactable(freq_table, searchable = TRUE, pagination = TRUE, defaultPageSize = 10)
Rangos de curtosis
Platicúrtica (Colas delgadas, menos outliers): Curtosis
< 3Mesocúrtica (Distribución normal, colas moderadas:
Curtosis igual o cercana a 3.Leptocúrtica (Colas extremadamente pesadas, muchos outliers:
Curtosis > 3library(e1071)
skewness <- apply(ab[,sapply(ab, is.numeric)], 2, skewness, na.rm = TRUE)
kurtosis <- apply(ab[,sapply(ab, is.numeric)], 2, kurtosis, na.rm = TRUE)
data.frame(Variable = names(skewness), Asimetría = skewness, Curtosis = kurtosis)
## Variable Asimetría
## CANT_HERIDOS_EN _SITIO_ACCIDENTE CANT_HERIDOS_EN _SITIO_ACCIDENTE 10.066935
## CANT_MUERTOS_EN _SITIO_ACCIDENTE CANT_MUERTOS_EN _SITIO_ACCIDENTE 4.973948
## CANTIDAD_ACCIDENTES CANTIDAD_ACCIDENTES 71.542998
## AÑO_ACCIDENTE AÑO_ACCIDENTE 0.394913
## Curtosis
## CANT_HERIDOS_EN _SITIO_ACCIDENTE 217.2398546
## CANT_MUERTOS_EN _SITIO_ACCIDENTE 22.8308039
## CANTIDAD_ACCIDENTES 5116.6003593
## AÑO_ACCIDENTE -0.9050988
CANT_HERIDOS_EN_SITIO_ACCIDENTE (Cantidad de heridos en sitio del accidente):CANT_MUERTOS_EN_SITIO_ACCIDENTE (Cantidad de muertos en sitio del accidente):CANTIDAD_ACCIDENTES (Cantidad de accidentes):NA'sSe realiza el conteo de datos faltantes por cada variable y se evidencia la presencia de NA en cantidad de heridos y cantidad de muertos en sitio del accidente. lo que equivale a cerca del 15% de toda nuestra base de datos.
faltantes <- colSums(is.na(ab))
faltantes
## 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
library(VIM)
aggr(ab,
numbers = TRUE,
col = c("navyblue", "red"),
cex.axis = 0.7,
gap = 3,
ylab = c("Proportion of missingness", "Missingness pattern"),
labels = names(ab),
cex.lab = 1.2,
axes = TRUE)
CANT_MUERTOS_EN_SITIO_ACCIDENTE: Esta variable
presenta el mayor porcentaje de datos faltantes, con aproximadamente un
100% de valores faltantes. Esto indica que prácticamente no se cuenta
con información sobre la cantidad de muertos en el sitio del accidente
en este conjunto de datos.
CANT_HERIDOS_EN_SITIO_ACCIDENTE: La segunda variable
con más datos faltantes, con un poco más del 50% de sus valores
faltantes. Esto significa que la mitad de los registros no incluyen
información sobre el número de heridos en el sitio del
accidente.
library(naniar)
gg_miss_var(ab, show_pct = TRUE)
Se desea analizar la distribución de los datos y observar su comportamiento para determinar algún proceso o método para la imputación de los datos en las variables donde haya observaciones faltantes, luego se realizan pruebas analíticas para confirmas si las muestras provienen de una distribución normal o se debe utilizar otro método no paramétrico para la imputación de datos.
# library(gridExtra)
datos_numericos <- ab[, c("CANT_HERIDOS_EN _SITIO_ACCIDENTE",
"CANT_MUERTOS_EN _SITIO_ACCIDENTE",
"CANTIDAD_ACCIDENTES")]
hist_heridos <- ggplot(ab, aes(x = `CANT_HERIDOS_EN _SITIO_ACCIDENTE`)) +
geom_histogram(binwidth = 1, fill = "lightblue", color = "black") +
ggtitle("Distribución de Heridos") +
xlab("Distribución de Heridos")+
ylab("Número de Heridos")
theme_minimal()
bar_muertos <- ggplot(ab, aes(x = as.factor(`CANT_MUERTOS_EN _SITIO_ACCIDENTE`))) +
geom_bar(fill = "darkblue", color = "black") +
ggtitle("Conteo de Muertos") +
xlab("Número de Muertos en Accidente") +
ylab("Frecuencia") +
theme_minimal()
bar_accidentes <- ggplot(ab, aes(x = as.factor(`CANTIDAD_ACCIDENTES`))) +
geom_bar(fill = "blue", color = "black") +
ggtitle("Conteo de Accidentes") +
xlab("Cantidad de Accidentes") +
ylab("Frecuencia") +
theme_minimal()
grid.arrange(hist_heridos, bar_muertos, bar_accidentes, ncol = 3)
Verifiquemos la normalidad de la variable
CANT_HERIDOS_EN_SITIO_ACCIDENTE en el conjunto de datos. En
un Q-Q plot, si los puntos siguen aproximadamente una línea recta (la
línea roja), se puede concluir que la variable sigue una distribución
normal. Se observa que los puntos se desvían significativamente de la
línea recta, especialmente en los extremos (quantiles más altos y más
bajos). Esto indica que la distribución de la variable
CANT_HERIDOS_EN_SITIO_ACCIDENTE no sigue una distribución
normal.
datos_numericos <- ab[, c("CANT_HERIDOS_EN _SITIO_ACCIDENTE",
"CANT_MUERTOS_EN _SITIO_ACCIDENTE",
"CANTIDAD_ACCIDENTES")]
qqnorm(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`)
qqline(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, col = "red")
SE realizará el proceso de imputación de datos sobre las variables
CANT_HERIDOS_EN _SITIO_ACCIDENTE y
CANT_MUERTOS_EN _SITIO_ACCIDENTE que presentan una alta
tasa de datos faltantes y adicionalemente, no poseen una distribución
específica, por lo que dada su distribución no especificada el método
más adecuado es Predictive Mean Matching o pmm. Se realizó
la imputación de datos con base a la mediana de los datos y a través del
gráfico de porcentaje para datos faltantes no se evidencia la presencia
de los mismo en nuestro conjunto de datos.
# install.package("cli") no sirve la libreria mice
# install.package("mice")
# library(cli)
# library(mice)
# Imputación por la media para las dos columnas específicas, aproximando al entero más cercano
ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`[is.na(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`)] <- round(mean(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, na.rm = TRUE))
ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`[is.na(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`)] <- round(median(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, na.rm = TRUE))
library(naniar)
gg_miss_var(ab, show_pct = TRUE)
library(VIM)
aggr(ab,
numbers = TRUE,
col = c("navyblue", "red"),
cex.axis = 0.7,
gap = 3,
ylab = c("Proportion of missingness", "Missingness pattern"),
labels = names(ab),
cex.lab = 1.2,
axes = TRUE)
hist_heridos <- ggplot(ab, aes(x = `CANT_HERIDOS_EN _SITIO_ACCIDENTE`)) +
geom_histogram(binwidth = 1, fill = "lightblue", color = "black") +
ggtitle("Distribución de Heridos") +
xlab("Distribución de Heridos")+
ylab("Número de Heridos")
theme_minimal()
bar_muertos <- ggplot(ab, aes(x = as.factor(`CANT_MUERTOS_EN _SITIO_ACCIDENTE`))) +
geom_bar(fill = "darkblue", color = "black") +
ggtitle("Conteo de Muertos") +
xlab("Número de Muertos en Accidente") +
ylab("Frecuencia") +
theme_minimal()
bar_accidentes <- ggplot(ab, aes(x = as.factor(`CANTIDAD_ACCIDENTES`))) +
geom_bar(fill = "blue", color = "black") +
ggtitle("Conteo de Accidentes") +
xlab("Cantidad de Accidentes") +
ylab("Frecuencia") +
theme_minimal()
grid.arrange(hist_heridos, bar_muertos, bar_accidentes, ncol = 3)
tablePosterior al proceso de imputación en datos faltantes, se
visualizarán las variables mediante filtros para analizar el
comportamiento de nuestros datos y evidenciar la presencia u ausencia de
datos atípicos. Primero analizaremos a través table la
proporción o relación entre la gravedad de los accidentes, la clase del
accidentes durante los diferentes meses del año.
Accidentes con heridos:Accidentes con muertos:Accidentes con solo daños:library(reactable)
meses_ordenados <- c("January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December")
table_multiple_df <- as.data.frame(table(ab$GRAVEDAD_ACCIDENTE, ab$CLASE_ACCIDENTE, factor(ab$MES_ACCIDENTE, levels = meses_ordenados)))
reactable(
table_multiple_df,
pagination = TRUE, # Habilitar paginación
searchable = TRUE, # Habilitar búsqueda
striped = TRUE, # Añadir bandas a las filas
highlight = TRUE, # Resaltar las filas al pasar el cursor
columns = list(
Var1 = colDef(name = "Gravedad del Accidente"),
Var2 = colDef(name = "Clase de Accidente"),
Var3 = colDef(name = "Mes del Accidente"),
Freq = colDef(name = "Frecuencia")
),
defaultPageSize = 10, # Tamaño de página por defecto
showPageSizeOptions = TRUE, # Mostrar opciones para cambiar el tamaño de la página
pageSizeOptions = c(5, 10, 20), # Opciones de tamaño de página
bordered = TRUE, # Bordes en la tabla
compact = TRUE # Compactar el espacio en la tabla
)
Heridos:Muertos:library(dplyr)
atropello_weekend <- ab %>%
filter(CLASE_ACCIDENTE == "Atropello" & DIA_ACCIDENTE %in% c("Sat", "Sun"))
tabla_atropello <- table(atropello_weekend$GRAVEDAD_ACCIDENTE,
atropello_weekend$CANTIDAD_ACCIDENTES,
factor(atropello_weekend$MES_ACCIDENTE, levels = meses_ordenados))
tabla_atropello_df <- as.data.frame(tabla_atropello)
reactable(tabla_atropello_df,
columns = list(
Var1 = colDef(name = "Gravedad del Accidente"),
Var2 = colDef(name = "Cantidad de Accidentes"),
Var3 = colDef(name = "Mes del Accidente"),
Freq = colDef(name = "Frecuencia")
),
pagination = TRUE,
defaultPageSize = 10,
bordered = TRUE,
highlight = TRUE,
searchable = TRUE)
Los accidentes tipo Choque que ocurren en los días
laborables (lunes a viernes) en Barranquilla son en su mayoría
incidentes que no involucran heridos ni muertes, predominando los casos
categorizados como “Solo daños”. La gravedad de estos accidentes es
generalmente baja, lo que sugiere que aunque los choques son comunes, no
resultan en eventos de alta gravedad.
library(dplyr)
choque_weekday <- ab %>%
filter(CLASE_ACCIDENTE == "Choque" & DIA_ACCIDENTE %in% c("Mon", "Tue", "Wed", "Thu", "Fri"))
reactable(choque_weekday,
columns = list(
GRAVEDAD_ACCIDENTE = colDef(name = "Gravedad del Accidente"),
CANTIDAD_ACCIDENTES = colDef(name = "Cantidad de Accidentes"),
MES_ACCIDENTE = colDef(name = "Mes del Accidente"),
DIA_ACCIDENTE = colDef(name = "Día del Accidente"),
`CANT_HERIDOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Heridos"),
`CANT_MUERTOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Muertos")
),
pagination = TRUE,
defaultPageSize = 10,
bordered = TRUE,
highlight = TRUE,
searchable = TRUE)
library(dplyr)
heridos_mayores <- ab %>%
filter(`CANT_HERIDOS_EN _SITIO_ACCIDENTE` > 10)
reactable(heridos_mayores,
columns = list(
GRAVEDAD_ACCIDENTE = colDef(name = "Gravedad del Accidente"),
CANTIDAD_ACCIDENTES = colDef(name = "Cantidad de Accidentes"),
MES_ACCIDENTE = colDef(name = "Mes del Accidente"),
DIA_ACCIDENTE = colDef(name = "Día del Accidente"),
`CANT_HERIDOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Heridos"),
`CANT_MUERTOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Muertos")
),
pagination = TRUE,
defaultPageSize = 10,
bordered = TRUE,
highlight = TRUE,
searchable = TRUE)
Los accidentes con más de un muerto en Barranquilla representan eventos de alta gravedad y mortalidad, con un patrón recurrente de 2 muertos por evento. Estos accidentes también suelen tener varios heridos, lo que refuerza la necesidad de implementar medidas de seguridad vial más estrictas y rápidas intervenciones en las áreas más afectadas.
library(dplyr)
muertos_mayores <- ab %>%
filter(`CANT_MUERTOS_EN _SITIO_ACCIDENTE` > 1)
reactable(muertos_mayores,
columns = list(
GRAVEDAD_ACCIDENTE = colDef(name = "Gravedad del Accidente"),
CANTIDAD_ACCIDENTES = colDef(name = "Cantidad de Accidentes"),
MES_ACCIDENTE = colDef(name = "Mes del Accidente"),
DIA_ACCIDENTE = colDef(name = "Día del Accidente"),
`CANT_HERIDOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Heridos"),
`CANT_MUERTOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Muertos")
),
pagination = TRUE,
defaultPageSize = 10,
bordered = TRUE,
highlight = TRUE,
searchable = TRUE)
Los datos incluyen tanto accidentes con “Solo daños” como con “Con heridos”, indicando que aunque hay lesiones en algunos casos, en otros solo se reportaron daños materiales y todos los registros incluyen 1 muerto por accidente. La consistencia en el número de heridos y muertos en cada accidente resalta la gravedad de estos eventos y subraya la necesidad de medidas preventivas adicionales, especialmente durante los fines de semana.
library(dplyr)
incendio_weekend <- ab %>%
filter(CLASE_ACCIDENTE == "Incendio" & DIA_ACCIDENTE %in% c("Sat", "Sun"))
reactable(incendio_weekend,
columns = list(
GRAVEDAD_ACCIDENTE = colDef(name = "Gravedad del Accidente"),
CANTIDAD_ACCIDENTES = colDef(name = "Cantidad de Accidentes"),
MES_ACCIDENTE = colDef(name = "Mes del Accidente"),
DIA_ACCIDENTE = colDef(name = "Día del Accidente"),
`CANT_HERIDOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Heridos"),
`CANT_MUERTOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Muertos")
),
pagination = TRUE,
defaultPageSize = 10,
bordered = TRUE,
highlight = TRUE,
searchable = TRUE)
Se decide realizar un análisis o inspección de datos atípicos en las
variables numéricas de nuestro interés, entre las que señalamos,
CANT_HERIDOS_EN _SITIO_ACCIDENTE,
CANT_MUERTOS_EN _SITIO_ACCIDENTE,
CANTIDAD_ACCIDENTES. Se hace una inspección visual a través
de cajas y bigotes y un diagrama de violín.
La mayoría de los datos están agrupados cerca de la línea central del boxplot. Esto sugiere que la mayoría de los accidentes tienen un número bajo de heridos, sin embargo, los valores atípicos están claramente visibles y dispersos en la gráfica, lo que indica la presencia de incidentes extremos en términos del número de heridos. Analizaremos de forma más aumentada estos datos atípicos.
CANT_HERIDOS_EN _SITIO_ACCIDENTElibrary(ggplot2)
library(gridExtra)
ggplot(ab, aes(y = `CANT_HERIDOS_EN _SITIO_ACCIDENTE`)) +
geom_boxplot(fill = "lightblue", color = "black") +
ggtitle("Diagrama de Cajas y Bigotes: Heridos en el Sitio del Accidente") +
xlab("Cantidad de Heridos en el Sitio del Accidente") +
ylab("Número de heridos") +
theme_minimal() +
coord_flip()
ggplot(ab, aes(x = factor(0), y = `CANT_HERIDOS_EN _SITIO_ACCIDENTE`)) +
geom_violin(fill = "navyblue", color = "black") +
ggtitle("Diagrama de Violín: Heridos en el Sitio del Accidente") +
xlab("Cantidad de Heridos en el Sitio del Accidente") +
ylab("Número de heridos") +
theme_minimal() +
coord_flip()
Los valores atípicos se repiten frecuentemente, especialmente el valor “2”, que aparece múltiples veces en los datos. Esto sugiere que el valor “2” se considera atípico en muchas de las observaciones, lo cual puede ser debido a que en la mayoría de los accidentes no se reportan heridos o solo hay uno, por lo que la presencia de más de un herido podría considerarse inusual. La mayoría de los valores atípicos están en el rango bajo, con valores como “2” y “3” siendo los más comunes. Sin embargo, también hay valores notablemente más altos, como “11”, “20”, y “42”, que representan situaciones extremas con un número considerable de heridos.
library(reactable)
out <- boxplot.stats(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`)$out
out_ind <- which(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE` %in% c(out))
atipicos <- ab[out_ind, ]
reactable(atipicos,
columns = list(
FECHA_ACCIDENTE = colDef(name = "Fecha del Accidente"),
HORA_ACCIDENTE = colDef(name = "Hora del Accidente"),
GRAVEDAD_ACCIDENTE = colDef(name = "Gravedad del Accidente"),
CLASE_ACCIDENTE = colDef(name = "Clase del Accidente"),
SITIO_EXACTO_ACCIDENTE = colDef(name = "Sitio Exacto del Accidente"),
`CANT_HERIDOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Heridos"),
`CANT_MUERTOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Muertos"),
`CANTIDAD_ACCIDENTES` = colDef(name = "Cantidad de Accidentes"),
AÑO_ACCIDENTE = colDef(name = "Año del Accidente"),
MES_ACCIDENTE = colDef(name = "Mes del Accidente"),
DIA_ACCIDENTE = colDef(name = "Día del Accidente")
),
pagination = TRUE, # Habilitar la paginación
defaultPageSize = 10, # Tamaño de página predeterminado
bordered = TRUE, # Borde de la tabla
highlight = TRUE, # Resaltar filas al pasar el mouse
searchable = TRUE) # Habilitar búsqueda
Otro método, conocido como filtro de Hampel, consiste en considerar como valores atípicos los valores fuera del intervalo formado por la mediana, más o menos 3 desviaciones absolutas de la mediana:
donde MAD es la desviación absoluta de la mediana y se define como la mediana de las desviaciones absolutas de la mediana \(\hat{X}\) de los datos:
Para este método, primero establecemos los límites del intervalo,
gracias a las funciones median() y mad(). En
este caso, k representa el factor de escala, por defecto, R lo considera
como 1. Para la variable CANT_HERIDOS_EN _SITIO_ACCIDENTE
los valores inferiores a 1 y superiores a 1 se
consideran datos atípicos.
lower_bound <- median(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`) - 3 * mad(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, constant = 1)
cat("La parte inferior de los datos es:", lower_bound, "\n")
## La parte inferior de los datos es: 1
upper_bound <- median(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`) + 3 * mad(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, constant = 1)
cat("La parte superior de los datos es:", upper_bound, "\n")
## La parte superior de los datos es: 1
RosnerLa prueba de Rosner para detectar valores atípicos tiene
las siguientes ventajas. Se utiliza para detectar varios valores
atípicos a la vez (a diferencia de la prueba de Grubbs y Dixon, que debe
realizarse de forma iterativa para detectar múltiples valores atípicos),
y está diseñado para evitar el problema del enmascaramiento, en el que
un valor atípico cercano a otro atípico puede pasar desapercibido. A
diferencia de la prueba de Dixon, hay que tener en cuenta que la prueba
de Rosner es más apropiada cuando el tamaño de la muestra es grande
\((n≥20)\).
library(EnvStats)
test <- rosnerTest(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, k = 500)
tabla_stats <- as.data.frame(test$all.stats)
colnames(tabla_stats) <- c("Index", "Mean", "Standard Deviation", "Value",
"Number of Observations", "R.i+1", "Lambda i+1", "Outlier")
reactable(tabla_stats,
columns = list(
Index = colDef(name = "Index"),
Mean = colDef(name = "Mean"),
`Standard Deviation` = colDef(name = "Standard Deviation"),
Value = colDef(name = "Value"),
`Number of Observations` = colDef(name = "Number of Observations"),
`R.i+1` = colDef(name = "R.i+1"),
`Lambda i+1` = colDef(name = "Lambda i+1"),
Outlier = colDef(name = "Outlier")
),
pagination = TRUE, # Habilitar la paginación
defaultPageSize = 10, # Tamaño de página predeterminado
bordered = TRUE, # Borde de la tabla
highlight = TRUE, # Resaltar filas al pasar el mouse
searchable = TRUE) # Habilitar búsqueda
Se realizará el proceso de imputación a los datos atipicos a través
del método capping, es decir, para los valores que se
encuentran fuera de los límites de \(1.5⋅IQR\) podríamos poner un tope
sustituyendo las observaciones que se encuentran fuera del límite
inferior por el valor del 5th percentil y las que se encuentran por
encima del límite superior, por el valor del 95th percentil. Posterior a
ellos, visualizamos graficamente los valores atípicos y no evidenciamos
sino únicamente 1 dato atípico por fuera de la malla de imputación, si
deseamos normalizarlo, podemor observarlo a través de la prueba
Grubbs.
library(reactable)
# Proceso para generar los datos con capping
x <- ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`
qnt <- quantile(x, probs=c(.25, .75), na.rm = TRUE) # Cuartiles
caps <- quantile(x, probs=c(.05, .95), na.rm = TRUE) # Percentiles 5th, 95th
H <- 1.5 * IQR(x, na.rm = TRUE)
x_original <- ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE` # Guardar los valores originales
x[x < (qnt[1] - H)] <- caps[1]
x[x > (qnt[2] + H)] <- caps[2]
# Crear un data frame para mostrar los resultados
data_frame <- data.frame(
Original = x_original,
Transformed = x,
Lower_Bound = caps[1],
Upper_Bound = caps[2]
)
## Warning in data.frame(Original = x_original, Transformed = x, Lower_Bound =
## caps[1], : row names were found from a short variable and have been discarded
# Crear la tabla con reactable
reactable(data_frame,
columns = list(
Original = colDef(name = "Original Values"),
Transformed = colDef(name = "Transformed Values"),
Lower_Bound = colDef(name = "Lower Bound (5th Percentile)"),
Upper_Bound = colDef(name = "Upper Bound (95th Percentile)")
),
pagination = TRUE, # Habilitar la paginación
defaultPageSize = 10, # Tamaño de página predeterminado
bordered = TRUE, # Borde de la tabla
highlight = TRUE, # Resaltar filas al pasar el mouse
searchable = TRUE) # Habilitar búsqueda
library(ggplot2)
library(gridExtra)
ggplot(ab, aes(y = `CANT_HERIDOS_EN _SITIO_ACCIDENTE`)) +
geom_boxplot(fill = "lightblue", color = "black") +
ggtitle("Diagrama de Cajas y Bigotes: Heridos en el Sitio del Accidente") +
xlab("Cantidad de Heridos en el Sitio del Accidente") +
ylab("Número de heridos") +
theme_minimal() +
coord_flip()
ggplot(ab, aes(x = factor(0), y = `CANT_HERIDOS_EN _SITIO_ACCIDENTE`)) +
geom_violin(fill = "navyblue", color = "black") +
ggtitle("Diagrama de Violín: Heridos en el Sitio del Accidente") +
xlab("Cantidad de Heridos en el Sitio del Accidente") +
ylab("Número de heridos") +
theme_minimal() +
coord_flip()
La prueba de Grubbs permite detectar si el valor más alto o más bajo de un conjunto de datos es un valor atípico (ver Grubbs). La prueba de Grubbs detecta un valor atípico cada vez (valor más alto o más bajo), por lo que las hipótesis nula y alternativa son las siguientes:
La función recibe los siguientes argumentos:
grubbs.test(x, type = 10, opposite = FALSE, two.sided = FALSE).
En este caso, type:
Dado que p-valor < alfa, no se rechaza la ipótesis nula, por tanto el dato 42 es un atípico y debemos alterarlo a través d eun método de imputación. Tomaremos el valor de 1 como suplente para dicho valor.
library(outliers)
test <- grubbs.test(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, type = 10, opposite = FALSE, two.sided = FALSE)
test
##
## Grubbs test for one outlier
##
## data: ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`
## G = 53.84872, U = 0.88677, p-value < 2.2e-16
## alternative hypothesis: highest value 42 is an outlier
out_ind <- which(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE` == 42)
percentil_5 <- quantile(ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, probs = 0.05, na.rm = TRUE)
ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`[out_ind] <- percentil_5
ggplot(ab, aes(y = `CANT_HERIDOS_EN _SITIO_ACCIDENTE`)) +
geom_boxplot(fill = "lightblue", color = "black") +
ggtitle("Diagrama de Cajas y Bigotes: Heridos en el Sitio del Accidente") +
xlab("Cantidad de Heridos en el Sitio del Accidente") +
ylab("Número de heridos") +
theme_minimal() +
coord_flip()
CANT_MUERTOS_EN _SITIO_ACCIDENTESe evidencia la presencia de valores atípicos en la variable de cantidad de muesrtos en el sitio de accidentepara los datos mayores que 1 y menores que 1.
ggplot(ab, aes(y = `CANT_MUERTOS_EN _SITIO_ACCIDENTE`)) +
geom_boxplot(fill = "lightblue", color = "black") +
ggtitle("Diagrama de Cajas y Bigotes: Muertos en el Sitio del Accidente") +
ylab("Cantidad de Muertos en el Sitio del Accidente") +
theme_minimal() +
coord_flip()
ggplot(ab, aes(y = `CANT_MUERTOS_EN _SITIO_ACCIDENTE`, x = factor(0))) +
geom_violin(fill = "navyblue", color = "black") +
ggtitle("Diagrama de Violín: Muertos en el Sitio del Accidente") +
ylab("Cantidad de Muertos en el Sitio del Accidente") +
theme_minimal() +
coord_flip()
library(reactable)
out <- boxplot.stats(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`)$out
out_ind <- which(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE` %in% c(out))
atipicos <- ab[out_ind, ]
reactable(atipicos,
columns = list(
FECHA_ACCIDENTE = colDef(name = "Fecha del Accidente"),
HORA_ACCIDENTE = colDef(name = "Hora del Accidente"),
GRAVEDAD_ACCIDENTE = colDef(name = "Gravedad del Accidente"),
CLASE_ACCIDENTE = colDef(name = "Clase del Accidente"),
SITIO_EXACTO_ACCIDENTE = colDef(name = "Sitio Exacto del Accidente"),
`CANT_HERIDOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Heridos"),
`CANT_MUERTOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Muertos"),
`CANTIDAD_ACCIDENTES` = colDef(name = "Cantidad de Accidentes"),
AÑO_ACCIDENTE = colDef(name = "Año del Accidente"),
MES_ACCIDENTE = colDef(name = "Mes del Accidente"),
DIA_ACCIDENTE = colDef(name = "Día del Accidente")
),
pagination = TRUE, # Habilitar la paginación
defaultPageSize = 10, # Tamaño de página predeterminado
bordered = TRUE, # Borde de la tabla
highlight = TRUE, # Resaltar filas al pasar el mouse
searchable = TRUE) # Habilitar búsqueda
Para la variable CANT_MUERTOS_EN _SITIO_ACCIDENTE los
valores inferiores a 1 y superiores a 1 se
consideran datos atípicos.
lower_bound <- median(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`) - 3 * mad(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, constant = 1)
cat("La parte inferior de los datos es:", lower_bound, "\n")
## La parte inferior de los datos es: 1
upper_bound <- median(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`) + 3 * mad(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, constant = 1)
cat("La parte superior de los datos es:", upper_bound, "\n")
## La parte superior de los datos es: 1
RosnerEn cada iteración, un valor de 2 fue identificado como atípico. Esto sugiere que en las iteraciones iniciales, la Prueba de Rosner ha encontrado varios casos donde el valor 2 es significativamente diferente del resto de los datos.
library(EnvStats)
test <- rosnerTest(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, k = 40)
tabla_stats <- as.data.frame(test$all.stats)
colnames(tabla_stats) <- c("Index", "Mean", "Standard Deviation", "Value",
"Number of Observations", "R.i+1", "Lambda i+1", "Outlier")
reactable(tabla_stats,
columns = list(
Index = colDef(name = "Index"),
Mean = colDef(name = "Mean"),
`Standard Deviation` = colDef(name = "Standard Deviation"),
Value = colDef(name = "Value"),
`Number of Observations` = colDef(name = "Number of Observations"),
`R.i+1` = colDef(name = "R.i+1"),
`Lambda i+1` = colDef(name = "Lambda i+1"),
Outlier = colDef(name = "Outlier")
),
pagination = TRUE, # Habilitar la paginación
defaultPageSize = 10, # Tamaño de página predeterminado
bordered = TRUE, # Borde de la tabla
highlight = TRUE, # Resaltar filas al pasar el mouse
searchable = TRUE) # Habilitar búsqueda
Se realizará el proceso de imputación a los datos atipicos a través
del método capping, es decir, para los valores que se
encuentran fuera de los límites de \(1.5⋅IQR\) podríamos poner un tope
sustituyendo las observaciones que se encuentran fuera del límite
inferior por el valor del 5th percentil y las que se encuentran por
encima del límite superior, por el valor del 95th percentil. Posterior a
ellos, visualizamos graficamente los valores atípicos y no evidenciamos
sino únicamente 1 dato atípico por fuera de la malla de imputación, si
deseamos normalizarlo, podemor observarlo a través de la prueba
Grubbs.
library(reactable)
x <- ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`
qnt <- quantile(x, probs=c(.25, .75), na.rm = TRUE) # Cuartiles
caps <- quantile(x, probs=c(.05, .95), na.rm = TRUE) # Percentiles 5th, 95th
H <- 1.5 * IQR(x, na.rm = TRUE)
x_original <- ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE` # Guardar los valores originales
x[x < (qnt[1] - H)] <- caps[1]
x[x > (qnt[2] + H)] <- caps[2]
# Crear un data frame para mostrar los resultados
data_frame <- data.frame(
Original = x_original,
Transformed = x,
Lower_Bound = caps[1],
Upper_Bound = caps[2]
)
## Warning in data.frame(Original = x_original, Transformed = x, Lower_Bound =
## caps[1], : row names were found from a short variable and have been discarded
# Crear la tabla con reactable
reactable(data_frame,
columns = list(
Original = colDef(name = "Original Values"),
Transformed = colDef(name = "Transformed Values"),
Lower_Bound = colDef(name = "Lower Bound (5th Percentile)"),
Upper_Bound = colDef(name = "Upper Bound (95th Percentile)")
),
pagination = TRUE, # Habilitar la paginación
defaultPageSize = 10, # Tamaño de página predeterminado
bordered = TRUE, # Borde de la tabla
highlight = TRUE, # Resaltar filas al pasar el mouse
searchable = TRUE) # Habilitar búsqueda
library(ggplot2)
library(gridExtra)
ggplot(ab, aes(y = `CANT_MUERTOS_EN _SITIO_ACCIDENTE`)) +
geom_boxplot(fill = "lightblue", color = "black") +
ggtitle("Diagrama de Cajas y Bigotes: Heridos en el Sitio del Accidente") +
xlab("Cantidad de Heridos en el Sitio del Accidente") +
ylab("Número de heridos") +
theme_minimal() +
coord_flip()
ggplot(ab, aes(x = factor(0), y = `CANT_MUERTOS_EN _SITIO_ACCIDENTE`)) +
geom_violin(fill = "navyblue", color = "black") +
ggtitle("Diagrama de Violín: Heridos en el Sitio del Accidente") +
xlab("Cantidad de Heridos en el Sitio del Accidente") +
ylab("Número de heridos") +
theme_minimal() +
coord_flip()
La prueba de Grubbs permite detectar si el valor más alto o más bajo de un conjunto de datos es un valor atípico (ver Grubbs). La prueba de Grubbs detecta un valor atípico cada vez (valor más alto o más bajo), por lo que las hipótesis nula y alternativa son las siguientes:
\(H0\): El valor más alto/bajo no es un valor atípico
\(H1\): El valor más alto/bajo es un valor atípico
10 = prueba si el valor máximo es un valor atípico.
11 = prueba si tanto el valor mínimo como el máximo son valores atípicos.
20 = prueba si hay dos valores atípicos en una cola.
Dado que p-valor < alfa, no se rechaza la ipótesis nula, por tanto el dato 42 es un atípico y debemos alterarlo a través d eun método de imputación. Tomaremos el valor de 1 como suplente para dicho valor.
library(outliers)
test <- grubbs.test(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, type = 10, opposite = FALSE, two.sided = FALSE)
test
##
## Grubbs test for one outlier
##
## data: ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`
## G = 53.33333, U = 0.88892, p-value < 2.2e-16
## alternative hypothesis: highest value 2 is an outlier
out_ind <- which(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE` == 2)
percentil_5 <- quantile(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, probs = 0.05, na.rm = TRUE)
ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`[out_ind] <- percentil_5
ggplot(ab, aes(y = `CANT_MUERTOS_EN _SITIO_ACCIDENTE`)) +
geom_boxplot(fill = "lightblue", color = "black") +
ggtitle("Diagrama de Cajas y Bigotes: Heridos en el Sitio del Accidente") +
xlab("Cantidad de Heridos en el Sitio del Accidente") +
ylab("Número de heridos") +
theme_minimal() +
coord_flip()
Cantidad de AccidentesInspeccionamos graficamente la variable y observamos la presencia de datos atípicos por encima de 1 accidente por día, por lo que procedemos a analizarlo medianteel test de grubbs
ggplot(ab, aes(y = `CANTIDAD_ACCIDENTES`)) +
geom_boxplot(fill = "lightblue", color = "black") +
ggtitle("Diagrama de Cajas y Bigotes: Cantidad de Accidentes") +
xlab("Cantidad de Accidentes") +
ylab("Cantidad de Accidentes") +
theme_minimal() +
coord_flip()
ggplot(ab, aes(y = `CANTIDAD_ACCIDENTES`, x = factor(0))) +
geom_violin(fill = "navyblue", color = "black") +
ggtitle("Diagrama de Violín: Cantidad de Accidentes") +
xlab("") +
ylab("Cantidad de Accidentes") +
theme_minimal() +
coord_flip()
library(reactable)
out <- boxplot.stats(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`)$out
out_ind <- which(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE` %in% c(out))
atipicos <- ab[out_ind, ]
reactable(atipicos,
columns = list(
FECHA_ACCIDENTE = colDef(name = "Fecha del Accidente"),
HORA_ACCIDENTE = colDef(name = "Hora del Accidente"),
GRAVEDAD_ACCIDENTE = colDef(name = "Gravedad del Accidente"),
CLASE_ACCIDENTE = colDef(name = "Clase del Accidente"),
SITIO_EXACTO_ACCIDENTE = colDef(name = "Sitio Exacto del Accidente"),
`CANT_HERIDOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Heridos"),
`CANT_MUERTOS_EN _SITIO_ACCIDENTE` = colDef(name = "Cantidad de Muertos"),
`CANTIDAD_ACCIDENTES` = colDef(name = "Cantidad de Accidentes"),
AÑO_ACCIDENTE = colDef(name = "Año del Accidente"),
MES_ACCIDENTE = colDef(name = "Mes del Accidente"),
DIA_ACCIDENTE = colDef(name = "Día del Accidente")
),
pagination = TRUE, # Habilitar la paginación
defaultPageSize = 10, # Tamaño de página predeterminado
bordered = TRUE, # Borde de la tabla
highlight = TRUE, # Resaltar filas al pasar el mouse
searchable = TRUE) # Habilitar búsqueda
La prueba de Grubbs permite detectar si el valor más alto o más bajo de un conjunto de datos es un valor atípico (ver Grubbs). La prueba de Grubbs detecta un valor atípico cada vez (valor más alto o más bajo), por lo que las hipótesis nula y alternativa son las siguientes:
\(H0\): El valor más alto/bajo no es un valor atípico
\(H1\): El valor más alto/bajo es un valor atípico
10 = prueba si el valor máximo es un valor atípico.
11 = prueba si tanto el valor mínimo como el máximo son valores atípicos.
20 = prueba si hay dos valores atípicos en una cola.
Dado que p-valor < alfa, no se rechaza la ipótesis nula, por tanto el dato 42 es un atípico y debemos alterarlo a través d eun método de imputación. Tomaremos el valor de 1 como suplente para dicho valor.
library(outliers)
test <- grubbs.test(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, type = 10, opposite = FALSE, two.sided = FALSE)
test
##
## Grubbs test for one outlier
##
## data: ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`
## G = NaN, U = NaN, p-value < 2.2e-16
## alternative hypothesis: highest value 1 is an outlier
out_ind <- which(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE` == 2)
percentil_5 <- quantile(ab$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, probs = 0.05, na.rm = TRUE)
ab$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`[out_ind] <- percentil_5
ggplot(ab, aes(y = `CANT_MUERTOS_EN _SITIO_ACCIDENTE`)) +
geom_boxplot(fill = "lightblue", color = "black") +
ggtitle("Diagrama de Cajas y Bigotes: Heridos en el Sitio del Accidente") +
xlab("Cantidad de Heridos en el Sitio del Accidente") +
ylab("Número de heridos") +
theme_minimal() +
coord_flip()