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\Rtmp8KqRMp\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)
library(dplyr)
library(ggplot2)
library(gridExtra)
p1_col <- ggplot(master_col, aes(x = year, y = `suicides/100k pop`, color = sex, group = sex)) +
geom_line(size = 1) +
geom_point(size = 2) +
labs(title = "Evolución de Suicidios por cada 100.000 habitantes en Colombia por género",
x = "Año",
y = "Suicidios por cada 100.000 hab",
color = "Género") +
theme_minimal()
p2_col <- ggplot(master_col, aes(x = year, y = `gdp_per_capita ($)`, color = sex, group = sex)) +
geom_line(size = 1) +
geom_point(size = 2) +
labs(title = "Evolución del PIB per cápita en Colombia por género",
x = "Año",
y = "PIB per cápita ($)",
color = "Género") +
theme_minimal()
p3_col <- ggplot(master_col, aes(x = year, y = `HDI for year`, color = sex, group = sex)) +
geom_line(size = 1) +
geom_point(size = 2) +
labs(title = "Evolución del IDH en Colombia por género",
x = "Año",
y = "IDH",
color = "Género") +
theme_minimal()
grid.arrange(p1_col, p2_col, p3_col, ncol = 1)
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)