Introducción

El siguiente informe presenta los métodos de preprocesamiento realizados para el análisis de la base de datos según las preguntas claves.

Objetivo

Objetivo: Cada grupo recibirá un conjunto de datos con información ficticia generada aleatoriamente. El objetivo es realizar el preprocesamiento adecuado para preparar los datos antes de su análisis.

Cargar librerias:

# Cargar librerias necesarias
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(naniar)
library(ggplot2)
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(mice)
## 
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
## 
##     filter
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
library(VIM)
## Loading required package: colorspace
## Loading required package: grid
## VIM is ready to use.
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
## 
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
## 
##     sleep

Cargar datos

Trabajadores <- read.csv("Grupo_1.csv", fileEncoding = "UTF-8", stringsAsFactors = FALSE)

Parte 1. Identificación de problemas en los datos

1. Exploren los datos asignados a su grupo.

# Observar las primeras filas en la base de datos
head(Trabajadores)
##   ID Edad Salario Experiencia   Ciudad Nivel_Educativo Horas_Trabajo_Semana
## 1  1   49   47164           8 San Juan      Secundaria                   30
## 2  2   40   23010          35 San Juan   Universitario                   50
## 3  3   22   76886           1   Caguas      Secundaria                   46
## 4  4   26   69046           8                 Primaria                   31
## 5  5   40   51575           4    Ponce   Universitario                   56
## 6  6   26   55348           3    Ponce        Primaria                   57
##   Estado_Civil Sector_Laboral Cantidad_Hijos Propietario_Vivienda Rango_Salario
## 1      Soltero  Independiente              4                   Sí         Medio
## 2       Casado        Privado              3                   No          Bajo
## 3      Soltero        Público              4                   No          Alto
## 4   Divorciado  Independiente              0                   Sí          Alto
## 5       Casado        Privado              3                   Sí         Medio
## 6      Soltero  Independiente              5                   Sí         Medio
# Observar las características de las variables
glimpse(Trabajadores)
## Rows: 100
## Columns: 12
## $ ID                   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15…
## $ Edad                 <dbl> 49, 40, 22, 26, 40, 26, 42, 24, 62, 19, 22, 41, 4…
## $ Salario              <dbl> 47164, 23010, 76886, 69046, 51575, 55348, 32671, …
## $ Experiencia          <dbl> 8, 35, 1, 8, 4, 3, 22, 1, NA, 9, 11, 24, 6, 3, 15…
## $ Ciudad               <chr> "San Juan", "San Juan", "Caguas", "", "Ponce", "P…
## $ Nivel_Educativo      <chr> "Secundaria", "Universitario", "Secundaria", "Pri…
## $ Horas_Trabajo_Semana <dbl> 30, 50, 46, 31, 56, 57, 55, 22, 50, 52, 58, NA, 3…
## $ Estado_Civil         <chr> "Soltero", "Casado", "Soltero", "Divorciado", "Ca…
## $ Sector_Laboral       <chr> "Independiente", "Privado", "Público", "Independi…
## $ Cantidad_Hijos       <dbl> 4, 3, 4, 0, 3, 5, 4, 2, 2, 5, 1, 3, 4, 3, 3, 3, 2…
## $ Propietario_Vivienda <chr> "Sí", "No", "No", "Sí", "Sí", "Sí", "No", "Sí", "…
## $ Rango_Salario        <chr> "Medio", "Bajo", "Alto", "Alto", "Medio", "Medio"…
# Revisar los datos de forma detallada
skimr::skim(Trabajadores)
Data summary
Name Trabajadores
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 0 1 0 8 3 5 0
Nivel_Educativo 0 1 0 13 1 4 0
Estado_Civil 0 1 0 10 5 4 0
Sector_Laboral 0 1 0 13 7 4 0
Propietario_Vivienda 0 1 0 2 8 3 0
Rango_Salario 0 1 0 5 6 4 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 1 0.99 39.69 13.78 18 26.50 40.0 51.00 64 ▇▅▆▆▅
Salario 6 0.94 49992.91 17047.48 20069 37191.75 50650.0 63286.50 79801 ▆▆▇▅▇
Experiencia 13 0.87 19.89 11.85 0 9.00 20.0 29.50 40 ▇▆▇▆▇
Horas_Trabajo_Semana 6 0.94 41.31 11.65 21 32.00 42.0 51.00 60 ▆▅▇▇▆
Cantidad_Hijos 11 0.89 2.56 1.66 0 1.00 2.0 4.00 5 ▇▅▃▅▅
# Conteo de datos faltantes por columna 
Trabajadores %>%
  is.na() %>%
  colSums()
