Introducción

En este ejercicio grupal, trabajamos con un conjunto de datos ficticio generado aleatoriamente con el propósito de aplicar técnicas de preprocesamiento de datos antes de su análisis. En la práctica, los datos suelen presentar problemas como valores faltantes, inconsistencias o “outliers”, lo que puede afectar la validez de los resultados si no se corrigen adecuadamente.

Por esta razón, en este trabajo primero exploramos el dataset para identificar posibles problemas en los datos. Luego, aplicamos diferentes métodos de imputación y transformación de variables según su naturaleza, justificando cada decisión. Finalmente, utilizamos visualizaciones interactivas para analizar relaciones entre variables y detectar patrones relevantes en los datos.

Parte 1: Identificación de problemas en los datos:

1. Exploren los datos asignados a su grupo.

# Base de datos
Grupo_5 <- read_csv("Grupo_5.csv")
## Rows: 100 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (6): Ciudad, Nivel_Educativo, Estado_Civil, Sector_Laboral, Propietario_...
## dbl (6): ID, Edad, Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos
## 
## ℹ 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.
summary(Grupo_5)
##        ID              Edad          Salario       Experiencia   
##  Min.   :  1.00   Min.   :18.00   Min.   :20393   Min.   : 1.00  
##  1st Qu.: 25.75   1st Qu.:32.00   1st Qu.:32892   1st Qu.:13.00  
##  Median : 50.50   Median :41.00   Median :45581   Median :22.00  
##  Mean   : 50.50   Mean   :43.14   Mean   :47654   Mean   :21.61  
##  3rd Qu.: 75.25   3rd Qu.:56.00   3rd Qu.:61180   3rd Qu.:32.00  
##  Max.   :100.00   Max.   :65.00   Max.   :79430   Max.   :39.00  
##                   NA's   :5       NA's   :7       NA's   :17     
##     Ciudad          Nivel_Educativo    Horas_Trabajo_Semana Estado_Civil      
##  Length:100         Length:100         Min.   :20.00        Length:100        
##  Class :character   Class :character   1st Qu.:28.25        Class :character  
##  Mode  :character   Mode  :character   Median :39.00        Mode  :character  
##                                        Mean   :38.71                          
##                                        3rd Qu.:47.75                          
##                                        Max.   :60.00                          
##                                        NA's   :10                             
##  Sector_Laboral     Cantidad_Hijos Propietario_Vivienda Rango_Salario     
##  Length:100         Min.   :0.0    Length:100           Length:100        
##  Class :character   1st Qu.:1.0    Class :character     Class :character  
##  Mode  :character   Median :3.0    Mode  :character     Mode  :character  
##                     Mean   :2.7                                           
##                     3rd Qu.:4.0                                           
##                     Max.   :5.0                                           
##                     NA's   :10
# Visión general de toda la base de datos
skimr::skim(Grupo_5)
Data summary
Name Grupo_5
Number of rows 100
Number of columns 12
_______________________
Column type frequency:
character 6
numeric 6
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Ciudad 3 0.97 5 8 0 4 0
Nivel_Educativo 2 0.98 8 13 0 3 0
Estado_Civil 2 0.98 6 10 0 3 0
Sector_Laboral 10 0.90 7 13 0 3 0
Propietario_Vivienda 7 0.93 2 2 0 2 0
Rango_Salario 7 0.93 4 5 0 3 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
ID 0 1.00 50.50 29.01 1 25.75 50.5 75.25 100 ▇▇▇▇▇
Edad 5 0.95 43.14 13.81 18 32.00 41.0 56.00 65 ▃▇▅▅▇
Salario 7 0.93 47654.06 17391.44 20393 32892.00 45581.0 61180.00 79430 ▇▇▆▆▆
Experiencia 17 0.83 21.61 10.99 1 13.00 22.0 32.00 39 ▅▆▅▆▇
Horas_Trabajo_Semana 10 0.90 38.71 11.45 20 28.25 39.0 47.75 60 ▇▅▇▅▅
Cantidad_Hijos 10 0.90 2.70 1.63 0 1.00 3.0 4.00 5 ▇▅▆▅▅
# Información de las primeras filas de la base de datos
head(Grupo_5)
## # A tibble: 6 × 12
##      ID  Edad Salario Experiencia Ciudad   Nivel_Educativo Horas_Trabajo_Semana
##   <dbl> <dbl>   <dbl>       <dbl> <chr>    <chr>                          <dbl>
## 1     1    47   35465          27 Ponce    Primaria                          39
## 2     2    31   30399          37 Bayamón  Secundaria                        NA
## 3     3    29   32214          36 San Juan Secundaria                        46
## 4     4    56   28196          38 San Juan Primaria                          57
## 5     5    45   66854          10 San Juan Universitario                     25
## 6     6    34   22328          32 San Juan Primaria                          NA
## # ℹ 5 more variables: Estado_Civil <chr>, Sector_Laboral <chr>,
## #   Cantidad_Hijos <dbl>, Propietario_Vivienda <chr>, Rango_Salario <chr>
# Características de las variables de la base de datos
glimpse(Grupo_5)
## Rows: 100
## Columns: 12
## $ ID                   <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15…
## $ Edad                 <dbl> 47, 31, 29, 56, 45, 34, 63, 19, NA, NA, 37, 45, 6…
## $ Salario              <dbl> 35465, 30399, 32214, 28196, 66854, 22328, 33669, …
## $ Experiencia          <dbl> 27, 37, 36, 38, 10, 32, NA, 9, 7, NA, 25, 17, 38,…
## $ Ciudad               <chr> "Ponce", "Bayamón", "San Juan", "San Juan", "San …
## $ Nivel_Educativo      <chr> "Primaria", "Secundaria", "Secundaria", "Primaria…
## $ Horas_Trabajo_Semana <dbl> 39, NA, 46, 57, 25, NA, 32, 56, 43, 20, 44, 51, 4…
## $ Estado_Civil         <chr> "Soltero", "Soltero", "Soltero", NA, "Casado", "S…
## $ Sector_Laboral       <chr> "Independiente", "Público", "Independiente", "Ind…
## $ Cantidad_Hijos       <dbl> NA, NA, 1, 5, 0, 3, 4, 2, 2, 4, NA, 3, 0, 1, 0, 3…
## $ Propietario_Vivienda <chr> "No", "Sí", "Sí", "Sí", "No", "No", NA, "No", "No…
## $ Rango_Salario        <chr> "Medio", "Medio", "Medio", "Bajo", "Alto", "Bajo"…

