Actividad visualización de datos

Author

Gwyneth Blanco Durán

Published

August 19, 2024

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.
library(readr)
library(knitr)
library(magrittr)
library(kableExtra)
library(dplyr)
library(ggplot2)
library(tidyr)
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 %>% names
require(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: cualitativa

  • anio: cuantitativa

  • sexo: cualitativa

  • edad: cualitativa

  • num_suic: cuantitativa

  • poblacion: cuantitativa

  • suic_x100k: cuantitativa

  • pais_anio: cualitativa

  • idh_anio: cuantitativa

  • pib_anio: cuantitativa

  • pib_pcap: cuantitativa

  • generacion: 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: cualitativa
  • HORA_ACCIDENTE: cualitativa
  • GRAVEDAD_ACCIDENTE: cualitativa
  • CLASE_ACCIDENTE: cualitativa
  • SITIO_EXACTO_ACCIDENTE: cualitativa
  • CANT_HERIDOS_EN_SITIO_ACCIDENTE: cuantitativa
  • CANT_MUERTOS_EN_SITIO_ACCIDENTE: cuantitativa
  • CANTIDAD_ACCIDENTES: cuantitativa
  • AÑO_ACCIDENTE: cuantitativa
  • MES_ACCIDENTE: cualitativa
  • DIA_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$promprecio
library(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.