##                   ID                 Edad              Salario 
##                    0                    1                    6 
##          Experiencia               Ciudad      Nivel_Educativo 
##                   13                    0                    0 
## Horas_Trabajo_Semana         Estado_Civil       Sector_Laboral 
##                    6                    0                    0 
##       Cantidad_Hijos Propietario_Vivienda        Rango_Salario 
##                   11                    0                    0

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

Los siguientes comandos fueron utlizados para identificar posibles problemas en la base de datos.

Datos faltantes
#Existen variables categoricas faltantes
Trabajadores <- replace(Trabajadores, Trabajadores == "", NA)
head(Trabajadores)
##   ID Edad Salario Experiencia   Ciudad Nivel_Educativo Horas_Trabajo_Semana
## 1  1   49   47164           8 San Juan      Secundaria                   30
## 2  2   40   23010          35 San Juan   Universitario                   50
## 3  3   22   76886           1   Caguas      Secundaria                   46
## 4  4   26   69046           8     <NA>        Primaria                   31
## 5  5   40   51575           4    Ponce   Universitario                   56
## 6  6   26   55348           3    Ponce        Primaria                   57
##   Estado_Civil Sector_Laboral Cantidad_Hijos Propietario_Vivienda Rango_Salario
## 1      Soltero  Independiente              4                   Sí         Medio
## 2       Casado        Privado              3                   No          Bajo
## 3      Soltero        Público              4                   No          Alto
## 4   Divorciado  Independiente              0                   Sí          Alto
## 5       Casado        Privado              3                   Sí         Medio
## 6      Soltero  Independiente              5                   Sí         Medio
# Observar datos faltantes por columna
gg_miss_var(Trabajadores)

#Obtener gráfico de valores faltantes en toda la base de datos
vis_miss(Trabajadores)

A partir de los resultados obtenidos, la base de datos sufre de valores faltantes en las siguientes variables de Edad (1%), Salario (6%), Experiencia (13%), Ciudad (3%), Nivel_Educativo (1%), Horas_Trabajo_Semana (6%), Estado_Civil (5%), Sector_Laboral (7%), Cantidad_Hijos (11%), Propietario_Vivienda (8%) y Rango_Salario (6%)

Registros duplicados
#Verificar por registros duplicados
Trabajadores %>%
  janitor::get_dupes()
## No variable names specified - using all columns.
## No duplicate combinations found of: ID, Edad, Salario, Experiencia, Ciudad, Nivel_Educativo, Horas_Trabajo_Semana, Estado_Civil, Sector_Laboral, ... and 3 other variables
##  [1] ID                   Edad                 Salario             
##  [4] Experiencia          Ciudad               Nivel_Educativo     
##  [7] Horas_Trabajo_Semana Estado_Civil         Sector_Laboral      
## [10] Cantidad_Hijos       Propietario_Vivienda Rango_Salario       
## [13] dupe_count          
## <0 rows> (or 0-length row.names)

Los resultados muestran que no existen datos duplicados

Búsqueda de outliers
summary(Trabajadores)
##        ID              Edad          Salario       Experiencia   
##  Min.   :  1.00   Min.   :18.00   Min.   :20069   Min.   : 0.00  
##  1st Qu.: 25.75   1st Qu.:26.50   1st Qu.:37192   1st Qu.: 9.00  
##  Median : 50.50   Median :40.00   Median :50650   Median :20.00  
##  Mean   : 50.50   Mean   :39.69   Mean   :49993   Mean   :19.89  
##  3rd Qu.: 75.25   3rd Qu.:51.00   3rd Qu.:63287   3rd Qu.:29.50  
##  Max.   :100.00   Max.   :64.00   Max.   :79801   Max.   :40.00  
##                   NA's   :1       NA's   :6       NA's   :13     
##     Ciudad          Nivel_Educativo    Horas_Trabajo_Semana Estado_Civil      
##  Length:100         Length:100         Min.   :21.00        Length:100        
##  Class :character   Class :character   1st Qu.:32.00        Class :character  
##  Mode  :character   Mode  :character   Median :42.00        Mode  :character  
##                                        Mean   :41.31                          
##                                        3rd Qu.:51.00                          
##                                        Max.   :60.00                          
##                                        NA's   :6                              
##  Sector_Laboral     Cantidad_Hijos  Propietario_Vivienda Rango_Salario     
##  Length:100         Min.   :0.000   Length:100           Length:100        
##  Class :character   1st Qu.:1.000   Class :character     Class :character  
##  Mode  :character   Median :2.000   Mode  :character     Mode  :character  
##                     Mean   :2.562                                          
##                     3rd Qu.:4.000                                          
##                     Max.   :5.000                                          
##                     NA's   :11