2. Identifiquen los problemas en los datos (valores faltantes, inconsistencias, outliers, etc.).

# Datos faltantes por columnas
gg_miss_var(Grupo_5)

# Datos faltantes en "Data Frame"
vis_miss(Grupo_5) +
  theme(
    plot.margin = margin(80, 40, 10, 10)
  )

# Porcentaje total de valores faltantes
pct_miss(Grupo_5)
## [1] 6.666667
# Identificación de valores que faltan
is.na(Grupo_5)
##           ID  Edad Salario Experiencia Ciudad Nivel_Educativo
##   [1,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##   [2,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##   [3,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##   [4,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##   [5,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##   [6,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##   [7,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##   [8,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##   [9,] FALSE  TRUE   FALSE       FALSE  FALSE           FALSE
##  [10,] FALSE  TRUE   FALSE        TRUE   TRUE           FALSE
##  [11,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [12,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [13,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [14,] FALSE  TRUE   FALSE       FALSE  FALSE           FALSE
##  [15,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [16,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [17,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [18,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [19,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [20,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [21,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [22,] FALSE FALSE    TRUE       FALSE  FALSE           FALSE
##  [23,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [24,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [25,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [26,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [27,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [28,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [29,] FALSE FALSE    TRUE       FALSE  FALSE           FALSE
##  [30,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [31,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [32,] FALSE FALSE    TRUE        TRUE  FALSE           FALSE
##  [33,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [34,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [35,] FALSE FALSE    TRUE       FALSE  FALSE            TRUE
##  [36,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [37,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [38,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [39,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [40,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [41,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [42,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [43,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [44,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [45,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [46,] FALSE FALSE    TRUE       FALSE  FALSE           FALSE
##  [47,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [48,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [49,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [50,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [51,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [52,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [53,] FALSE FALSE    TRUE       FALSE   TRUE           FALSE
##  [54,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [55,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [56,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [57,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [58,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [59,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [60,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [61,] FALSE FALSE   FALSE        TRUE   TRUE           FALSE
##  [62,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [63,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [64,] FALSE  TRUE   FALSE        TRUE  FALSE           FALSE
##  [65,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [66,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [67,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [68,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [69,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [70,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [71,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [72,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [73,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [74,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [75,] FALSE FALSE    TRUE       FALSE  FALSE            TRUE
##  [76,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [77,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [78,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [79,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [80,] FALSE  TRUE   FALSE       FALSE  FALSE           FALSE
##  [81,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [82,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [83,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [84,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [85,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [86,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [87,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [88,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [89,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [90,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [91,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [92,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [93,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [94,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [95,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [96,] FALSE FALSE   FALSE        TRUE  FALSE           FALSE
##  [97,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [98,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##  [99,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
## [100,] FALSE FALSE   FALSE       FALSE  FALSE           FALSE
##        Horas_Trabajo_Semana Estado_Civil Sector_Laboral Cantidad_Hijos
##   [1,]                FALSE        FALSE          FALSE           TRUE
##   [2,]                 TRUE        FALSE          FALSE           TRUE
##   [3,]                FALSE        FALSE          FALSE          FALSE
##   [4,]                FALSE         TRUE          FALSE          FALSE
##   [5,]                FALSE        FALSE          FALSE          FALSE
##   [6,]                 TRUE        FALSE          FALSE          FALSE
##   [7,]                FALSE        FALSE          FALSE          FALSE
##   [8,]                FALSE        FALSE          FALSE          FALSE
##   [9,]                FALSE        FALSE          FALSE          FALSE
##  [10,]                FALSE        FALSE          FALSE          FALSE
##  [11,]                FALSE        FALSE          FALSE           TRUE
##  [12,]                FALSE        FALSE          FALSE          FALSE
##  [13,]                FALSE        FALSE          FALSE          FALSE
##  [14,]                FALSE        FALSE           TRUE          FALSE
##  [15,]                FALSE        FALSE          FALSE          FALSE
##  [16,]                FALSE        FALSE          FALSE          FALSE
##  [17,]                 TRUE        FALSE          FALSE           TRUE
##  [18,]                FALSE        FALSE          FALSE          FALSE
##  [19,]                FALSE        FALSE          FALSE          FALSE
##  [20,]                FALSE        FALSE          FALSE          FALSE
##  [21,]                FALSE        FALSE          FALSE          FALSE
##  [22,]                FALSE        FALSE          FALSE          FALSE
##  [23,]                FALSE        FALSE          FALSE          FALSE
##  [24,]                FALSE        FALSE          FALSE          FALSE
##  [25,]                FALSE        FALSE           TRUE           TRUE
##  [26,]                FALSE        FALSE          FALSE           TRUE
##  [27,]                 TRUE        FALSE          FALSE          FALSE
##  [28,]                FALSE        FALSE          FALSE          FALSE
##  [29,]                FALSE        FALSE          FALSE          FALSE
##  [30,]                FALSE        FALSE           TRUE          FALSE
##  [31,]                FALSE        FALSE          FALSE          FALSE
##  [32,]                FALSE        FALSE          FALSE          FALSE
##  [33,]                FALSE        FALSE          FALSE          FALSE
##  [34,]                FALSE        FALSE          FALSE          FALSE
##  [35,]                FALSE        FALSE          FALSE           TRUE
##  [36,]                FALSE        FALSE          FALSE          FALSE
##  [37,]                FALSE         TRUE           TRUE          FALSE
##  [38,]                 TRUE        FALSE          FALSE          FALSE
##  [39,]                FALSE        FALSE          FALSE          FALSE
##  [40,]                FALSE        FALSE          FALSE          FALSE
##  [41,]                FALSE        FALSE          FALSE           TRUE
##  [42,]                FALSE        FALSE          FALSE          FALSE
##  [43,]                FALSE        FALSE           TRUE           TRUE
##  [44,]                FALSE        FALSE          FALSE          FALSE
##  [45,]                FALSE        FALSE          FALSE          FALSE
##  [46,]                FALSE        FALSE           TRUE          FALSE
##  [47,]                FALSE        FALSE          FALSE          FALSE
##  [48,]                 TRUE        FALSE          FALSE          FALSE
##  [49,]                FALSE        FALSE          FALSE          FALSE
##  [50,]                FALSE        FALSE          FALSE          FALSE
##  [51,]                FALSE        FALSE          FALSE          FALSE
##  [52,]                FALSE        FALSE          FALSE          FALSE
##  [53,]                FALSE        FALSE          FALSE          FALSE
##  [54,]                FALSE        FALSE          FALSE          FALSE
##  [55,]                FALSE        FALSE          FALSE          FALSE
##  [56,]                FALSE        FALSE          FALSE          FALSE
##  [57,]                FALSE        FALSE          FALSE          FALSE
##  [58,]                FALSE        FALSE          FALSE          FALSE
##  [59,]                FALSE        FALSE          FALSE          FALSE
##  [60,]                FALSE        FALSE           TRUE          FALSE
##  [61,]                FALSE        FALSE          FALSE          FALSE
##  [62,]                FALSE        FALSE          FALSE          FALSE
##  [63,]                FALSE        FALSE          FALSE          FALSE
##  [64,]                FALSE        FALSE          FALSE          FALSE
##  [65,]                FALSE        FALSE          FALSE          FALSE
##  [66,]                FALSE        FALSE          FALSE           TRUE
##  [67,]                FALSE        FALSE          FALSE          FALSE
##  [68,]                 TRUE        FALSE          FALSE          FALSE
##  [69,]                FALSE        FALSE          FALSE          FALSE
##  [70,]                FALSE        FALSE          FALSE          FALSE
##  [71,]                FALSE        FALSE           TRUE          FALSE
##  [72,]                FALSE        FALSE          FALSE          FALSE
##  [73,]                FALSE        FALSE          FALSE          FALSE
##  [74,]                FALSE        FALSE          FALSE          FALSE
##  [75,]                FALSE        FALSE          FALSE          FALSE
##  [76,]                FALSE        FALSE          FALSE          FALSE
##  [77,]                 TRUE        FALSE          FALSE          FALSE
##  [78,]                FALSE        FALSE          FALSE          FALSE
##  [79,]                FALSE        FALSE          FALSE          FALSE
##  [80,]                FALSE        FALSE          FALSE          FALSE
##  [81,]                FALSE        FALSE          FALSE          FALSE
##  [82,]                FALSE        FALSE          FALSE          FALSE
##  [83,]                FALSE        FALSE          FALSE          FALSE
##  [84,]                FALSE        FALSE          FALSE          FALSE
##  [85,]                 TRUE        FALSE          FALSE          FALSE
##  [86,]                FALSE        FALSE           TRUE          FALSE
##  [87,]                FALSE        FALSE          FALSE          FALSE
##  [88,]                FALSE        FALSE          FALSE          FALSE
##  [89,]                FALSE        FALSE          FALSE          FALSE
##  [90,]                FALSE        FALSE          FALSE          FALSE
##  [91,]                FALSE        FALSE          FALSE          FALSE
##  [92,]                FALSE        FALSE           TRUE          FALSE
##  [93,]                FALSE        FALSE          FALSE          FALSE
##  [94,]                FALSE        FALSE          FALSE          FALSE
##  [95,]                FALSE        FALSE          FALSE          FALSE
##  [96,]                 TRUE        FALSE          FALSE          FALSE
##  [97,]                FALSE        FALSE          FALSE          FALSE
##  [98,]                FALSE        FALSE          FALSE          FALSE
##  [99,]                FALSE        FALSE          FALSE          FALSE
## [100,]                FALSE        FALSE          FALSE          FALSE
##        Propietario_Vivienda Rango_Salario
##   [1,]                FALSE         FALSE
##   [2,]                FALSE         FALSE
##   [3,]                FALSE         FALSE
##   [4,]                FALSE         FALSE
##   [5,]                FALSE         FALSE
##   [6,]                FALSE         FALSE
##   [7,]                 TRUE         FALSE
##   [8,]                FALSE         FALSE
##   [9,]                FALSE         FALSE
##  [10,]                FALSE         FALSE
##  [11,]                FALSE         FALSE
##  [12,]                FALSE         FALSE
##  [13,]                FALSE         FALSE
##  [14,]                FALSE         FALSE
##  [15,]                FALSE         FALSE
##  [16,]                FALSE         FALSE
##  [17,]                FALSE         FALSE
##  [18,]                FALSE         FALSE
##  [19,]                FALSE         FALSE
##  [20,]                FALSE         FALSE
##  [21,]                FALSE         FALSE
##  [22,]                FALSE          TRUE
##  [23,]                FALSE         FALSE
##  [24,]                FALSE         FALSE
##  [25,]                 TRUE         FALSE
##  [26,]                FALSE         FALSE
##  [27,]                FALSE         FALSE
##  [28,]                FALSE         FALSE
##  [29,]                 TRUE          TRUE
##  [30,]                FALSE         FALSE
##  [31,]                FALSE         FALSE
##  [32,]                FALSE          TRUE
##  [33,]                FALSE         FALSE
##  [34,]                FALSE         FALSE
##  [35,]                FALSE          TRUE
##  [36,]                FALSE         FALSE
##  [37,]                FALSE         FALSE
##  [38,]                FALSE         FALSE
##  [39,]                 TRUE         FALSE
##  [40,]                FALSE         FALSE
##  [41,]                FALSE         FALSE
##  [42,]                FALSE         FALSE
##  [43,]                FALSE         FALSE
##  [44,]                FALSE         FALSE
##  [45,]                FALSE         FALSE
##  [46,]                FALSE          TRUE
##  [47,]                FALSE         FALSE
##  [48,]                 TRUE         FALSE
##  [49,]                FALSE         FALSE
##  [50,]                FALSE         FALSE
##  [51,]                FALSE         FALSE
##  [52,]                FALSE         FALSE
##  [53,]                FALSE          TRUE
##  [54,]                FALSE         FALSE
##  [55,]                FALSE         FALSE
##  [56,]                FALSE         FALSE
##  [57,]                FALSE         FALSE
##  [58,]                FALSE         FALSE
##  [59,]                FALSE         FALSE
##  [60,]                FALSE         FALSE
##  [61,]                FALSE         FALSE
##  [62,]                FALSE         FALSE
##  [63,]                FALSE         FALSE
##  [64,]                FALSE         FALSE
##  [65,]                FALSE         FALSE
##  [66,]                FALSE         FALSE
##  [67,]                FALSE         FALSE
##  [68,]                FALSE         FALSE
##  [69,]                FALSE         FALSE
##  [70,]                 TRUE         FALSE
##  [71,]                FALSE         FALSE
##  [72,]                FALSE         FALSE
##  [73,]                FALSE         FALSE
##  [74,]                FALSE         FALSE
##  [75,]                FALSE          TRUE
##  [76,]                FALSE         FALSE
##  [77,]                 TRUE         FALSE
##  [78,]                FALSE         FALSE
##  [79,]                FALSE         FALSE
##  [80,]                FALSE         FALSE
##  [81,]                FALSE         FALSE
##  [82,]                FALSE         FALSE
##  [83,]                FALSE         FALSE
##  [84,]                FALSE         FALSE
##  [85,]                FALSE         FALSE
##  [86,]                FALSE         FALSE
##  [87,]                FALSE         FALSE
##  [88,]                FALSE         FALSE
##  [89,]                FALSE         FALSE
##  [90,]                FALSE         FALSE
##  [91,]                FALSE         FALSE
##  [92,]                FALSE         FALSE
##  [93,]                FALSE         FALSE
##  [94,]                FALSE         FALSE
##  [95,]                FALSE         FALSE
##  [96,]                FALSE         FALSE
##  [97,]                FALSE         FALSE
##  [98,]                FALSE         FALSE
##  [99,]                FALSE         FALSE
## [100,]                FALSE         FALSE
# Número de valores que faltan en total
sum(is.na(Grupo_5))
## [1] 80
# Identificación de inconsistencias
inconsistentes <- Grupo_5 %>%
  filter(!is.na(Edad),
         !is.na(Experiencia),
         Experiencia > Edad)

