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

skim(dat)
Data summary
Name dat
Number of rows 100
Number of columns 11
_______________________
Column type frequency:
character 6
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Ciudad 5 0.95 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 2 0.98 7 13 0 3 0
Propietario_Vivienda 4 0.96 2 2 0 2 0
Rango_Salario 9 0.91 4 5 0 3 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Edad 9 0.91 44.95 13.82 18 37.0 48 56.0 65 ▆▂▇▇▇
Salario 9 0.91 49339.10 16344.08 20620 35230.5 46786 62878.0 78786 ▅▇▆▆▆
Experiencia 13 0.87 20.55 11.58 0 12.0 21 30.5 40 ▆▅▇▇▆
Horas_Trabajo_Semana 3 0.97 41.10 11.63 20 33.0 42 51.0 60 ▇▆▆▇▇
Cantidad_Hijos 8 0.92 2.53 1.71 0 1.0 3 4.0 5 ▇▅▅▅▅

La gran mayoría de las variables numéricas presentan datos faltantes, siendo “Experiencia” la más que contiene. Las variables que considero que presentaron más anomalías fueron “Edad”, “Salario” y “Cantidad_Hijos”, debido a que, como se puede observar en sus histogramas, se puede apreciar un sesgo notable en las variables. Además, todas las variables categóricas contienen espacios vacíos, lo que dificulta su análisis.

Problemas

* 1.    Datos Faltantes 
pct_miss_case(dat)
## [1] 44
gg_miss_var(dat)

 dat %>% aggr(combined = TRUE, numbers = TRUE, sortVars=TRUE, 
      labels=names(dat), cex.axis=.7, gap=3, 
      ylab=c("Proporcion de Datos Faltantes","Patron de Datos Faltantes"))

## 
##  Variables sorted by number of missings: 
##              Variable Count
##           Experiencia    13
##                  Edad     9
##               Salario     9
##         Rango_Salario     9
##        Cantidad_Hijos     8
##                Ciudad     5
##  Propietario_Vivienda     4
##  Horas_Trabajo_Semana     3
##       Nivel_Educativo     2
##          Estado_Civil     2
##        Sector_Laboral     2

Se identificó que el 44% de las variables presentan datos faltantes, concentrados principalmente en las variables de Experiencia, Edad, Salario y Cantidad de Hijos. Se concluye que Rango de Salario, al ser una variable derivada de Salario, presenta la misma cantidad de observaciones faltantes, con una frecuencia de datos incompletos para esta combinación del 0.04. La data faltante presenta un patrón de co-ocurrencia, lo que sugiere que un segmento específico de la muestra omitió responder el bloque de preguntas demográficas y socioeconómicas en su totalidad. Esta estructura indica que la causa de la pérdida de información es de tipo MAR Missing at Random, relacionando los datos incompletos con otras variables observadas. Debido a esta naturaleza multivariante y la presencia de datos mixtos (discretos, binarios y categóricos), se optará por una Imputación Múltiple por Ecuaciones Encadenadas (MICE), Random Forest , y Regresión Múltiple . Este procedimiento permitirá generar valores que respeten la distribución original de la muestra y mantengan la integridad de las correlaciones, evitando el sesgo que producirían métodos de imputaccion sin iterar.

Parte 2: Imputación de datos:

Datos Categoricos

Imput_rf <- mice(dat, method = "rf", m = 1, print = FALSE)
Complete_rf <- mice::complete(Imput_rf)

Imput_mode = mice(dat, method = "cart", print = FALSE) 
Complete_mode =mice::complete(Imput_mode)

Gráfico de densidad para variables categóricas

data_long_fact <- bind_rows(
  dat %>% 
    mutate(Origen = "Original"), 
  Complete_rf  %>% mutate(Origen = "Random Forest")  ,
  Complete_mode %>% mutate(Origen = "Imputacion Moda")) %>%
  select(all_of(cat_vars), Origen) %>%
  pivot_longer(cols = -Origen, names_to = "Variable", values_to = "Valor")


p2 <- ggplot(data_long_fact, aes(x = Valor, fill = Origen)) +
  geom_bar(position = "dodge", alpha = 0.8) + # Better for categories
  facet_wrap(~Variable, scales = "free") + 
  labs(
    title = "Comparación de Distribuciones por Método",
    x = "Categorías", 
    y = "Frecuencia"
  ) +
  theme_minimal()


ggplotly(p2)

Conclusión acerca de imputación multivariada para las variables categóricas

Se ha determinado que el modelo de Random Forest es el más adecuado para la mayoría de las variables categóricas por las siguientes razones:

