library(readr)
library(knitr)
library(magrittr)
library(kableExtra)
library(dplyr)
library(ggplot2)
library(tidyr)Actividad visualización de datos
Actividad 2 (parte 1) - Visualización de datos
La base de datos Suicide Rates Overview 1985 to 2016 se refiere a lo siguiente:
Existen varias señales correlacionadas con el aumento de las tasas de suicidios mundial, este conjunto de datos fue creado para encontrar este tipo de señales y contiene 27,820 observaciones que aportan información tanto socioeconómica como demográfica de cada país.
Realizar lo siguiente:
Punto 1
- Importe la base de datos.
master <- read_csv("C:/Users/Usuario/Downloads/archive/master.csv")master %>% names [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"
Renombramos las variables para más comodidad y facilidad a la hora de realizar la actividad.
nombres <- master %>% namesrequire(dplyr)
require(magrittr)
master %<>% rename(
pais = nombres[1],
anio = nombres[2],
sexo = nombres[3],
edad = nombres[4],
num_suic = nombres[5],
poblacion = nombres[6],
suic_x100k = nombres[7],
pais_anio = nombres[8],
idh_anio = nombres[9],
pib_anio = nombres[10],
pib_pcap = nombres[11],
generacion = nombres[12]
)master %>% names [1] "pais" "anio" "sexo" "edad" "num_suic"
[6] "poblacion" "suic_x100k" "pais_anio" "idh_anio" "pib_anio"
[11] "pib_pcap" "generacion"
kable(head(master))| pais | anio | sexo | edad | num_suic | poblacion | suic_x100k | pais_anio | idh_anio | pib_anio | pib_pcap | generacion |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
Punto 2
- Analice las características de la base de datos. Estas pueden incluir: número de filas, número de columnas, nombres de las variables, tipos de variables, entre otras.
str(master)spc_tbl_ [27,820 × 12] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ pais : chr [1:27820] "Albania" "Albania" "Albania" "Albania" ...
$ anio : num [1:27820] 1987 1987 1987 1987 1987 ...
$ sexo : chr [1:27820] "male" "male" "female" "male" ...
$ edad : chr [1:27820] "15-24 years" "35-54 years" "15-24 years" "75+ years" ...
$ num_suic : num [1:27820] 21 16 14 1 9 1 6 4 1 0 ...
$ poblacion : num [1:27820] 312900 308000 289700 21800 274300 ...
$ suic_x100k: num [1:27820] 6.71 5.19 4.83 4.59 3.28 2.81 2.15 1.56 0.73 0 ...
$ pais_anio : chr [1:27820] "Albania1987" "Albania1987" "Albania1987" "Albania1987" ...
$ idh_anio : num [1:27820] NA NA NA NA NA NA NA NA NA NA ...
$ pib_anio : num [1:27820] 2.16e+09 2.16e+09 2.16e+09 2.16e+09 2.16e+09 ...
$ pib_pcap : num [1:27820] 796 796 796 796 796 796 796 796 796 796 ...
$ generacion: 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>
Punto 3
- Analice cada una de las variables según su tipo: numéricas y categóricas.
Después de efectuar el código anterior, podemos conocer el tipo de variables que contiene nuestro dataset. A continuación, está el listado de cada una de ellas.
pais:cualitativaanio:cuantitativasexo:cualitativaedad:cualitativanum_suic:cuantitativapoblacion:cuantitativasuic_x100k:cuantitativapais_anio:cualitativaidh_anio:cuantitativapib_anio:cuantitativapib_pcap:cuantitativageneracion:cualitativa
Punto 4
- Filtre la base de datos para entender mejor su estructura.
Para fitrar la base de datos utilizaremos la función filter.
filter(master, num_suic >20 & edad == "25-34 years" )# A tibble: 2,860 × 12
pais anio sexo edad num_suic poblacion suic_x100k pais_anio idh_anio
<chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
1 Albania 1997 male 25-3… 36 236000 15.2 Albania1… NA
2 Albania 1998 male 25-3… 26 240400 10.8 Albania1… NA
3 Albania 2001 male 25-3… 22 206484 10.6 Albania2… NA
4 Albania 2002 male 25-3… 23 206286 11.2 Albania2… NA
5 Albania 2008 male 25-3… 21 172855 12.2 Albania2… NA
6 Argentina 1985 male 25-3… 177 2234200 7.92 Argentin… 0.694
7 Argentina 1985 female 25-3… 65 2185200 2.97 Argentin… 0.694
8 Argentina 1986 male 25-3… 209 2246900 9.3 Argentin… NA
9 Argentina 1986 female 25-3… 96 2197600 4.37 Argentin… NA
10 Argentina 1987 male 25-3… 192 2276200 8.44 Argentin… NA
# ℹ 2,850 more rows
# ℹ 3 more variables: pib_anio <dbl>, pib_pcap <dbl>, generacion <chr>
filter(master, sexo == "female" )# A tibble: 13,910 × 12
pais anio sexo edad num_suic poblacion suic_x100k pais_anio idh_anio
<chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
1 Albania 1987 female 15-24 … 14 289700 4.83 Albania1… NA
2 Albania 1987 female 75+ ye… 1 35600 2.81 Albania1… NA
3 Albania 1987 female 35-54 … 6 278800 2.15 Albania1… NA
4 Albania 1987 female 25-34 … 4 257200 1.56 Albania1… NA
5 Albania 1987 female 5-14 y… 0 311000 0 Albania1… NA
6 Albania 1987 female 55-74 … 0 144600 0 Albania1… NA
7 Albania 1988 female 75+ ye… 2 36400 5.49 Albania1… NA
8 Albania 1988 female 15-24 … 8 295600 2.71 Albania1… NA
9 Albania 1988 female 55-74 … 3 147500 2.03 Albania1… NA
10 Albania 1988 female 25-34 … 5 262400 1.91 Albania1… NA
# ℹ 13,900 more rows
# ℹ 3 more variables: pib_anio <dbl>, pib_pcap <dbl>, generacion <chr>
filter(master, sexo == "male" )# A tibble: 13,910 × 12
pais anio sexo edad num_suic poblacion suic_x100k pais_anio idh_anio
<chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
1 Albania 1987 male 15-24 y… 21 312900 6.71 Albania1… NA
2 Albania 1987 male 35-54 y… 16 308000 5.19 Albania1… NA
3 Albania 1987 male 75+ yea… 1 21800 4.59 Albania1… NA
4 Albania 1987 male 25-34 y… 9 274300 3.28 Albania1… NA
5 Albania 1987 male 55-74 y… 1 137500 0.73 Albania1… NA
6 Albania 1987 male 5-14 ye… 0 338200 0 Albania1… NA
7 Albania 1988 male 15-24 y… 17 319200 5.33 Albania1… NA
8 Albania 1988 male 75+ yea… 1 22300 4.48 Albania1… NA
9 Albania 1988 male 35-54 y… 14 314100 4.46 Albania1… NA
10 Albania 1988 male 55-74 y… 4 140200 2.85 Albania1… NA
# ℹ 13,900 more rows
# ℹ 3 more variables: pib_anio <dbl>, pib_pcap <dbl>, generacion <chr>
Punto 5
- Explore la ayuda de la función table del paquete base y utilícela para explorar la base de datos.
table(master$edad)
15-24 years 25-34 years 35-54 years 5-14 years 55-74 years 75+ years
4642 4642 4642 4610 4642 4642
table(master$sexo)
female male
13910 13910
table(master$generacion)
Boomers G.I. Generation Generation X Generation Z Millenials
4990 2744 6408 1470 5844
Silent
6364
Gracias a la función table podemos conocer más información sobre los datos que tienen cada una de las variables de nuestro dataset. Como podemos observar, la cantidad de hombres y mujeres en nuestra muestra es la misma, y la generación más presente en estos datos es Generation x silent
Punto 6
- Identifique los valores NA (Not Available) en la base de datos.
Para identificar los datos faltantes realizaremos el siguiente gráfico:
suppressWarnings(require(Amelia))
suppressWarnings(missmap(master))Podemos observar que la variable con más datos faltantes es la variable idh_anio.
Punto 7
- Analice la presencia de posibles valores atípicos.
par(mfrow=c(2, 4))
boxplot(master$anio, main="Año")
boxplot(master$num_suic, main="Número de Suicidios")
boxplot(master$poblacion, main="Población")
boxplot(master$suic_x100k, main="Suicidios por cada mil personas en la población")
boxplot(master$idh_anio, main="IDH por Año")
boxplot(master$pib_anio, main="PIB por Año")
boxplot(master$pib_pcap, main="PIB per cápita")
par(mfrow=c(1, 1))Punto 8
- Decida qué hacer con los valores NA.
Analizemos los datos faltantes de la variable idh_anio, ya que, según el ´missingnessmap´, es la variable que más tiene NA.
summary(master$idh_anio) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.483 0.713 0.779 0.777 0.855 0.944 19456
En este caso, analizaremos la distribución de la variable con un histograma, de esta forma, podemos saber visualmente si la variable podría o no tener una distribución normal, para luego, poder realizar la imputación con el método de emparejamiento predicitivo medio.
hist(master$idh_anio, xlab = "IDH año", col = "#E0BFF0", main = "IDH año" )En este caso, a manera de ejercicio, asumiremos que las observaciones siguen una distribución normal, por lo tanto, reemplazaremos los datos faltantes con la media.
medias <- mean(master$idh_anio, na.rm = TRUE)
print(medias)[1] 0.7766011
master <- master %>%
mutate(idh_anio = replace(idh_anio, is.na(idh_anio), mean(idh_anio, na.rm = TRUE)))Por ultimo, realizaremos nuevamente el mapa de datos faltantes.
suppressWarnings(require(Amelia))
suppressWarnings(missmap(master))Luego de esto, podemos decir que no queda ningún dato faltante.
Actividad 2 (parte 2) - Visualización de datos
Punto 1
- Edite y explore reglas para verificar que la base de datos no contenga posibles registros erróneos.
Como pudimos ver anteriormente, la base de datos no contiene datos erroneos.
Punto 2
master_col <- filter(master, pais == "Colombia")master_eu <- filter(master, pais == "United States")Punto 3
Realice un análisis de la evolución de los suicidios por cada 100.000 habitantes, del PIB per cápita y del IDH, a lo largo de los años en ambos países
evolución de los suicidios por cada 100.000 habitantes
library(ggplot2)
library(ggpubr)
suicdcol <- ggplot(master_col, aes(x = anio, y = suic_x100k, color = pais)) +
geom_line(size = 0.7, aes(linetype = pais)) +
labs(title = "Evolución de los suicidios por cada 100,000 habitantes (Colombia)",
x = "Año", y = "Suicidios por 100,000 habitantes") +
scale_color_manual(values = c("#CD2626"))
# Segundo gráfico
suicdeu <- ggplot(master_eu, aes(x = anio, y = suic_x100k, color = pais)) +
geom_line(size = 0.7, aes(linetype = pais)) +
labs(title = "Evolución de los suicidios por cada 100,000 habitantes (Europa)",
x = "Año", y = "Suicidios por 100,000 habitantes") +
scale_color_manual(values = c("#CD69C9"))
# Combinar los gráficos
ggarrange(suicdcol, suicdeu, ncol = 2, nrow = 1)Evolución de PIB per cápita
pibcol <- ggplot(master_col, aes(x = anio, y = pib_pcap, color = pais)) +
geom_line(size = 0.7, aes(linetype = pais)) +
labs(title = "Evolución del PIB per cápita (Colombia)",
x = "Año", y = "PIB per cápita") +
scale_color_manual(values = c("#CD2626"))
pibeu <- ggplot(master_eu, aes(x = anio, y = pib_pcap, color = pais)) +
geom_line(size = 0.7, aes(linetype = pais)) +
labs(title = "Evolución del PIB per cápita (Europa)",
x = "Año", y = "PIB per cápita") +
scale_color_manual(values = c("#CD69C9"))
ggarrange(pibcol, pibeu, ncol = 2, nrow = 1)Evolución del IDH
idhcol <- ggplot(master_col, aes(x = anio, y = idh_anio, color = pais)) +
geom_line(size = 0.7, aes(linetype = pais)) +
labs(title = "Evolución de IDH (Colombia)",
x = "Año", y = "IDH") +
scale_color_manual(values = c("#CD2626"))
idheu <- ggplot(master_eu, aes(x = anio, y = idh_anio, color = pais)) +
geom_line(size = 0.7, aes(linetype = pais)) +
labs(title = "Evolución de IDH (Europa)",
x = "Año", y = "IDH") +
scale_color_manual(values = c("#CD69C9"))
ggarrange(idhcol, idheu, ncol = 2, nrow = 1)Punto 4
ggplot(master_col, aes(x = anio, y = suic_x100k, color = sexo, linetype = sexo)) +
geom_line(size = 1) +
labs(title = "Evolución de los suicidios por cada 100,000 habitantes",
x = "Año", y = "Suicidios por 100,000 habitantes") +
scale_color_manual(values = c("#8B0A50","#1874CD"))ggplot(master_col, aes(x = anio, y = pib_pcap, color = sexo, linetype = sexo)) +
geom_line(size = 1) +
labs(title = "Evolución del PIB per cápita",
x = "Año", y = "PIB per cápita") +
scale_color_manual(values = c("#8B0A50","#1874CD"))ggplot(master_col, aes(x = anio, y = idh_anio, color = sexo, linetype = sexo)) +
geom_line(size = 1) +
labs(title = "Evolución del IDH",
x = "Año", y = "IDH") +
scale_color_manual(values = c("#8B0A50","#1874CD"))Punto 5
ggplot(master_col, aes(x = anio, y = suic_x100k, color = edad, linetype = sexo)) +
geom_line(size = 1) +
labs(title = "Evolución de los suicidios por cada 100,000 habitantes",
x = "Año", y = "Suicidios por 100,000 habitantes") +
scale_color_manual(values = c("#8B0A50","#1874CD","#FF1493","#79CDCD","deepskyblue2","#9AC0CD"))ggplot(master_col, aes(x = anio, y = pib_pcap, color = sexo, linetype = edad)) +
geom_line(size = 1) +
labs(title = "Evolución del PIB per cápita",
x = "Año", y = "PIB per cápita") +
scale_color_manual(values = c("#8B0A50","#1874CD"))ggplot(master_col, aes(x = anio, y = idh_anio, color = sexo, linetype = edad)) +
geom_line(size = 1) +
labs(title = "Evolución de IDH (Indice de desarrollo humano)",
x = "Año", y = "IDH") +
scale_color_manual(values = c("#8B0A50","#1874CD"))Actividad 2 (parte 3) - Visualización de datos
- Realice un análisis descriptivo completo y actualizado al julio 31 2024, incluyendo graficos, tablas y georreferenciación de la base de datos ´Accidentalidad_en_Barranquilla.csv´.
library(readr)
Accidentalidad_en_Barranquilla_20240831 <- read_csv("C:/Users/Usuario/Documents/DATOSPARADATAVIZ/Accidentalidad_en_Barranquilla_20240831.csv")
accidbaq <- rename(Accidentalidad_en_Barranquilla_20240831)
View(accidbaq)Para realizar el analisis descriptivo, primero comenzaremos conociendo nuestra base de datos y sus variables.
accidbaq %>% names [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"
str(accidbaq)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>
En esta ocasión contamos con una base de datos que tiene 25610 filas y 11 columnas, además contiene las siguientes variables.
FECHA_ACCIDENTE: cualitativaHORA_ACCIDENTE: cualitativaGRAVEDAD_ACCIDENTE: cualitativaCLASE_ACCIDENTE: cualitativaSITIO_EXACTO_ACCIDENTE: cualitativaCANT_HERIDOS_EN_SITIO_ACCIDENTE: cuantitativaCANT_MUERTOS_EN_SITIO_ACCIDENTE: cuantitativaCANTIDAD_ACCIDENTES: cuantitativaAÑO_ACCIDENTE: cuantitativaMES_ACCIDENTE: cualitativaDIA_ACCIDENTE: cualitativa
Realizamos unos filtros si deseamos información exacta de nuestra base de datos.
library(dplyr)
filterdata <- accidbaq %>%
filter(MES_ACCIDENTE == "June",
AÑO_ACCIDENTE == 2023,
GRAVEDAD_ACCIDENTE == "Con heridos",
DIA_ACCIDENTE == "Mon",
`CANT_HERIDOS_EN _SITIO_ACCIDENTE` >= 1)head(filterdata)# A tibble: 6 × 11
FECHA_ACCIDENTE HORA_ACCIDENTE GRAVEDAD_ACCIDENTE CLASE_ACCIDENTE
<dttm> <chr> <chr> <chr>
1 2023-06-05 00:00:00 04:50:00:pm Con heridos Caida Ocupante
2 2023-06-05 00:00:00 05:20:00:pm Con heridos Choque
3 2023-06-05 00:00:00 06:20:00:am Con heridos Choque
4 2023-06-05 00:00:00 06:30:00:pm Con heridos Choque
5 2023-06-12 00:00:00 12:30:00:pm Con heridos Choque
6 2023-06-19 00:00:00 02:45:00:am Con heridos Choque
# ℹ 7 more variables: SITIO_EXACTO_ACCIDENTE <chr>,
# `CANT_HERIDOS_EN _SITIO_ACCIDENTE` <dbl>,
# `CANT_MUERTOS_EN _SITIO_ACCIDENTE` <dbl>, CANTIDAD_ACCIDENTES <dbl>,
# AÑO_ACCIDENTE <dbl>, MES_ACCIDENTE <chr>, DIA_ACCIDENTE <chr>
Usamos la función table para conocer más sobre el contenido de nuestra base de datos.
table(accidbaq$GRAVEDAD_ACCIDENTE)
Con heridos Con muertos Solo daños
9901 252 15457
Podemos analizar que la categoria Con muertos es la que tiene menos observaciones y la categoría con más observaciones es Solo daños.
table(accidbaq$MES_ACCIDENTE)
April August December February January July June March
2010 1918 2189 2477 2349 1932 2103 2446
May November October September
2121 1995 2090 1980
table(accidbaq$AÑO_ACCIDENTE)
2018 2019 2020 2021 2022 2023 2024
5898 5645 3281 4700 3683 1662 741
Analisis de los NA:
faltantes <- colSums(is.na(accidbaq))
faltantes <- sort(faltantes, decreasing = TRUE)
print(faltantes)CANT_MUERTOS_EN _SITIO_ACCIDENTE CANT_HERIDOS_EN _SITIO_ACCIDENTE
25358 15626
FECHA_ACCIDENTE HORA_ACCIDENTE
0 0
GRAVEDAD_ACCIDENTE CLASE_ACCIDENTE
0 0
SITIO_EXACTO_ACCIDENTE CANTIDAD_ACCIDENTES
0 0
AÑO_ACCIDENTE MES_ACCIDENTE
0 0
DIA_ACCIDENTE
0
Realizamos el mapa para observar los datos faltantes.
library(Amelia)
missmap(accidbaq, col = c("#CD0000", "#3A5FCD"), legend = TRUE, cex = 0.7)Luego, analizamos los datos atipicos.
par(mfrow=c(1, 4))
boxplot(accidbaq$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`,col="#CD919E")
boxplot(accidbaq$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`,col="#CD919E")
boxplot(accidbaq$CANTIDAD_ACCIDENTES,col="#CD919E")
boxplot(accidbaq$AÑO_ACCIDENTE,col="#CD919E")par(mfrow=c(1, 1))par(mfrow = c(2, 2))
hist(accidbaq$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`,
main = "Heridos en Sitio de Accidente",
xlab = "Cant herido en accidente",
col = "#CD2990")
hist(accidbaq$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`,
main = "Muertos en Sitio de Accidente",
xlab = "Cant muerto en accidente",
col = "#B03060")
hist(accidbaq$CANTIDAD_ACCIDENTES,
main = "Cantidad de Accidentes",
xlab = "Cantidad de accidentes",
col = "#FF34B3")
hist(accidbaq$AÑO_ACCIDENTE,
main = "Año de Accidente",
xlab = "Año de accidente",
col = "#8B1C62")par(mfrow = c(1, 1))Como podemos observar, estas variables no siguen una distribución normal, ya que, gracias a los histogramas se puede obtener una noción si estas variables tendrán o no una distribución normal. Por lo tanto, para imputar los datos atipicos de las variables que los tienen, utilizaremos la mediana.
# Extraer outliers para cada variable de interés
outliers_heridos <- boxplot.stats(accidbaq$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`)$out
outliers_muertos <- boxplot.stats(accidbaq$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`)$out
outliers_accidentes <- boxplot.stats(accidbaq$CANTIDAD_ACCIDENTES)$out
outliers_año <- boxplot.stats(accidbaq$AÑO_ACCIDENTE)$out# Calcular la mediana para cada variable de interés
mediana_heridos <- median(accidbaq$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, na.rm = TRUE)
mediana_muertos <- median(accidbaq$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`, na.rm = TRUE)
mediana_accidentes <- median(accidbaq$CANTIDAD_ACCIDENTES, na.rm = TRUE)
mediana_año <- median(accidbaq$AÑO_ACCIDENTE, na.rm = TRUE)
# Reemplazar los outliers por la mediana correspondiente
accidbaq$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`[accidbaq$`CANT_HERIDOS_EN _SITIO_ACCIDENTE` %in% outliers_heridos] <- mediana_heridos
accidbaq$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`[accidbaq$`CANT_MUERTOS_EN _SITIO_ACCIDENTE` %in% outliers_muertos] <- mediana_muertos
accidbaq$CANTIDAD_ACCIDENTES[accidbaq$CANTIDAD_ACCIDENTES %in% outliers_accidentes] <- mediana_accidentes
accidbaq$AÑO_ACCIDENTE[accidbaq$AÑO_ACCIDENTE %in% outliers_año] <- mediana_año
# Verificar los resultados
summary(accidbaq$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
1.000 1.000 1.000 1.324 2.000 3.000 15626
summary(accidbaq$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
1 1 1 1 1 1 25358
summary(accidbaq$CANTIDAD_ACCIDENTES) Min. 1st Qu. Median Mean 3rd Qu. Max.
1 1 1 1 1 1
summary(accidbaq$AÑO_ACCIDENTE) Min. 1st Qu. Median Mean 3rd Qu. Max.
2018 2019 2020 2020 2021 2024
par(mfrow=c(1, 4))
boxplot(accidbaq$`CANT_HERIDOS_EN _SITIO_ACCIDENTE`, col="#FFC1C1")
boxplot(accidbaq$`CANT_MUERTOS_EN _SITIO_ACCIDENTE`,col="#FFC1C1")
boxplot(accidbaq$CANTIDAD_ACCIDENTES,col="#FFC1C1")
boxplot(accidbaq$AÑO_ACCIDENTE,col="#FFC1C1")par(mfrow=c(1, 1))Actividad: Precio de los combustibles en el país.
ptrimestre <- read.csv("C:/Users/Usuario/Documents/CombustibleColombia/precios (20).csv")
strimestre <- read.csv("C:/Users/Usuario/Documents/CombustibleColombia/precios (21).csv")
ttrimestre <- read.csv("C:/Users/Usuario/Documents/CombustibleColombia/precios (22).csv")
ctrimestre <- read.csv("C:/Users/Usuario/Documents/CombustibleColombia/precios (23).csv")combustible2023 <- rbind(ptrimestre, strimestre, ttrimestre, ctrimestre)str(combustible2023)'data.frame': 267943 obs. of 7 variables:
$ BANDERA : chr "TERPEL" "TERPEL" "TERPEL" "TERPEL" ...
$ NOMBRE.COMERCIAL: chr "ESTACION DE SERVICIO SERVICENTRO LA PEDRERA" "ESTACION DE SERVICIO SERVICENTRO LA PEDRERA" "BALSA EL CONDOR" "BALSA EL CONDOR" ...
$ PRODUCTO : chr "DIESEL" "GASOLINA MOTOR" "GASOLINA MOTOR" "DIESEL" ...
$ FECHA.REGISTRO : chr "01-Jan-2023" "01-Jan-2023" "01-Jan-2023" "01-Jan-2023" ...
$ DEPARTAMENTO : chr "AMAZONAS" "AMAZONAS" "AMAZONAS" "AMAZONAS" ...
$ MUNICIPIO : chr "LA PEDRERA" "LA PEDRERA" "LETICIA" "LETICIA" ...
$ VALOR.PRECIO : num 15000 15500 11380 10840 11380 ...
ggplot(combustible2023, aes(x = PRODUCTO)) +
geom_bar(fill = "#E290B3") +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5)+
theme_minimal() +
labs(x = "Producto", y = "Cantidad de Observaciones") En el anterior diagrama de barras para la variable PRODUCTO podemos observar que la gasolina motor es la que más observaciones tiene con más de 120.000 observaciones. Por otro lado, extra fue la que menos observaciones tuvo.
ggplot(combustible2023, aes(x = DEPARTAMENTO)) +
geom_bar(fill = "#E290B3") +
theme_minimal() +
labs(x = "Departamentos", y = "Cantidad de Observaciones", title = "Cantidad de Observaciones por Departamento") +
theme(axis.text.x = element_text(angle = 80, hjust = 1, size = 5))Luego de efectuar el anterior gráfico, podemos observar que en departamenento en donde hubo más aumento del precio del combustible fue en el Archipielago de San Andres. Mientras que los demás estuvieron en un rango de precios muy parecidos entre si.
ggplot(combustible2023, aes(x = BANDERA)) +
geom_bar(fill = "#E290B3") +
theme_minimal() +
labs(x = "Bandera", y = "Cantidad de Observaciones", title = "Cantidad de Observaciones por Bandera") +
theme(axis.text.x = element_text(angle = 70, hjust = 1, size = 7))La anterior gráfica nos muestra las distribuidoras de combustibles y sus observaciónes. Podemos concluir que TERPEL y PRIMAX son las que más observaciones tiene, mientras que SAVE, PROXXON Y ZAPATA Y VELASQUEZ fueron las que menos observaciones obtuvieron.
library(sf)
mapacol <- st_read("C:/Users/Usuario/Downloads/Python _Act/Python _Act/coordenadas/COLOMBIA/COLOMBIA.shp")Reading layer `COLOMBIA' from data source
`C:\Users\Usuario\Downloads\Python _Act\Python _Act\coordenadas\COLOMBIA\COLOMBIA.shp'
using driver `ESRI Shapefile'
Simple feature collection with 33 features and 11 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -81.73575 ymin: -4.227907 xmax: -66.84735 ymax: 13.39453
Geodetic CRS: WGS 84
head(mapacol)Simple feature collection with 6 features and 11 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -77.13556 ymin: 3.726892 xmax: -71.94853 ymax: 11.1092
Geodetic CRS: WGS 84
OBJECTID DPTO_CCDGO DPTO_NANO_ DPTO_CNMBR DPTO_CACTO
1 1 05 1886 ANTIOQUIA Constitucion Politica de 1886
2 2 08 1910 ATLANTICO Ley 21 de 1910
3 3 11 0 BOGOTA D.C. <NA>
4 4 13 1886 BOLIVAR Constitucion Politica de 1886
5 5 15 1886 BOYACA Constitucion Politica de 1886
6 6 17 1905 CALDAS 11 de Abril de 1905
DPTO_NAREA DPTO_CSMBL DPTO_NANO PAIS_PAIS_ SHAPE_Leng SHAPE_Area
1 63063325603 3 2005 1 21.137035 5.1557833
2 3326730008 3 2005 2 2.461077 0.2748252
3 1633209262 3 2005 3 3.731288 0.1330445
4 26665590821 3 2005 4 15.706980 2.1910550
5 23077053534 3 2005 5 15.280968 1.8833146
6 7415932693 3 2005 6 6.614200 0.6047122
geometry
1 MULTIPOLYGON (((-76.40481 8...
2 MULTIPOLYGON (((-74.82969 1...
3 MULTIPOLYGON (((-74.07274 4...
4 MULTIPOLYGON (((-75.24966 1...
5 MULTIPOLYGON (((-72.01129 7...
6 MULTIPOLYGON (((-74.67118 5...
prompreciocomb <- combustible2023 %>%
group_by(DEPARTAMENTO) %>%
summarise(promprecio = mean(VALOR.PRECIO, na.rm = TRUE))mapacol$promcomb <- prompreciocomb$prompreciolibrary(ggplot2)
library(paletteer)
ggplot(data = mapacol) +
geom_sf(aes(fill = promcomb)) +
geom_sf_text(aes(label = DPTO_CNMBR), size = 2, color = "black", check_overlap = TRUE) +
scale_fill_gradientn(colours = paletteer_c("grDevices::Purp", 30), name = "Precio Promedio (COP)") +
labs(title = "Promedio del Precio del Combustible por Departamento en Colombia") +
theme_minimal()Por último, calculamos el promedio del precio del combustible de acuerdo a cada departamento de Colombia para conocer cual obtuvo el mayor precio promedio. En este caso, podemos observar que departamentos como Vichada, Bolivar y Caqueta obtuvieron un precio promedio alto. Por otro lado, observamos que Huila, Tolima, Valle del Cauca, Arauca, entre otros, tienen un precio promedio bastante bajo. Además, podemos concluir que la mayoria de departamentos estan entre un precio promedio de 12.000 y 14.000.