inconsistentes
## # A tibble: 11 × 12
##       ID  Edad Salario Experiencia Ciudad   Nivel_Educativo Horas_Trabajo_Semana
##    <dbl> <dbl>   <dbl>       <dbl> <chr>    <chr>                          <dbl>
##  1     2    31   30399          37 Bayamón  Secundaria                        NA
##  2     3    29   32214          36 San Juan Secundaria                        46
##  3    19    30   32892          34 Ponce    Primaria                          37
##  4    23    19   20751          38 Ponce    Universitario                     41
##  5    24    34   46274          35 Bayamón  Universitario                     39
##  6    52    32   45581          33 Ponce    Primaria                          20
##  7    65    30   63138          34 Ponce    Universitario                     50
##  8    79    33   25462          34 Ponce    Secundaria                        29
##  9    81    18   26948          24 Ponce    Secundaria                        35
## 10    85    20   20393          28 Bayamón  Universitario                     NA
## 11    95    23   69554          32 Ponce    Primaria                          29
## # ℹ 5 more variables: Estado_Civil <chr>, Sector_Laboral <chr>,
## #   Cantidad_Hijos <dbl>, Propietario_Vivienda <chr>, Rango_Salario <chr>

Durante la exploración inicial del conjunto de datos, se identificaron dos tipos de problemas principales. En primer lugar, se detectaron valores faltantes en varias variables, lo que podría afectar la precisión de análisis posteriores si no se manejan adecuadamente. En segundo lugar, se encontraron inconsistencias lógicas entre las variables Edad y Experiencia, ya que existen casos en los que la experiencia laboral es mayor que la edad de la persona, lo cual no es coherente en términos reales. Estos hallazgos evidencian la necesidad de realizar un preprocesamiento adecuado antes de proceder con cualquier análisis estadístico.

