Examen Grupal I

Ejercicio Grupal: Preprocesamiento de Datos.

La base de datos contiene información socioeconómica y laboral de 100 individuos. Incluye variables demográficas como edad, estado civil y número de hijos, así como datos financieros relacionados con ingresos y propiedad de vivienda. Además, presenta información laboral como horas de trabajo por semana, sector de empleo y nivel educativo.

Algunas variables tienen valores nulos, lo que sugiere la necesidad de preprocesamiento antes del análisis. Esta base de datos puede ser utilizada para estudiar la relación entre educación, experiencia y salario, entre otros factores.

Descripción de las Variables:

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

1. Exploren los datos asignados a su grupo.

  head(G2)
Edad Salario Experiencia Ciudad Nivel_Educativo Horas_Trabajo_Semana Estado_Civil Sector_Laboral Cantidad_Hijos Propietario_Vivienda Rango_Salario
35 27203 NA Ponce Primaria 54 Casado Público 3 No Bajo
43 45647 10 San Juan Primaria 36 Casado Público 3 No Medio
53 42181 10 Caguas Universitario 26 Independiente 5 Medio
38 58530 20 Ponce Universitario 45 Casado Público NA Medio
58 76972 NA Ponce Universitario 59 Casado Independiente 5 Alto
46 59877 NA Caguas Primaria 60 Casado Público 4 No Medio
  str(G2)
## 'data.frame':    100 obs. of  11 variables:
##  $ Edad                : num  35 43 53 38 58 46 38 62 35 30 ...
##  $ Salario             : num  27203 45647 42181 58530 76972 ...
##  $ Experiencia         : num  NA 10 10 20 NA NA 26 29 38 24 ...
##  $ Ciudad              : chr  "Ponce" "San Juan" "Caguas" "Ponce" ...
##  $ Nivel_Educativo     : chr  "Primaria" "Primaria" "Universitario" "Universitario" ...
##  $ Horas_Trabajo_Semana: num  54 36 26 45 59 60 22 41 49 33 ...
##  $ Estado_Civil        : chr  "Casado" "Casado" "" "Casado" ...
##  $ Sector_Laboral      : chr  "Público" "Público" "Independiente" "Público" ...
##  $ Cantidad_Hijos      : num  3 3 5 NA 5 4 0 0 3 5 ...
##  $ Propietario_Vivienda: chr  "No" "No" "Sí" "Sí" ...
##  $ Rango_Salario       : chr  "Bajo" "Medio" "Medio" "Medio" ...
  skimr::skim(G2)
Data summary
Name G2
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 0 1 0 8 4 5 0
Nivel_Educativo 0 1 0 13 3 4 0
Estado_Civil 0 1 0 10 4 4 0
Sector_Laboral 0 1 0 13 1 4 0
Propietario_Vivienda 0 1 0 2 3 3 0
Rango_Salario 0 1 0 5 9 4 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Edad 7 0.93 43.65 13.89 18 31 46 56.0 64 ▅▃▅▆▇
Salario 9 0.91 50512.31 16653.66 20213 37544 52147 62582.5 79438 ▆▇▇▇▆
Experiencia 11 0.89 19.96 12.19 0 10 19 30.0 40 ▇▆▆▆▇
Horas_Trabajo_Semana 3 0.97 39.65 11.61 20 28 41 49.0 60 ▆▃▃▇▃
Cantidad_Hijos 11 0.89 2.79 1.67 0 1 3 4.0 5 ▇▅▆▅▇

La base de datos asignada al grupo dos consiste en 100 observaciones y 12 variables. La función skim nos permite hacer una breve visión general de los valores faltantes y la estadística de esta base de datos. Continuaremos analizando esta base de datos en los próximos pasos de este trabajo.

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

A continuación realizaremos una serie de análisis para identificar los problemas de nuestra base de datos.

# 1. Para identificar valores faltantes

vis_miss(G2)

En este gráfico de valores faltantes podemos observar como hay 96.3% de valores presentes y solo un 3.7% de valores ausentes. Las variables con más datos faltantes lo son Experiencia (11%), Cantidad_Hijos (11%), Salario (9%) y Edad (7%). Por otro lado las variables Ciudad, Nivel_Educativo, Estado_Civil, Sector_Laboral, Propietario_Vivienda y Rango_Salario no tienen valores faltantes (0%).

# 2. Para identificar distribuciones en las variables categóricas