•   Para variables como Ciudad, la imputación por la Moda generó incrementos artificiales, lo que introduce un sesgo de concentración que podría invalidar análisis estadísticos posteriores
•     Aunque el método de Random Forest mostró una ligera sobreestimación en la categoría "Medio" de la variable Rango Salario, su comportamiento general es más conservador y logra capturar mejor su correlación con Ingreso. 
•     Cabe destacar que, para la variable titular, la imputación por la moda presentó una alineación visualmente superior a la data original en comparación con Random Forest. Dado a que se considera una variable con poca relaciona otras variables , se utilizara la imputación por la moda. 

Variables numéricas

Imput_reg <- mice( select(dat , where(is.numeric)), method = "norm.predict", print = FALSE)
Complete_reg <- mice::complete(Imput_reg)

Imput_mean <- mice(select(dat , where(is.numeric)),method="mean",print=F) 
Complete_mean <- mice::complete(Imput_mean)


Complete_median <- dat %>%
  mutate(across(where(is.numeric), ~ifelse(is.na(.), median(., na.rm = TRUE), .))) %>% select(where(is.numeric))
data_long <- bind_rows(
  dat %>% 
    mutate(Origen = "Original"), 
  Complete_reg %>% mutate(Origen = "Regresion Simple"), 
  Complete_mean  %>% mutate(Origen = "Media"),
  Complete_median  %>% mutate(Origen = "Mediana")) %>%
  select(Origen, where(is.numeric)) %>%
  pivot_longer(cols = -Origen, names_to = "Variable", values_to = "Valor")



p <- ggplot(data_long, aes(x = Valor, color = Origen, fill = Origen, text = paste("Metodo:", Origen))) +
  geom_density(alpha = 0.2) +
  facet_wrap(~Variable, scales = "free") + 
  labs(title = "Comparacion de Imputacion Multivariada", x = "Variables", y = "Densidad") +
  theme_minimal()

# Convertir a grC!fico interactivo 
ggplotly(p, tooltip = c("text", "x", "y"))
  •     Regresión Lineal: Se identificó como el método más robusto en comparación con los estadísticos simples, aunque no es perfecto. Presenta cierta distorsión en los patrones reales y una tendencia a la sobreestimación de valores, lo cual debe ser considerado como una limitación en las inferencias posteriores.
  •     Media: Este método resultó inefectivo para capturar la estructura compleja de los datos. Su principal debilidad fue la sobreestimación de valores en la variable con mayor índice de ausencia, Experiencia. Se concluye que la media ignora la variabilidad natural y falla al intentar representar las relaciones reales entre variables.
  •     Mediana: Fue el método con menor desempeño, mostrando la mayor desalineación respecto a la estructura original. Su uso generó picos artificiales ,lo que introduciría sesgos severos en las conclusiones. Por tanto, se descarta como método general.

Tras evaluar el impacto de cada método, se optará por un enfoque mixta: se utilizará la mediana únicamente para ‘Horas de Trabajo’ y la media para ‘Cantidad de Hijos’ , mientras que, para las variables críticas de Salario, Edad y Experiencia, se aplicará Regresión Lineal por su mayor capacidad de preservación de la estructura de datos

Impacto Se debe considerar en el análisis posterior que la selección de los métodos de imputación se realizó mediante una comparativa entre un conjunto específico de técnicas: métodos univariados (media, moda y mediana), regresión simple y métodos multivariados (Random Forest). Por lo tanto, no se descarta que otros métodos no evaluados en este estudio pudieran capturar con mayor precisión la estructura subyacente de los datos. Es importante señalar que la elección de estos métodos no se basó en una evaluación de su rendimiento absoluto o independiente, sino en su efectividad relativa comparada entre sí dentro de este contexto específico. Finalmente, se advierte que ninguna de las técnicas presentadas logró un ajuste exacto a la distribución original. Todos los métodos de imputación conllevan una distorsión que debe ser tomado en cuenta al interpretar los resultados finales.

Conclusión acerca de imputación multivariada para las variables numéricas

  •     Regresión Lineal: Se identificó como el método más robusto en comparación con los estadísticos simples, aunque no es perfecto. Presenta cierta distorsión en los patrones reales y una tendencia a la sobreestimación de valores, lo cual debe ser considerado como una limitación en las inferencias posteriores.
  •     Media: Este método resultó inefectivo para capturar la estructura compleja de los datos. Su principal debilidad fue la sobreestimación de valores en la variable con mayor índice de ausencia, Experiencia. Se concluye que la media ignora la variabilidad natural y falla al intentar representar las relaciones reales entre variables.
  •     Mediana: Fue el método con menor desempeño, mostrando la mayor desalineación respecto a la estructura original. Su uso generó picos artificiales ,lo que introduciría sesgos severos en las conclusiones. Por tanto, se descarta como método general.