3. Propongan estrategias de preprocesamiento para solucionar estos problemas.

Para solucionar los problemas identificados en el conjunto de datos se aplicarán diferentes estrategias de preprocesamiento. En primer lugar, los valores faltantes se manejarán mediante métodos de imputación para evitar la eliminación de observaciones y así mantener el tamaño del conjunto de datos. En el caso de las variables numéricas, los valores faltantes se reemplazarán utilizando el promedio de la variable, mientras que para las variables categóricas se estimará la categoría más probable basada en la información disponible. También se revisarán y corregirán posibles inconsistencias en los datos, como situaciones en las que la experiencia laboral sea mayor que la edad, ya que este tipo de casos no es lógicamente posible. Además, las variables categóricas se transformarán al tipo de dato factor para asegurar que R las interprete correctamente durante el análisis y las visualizaciones. Finalmente, en este trabajo no se realizará una comparación entre métodos de imputación univariados y multivariados, ya que el uso de métodos multivariados aumentó significativamente el peso del archivo y dificulta su publicación. No obstante, se utilizará imputación univariada porque, dada la naturaleza de los datos y el bajo porcentaje de valores faltantes, este método resulta adecuado y suficiente para el preprocesamiento del conjunto de datos.

Parte 2: Imputación de datos:

1. Para las variables con valores faltantes, decidan cuál método de imputación aplicar (media, mediana, moda, regresión, eliminación, etc.).

