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.