Tras evaluar el impacto de cada método, se optará por un enfoque híbrido: se utilizará la mediana únicamente para ‘Horas de Trabajo’ y la media para ‘Cantidad de Hijos’ debido a su baja variabilidad, mientras que, para las variables críticas de Salario, Edad y Experiencia, se aplicará Regresión Lineal por su mayor capacidad de preservación de la estructura de datos

Parte 3: Discretización y modificación:

Factores Ordinales (Nivel Educativo y Rango Salario

dat_final <- Complete_rf
dat_final$titular <- Complete_mode$titular
dat_final$Salario = Complete_reg$Salario
dat_final$Edad = Complete_reg$Edad
dat_final$Experiencia = Complete_reg$Experiencia
dat_final$Horas_Trabajo_Semana = Complete_median$Horas_Trabajo_Semana
dat_final$Rango_Salario <- factor(dat_final$Rango_Salario, 
                                    levels = c("Bajo", "Medio", "Alto"), 
                                    ordered = TRUE)


dat_final$Nivel_Educativo = factor( dat_final$Nivel_Educativo ,
                                      levels = c("Primaria" ,"Secundaria" , "Universitario"),
                                      ordered= TRUE)

Se definen niveles específicos para las variables Rango_Salario y Nivel_Educativo debido a su naturaleza ordinal. Establecer este orden explícitamente en R garantiza que las visualizaciones y los análisis estadísticos respeten la progresión real de los datos

Eliminación de tildes

dat_final$Cantidad_Hijos= Complete_mean$Cantidad_Hijos
dat_final$Ciudad = recode(dat_final$Ciudad, "Bayam\u00f3n" = "Bayamon")


dat_final$Sector_Laboral = recode(dat_final$Sector_Laboral, "P\u00fablico" = "Publico")

Se procedió a normalizar los caracteres eliminando tildes y caracteres especiales para evitar errores de codificación durante la importación y procesamiento en R

Definir los puntos de corte

cortes <- c(18, 30, 50, 80)
etiquetas <- c("Joven", "Adulto", "Senior")
dat_final$Edad= cut(dat_final$Edad, breaks = cortes, labels = etiquetas, right = FALSE)

La discretización de las variables ‘Edad’ mediante los cortes es necesaria para transformar variables discretas en categorías ordinales. Esto reduce la dispersión, facilita la detección de patrones en gráficos y mejora la interpretabilidad del análisis.

Parte 4: Visualización avanzada

Mapa de calor

corr <- cor(dplyr::select_if(dat_final, is.numeric))
plot_ly(colors = "RdBu") %>%
  add_heatmap(x = rownames(corr), y = colnames(corr), z = corr) %>%
  colorbar(limits = c(-1, 1))

Las variables de estudio possen una relacion debil entre si . Demostrando que no hay una causalidad o dependencia entre la S No hay un patron de codependencia en las variables selecionadas

Gráfico de barras interactivo

plot_ly(dat_final, x = ~Cantidad_Hijos, color = ~Rango_Salario)
## No trace type specified:
##   Based on info supplied, a 'histogram' trace seems appropriate.
##   Read more about this trace type -> https://plotly.com/r/reference/#histogram

Se observa una distribución multimodal donde el nivel de salario “Medio” predomina en la mayoría de las categorías de cantidad de hijos, alcanzando su frecuencia máxima en individuos sin hijos

Los participantes con salarios más altos muestran una preferencia por familias de 2 hijos o por no tener hijos

Los individuos con salario “Bajo” representan la minoría en casi todos los niveles de cantidad de hijos , mostrando su mayor participación relativa en el grupo de 3 hijos, donde superan en frecuencia a los individuos de salario alto.

Gráfico de dispersión

plot_ly(dat_final, x = ~as.numeric(Experiencia), y = ~Salario, color = ~as.numeric(Experiencia), 
        type = "scatter", 
        mode = "markers",
        marker = list(size = 10, opacity = 0.7))%>%
  layout(xaxis = list(title = "Experiencia (Años)"))

La ausencia de una tendencia lineal entre la experiencia y el salario sugiere que la primera no es un predictor sólido del nivel de ingresos en este conjunto de datos. Se observa una alta variabilidad; por ejemplo, individuos con nula experiencia acceden a salarios medios (30k-60k). Asimismo, destaca un caso atípico donde un individuo con la mayor experiencia registrada percibe un salario inferior a 40k, lo cual refuerza la falta de correlación directa entre años de experiencia y ingreso.