table(G2$Ciudad)
Bayamón Caguas Ponce San Juan
4 29 25 26 16
table(G2$Nivel_Educativo)
Primaria Secundaria Universitario
3 35 23 39
table(G2$Estado_Civil)
Casado Divorciado Soltero
4 37 30 29
table(G2$Propietario_Vivienda)
No
3 51 46
table(G2$Rango_Salario)
Alto Bajo Medio
9 26 13 52

Esta es otra manera de ver los valores faltantes:

  1. Ciudad:
  1. Nivel_Educativo:
  1. Estado_Civil
  1. Propietario_Vivienda
  1. Rango_Salario

Confirmaremos si las detección de valores vacios es correcta con el siguiente código.

# 3. Detección de valores vacíos en variables categóricas

sum(G2$Ciudad == "", na.rm = TRUE)
## [1] 4
sum(G2$Nivel_Educativo == "", na.rm = TRUE)
## [1] 3
sum(G2$Estado_Civil == "", na.rm = TRUE)
## [1] 4
sum(G2$Propietario_Vivienda == "", na.rm = TRUE)
## [1] 3
sum(G2$Rango_Salario == "", na.rm = TRUE)
## [1] 9

Los valores vacíos del paso dos están acorde con las del paso tres. Ahora utilizarimos una variables de ejemplo para determinar si los valores vacíos son NA o casillas vacías.

# 4 Valores vacíos y valores NA

sum(is.na(G2$Rango_Salario))  # ¿Cuántos NA hay en Rango_Salario?
## [1] 0
sum(G2$Rango_Salario == "", na.rm = TRUE)  # ¿Cuántas cadenas vacías hay?
## [1] 9

Problemas más relevantes encontrados

En primer lugar, podemos observar como hay ciertos valores faltantes que son catalogados como cadenas vacías y no como NA. Esto lo vemos en especial en el paso cuatro siendo los valores NA=0 y los valores vacíos (““)= 9. Debemos asegurarnos de que estos valores sean correctamente tratados antes de la imputación.

Otra observación es que dado que la base de datos tiene precisamente 100 observaciones, al conocer la cantidad de datos faltantes, también se obtiene el porcentaje de datos faltantes por variable. Recordemos que los valores faltantes no son lo mismo que el valor 0, dado que 0 es un resultado y NA representa la ausencia de un valor. En la variable “Cantidad_Hijos”, hay ambas ocurrencias, y no significan lo mismo. Una indica que el individuo no tiene hijos, mientras que la otra simplemente significa que el individuo no quiso o se le olvidó responder la pregunta.

En varias variables categóricas, como “Estado_Civil”, “Sector_Laboral” y “Propietario_Vivienda”, existen observaciones sin información registrada. Esto genera incertidumbre al analizar los datos, ya que impide determinar correctamente las categorías a las que pertenecen algunas personas.

Se observan posibles valores atípicos en la variable “Horas_Trabajo_Semana”, donde algunos individuos reportan jornadas laborales considerablemente altas en comparación con el resto de la muestra. Esto puede indicar errores de digitación o reflejar la presencia de personas con horarios de trabajo extremos.

3. Propongan estrategias de preprocesamiento para solucionar estos problemas.

Como sabemos que todos los renglones de la columna Ciudad deben incluir algún dato, removemos aquellos con valores perdidos luego de hacer la correción de las cadenas vacías y los NA.

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

Antes de aplicar cualquier método de imputación, es necesario convertir todas las observaciones vacías (““) en NA, para asegurar un tratamiento adecuado de los valores faltantes. Una vez realizado este paso, seleccionamos diferentes estrategias de imputación según la naturaleza de cada variable:

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

  1. Edad y Experiencia: Se usa la mediana porque la distribución puede ser sesgada y la mediana es más robusta a valores atípicos.

  2. Salario: Se usa PMM en lugar de la media, ya que los salarios pueden tener valores extremos y PMM permite imputaciones más realistas.

  3. Horas_Trabajo_Semana: Se usa PMM para preservar la relación con otras variables, evitando distorsionar la distribución.

  4. Cantidad_Hijos: Se usa la moda, ya que es una variable categórica y discreta, donde el valor más frecuente es una opción adecuada.

  5. Rango_Salario: Se imputará posteriormente, asegurando que su clasificación esté alineada con la variable Salario.

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

# Converción valores vacíos ("") en NA para todas las variables categóricas