Los resultados muestran los cuartiles y un resumen estadístico de cada variable en la base de datos. A simple vista, no parecen haber valores atípicos.

3. Propongan estrategias de preprocesamiento para solucionar estos problemas

Para solucionar estos problemas proponemos identificar y manejar los valores faltantes. Se pueden imputar o eliminar estos datos faltantes para mejorar la precisión de este modelo. Para mejorar la calidad de los datos se podrían transformar o normalizar si es necesario. Por último proponemos el manejo de los outliers para que estos no afecten nuestro análisis.

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.).

  • Edad: Eliminacion (menos 5%)
  • Salario: Univariada
  • Experiencia: Árboles de Decisión
  • Ciudad: Eliminacion (menos 5%)
  • Nivel_Educativo: Eliminaciones (menos 5%)
  • Horas_Trabajo_Semana: Media
  • Estado_Civil: Moda
  • Cantidad_Hijos: Random Forest
  • Propietario_Vivienda: Moda
  • Sector_Laboral: Moda
  • Rango_Salario: Manual

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

  • Edad: Puede ser ignorada debido a que el porcentaje de datos faltantes es solo 1% y por lo tanto, menor al 5% del total de observaciones. Sin embargo, esta variable puede estar relacionada con otra y ser tipo MAR, por lo cual pudiéramos utilizar imputación multivariada.
  • Experiencia: Variable numérica con una distribución balanceada. Los tipos de datos faltantes pueden ser categorizados como MAR, por lo cual podemos usar árboles de decisiones o Random Forest con variables relacionadas como Nivel_Educativo o Edad.
  • Ciudad: Puede ser ignorada debido a que el porcentaje de datos faltantes es solo 3%. Aún así, si los datos faltantes son tipo MCAR y , podemos usar la imputación por Moda para esta variable categórica.
  • Nivel_Educativo: Igualmente puede ser ignorada, ya que tiene solo 1% de datos faltantes. Si quisiéramos imputar esta variable categórica, podemos hacerlo por la moda con una categoría más frecuente.
  • Horas_Trabajo_Semana: Asumimos que los valores faltantes son tipo MCAR, por lo cual el método de imputación univariada sería por la media debido a que la distribución de los valores es bastante simétrica.
  • Estado_Civil: Variable categórica que tiene una distribución un poco sesgada. Por lo tanto, podemos utilizar la moda para imputar datos, aunque fortalezca el sesgo. Por otra parte, si consideramos que es un tipo de dato faltante MNAR, pudiéramos utilizar otro método más avanzado como MICE.
  • Sector_Laboral: Variable categórica con una distribución balanceada. Podemos imputar por la moda ya que no hay un sesgo claro. Igualmente podemos usar Random Forest o KNN si creemos que existen variables que puedan predecir el sector laboral como horas de trabajo, la edad o el nivel de educación.
  • Propietario_Vivienda: La distribución de esta variable categórica binomial está sesgada a las respuestas afirmativas de propietarios de vivienda. Si los datos faltantes los categorizamos como MAR, podemos utilizar variables como salario o edad para predecir estos valores.
  • Cantidad_Hijos: Si los datos faltantes son tipo MAR, la cantidad de hijos puede depender de otra variable como salario. Por lo tanto, podemos aplicar métodos de imputación multivariada como Random Forest.
  • Rango_Salario: Es una variable categórica que depende totalmente del valor del salario. Por lo tanto, puede ser calculada con un valor determinado después de haber imputado los valores faltantes del salario.

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