Este conjunto de datos presenta un 6.7% de valores faltantes a nivel global. El análisis detallado por variable evidenció que Edad (5%), Salario (7%), Experiencia (17%), Horas de Trabajo por Semana (10%), Sector Laboral (10%), Propietario de Vivienda (7%) y Rango de Salario (7%) concentran proporciones de datos faltantes, lo que podría afectar la precisión de los análisis posteriores. Utilizamos una imputacion univariada por la media para las variables numericas y continuas de Edad, Salario, Experiencia, Horas_Trabajo_Semana y Cantidad_Hijos. Adicionalmente, utilizamos una imputacion univariada por la moda para las 3 variables categoricas: Sector Laboral, Propietario de Vivienda y Rango de Salario.

2. Justifiquen su elección con base en la naturaleza de los datos.

Las variables del conjunto de datos son una combinación de numéricas y categóricas, por lo que se necesitaba un método simple que se adaptara a cada tipo. Dado que el porcentaje de valores faltantes no es extremadamente alto, se optó por una imputación univariada, utilizando la media para variables numéricas y la moda para variables categóricas. Debido a que el porcentaje de valores faltantes en el conjunto de datos es relativamente bajo, se optó por utilizar un método simple de imputación univariada. Este método permite reemplazar los valores faltantes de manera eficiente sin añadir complejidad al análisis. Métodos multivariados suelen utilizarse cuando existe una mayor proporción de datos faltantes o cuando se requiere modelar relaciones más complejas entre variables. En este caso, decidimos optar por análisis más simples y específicos.