categorical_vars <- c("Ciudad", "Nivel_Educativo", "Estado_Civil", "Propietario_Vivienda", "Rango_Salario")

for (var in categorical_vars) {
  G2[[var]] <- as.character(G2[[var]])  
  G2[[var]][G2[[var]] == ""] <- NA  
  G2[[var]] <- as.factor(G2[[var]])  
}

# Verificar la cantidad de NA después de la conversión

sapply(G2[categorical_vars], function(x) sum(is.na(x)))  
##               Ciudad      Nivel_Educativo         Estado_Civil 
##                    4                    3                    4 
## Propietario_Vivienda        Rango_Salario 
##                    3                    9

Ahora confirmemos si la converción fue exitosa.

sum(is.na(G2$Rango_Salario))
## [1] 9
sum(G2$Rango_Salario == "", na.rm = TRUE)
## [1] 0

Podemos confirmar con este último código que ya no hay observaciones vacías y están correctamente como NA. Este paso es importante antes de comenzar nuestros métodos de imputación porque mice() solo trata los valores NA como datos faltantes. Si “” es tratado como una categoría válida, el modelo de imputación podría intentar asignar valores basados en él, lo que podría sesgar los resultados. Continuemos con las tecnicas de imputación.

# 1. Imputación con la CART y MICE para variables categóricas 

Imput_cart <- mice(G2, method = "cart", print = FALSE)
## Warning: Number of logged events: 1
Complete_cart <- mice::complete(Imput_cart)

# Imputación con MICE

Imput_mice <- mice(G2, method = "pmm", m = 5, print = FALSE)  
## Warning: Number of logged events: 1
Complete_mice <- mice::complete(Imput_mice)

# Crear un data.frame con los conteos antes y después de la imputación

G2_cat <- bind_rows(
  G2 %>% select(Rango_Salario) %>% mutate(Origen = "Original"),
  Complete_cart %>% select(Rango_Salario) %>% mutate(Origen = "Imputado")
) %>%
  filter(!is.na(Rango_Salario))  # Eliminar NA de los datos originales para comparación justa

# Crear el gráfico de barras corregido

p2 <- ggplot(G2_cat, aes(x = Rango_Salario, fill = Origen, text = paste("Origen:", Origen))) +
  geom_bar(position = "dodge") +
  labs(title = "", x = "Rango Salario",y = "Frecuencia") +
  theme_minimal()


ggplotly(p2,tooltip = c("text", "x", "y"))
p2

Es esencial conocer el salario para luego estimar el Rango Salarial (alto, medio, bajo), entonces, tendremos que analizar la relacion entre ambas variables para lidiar con algunos datos faltantes dentro de la variable Rango_Salario.

# Visualizar la relación entre Salario y Rango_Salario

G2_salario <- ggplot(G2, aes(x = Salario, y = Rango_Salario, color = is.na(Rango_Salario))) +
  geom_jitter() +
  theme_minimal()
ggplotly(G2_salario)
# Definir umbrales para asignar Rango_Salario

G2 <- G2 %>% mutate(
  Rango_Salario = case_when(
    is.na(Rango_Salario) & Salario < 30000 ~ "Bajo",
    is.na(Rango_Salario) & Salario >= 30000 & Salario < 60000 ~ "Medio",
    is.na(Rango_Salario) & Salario >= 60000 ~ "Alto",
    TRUE ~ as.character(Rango_Salario)
  )
)

# Convertir nuevamente a factor

G2$Rango_Salario <- as.factor(G2$Rango_Salario)

Este gráfico de dispersión ayuda visualizar la relación entre Salario y Rango_Salario, resaltando los valores faltantes. También definimos reglas para imputar Rango_Salario según umbrales de Salario. Ahora los valores NA se llenan automáticamente en función de estos criterios.

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

Paso 1: Evaluaremos la imputación de las variables categóricas (CART y Moda).

# Ver imputación antes y después de imputar Rango_Salario

table(G2$Rango_Salario, useNA = "ifany")  # Datos después de la imputación
Alto Bajo Medio NA
26 13 52 9

Despues de la imputación, Rango_Salario tiene: 26 observaciones clasificadas como “Alto”, 13 observaciones clasificadas como “Bajo”, 52 observaciones clasificadas como “Medio y 9 valores siguen siendo NA, lo que sugiere que estos casos no fueron imputados.

# Comparación de datos originales vs imputados

table(G2_cat$Origen)  
Imputado Original
100 91