Realizaremos las siguientes imputaciones por categoría de variables. Primero eliminaremos las variables con porcentajes de datos faltantes menores que cinco.

# Eliminar datos faltantes menores que el 5%
Trabajadores <- Trabajadores %>%
  drop_na(Edad, Ciudad, Nivel_Educativo)

A continuación, aplicamos diferentes estrategias de imputación a la base de datos

# Imputación con la media para variables continuas
Imput_mean <- mice(Trabajadores,method="mean",print=FALSE) 
Complete_mean <- mice::complete(Imput_mean)
# Imputacion con regresión predictiva(sin variabilidad)
Imput_reg1 <- mice(Trabajadores, method = "norm.predict", print = FALSE)
Complete_reg1 <- mice::complete(Imput_reg1)
# Imputación con regresión y bootstrap (con variabilidad)
Imput_reg2 <- mice(Trabajadores, method = "norm.boot", print = FALSE)
Complete_reg2 <- mice::complete(Imput_reg2)
# Imputación con Regresión Múltiple 
Imput_reg_mult <- mice(Trabajadores, method = "norm.predict", m = 5, print = FALSE)
Complete_reg_mult <- mice::complete(Imput_reg_mult)
# Imputación con MICE
Imput_mice <- mice(Trabajadores, method = "pmm", m = 5, print = FALSE)  
Complete_mice <- mice::complete(Imput_mice)
# Imputación con Random Forest
Imput_rf <- mice(Trabajadores, method = "rf", m = 5, print = FALSE)
Complete_rf <- mice::complete(Imput_rf)
# Imputación con la moda para variables categóricas
Imput_mode <- mice(Trabajadores,method="cart",print=FALSE)
Complete_mode <- mice::complete(Imput_mode)

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

Comparación de datos originales y datos imputados con la media
# Convertir los datos en formato largo para comparación
  Trabajadores_long <- bind_rows(
    Trabajadores %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Original"),
    Complete_mean %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Imputado")
  ) %>%
    pivot_longer(cols = c(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos), 
               names_to = "Variable", values_to = "Valor")

# Graficar la comparación con ggplot
  p1 <- ggplot(Trabajadores_long, aes(x = Valor, fill = Origen, text = paste("Origen:", Origen))) +
    geom_density(alpha = 0.2) +
    facet_wrap(~Variable, scales = "free") +
    labs(title = "Comparación de datos originales vs imputados",
       x = "Valor", y = "Densidad") +
    theme_minimal()

# Mostrar gráfico
  ggplotly(p1, tooltip = c("text", "x", "y"))
