Parte 1: Identificación de Problemas en los Datos 1.1 Carga y Exploración Inicial Se carga el archivo Grupo_3.csv y se revisa su estructura y las primeras filas.
library(readr)
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
# Leer datos
df <- read.csv("Grupo_3.csv", stringsAsFactors = FALSE)
# Inspeccionar nombres de columnas y primeras filas
cat("Nombres de columnas:\n")
## Nombres de columnas:
print(colnames(df))
## [1] "ID" "Edad" "Salario"
## [4] "Experiencia" "Ciudad" "Nivel_Educativo"
## [7] "Horas_Trabajo_Semana" "Estado_Civil" "Sector_Laboral"
## [10] "Cantidad_Hijos" "Propietario_Vivienda" "Rango_Salario"
cat("\nPrimeras filas del dataframe:\n")
##
## Primeras filas del dataframe:
print(head(df))
## ID Edad Salario Experiencia Ciudad Nivel_Educativo Horas_Trabajo_Semana
## 1 1 39 21194 12 Caguas Universitario 51
## 2 2 40 35185 13 Caguas Universitario 31
## 3 3 27 55264 32 Bayamón Primaria 50
## 4 4 NA 59451 5 Caguas Universitario 34
## 5 5 43 34924 21 Bayamón Universitario 20
## 6 6 NA 67882 34 Bayamón Universitario 54
## Estado_Civil Sector_Laboral Cantidad_Hijos Propietario_Vivienda Rango_Salario
## 1 Divorciado Independiente NA No Bajo
## 2 Soltero Privado 1 Sí Medio
## 3 Público 4 No Medio
## 4 Divorciado Privado 1 Sí Medio
## 5 Soltero Independiente 5 Sí Medio
## 6 Divorciado Público 5 Sí Alto
1.2 Análisis Estadístico y Exploración de Datos Se genera un resumen estadístico para identificar distribuciones, presencia de outliers y valores faltantes.
# Selección de variables numéricas de interés
numeric_vars <- df %>% select(Edad, Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos)
cat("Resumen estadístico de variables numéricas:\n")
## Resumen estadístico de variables numéricas:
print(summary(numeric_vars))
## Edad Salario Experiencia Horas_Trabajo_Semana
## Min. :18.00 Min. :20620 Min. : 0.00 Min. :20.0
## 1st Qu.:37.00 1st Qu.:35230 1st Qu.:12.00 1st Qu.:33.0
## Median :48.00 Median :46786 Median :21.00 Median :42.0
## Mean :44.95 Mean :49339 Mean :20.55 Mean :41.1
## 3rd Qu.:56.00 3rd Qu.:62878 3rd Qu.:30.50 3rd Qu.:51.0
## Max. :65.00 Max. :78786 Max. :40.00 Max. :60.0
## NA's :9 NA's :9 NA's :13 NA's :3
## Cantidad_Hijos
## Min. :0.000
## 1st Qu.:1.000
## Median :3.000
## Mean :2.533
## 3rd Qu.:4.000
## Max. :5.000
## NA's :8
# Conteo de valores faltantes por columna
cat("\nConteo de valores faltantes por variable:\n")
##
## Conteo de valores faltantes por variable:
print(colSums(is.na(df)))
## ID Edad Salario
## 0 9 9
## Experiencia Ciudad Nivel_Educativo
## 13 0 0
## Horas_Trabajo_Semana Estado_Civil Sector_Laboral
## 3 0 0
## Cantidad_Hijos Propietario_Vivienda Rango_Salario
## 8 0 0
Observaciones:
-Se evidencia que algunas columnas tienen valores faltantes (por ejemplo, Edad, Salario, Experiencia, Horas_Trabajo_Semana y Cantidad_Hijos). -Estos problemas deben ser tratados mediante la imputación de datos o eliminación, dependiendo de la cantidad de missing values y la naturaleza de cada variable.
Parte 2: Imputación de Datos Para las variables con valores faltantes, se aplicarán estrategias de imputación según sus características. Se utilizarán los siguientes métodos: -Mediana: Es robusto frente a outliers y se emplea en variables donde existen valores extremos. -Media: Puede usarse en variables sin outliers significativos.
2.1 Imputación para Edad y Salario Dado que se han observado algunos outliers, se opta por imputar usando la mediana.
# Imputación de la variable Edad usando la mediana
df$Edad <- ifelse(is.na(df$Edad), median(df$Edad, na.rm = TRUE), df$Edad)
# Imputación de la variable Salario usando la mediana
df$Salario <- ifelse(is.na(df$Salario), median(df$Salario, na.rm = TRUE), df$Salario)
2.2 Imputación para Experiencia y Horas de Trabajo Se procede con la imputación de estas variables, también usando la mediana (considerando la naturaleza de estos datos).
# Imputación de la variable Experiencia
df$Experiencia <- ifelse(is.na(df$Experiencia), median(df$Experiencia, na.rm = TRUE), df$Experiencia)
# Imputación de la variable Horas_Trabajo_Semana
df$Horas_Trabajo_Semana <- ifelse(is.na(df$Horas_Trabajo_Semana), median(df$Horas_Trabajo_Semana, na.rm = TRUE), df$Horas_Trabajo_Semana)
2.3 Imputación para Cantidad de Hijos Se utiliza la mediana para sustituir valores faltantes.
df$Cantidad_Hijos <- ifelse(is.na(df$Cantidad_Hijos), median(df$Cantidad_Hijos, na.rm = TRUE), df$Cantidad_Hijos)
2.4 Comparación de Métodos de Imputación en el Salario Como ejemplo, se imputa utilizando la media y la mediana para la variable Salario y se compara su efecto:
# Imputación por media
df$Salario_impute_mean <- ifelse(is.na(df$Salario), mean(df$Salario, na.rm = TRUE), df$Salario)
# Imputación por mediana ya realizada se guarda en Salario
df$Salario_impute_median <- df$Salario
# Crear un dataframe con una variable categórica para el tipo de imputación
df_long <- data.frame(
Metodo = rep(c("Media", "Mediana"), each = nrow(df)),
Salario = c(df$Salario_impute_mean, df$Salario_impute_median)
)
# Cargar librerías
library(ggplot2)
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
# Gráfico para imputación por media
p_mean <- ggplot(df_long[df_long$Metodo == "Media", ], aes(x = Metodo, y = Salario)) +
geom_boxplot(fill = "lightblue") +
ggtitle("Imputación con Media")
# Gráfico para imputación por mediana
p_median <- ggplot(df_long[df_long$Metodo == "Mediana", ], aes(x = Metodo, y = Salario)) +
geom_boxplot(fill = "salmon") +
ggtitle("Imputación con Mediana")
# Mostrar ambos gráficos en una fila
grid.arrange(p_mean, p_median, ncol = 2)
Conclusiones de la Imputación:
-La imputación por mediana es generalmente preferible cuando existen outliers, ya que minimiza el sesgo que podrían introducir valores extremos. -La elección del método de imputación afecta el análisis posterior en términos de medidas de tendencia, dispersión y, por ende, cualquier modelado predictivo o agrupamiento que se realice.
Parte 3: Discretización y Modificación Esta sección está enfocada en transformar las variables categóricas a formatos adecuados.
3.1 Transformación de Variables Categóricas -Nivel_Educativo: Se convierte a factor. Si existe un orden natural (por ejemplo, “Primaria” < “Universitario”), se ordena. -Rango_Salario: Se transforma en variable ordinal con niveles: Bajo < Medio < Alto.
# Transformar Nivel_Educativo en factor ordenado (ajustar los niveles de acuerdo a la jerarquía que manejes)
if("Nivel_Educativo" %in% colnames(df)){
df$Nivel_Educativo <- factor(df$Nivel_Educativo, levels = c("Primaria", "Universitario"), ordered = TRUE)
}
# Transformar Rango_Salario en factor ordinal
if("Rango_Salario" %in% colnames(df)){
df$Rango_Salario <- factor(df$Rango_Salario, levels = c("Bajo", "Medio", "Alto"), ordered = TRUE)
}
3.2 Variables Dummy (One-Hot Encoding) Si se requiere utilizar variables dummy para modelado, se puede hacer uno a una:
# Ejemplo de creación de variables dummy para Nivel_Educativo
if("Nivel_Educativo" %in% colnames(df)){
dummies <- model.matrix(~Nivel_Educativo - 1, data = df)
head(dummies)
}
## Nivel_EducativoPrimaria Nivel_EducativoUniversitario
## 1 0 1
## 2 0 1
## 3 1 0
## 4 0 1
## 5 0 1
## 6 0 1
Parte 4: Visualización Avanzada Se generan visualizaciones interactivas para explorar las correlaciones y relaciones entre variables.
4.1 Mapa de Calor Interactivo de Correlaciones Primero, se normalizan algunas variables numéricas para que estén en la misma escala y se construye la matriz de correlaciones.
library(tidyr)
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(tibble)
# Normalizar variables numéricas
df_normalized <- df %>%
mutate(
Salario_norm = scale(Salario),
Edad_norm = scale(Edad),
Experiencia_norm = scale(Experiencia),
Horas_Trabajo_Semana_norm = scale(Horas_Trabajo_Semana)
)
# Calcular matriz de correlación
numeric_vars <- df_normalized %>%
select(Salario_norm, Edad_norm, Experiencia_norm, Horas_Trabajo_Semana_norm)
cor_matrix <- cor(numeric_vars, use = "complete.obs")
# Convertir la matriz de correlación a formato largo usando pivot_longer
cor_melted <- as.data.frame(cor_matrix) %>%
rownames_to_column("Var1") %>%
pivot_longer(-Var1, names_to = "Var2", values_to = "value")
# Crear mapa de calor
heatmap <- ggplot(cor_melted, aes(Var1, Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1,1)) +
theme_minimal() +
labs(title = "Mapa de Calor de Correlaciones",
x = "", y = "") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Hacer el gráfico interactivo
ggplotly(heatmap)
4.2 Gráfico de Barras Interactivo: Cantidad de Hijos por Rango de Salario
hijos_salario <- df %>%
group_by(Rango_Salario) %>%
summarise(
Promedio_Hijos = mean(Cantidad_Hijos, na.rm = TRUE),
Error_Estandar = sd(Cantidad_Hijos, na.rm = TRUE) / sqrt(n())
)
barplot <- ggplot(hijos_salario, aes(x = Rango_Salario, y = Promedio_Hijos,
text = paste("Promedio:", round(Promedio_Hijos, 2)))) +
geom_bar(stat = "identity", fill = "skyblue") +
geom_errorbar(aes(ymin = Promedio_Hijos - Error_Estandar,
ymax = Promedio_Hijos + Error_Estandar),
width = 0.2) +
labs(title = "Promedio de Hijos por Rango de Salario",
x = "Rango de Salario",
y = "Promedio de Hijos") +
theme_minimal()
ggplotly(barplot)
4.3 Gráfico de Dispersión: Salario vs Experiencia
scatter <- ggplot(df, aes(x = Experiencia, y = Salario,
text = paste("Ciudad:", Ciudad,
"\nSalario:", scales::dollar(Salario),
"\nExperiencia:", Experiencia, "años"))) +
geom_point(aes(color = Ciudad)) +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Relación entre Salario y Experiencia",
x = "Experiencia (años)",
y = "Salario") +
theme_minimal()
ggplotly(scatter)
## `geom_smooth()` using formula = 'y ~ x'
Análisis de graficas:
Mapa de Calor de Correlaciones:
Las variables numéricas presentan correlaciones moderadas a fuertes
entre sí. En particular, hay una relación positiva entre salario y
experiencia, lo que indica que a mayor experiencia, mayor salario.
También se observa una correlación entre edad y experiencia, lo que
sugiere que a medida que aumenta la edad, es más probable que una
persona tenga más años de experiencia laboral. Sin embargo, la
intensidad de estas relaciones puede variar.
Gráfico de Barras: Cantidad de Hijos por Rango de Salario: El gráfico muestra que los empleados con salarios “Medios” y “Altos” tienden a tener, en promedio, una mayor cantidad de hijos en comparación con aquellos con ingresos “Bajos”. No obstante, las barras de error indican que hay variabilidad dentro de cada grupo, lo que sugiere que, aunque existe una tendencia, no todos los empleados dentro de un mismo rango salarial presentan el mismo comportamiento.
Gráfico de Dispersión: Salario vs. Experiencia: La relación entre salario y experiencia es positiva y aproximadamente lineal, como lo indica la línea de tendencia. A mayor experiencia, mayor salario, lo que es consistente con patrones comunes en el mercado laboral. Además, el uso de colores para representar diferentes ciudades sugiere que la relación entre experiencia y salario puede no ser igual en todas las regiones, lo que abre la posibilidad de realizar análisis segmentados por ubicación geográfica.