100 observaciones fueron imputadas, lo que significa que estas tenían valores faltantes en Rango_Salario y se les asignó una categoría. 91 observaciones ya tenían valores en Rango_Salario antes de la imputación. La diferencia de 9 observaciones no imputadas coincide con los NA restantes en Rango_Salario. Mostraremos estos mismos datos gráficamente.

# Comparar gráficamente 

p3 <- ggplot(G2, aes(x = Rango_Salario)) +
  geom_bar(fill = "steelblue") +
  labs(title = "Distribución de Rango_Salario después de imputación manual", x = "Rango Salario", y = "Frecuencia") +
  theme_minimal()

ggplotly(p3)

¿Cuál es la estrategia más adecuada en este caso?

Para evaluar los métodos de imputación, analizamos los valores antes y después del proceso. CART imputó 100 valores, pero dejó 9 sin asignar (NA). Esto sugiere que, en algunos casos, no se encontró una relación suficientemente fuerte para predecir Rango_Salario. La moda garantizaría que no queden valores faltantes, pero no necesariamente reflejaría la estructura de los datos. En este caso CART es la mejor opción, ya que predice los valores en función de los datos existentes, pero podríamos complementar con la moda para llenar los NA restantes sin sesgar la distribución.

Paso 2: Evaluar la imputación de variables numéricas (MICE vs Mediana)

# Comparar estadísticas descriptivas

summary(G2$Salario)  # Después de la imputación manual
Min. 1st Qu. Median Mean 3rd Qu. Max. NA’s
20213 37544 52147 50512.31 62582.5 79438 9
summary(Complete_mice$Salario)  # Después de la imputación con PMM
Min. 1st Qu. Median Mean 3rd Qu. Max.
20213 37663 53629 51206.74 66183 79438

Este código nos muestra los valores mínimos, máximos, media, mediana y cuartiles de Salario después de la imputación manual y con MICE (PMM). Los valores mínimo y máximo son idénticos en ambas imputaciones, lo que indica que ningún valor extremo fue modificado significativamente. Podemos observar valores similares en ambas estrategias, lo que nos da a entender que ambas funcionan de manera comparable. Una diferencia que observamos es que la media de MICE es más alta, lo que indica que la imputación basada en patrones capturó relaciones que la imputación no consideró. El número de valores NA pasó de 9 a 0 en MICE, lo que significa que MICE imputó todos los valores faltantes exitósamente.Veamos la distribución gráficamente.

# Visualizar distribución de Salarios antes y después de la imputación

p4 <- ggplot() +
  geom_density(data = G2, aes(x = Salario, fill = "Manual"), alpha = 0.5) +
  geom_density(data = Complete_mice, aes(x = Salario, fill = "MICE"), alpha = 0.5) +
  labs(title = "Comparación de distribución de Salario", x = "Salario", y = "Densidad") +
  theme_minimal()

ggplotly(p4)
## Warning: Removed 9 rows containing non-finite outside the scale range
## (`stat_density()`).

Este gráfico de densidad muestra la distribución de salarios antes y después de la imputación de valores faltantes utilizando dos métodos:

Podemos apreciar como las curvas se superponen en la mayor parte del rango salarial, lo que indica que la imputación con MICE mantiene una distribución bastante similar a la original, adicional se mantuvo identico la densidad máxima en la curva de MICE, además, podemos asumir que no hubo generación de valores atípicos fuera de los límites del salario.

¿Cuál es la estrategia más adecuada en este caso?

La imputación manual con mediana tiene menor impacto en la estructura de los datos, pero también puede reducir la variabilidad al asignar valores repetidos a múltiples observaciones. No obstante, PMM preservó la variabilidad de los datos mejor que la mediana manual, como se ve en la diferencia entre los cuartiles y la media. Adicional, PMM eliminó todos los NA, asegurando que no haya valores faltantes en el análisis posterior. Es por estas razones que PMM es la mejor opción.

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

La selección del método de imputación influye directamente en la calidad del análisis posterior, ya que determina qué tan bien se preservan las relaciones entre las variables y si se introduce algún sesgo en los datos.

1-Impacto en la distribución de las variables

Si usamos la mediana:

Si usamos PMM (Predictive Mean Matching) con MICE:

2-Impacto en la relación entre variables

Si imputamos con moda en variables categóricas:

Si usamos CART para variables categóricas

3-Impacto en modelos predictivos y aprendizaje automático