Comparación de datos originales con datos imputados con regresión múltiple y bootstraps
# Convertir los datos en formato largo
data_long_reg <- bind_rows(
  Trabajadores %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Original"),
  Complete_reg1 %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Regresión Predictiva"),
  Complete_reg2 %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Regresión Bootstrap")) %>%
  pivot_longer(cols = c(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos), names_to = "Variable", values_to = "Valor")


#crear grafico de densidad 
p2 <- ggplot(data_long_reg, 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()


# Convertir a gráfico interactivo sin duplicaciones en el tooltip
ggplotly(p2, tooltip = c("text", "x", "y"))
Comparacion de datos originales y datos ajustados con regresión multivariada
# Convertir los datos imputados a formato largo 
data_long_mult <- bind_rows(
  Trabajadores %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Original"),
  Complete_reg_mult %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Regresión Múltiple"),
  Complete_mice %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "MICE"),
  Complete_rf %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Random Forest")) %>%
  pivot_longer(cols = c(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos), names_to = "Variable", values_to = "Valor")


# Crear gráfico de densidad 
p3 <- ggplot(data_long_mult, aes(x = Valor, color = Origen, fill = Origen, text = paste("Método:", Origen))) +
  geom_density(alpha = 0.2) +
  facet_wrap(~Variable, scales = "free") + 
  labs(title = "Comparación de Imputación Multivariada", x = "Variables", y = "Densidad") +
  theme_minimal()


# Convertir a gráfico interactivo 
ggplotly(p3, tooltip = c("text", "x", "y"))
Comparación de datos originales y diferentes imputaciones con moda
# Crear un data.frame con los conteos antes y después de la imputación para `Estado Civil`
data_cat1 <- bind_rows(
  Trabajadores %>% select(Estado_Civil) %>% mutate(Origen = "Original"),
  Complete_mode %>% select(Estado_Civil) %>% mutate(Origen = "Imputado")) %>%
  filter(!is.na(Estado_Civil))  # Eliminar NA de los datos originales para comparación justa


# Crear el gráfico de barras corregido
ECimp <- ggplot(data_cat1, aes(x = Estado_Civil, fill = Origen, text = paste("Origen:", Origen))) +
  geom_bar(position = "dodge") +
  labs(title = "", x = "Estado_Civil",y = "Frecuencia") +
  theme_minimal()

# Mostrar gráfico
ggplotly(ECimp,tooltip = c("text", "x", "y"))
# Crear un data.frame con los conteos antes y después de la imputación `Sector_Laboral`
data_cat2 <- bind_rows(
  Trabajadores %>% select(Sector_Laboral) %>% mutate(Origen = "Original"),
  Complete_mode %>% select(Sector_Laboral) %>% mutate(Origen = "Imputado")) %>%
  filter(!is.na(Sector_Laboral))  # Eliminar NA de los datos originales para comparación justa


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

# Mostrar gráfico
ggplotly(SLimp,tooltip = c("text", "x", "y"))
# Crear un data.frame con los conteos antes y después de la imputación `Propietario_ Vivienda`
data_cat3<- bind_rows(
  Trabajadores %>% select(Propietario_Vivienda) %>% mutate(Origen = "Original"),
  Complete_mode %>% select(Propietario_Vivienda) %>% mutate(Origen = "Imputado")) %>%
  filter(!is.na(Propietario_Vivienda))  # Eliminar NA de los datos originales para comparación justa


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

# Mostrar gráfica
ggplotly(PVimp,tooltip = c("text", "x", "y"))

Finalmente, unimos las imputaciones con la base de datos original:

# Uso de semi-joins para unir las imputaciones con la base de datos original

Trabajadores_IMP <- semi_join(Complete_mice, Trabajadores, by = c("Salario", "Cantidad_Hijos"))


Trabajadores_IMP <-semi_join(Complete_rf, Trabajadores_IMP, by = "Horas_Trabajo_Semana")


Trabajadores_IMP <- semi_join(Complete_reg2, Trabajadores_IMP, by = "Experiencia")


Trabajadores_IMP <- semi_join(Complete_mode, Trabajadores_IMP, by = c("Propietario_Vivienda", "Sector_Laboral", "Estado_Civil"))

Trabajadores_IMP <- Trabajadores_IMP %>%
  mutate(Rango_Salario = ifelse(is.na(Rango_Salario), 
                                case_when(
                                  Salario > 65000 ~ "Alto",
                                  Salario <= 64900 & Salario > 30000 ~ "Medio",
                                  Salario <= 30000 ~ "Bajo",
                                  TRUE ~ "Desconocido" 
                                ),
                                Rango_Salario))

Analizando las comparaciones de las diferentes imputaciones contra los datos originales podemos determinar los mejores prospectos de imputación son:

  • Salario: MICE
  • Experiencia: Bootstrap
  • Cantidad_Hijos: MICE
  • Horas_Trabajo_Semana: RF
  • Propietario_Vivienda: Moda
  • Sector_Laboral: Moda
  • Estado_Civil: Moda
  • Rango_Salario: Imputación Manual

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

Analizar y comparar los métodos de imputación es imperativo para conservar la naturaleza y relación de los datos. Aunque estos datos son generados aleatoriamente, aplicar un método de imputación que no es apropiado puede distorsionar los resultados de análisis posterior.

Parte 3. Discretización y modificación:

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

Los siguientes comandos transformaron las variables categóricas de tipo carácter a tipo factor:

# Convertir variables a tipo factor
Trabajadores_IMP <- Trabajadores_IMP %>%
    mutate(Ciudad = factor(Ciudad),
Nivel_Educativo = factor(Nivel_Educativo),
                Estado_Civil = factor(Estado_Civil),
                Sector_Laboral = factor(Sector_Laboral),
                Propietario_Vivienda = factor(Propietario_Vivienda),
                Rango_Salario = factor(Rango_Salario))

2. Expliquen las decisiones tomadas en este proceso.

Las variables se convirtieron de tipo carácter a tipo factor para poder establecer sus valores como niveles definidos, en vez de guardar un simple texto. Por ejemplo, la variable estado_civil ahora solo guarda los valores de “soltero”, “casado”, y “divorciado”. Igualmente, esta transformación también ayuda a los modelos estadísticos utilizados más adelante a interpretar con certeza los valores en las variables. Por ejemplo, las variables categóricas se manejan mejor como factores en agrupaciones y en análisis gráficos como ggplot.

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?

# Calcular la matriz de correlación con las variables numéricas
corr <- cor(dplyr::select_if(Trabajadores_IMP %>% select(-ID), is.numeric), use = "complete.obs")

# Crear el mapa de calor interactivo con Plotly
plot_ly(colors = "RdBu") %>%
  add_heatmap(x = rownames(corr), y = colnames(corr), z = corr) %>%
  colorbar(limits = c(-1, 1)) %>%
  layout(title = "Mapa de Calor de Correlaciones")

El mapa de calor de correlaciones de variables numéricas muestran los colores rojos y azul. En este caso, los colores azules se utilizan para demostrar una correlación positiva, por lo cual las celdas con valores cercanos a +1 tendrán un color azul más intenso. Por otro lado, los colores rojos se utilizan para demostrar una correlación negativa y valores cercanos a -1.

Por lo tanto, podemos interpretar la correlación de las variables númericas de la siguiente manera:

  • Experiencia y Horas_Trabajo_Semana: Correlación positiva.
  • Cantidad_Hijos y Salario: Son las variables con más correlación postiva de la gráfica.
  • Cantidad_Hijos y Experiencia: Correlación negativa.
  • Edad y Salario: Correlación negativa
  • Experiencia y Salario: Correlación cercana a cero, no hay una correlación significativa.
  • Experiencia y Edad: Correlación cercana a cero, no hay correlación significativa.

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?

# Crear tabla de frecuencia con la suma de la cantidad de hijos por rango de salario
tabla_frecuencia <- Trabajadores_IMP %>%
  group_by(Rango_Salario) %>%
  summarise(Total_Hijos = sum(Cantidad_Hijos, na.rm = TRUE), .groups = "drop")

# Crear gráfico
grafico_ggplot <- ggplot(tabla_frecuencia, aes(x = Rango_Salario, y = Total_Hijos, fill = Rango_Salario)) + 
  geom_bar(stat = "identity") +
  labs(title = "Cantidad Total de Hijos por Rango de Salario",
       x = "Rango de Salario",
       y = "Cantidad de Hijos") +
theme_minimal()

# Crear gráfico interactivo
plot_interactivo <- ggplotly(grafico_ggplot)

#Mostrar gráfico
plot_interactivo

Podemos observar que hay un mayor número de hijos en el rango de salario “Medio” en comparación con los otros rangos. Por lo tanto, se puede asumir que familias con este tipo de ingreso suelen tener más hijos por factores socioeconómicos. Por otro lado, el rango de salario “Bajo” son los trabajadores que menos hijos tienen. Esto puede estar relacionado a restricciones económicas y tener una menor capacidad para criar hijos. Finalmente, el rango de salario “Alto” muestra una cantidad balanceada de hijos. Esto puede deberse a que familias con ingresos más alto tienen la capacidad de tomar decisiones más calculadas en base a la cantidad de hijos que quisieran tener.

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

p <- ggplot(Trabajadores, aes(x = Experiencia, y = Salario)) +
  geom_point() +
  geom_smooth(method = "lm", linetype = "dashed", fill = "blue") +  
  labs(title = "Relación entre Salario y Experiencia",
       x = "Años de Experiencia",
       y = "Salario") +
  theme_minimal()

# Convertir el gráfico a interactivo con plotly
grafico_dispersión <- ggplotly(p)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 19 rows containing non-finite outside the scale range
## (`stat_smooth()`).
# Mostrar el gráfico
grafico_dispersión

La gráfica muestra la correlación entre las variables de Salario y Experiencia. Al igual que fue observado en el mapa de calor, es evidente que estas variables no tienen una relación significativa. Los puntos están distribuidos por toda la gráfica sin una tendencia clara, por lo cual podemos observar que las variables no están relacionadas de forma lineal.