3. Apliquen diferentes estrategias de imputación según las características de las variables de su conjunto de datos.

Para aplicar la imputación de manera adecuada se separaron las variables según su tipo. Las variables numéricas (Edad, Salario, Experiencia, Horas de Trabajo por Semana y Cantidad de Hijos) fueron imputadas utilizando la media. Por otro lado, las variables categóricas (Sector Laboral, Propietario de Vivienda y Rango de Salario) fueron imputadas utilizando un método basado en árboles de clasificación (CART), el cual permite estimar la categoría más probable en función de la estructura de los datos.

# Corrección de inconsistencia
Grupo_5Nuevo <- Grupo_5 %>%
  mutate(
    Experiencia = ifelse(
      Experiencia > Edad,
      NA,
      Experiencia))

Grupo_5Nuevo %>%
  filter(Experiencia > Edad)
## # A tibble: 0 × 12
## # ℹ 12 variables: ID <dbl>, Edad <dbl>, Salario <dbl>, Experiencia <dbl>,
## #   Ciudad <chr>, Nivel_Educativo <chr>, Horas_Trabajo_Semana <dbl>,
## #   Estado_Civil <chr>, Sector_Laboral <chr>, Cantidad_Hijos <dbl>,
## #   Propietario_Vivienda <chr>, Rango_Salario <chr>

Método 1 — Imputación univariada

# 1) Variables continuas (mean)
Data_cont <- Grupo_5Nuevo %>% select(Edad, Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos)

Imput_mean <- mice(Data_cont, method = "mean", print = F)
complete_mean <- mice::complete(Imput_mean)

# 2) Variables categóricas (cart)
Data_cat <- Grupo_5Nuevo %>% select(Sector_Laboral, Propietario_Vivienda, Rango_Salario)

Imput_mode <- mice(Data_cat, method = "cart", print = F)
complete_mode <- mice::complete(Imput_mode)

Grupo_5_final <- bind_cols(complete_mean, complete_mode)

