skim(dat)
| 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.
* 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.
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
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.
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.