Si la imputación introduce valores irreales o sesgados:

Si la imputación conserva la variabilidad de los datos:

Conclusión

La elección del método de imputación afecta la distribución de los datos, las relaciones entre variables y la precisión de los modelos predictivos. En cuanto a las estrategias, PMM es mejor para datos numéricos cuando se quiere preservar la variabilidad y estructura original. Por otro lado, CART es mejor que la moda en varibles categóricas porque respeta las relaciones entre variables. Las elecciones en estrategias son de suma importancia debido a que una imputación incorrecta puede generar sesgos, afectar modelos predictivos y distorsionar la interpretación de los resultados.En nuestro caso, PMM fue la mejor opción para imputar Salario, y CART fue la mejor opción para imputar Rango_Salario, ya que ambos métodos preservaron mejor la estructura de los datos originales.

C. Parte 3: Discretización y codificación:

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

# Cargar librerías necesarias
library(dplyr)

# Transformaciones 
G4 <- G2 %>%
  mutate(
    # Convertir variables categóricas en factores
    Ciudad = as.factor(Ciudad),
    Estado_Civil = as.factor(Estado_Civil),
    Propietario_Vivienda = as.factor(Propietario_Vivienda),
    Sector_Laboral = as.factor(Sector_Laboral),

    # Convertir a factor con niveles numéricos
    Nivel_Educativo = factor(Nivel_Educativo, 
                             levels = c("Primaria", "Secundaria", "Universitario"), 
                             labels = c(1, 2, 3)),
    
    Rango_Salario = factor(Rango_Salario, 
                           levels = c("Bajo", "Medio", "Alto"), 
                           labels = c(1, 2, 3)),

    # Convertir variables binarias en 0 y 1
    Propietario_Vivienda = ifelse(Propietario_Vivienda == "Sí", 1, 0),
    
    # Clasificación de Ciudad
    Ciudad_Cat = case_when(
      Ciudad %in% c("San Juan", "Bayamón", "Caguas") ~ "Área Metropolitana",
      TRUE ~ "Interior"
    ),

    # Discretización de variables numéricas
    Edad_Cat = cut(Edad, 
                   breaks = c(0, 17, 29, 49, Inf), 
                   labels = c("Menor de edad", "Joven", "Adulto", "Mayor"), 
                   include.lowest = TRUE),
    
    Salario_Cat = cut(Salario, 
                      breaks = quantile(Salario, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE), 
                      labels = c("Bajo", "Medio-Bajo", "Medio-Alto", "Alto"), 
                      include.lowest = TRUE),
    
    Experiencia_Cat = cut(Experiencia, 
                          breaks = c(0, 10, 20, Inf), 
                          labels = c("Baja", "Media", "Alta"), 
                          include.lowest = TRUE),
    
    Horas_Trabajo_Cat = cut(Horas_Trabajo_Semana, 
                            breaks = c(0, 30, 45, Inf), 
                            labels = c("Jornada Reducida", "Jornada Completa", "Horas Extras"), 
                            include.lowest = TRUE)
  )

# Convertir a numérico después de la transformación
G4$Nivel_Educativo <- as.integer(as.character(G4$Nivel_Educativo))
G4$Rango_Salario <- as.integer(as.character(G4$Rango_Salario))

2. Expliquen las decisiones tomadas en este proceso.

Para mejorar la interpretación y el análisis de los datos, se realizó la discretización de varias variables clave. La edad se categorizó en cuatro grupos (Menor de edad, Joven, Adulto y Mayor) para representar distintas etapas de la vida, mientras que el salario se segmentó en cuartiles para distribuir los valores en niveles de ingreso (Bajo, Medio-Bajo, Medio-Alto y Alto). La experiencia laboral se clasificó en Baja, Media y Alta, reflejando el crecimiento profesional, y las horas de trabajo semanales se agruparon en Jornada Reducida, Jornada Completa y Horas Extras según su intensidad. Además, se reclasificó la ciudad en dos categorías: Área Metropolitana (San Juan, Bayamón y Caguas) e Interior, permitiendo analizar diferencias geográficas. La variable de propietario de vivienda se transformó en un formato binario (1 = Sí, 0 = No) para facilitar su uso en modelos estadísticos. Finalmente, las variables Nivel Educativo y Rango de Salario se transformaron en factores numéricos para facilitar su interpretación en modelos estadísticos y permitir comparaciones más eficientes en el análisis de datos.