# Convertir datos a formato largo
data_long <- bind_rows(
  Data_cont %>% 
    select(Edad, Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% 
    mutate(Origen = "Original"),
  
  complete_mean %>% 
    select(Edad, Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% 
    mutate(Origen = "Imputado")) %>%
  pivot_longer(cols = c(Edad, Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos), names_to = "Variable", values_to = "Valor")

# Crear gráfico de densidad
p1 <- ggplot(data_long, aes(x = Valor, 
                 color = Origen, 
                 fill = Origen,
                 text = paste("Origen:", Origen))) +
  geom_density(alpha = 0.2) +
  facet_wrap(~Variable, scales = "free") + 
  labs(title = "Comportamiento de la Imputación",
       x = "Variables",
       y = "Densidad") +
  theme_minimal()

ggplotly(p1, tooltip = c("text", "x", "y"))

En el gráfico de densidad de las variables numéricas, se observa que, en la mayoría de los casos, las distribuciones de los datos imputados son similares a las de los datos originales, lo que indica que la imputación por la media mantiene el patrón general de las variables. Sin embargo, en la variable “Experiencia” se observa una diferencia más marcada, donde los datos imputados presentan un pico de densidad considerablemente mayor. Esto ocurre porque la imputación por la media introduce varios valores iguales, lo que genera una concentración artificial alrededor del promedio y reduce la variabilidad de la variable.

### Para Variable Categórica: Sector_Laboral
# Crear data.frame antes y después de la imputación
data_cat <- bind_rows(
  Data_cat %>% select(Sector_Laboral) %>% mutate(Origen = "Original"),
  complete_mode %>% select(Sector_Laboral) %>% mutate(Origen = "Imputado")
) %>%
  filter(!is.na(Sector_Laboral))

# Crear gráfico de barras
p2 <- ggplot(data_cat, 
             aes(x = Sector_Laboral, 
                 fill = Origen, 
                 text = paste("Origen:", Origen))) +
  geom_bar(position = "dodge") +
  labs(title = "",
       x = "Sector Laboral",
       y = "Frecuencia") +
  theme_minimal()

ggplotly(p2, tooltip = c("text", "x", "y"))
### Para Variable Categórica: Propietario_Vivienda
# Crear data.frame antes y después de la imputación
data_cat <- bind_rows(
  Data_cat %>% select(Propietario_Vivienda) %>% mutate(Origen = "Original"),
  complete_mode %>% select(Propietario_Vivienda) %>% mutate(Origen = "Imputado")
) %>%
  filter(!is.na(Propietario_Vivienda))

# Crear gráfico de barras
p3 <- ggplot(data_cat, 
             aes(x = Propietario_Vivienda, 
                 fill = Origen, 
                 text = paste("Origen:", Origen))) +
  geom_bar(position = "dodge") +
  labs(title = "",
       x = "Propietario_Vivienda",
       y = "Frecuencia") +
  theme_minimal()

ggplotly(p3, tooltip = c("text", "x", "y"))
### Para Variable Categórica: Rango_Salario
# Crear data.frame antes y después de la imputación
data_cat <- bind_rows(
  Data_cat %>% select(Rango_Salario) %>% mutate(Origen = "Original"),
  complete_mode %>% select(Rango_Salario) %>% mutate(Origen = "Imputado")
) %>%
  filter(!is.na(Rango_Salario))

# Crear gráfico de barras
p4 <- ggplot(data_cat, 
             aes(x = Rango_Salario, 
                 fill = Origen, 
                 text = paste("Origen:", Origen))) +
  geom_bar(position = "dodge") +
  labs(title = "",
       x = "Rango_Salario",
       y = "Frecuencia") +
  theme_minimal()

ggplotly(p4, tooltip = c("text", "x", "y"))

En las variables categóricas, las frecuencias de las categorías imputadas se mantienen muy cercanas a las de los datos originales. Esto sugiere que el método de imputación utilizado logra conservar la distribución de las categorías sin alterar significativamente la estructura de los datos. Por lo tanto, la imputación aplicada no introduce sesgos importantes en estas variables.

4. Comparen los resultados obtenidos con cada estrategia y expliquen cuál es la más adecuada en su caso.

En las variables Edad, Salario y Horas de Trabajo por Semana, el comportamiento de los datos imputados es bastante similar al de los datos originales. Esto sugiere que la imputación por media logra mantener la estructura general de la distribución para estas variables. Sin embargo, en variables como Experiencia y Cantidad de Hijos se observan diferencias más marcadas entre la distribución original y la imputada. Esto se debe a que la imputación por media reemplaza los valores faltantes por un único valor promedio, lo que puede reducir la variabilidad de los datos. A pesar de estas diferencias, el método sigue siendo adecuado en este caso, ya que el porcentaje de valores faltantes es relativamente bajo y permite mantener el tamaño completo del conjunto de datos sin eliminar observaciones.

5. Expliquen cómo la elección del método de imputación afecta el análisis posterior de los datos.

En este caso, la imputación por media en las variables numéricas puede reducir la variabilidad, ya que varios valores faltantes se reemplazan por el mismo promedio. Esto puede influir en medidas como la varianza o las correlaciones entre variables. Para las variables categóricas se utilizó la moda, reemplazando los valores faltantes por la categoría más frecuente, lo que puede aumentar ligeramente la frecuencia de esa categoría en los resultados.

Parte 3: Discretización y modificación:

1. Transformen las variables categóricas en un formato adecuado para el análisis.

Grupo_5_final <- Grupo_5Nuevo %>%
  mutate(
    Ciudad = as.factor(Ciudad),
    Nivel_Educativo = as.factor(Nivel_Educativo),
    Estado_Civil = as.factor(Estado_Civil),
    Sector_Laboral = as.factor(Sector_Laboral),
    Propietario_Vivienda = as.factor(Propietario_Vivienda),
    Rango_Salario = as.factor(Rango_Salario)
  )
  
str(Grupo_5_final)
## tibble [100 × 12] (S3: tbl_df/tbl/data.frame)
##  $ ID                  : num [1:100] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Edad                : num [1:100] 47 31 29 56 45 34 63 19 NA NA ...
##  $ Salario             : num [1:100] 35465 30399 32214 28196 66854 ...
##  $ Experiencia         : num [1:100] 27 NA NA 38 10 32 NA 9 NA NA ...
##  $ Ciudad              : Factor w/ 4 levels "Bayamón","Caguas",..: 3 1 4 4 4 4 1 1 4 NA ...
##  $ Nivel_Educativo     : Factor w/ 3 levels "Primaria","Secundaria",..: 1 2 2 1 3 1 1 1 3 3 ...
##  $ Horas_Trabajo_Semana: num [1:100] 39 NA 46 57 25 NA 32 56 43 20 ...
##  $ Estado_Civil        : Factor w/ 3 levels "Casado","Divorciado",..: 3 3 3 NA 1 3 2 2 2 1 ...
##  $ Sector_Laboral      : Factor w/ 3 levels "Independiente",..: 1 3 1 1 2 1 2 2 1 2 ...
##  $ Cantidad_Hijos      : num [1:100] NA NA 1 5 0 3 4 2 2 4 ...
##  $ Propietario_Vivienda: Factor w/ 2 levels "No","Sí": 1 2 2 2 1 1 NA 1 1 1 ...
##  $ Rango_Salario       : Factor w/ 3 levels "Alto","Bajo",..: 3 3 3 2 1 2 3 3 2 2 ...

2. Expliquen las decisiones tomadas en este proceso.

Para preparar las variables categóricas para el análisis, se transformaron las variables Ciudad, Nivel_Educativo, Estado_Civil, Sector_Laboral, Propietario_Vivienda y Rango_Salario al tipo de dato factor utilizando la función as.factor() aprendida a través de los cursos de DataCamp. Esta transformación permite que R reconozca estas variables como categóricas y trate cada categoría como un nivel dentro de la variable. De esta manera se facilita su uso en análisis estadísticos, visualizaciones y modelos posteriores.

Parte 4: Visualización avanzada:

1. Crea un mapa de calor interactivo de correlaciones entre las variables numéricas usando plotly. ¿Qué patrones observas en los datos?

library(dplyr)
library(plotly)
library(RColorBrewer)

corr <- cor(dplyr::select_if(Grupo_5Nuevo, is.numeric),
            use = "pairwise.complete.obs")

pal <- colorRampPalette(brewer.pal(11, "RdBu"))(30)

plot_ly() %>%
  add_heatmap(
    x = colnames(corr),
    y = rownames(corr),
    z = corr,
    colors = pal,
    zmin = -1, zmax = 1
  ) %>%
  colorbar(limits = c(-1, 1))

Al crear un mapa de calor de correlaciones entre las variables numéricas podemos observar algunos patrones en los datos. La correlación más clara se presenta entre Edad y Experiencia, lo cual es esperado ya que a mayor edad generalmente se acumulan más años de experiencia laboral. También se observa una ligera relación positiva entre Edad y Salario, lo que podría indicar que el salario tiende a aumentar con la edad o la experiencia. Para el resto de las variables, las correlaciones son bajas, lo que sugiere que no existe una relación lineal fuerte entre ellas.

2. Genera un gráfico de barras interactivo con ggplotly para comparar cantidad de hijos según el rango de salario. ¿Qué patrones observas en los datos?

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.1     ✔ purrr     1.2.1
## ✔ lubridate 1.9.5     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ magrittr::extract() masks tidyr::extract()
## ✖ plotly::filter()    masks mice::filter(), dplyr::filter(), stats::filter()
## ✖ dplyr::lag()        masks stats::lag()
## ✖ purrr::set_names()  masks magrittr::set_names()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(plotly)

# Resumir la cantidad de hijos por rango de salario
datos_hijos <- Grupo_5Nuevo %>%
  group_by(Rango_Salario) %>%
  summarise(prom_hijos = mean(Cantidad_Hijos, na.rm = TRUE))

# Gráfico de barras
g <- ggplot(datos_hijos, aes(x = Rango_Salario, y = prom_hijos, fill = Rango_Salario)) +
  geom_bar(stat = "identity")

# Convertir a gráfico interactivo
ggplotly(g)

Cuando generamos un gráfico de barras interactivo con ggplotly para comparar cantidad de hijos según el rango de salario, podemos comparar los siguientes patrones en los datos: el promedio de hijos es bastante similar entre los rangos de salario y las barras no cambian drásticamente. Sin embargo, podemos observar que el grupo de salario bajo muestra el promedio de hijos más alto. Por lo tanto, no se observa una relación clara o fuerte entre el rango de salario y la cantidad de hijos.

3. Crea un gráfico de dispersión donde se visualice la relación entre Salario y Experiencia. ¿Qué patrones observas en los datos?

library(plotly)

plot_ly(Grupo_5Nuevo, 
        x = ~Experiencia, 
        y = ~Salario, 
        type = "scatter", 
        mode = "markers")

Cuando analizamos el gráfico de dispersión y observamos la relación entre Salario y Experiencia, podemos observar los siguientes patrones: el gráfico sugiere una relación casi nula entre el salario y la experiencia, ya que no hay un patrón como tal y los puntos están dispersos sin marcar una tendencia ascendente o descendente.