D. 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?

data_numeric <- G4 %>% select_if(is.numeric)
corr_matrix <- cor(data_numeric, use = "pairwise.complete.obs")

# Convertir matriz a formato largo para ggplot y asegurarse de que los nombres sean caracteres
df_corr <- as.data.frame(as.table(corr_matrix))
names(df_corr) <- c("Var1", "Var2", "value")
df_corr$Var1 <- as.character(df_corr$Var1)
df_corr$Var2 <- as.character(df_corr$Var2)

# Crear el mapa de calor interactivo
p1 <- ggplot(df_corr, aes(Var1, Var2, fill = value)) +
  geom_tile() +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0) +
  theme_minimal() +
  labs(title = "Mapa de Calor de Correlaciones")

# Convertir a gráfico interactivo
plotly::ggplotly(p1)

Sobre las corelaciones fuertes: Existe una fuerte correlación positiva entre Edad y Experiencia, lo cual es esperado, ya que a mayor edad, generalmente se tiene más experiencia laboral. También hay una fuerte correlación entre Horas de Trabajo por Semana y Salario, lo que indica que quienes trabajan más horas suelen ganar más.

Sobre las correlaciones débiles o nulas: La relación entre Salario y Cantidad de Hijos parece ser débil o inexistente. No se observa una relación clara entre Nivel Educativo y Salario, lo que podría indicar que el nivel educativo no es un factor determinante en el salario dentro de este conjunto de datos.

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?

library(ggplot2)
library(plotly)
library(dplyr)

# 1 Crear el gráfico de barras con ggplot2
p <- ggplot(G4, aes(x = factor(Rango_Salario), y = Cantidad_Hijos, fill = factor(Rango_Salario))) +
  geom_bar(stat = "summary", fun = "mean") +  # Promedio de hijos por rango salarial
  labs(title = "Cantidad Promedio de Hijos por Rango Salarial",
       x = "Rango Salarial",
       y = "Cantidad Promedio de Hijos") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

# 2 Convertir el gráfico a interactivo con ggplotly
ggplotly(p)
## Warning: Removed 11 rows containing non-finite outside the scale range
## (`stat_summary()`).

El gráfico de barras presentado muestra la relación entre la cantidad promedio de hijos y los diferentes rangos salariales, representados por las categorías 1, 2 y 3. En el eje X se encuentran los rangos salariales, mientras que en el eje Y se visualiza la cantidad promedio de hijos en cada grupo. Cada barra tiene un color distinto para diferenciar visualmente los rangos salariales. Se observa un patrón en el que a medida que aumenta el rango salarial, también aumenta la cantidad promedio de hijos. El grupo con mayor salario (categoría 3) presenta la mayor cantidad promedio de hijos, mientras que los grupos con menor salario (categorías 1 y 2) tienen valores más bajos, aunque el grupo 2 muestra un ligero aumento respecto al grupo 1. Este comportamiento sugiere una posible relación entre el nivel de ingresos y el número de hijos, lo que podría estar influenciado por factores económicos, culturales o sociales.

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

library(plotly)

p3 <- ggplot(G4, aes(x = Experiencia, y = Salario)) +
  geom_point(aes(color = Experiencia), alpha = 0.7) +
  theme_minimal() +
  labs(title = "Relación entre Salario y Experiencia",
       x = "Experiencia (años)",
       y = "Salario")

# Convertir a gráfico interactivo
plotly::ggplotly(p3)

El gráfico de dispersión muestra la relación entre el salario y los años de experiencia de los individuos en el conjunto de datos. Se observa una tendencia general en la que, a medida que aumenta la experiencia, los salarios tienden a ser más altos. Sin embargo, la relación no es completamente lineal, ya que hay puntos dispersos que indican variabilidad en los salarios para un mismo nivel de experiencia. Además, la escala de color representa la cantidad de años de experiencia, con tonalidades más oscuras para menor experiencia y más claras para mayor experiencia. Esto permite visualizar cómo se distribuyen los datos y detectar posibles anomalías o patrones atípicos.

Conclusión

En este análisis, procesamos nuestra base de datos e identificamos problemas en la calidad de los datos. Mediante técnicas de depuración e imputación, logramos corregir valores faltantes y inconsistencias, optimizando la información para un análisis más preciso. Esto nos permitió obtener una mejor interpretación de los datos y representarlos de manera efectiva a través de visualizaciones avanzadas.