El siguiente informe presenta los métodos de preprocesamiento realizados para el análisis de la base de datos según las preguntas claves.
Objetivo: Cada grupo recibirá un conjunto de datos con información ficticia generada aleatoriamente. El objetivo es realizar el preprocesamiento adecuado para preparar los datos antes de su análisis.
# Cargar librerias necesarias
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
library(tidyr)
library(janitor)
##
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(naniar)
library(ggplot2)
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(mice)
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
library(VIM)
## Loading required package: colorspace
## Loading required package: grid
## VIM is ready to use.
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
##
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
##
## sleep
Trabajadores <- read.csv("Grupo_1.csv", fileEncoding = "UTF-8", stringsAsFactors = FALSE)
# Observar las primeras filas en la base de datos
head(Trabajadores)
## ID Edad Salario Experiencia Ciudad Nivel_Educativo Horas_Trabajo_Semana
## 1 1 49 47164 8 San Juan Secundaria 30
## 2 2 40 23010 35 San Juan Universitario 50
## 3 3 22 76886 1 Caguas Secundaria 46
## 4 4 26 69046 8 Primaria 31
## 5 5 40 51575 4 Ponce Universitario 56
## 6 6 26 55348 3 Ponce Primaria 57
## Estado_Civil Sector_Laboral Cantidad_Hijos Propietario_Vivienda Rango_Salario
## 1 Soltero Independiente 4 Sí Medio
## 2 Casado Privado 3 No Bajo
## 3 Soltero Público 4 No Alto
## 4 Divorciado Independiente 0 Sí Alto
## 5 Casado Privado 3 Sí Medio
## 6 Soltero Independiente 5 Sí Medio
# Observar las características de las variables
glimpse(Trabajadores)
## Rows: 100
## Columns: 12
## $ ID <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15…
## $ Edad <dbl> 49, 40, 22, 26, 40, 26, 42, 24, 62, 19, 22, 41, 4…
## $ Salario <dbl> 47164, 23010, 76886, 69046, 51575, 55348, 32671, …
## $ Experiencia <dbl> 8, 35, 1, 8, 4, 3, 22, 1, NA, 9, 11, 24, 6, 3, 15…
## $ Ciudad <chr> "San Juan", "San Juan", "Caguas", "", "Ponce", "P…
## $ Nivel_Educativo <chr> "Secundaria", "Universitario", "Secundaria", "Pri…
## $ Horas_Trabajo_Semana <dbl> 30, 50, 46, 31, 56, 57, 55, 22, 50, 52, 58, NA, 3…
## $ Estado_Civil <chr> "Soltero", "Casado", "Soltero", "Divorciado", "Ca…
## $ Sector_Laboral <chr> "Independiente", "Privado", "Público", "Independi…
## $ Cantidad_Hijos <dbl> 4, 3, 4, 0, 3, 5, 4, 2, 2, 5, 1, 3, 4, 3, 3, 3, 2…
## $ Propietario_Vivienda <chr> "Sí", "No", "No", "Sí", "Sí", "Sí", "No", "Sí", "…
## $ Rango_Salario <chr> "Medio", "Bajo", "Alto", "Alto", "Medio", "Medio"…
# Revisar los datos de forma detallada
skimr::skim(Trabajadores)
Name | Trabajadores |
Number of rows | 100 |
Number of columns | 12 |
_______________________ | |
Column type frequency: | |
character | 6 |
numeric | 6 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
Ciudad | 0 | 1 | 0 | 8 | 3 | 5 | 0 |
Nivel_Educativo | 0 | 1 | 0 | 13 | 1 | 4 | 0 |
Estado_Civil | 0 | 1 | 0 | 10 | 5 | 4 | 0 |
Sector_Laboral | 0 | 1 | 0 | 13 | 7 | 4 | 0 |
Propietario_Vivienda | 0 | 1 | 0 | 2 | 8 | 3 | 0 |
Rango_Salario | 0 | 1 | 0 | 5 | 6 | 4 | 0 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
ID | 0 | 1.00 | 50.50 | 29.01 | 1 | 25.75 | 50.5 | 75.25 | 100 | ▇▇▇▇▇ |
Edad | 1 | 0.99 | 39.69 | 13.78 | 18 | 26.50 | 40.0 | 51.00 | 64 | ▇▅▆▆▅ |
Salario | 6 | 0.94 | 49992.91 | 17047.48 | 20069 | 37191.75 | 50650.0 | 63286.50 | 79801 | ▆▆▇▅▇ |
Experiencia | 13 | 0.87 | 19.89 | 11.85 | 0 | 9.00 | 20.0 | 29.50 | 40 | ▇▆▇▆▇ |
Horas_Trabajo_Semana | 6 | 0.94 | 41.31 | 11.65 | 21 | 32.00 | 42.0 | 51.00 | 60 | ▆▅▇▇▆ |
Cantidad_Hijos | 11 | 0.89 | 2.56 | 1.66 | 0 | 1.00 | 2.0 | 4.00 | 5 | ▇▅▃▅▅ |
# Conteo de datos faltantes por columna
Trabajadores %>%
is.na() %>%
colSums()
## ID Edad Salario
## 0 1 6
## Experiencia Ciudad Nivel_Educativo
## 13 0 0
## Horas_Trabajo_Semana Estado_Civil Sector_Laboral
## 6 0 0
## Cantidad_Hijos Propietario_Vivienda Rango_Salario
## 11 0 0
Los siguientes comandos fueron utlizados para identificar posibles problemas en la base de datos.
#Existen variables categoricas faltantes
Trabajadores <- replace(Trabajadores, Trabajadores == "", NA)
head(Trabajadores)
## ID Edad Salario Experiencia Ciudad Nivel_Educativo Horas_Trabajo_Semana
## 1 1 49 47164 8 San Juan Secundaria 30
## 2 2 40 23010 35 San Juan Universitario 50
## 3 3 22 76886 1 Caguas Secundaria 46
## 4 4 26 69046 8 <NA> Primaria 31
## 5 5 40 51575 4 Ponce Universitario 56
## 6 6 26 55348 3 Ponce Primaria 57
## Estado_Civil Sector_Laboral Cantidad_Hijos Propietario_Vivienda Rango_Salario
## 1 Soltero Independiente 4 Sí Medio
## 2 Casado Privado 3 No Bajo
## 3 Soltero Público 4 No Alto
## 4 Divorciado Independiente 0 Sí Alto
## 5 Casado Privado 3 Sí Medio
## 6 Soltero Independiente 5 Sí Medio
# Observar datos faltantes por columna
gg_miss_var(Trabajadores)
#Obtener gráfico de valores faltantes en toda la base de datos
vis_miss(Trabajadores)
A partir de los resultados obtenidos, la base de datos sufre de
valores faltantes en las siguientes variables de Edad
(1%),
Salario
(6%), Experiencia
(13%),
Ciudad
(3%), Nivel_Educativo
(1%),
Horas_Trabajo_Semana
(6%), Estado_Civil
(5%),
Sector_Laboral
(7%), Cantidad_Hijos
(11%),
Propietario_Vivienda
(8%) y Rango_Salario
(6%)
#Verificar por registros duplicados
Trabajadores %>%
janitor::get_dupes()
## No variable names specified - using all columns.
## No duplicate combinations found of: ID, Edad, Salario, Experiencia, Ciudad, Nivel_Educativo, Horas_Trabajo_Semana, Estado_Civil, Sector_Laboral, ... and 3 other variables
## [1] ID Edad Salario
## [4] Experiencia Ciudad Nivel_Educativo
## [7] Horas_Trabajo_Semana Estado_Civil Sector_Laboral
## [10] Cantidad_Hijos Propietario_Vivienda Rango_Salario
## [13] dupe_count
## <0 rows> (or 0-length row.names)
Los resultados muestran que no existen datos duplicados
summary(Trabajadores)
## ID Edad Salario Experiencia
## Min. : 1.00 Min. :18.00 Min. :20069 Min. : 0.00
## 1st Qu.: 25.75 1st Qu.:26.50 1st Qu.:37192 1st Qu.: 9.00
## Median : 50.50 Median :40.00 Median :50650 Median :20.00
## Mean : 50.50 Mean :39.69 Mean :49993 Mean :19.89
## 3rd Qu.: 75.25 3rd Qu.:51.00 3rd Qu.:63287 3rd Qu.:29.50
## Max. :100.00 Max. :64.00 Max. :79801 Max. :40.00
## NA's :1 NA's :6 NA's :13
## Ciudad Nivel_Educativo Horas_Trabajo_Semana Estado_Civil
## Length:100 Length:100 Min. :21.00 Length:100
## Class :character Class :character 1st Qu.:32.00 Class :character
## Mode :character Mode :character Median :42.00 Mode :character
## Mean :41.31
## 3rd Qu.:51.00
## Max. :60.00
## NA's :6
## Sector_Laboral Cantidad_Hijos Propietario_Vivienda Rango_Salario
## Length:100 Min. :0.000 Length:100 Length:100
## Class :character 1st Qu.:1.000 Class :character Class :character
## Mode :character Median :2.000 Mode :character Mode :character
## Mean :2.562
## 3rd Qu.:4.000
## Max. :5.000
## NA's :11
Los resultados muestran los cuartiles y un resumen estadístico de cada variable en la base de datos. A simple vista, no parecen haber valores atípicos.
Para solucionar estos problemas proponemos identificar y manejar los valores faltantes. Se pueden imputar o eliminar estos datos faltantes para mejorar la precisión de este modelo. Para mejorar la calidad de los datos se podrían transformar o normalizar si es necesario. Por último proponemos el manejo de los outliers para que estos no afecten nuestro análisis.
Edad
: Eliminacion (menos 5%)Salario
: UnivariadaExperiencia
: Árboles de DecisiónCiudad
: Eliminacion (menos 5%)Nivel_Educativo
: Eliminaciones (menos 5%)Horas_Trabajo_Semana
: MediaEstado_Civil
: ModaCantidad_Hijos
: Random ForestPropietario_Vivienda
: ModaSector_Laboral
: ModaRango_Salario
: ManualEdad
: Puede ser ignorada debido a que el porcentaje de
datos faltantes es solo 1% y por lo tanto, menor al 5% del total de
observaciones. Sin embargo, esta variable puede estar relacionada con
otra y ser tipo MAR, por lo cual pudiéramos utilizar imputación
multivariada.Experiencia
: Variable numérica con una distribución
balanceada. Los tipos de datos faltantes pueden ser categorizados como
MAR, por lo cual podemos usar árboles de decisiones o Random Forest con
variables relacionadas como Nivel_Educativo o Edad.Ciudad
: Puede ser ignorada debido a que el porcentaje
de datos faltantes es solo 3%. Aún así, si los datos faltantes son tipo
MCAR y , podemos usar la imputación por Moda para esta variable
categórica.Nivel_Educativo
: Igualmente puede ser ignorada, ya que
tiene solo 1% de datos faltantes. Si quisiéramos imputar esta variable
categórica, podemos hacerlo por la moda con una categoría más
frecuente.Horas_Trabajo_Semana
: Asumimos que los valores
faltantes son tipo MCAR, por lo cual el método de imputación univariada
sería por la media debido a que la distribución de los valores es
bastante simétrica.Estado_Civil
: Variable categórica que tiene una
distribución un poco sesgada. Por lo tanto, podemos utilizar la moda
para imputar datos, aunque fortalezca el sesgo. Por otra parte, si
consideramos que es un tipo de dato faltante MNAR, pudiéramos utilizar
otro método más avanzado como MICE.Sector_Laboral
: Variable categórica con una
distribución balanceada. Podemos imputar por la moda ya que no hay un
sesgo claro. Igualmente podemos usar Random Forest o KNN si creemos que
existen variables que puedan predecir el sector laboral como horas de
trabajo, la edad o el nivel de educación.Propietario_Vivienda
: La distribución de esta variable
categórica binomial está sesgada a las respuestas afirmativas de
propietarios de vivienda. Si los datos faltantes los categorizamos como
MAR, podemos utilizar variables como salario o edad para predecir estos
valores.Cantidad_Hijos
: Si los datos faltantes son tipo MAR, la
cantidad de hijos puede depender de otra variable como salario. Por lo
tanto, podemos aplicar métodos de imputación multivariada como Random
Forest.Rango_Salario
: Es una variable categórica que depende
totalmente del valor del salario. Por lo tanto, puede ser calculada con
un valor determinado después de haber imputado los valores faltantes del
salario.Realizaremos las siguientes imputaciones por categoría de variables. Primero eliminaremos las variables con porcentajes de datos faltantes menores que cinco.
# Eliminar datos faltantes menores que el 5%
Trabajadores <- Trabajadores %>%
drop_na(Edad, Ciudad, Nivel_Educativo)
A continuación, aplicamos diferentes estrategias de imputación a la base de datos
# Imputación con la media para variables continuas
Imput_mean <- mice(Trabajadores,method="mean",print=FALSE)
Complete_mean <- mice::complete(Imput_mean)
# Imputacion con regresión predictiva(sin variabilidad)
Imput_reg1 <- mice(Trabajadores, method = "norm.predict", print = FALSE)
Complete_reg1 <- mice::complete(Imput_reg1)
# Imputación con regresión y bootstrap (con variabilidad)
Imput_reg2 <- mice(Trabajadores, method = "norm.boot", print = FALSE)
Complete_reg2 <- mice::complete(Imput_reg2)
# Imputación con Regresión Múltiple
Imput_reg_mult <- mice(Trabajadores, method = "norm.predict", m = 5, print = FALSE)
Complete_reg_mult <- mice::complete(Imput_reg_mult)
# Imputación con MICE
Imput_mice <- mice(Trabajadores, method = "pmm", m = 5, print = FALSE)
Complete_mice <- mice::complete(Imput_mice)
# Imputación con Random Forest
Imput_rf <- mice(Trabajadores, method = "rf", m = 5, print = FALSE)
Complete_rf <- mice::complete(Imput_rf)
# Imputación con la moda para variables categóricas
Imput_mode <- mice(Trabajadores,method="cart",print=FALSE)
Complete_mode <- mice::complete(Imput_mode)
# Convertir los datos en formato largo para comparación
Trabajadores_long <- bind_rows(
Trabajadores %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Original"),
Complete_mean %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Imputado")
) %>%
pivot_longer(cols = c(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos),
names_to = "Variable", values_to = "Valor")
# Graficar la comparación con ggplot
p1 <- ggplot(Trabajadores_long, aes(x = Valor, fill = Origen, text = paste("Origen:", Origen))) +
geom_density(alpha = 0.2) +
facet_wrap(~Variable, scales = "free") +
labs(title = "Comparación de datos originales vs imputados",
x = "Valor", y = "Densidad") +
theme_minimal()
# Mostrar gráfico
ggplotly(p1, tooltip = c("text", "x", "y"))
# Convertir los datos en formato largo
data_long_reg <- bind_rows(
Trabajadores %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Original"),
Complete_reg1 %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Regresión Predictiva"),
Complete_reg2 %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Regresión Bootstrap")) %>%
pivot_longer(cols = c(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos), names_to = "Variable", values_to = "Valor")
#crear grafico de densidad
p2 <- ggplot(data_long_reg, aes(x = Valor, color = Origen, fill = Origen, text = paste("Origen:", Origen))) +
geom_density(alpha = 0.2) +
facet_wrap(~Variable, scales = "free") +
labs(title = "Comportamiento de la Imputación", x = "Variables", y = "Densidad") +
theme_minimal()
# Convertir a gráfico interactivo sin duplicaciones en el tooltip
ggplotly(p2, tooltip = c("text", "x", "y"))
# Convertir los datos imputados a formato largo
data_long_mult <- bind_rows(
Trabajadores %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Original"),
Complete_reg_mult %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Regresión Múltiple"),
Complete_mice %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "MICE"),
Complete_rf %>% select(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos) %>% mutate(Origen = "Random Forest")) %>%
pivot_longer(cols = c(Salario, Experiencia, Horas_Trabajo_Semana, Cantidad_Hijos), names_to = "Variable", values_to = "Valor")
# Crear gráfico de densidad
p3 <- ggplot(data_long_mult, aes(x = Valor, color = Origen, fill = Origen, text = paste("Método:", Origen))) +
geom_density(alpha = 0.2) +
facet_wrap(~Variable, scales = "free") +
labs(title = "Comparación de Imputación Multivariada", x = "Variables", y = "Densidad") +
theme_minimal()
# Convertir a gráfico interactivo
ggplotly(p3, tooltip = c("text", "x", "y"))
# Crear un data.frame con los conteos antes y después de la imputación para `Estado Civil`
data_cat1 <- bind_rows(
Trabajadores %>% select(Estado_Civil) %>% mutate(Origen = "Original"),
Complete_mode %>% select(Estado_Civil) %>% mutate(Origen = "Imputado")) %>%
filter(!is.na(Estado_Civil)) # Eliminar NA de los datos originales para comparación justa
# Crear el gráfico de barras corregido
ECimp <- ggplot(data_cat1, aes(x = Estado_Civil, fill = Origen, text = paste("Origen:", Origen))) +
geom_bar(position = "dodge") +
labs(title = "", x = "Estado_Civil",y = "Frecuencia") +
theme_minimal()
# Mostrar gráfico
ggplotly(ECimp,tooltip = c("text", "x", "y"))
# Crear un data.frame con los conteos antes y después de la imputación `Sector_Laboral`
data_cat2 <- bind_rows(
Trabajadores %>% select(Sector_Laboral) %>% mutate(Origen = "Original"),
Complete_mode %>% select(Sector_Laboral) %>% mutate(Origen = "Imputado")) %>%
filter(!is.na(Sector_Laboral)) # Eliminar NA de los datos originales para comparación justa
# Crear el gráfico de barras corregido
SLimp <- ggplot(data_cat2, aes(x = Sector_Laboral, fill = Origen, text = paste("Origen:", Origen))) +
geom_bar(position = "dodge") +
labs(title = "", x = "Sector_Laboral",y = "Frecuencia") +
theme_minimal()
# Mostrar gráfico
ggplotly(SLimp,tooltip = c("text", "x", "y"))
# Crear un data.frame con los conteos antes y después de la imputación `Propietario_ Vivienda`
data_cat3<- bind_rows(
Trabajadores %>% select(Propietario_Vivienda) %>% mutate(Origen = "Original"),
Complete_mode %>% select(Propietario_Vivienda) %>% mutate(Origen = "Imputado")) %>%
filter(!is.na(Propietario_Vivienda)) # Eliminar NA de los datos originales para comparación justa
# Crear el gráfico de barras corregido
PVimp <- ggplot(data_cat3, aes(x = Propietario_Vivienda, fill = Origen, text = paste("Origen:", Origen))) +
geom_bar(position = "dodge") +
labs(title = "", x = "Propietario_Vivienda",y = "Frecuencia") +
theme_minimal()
# Mostrar gráfica
ggplotly(PVimp,tooltip = c("text", "x", "y"))
Finalmente, unimos las imputaciones con la base de datos original:
# Uso de semi-joins para unir las imputaciones con la base de datos original
Trabajadores_IMP <- semi_join(Complete_mice, Trabajadores, by = c("Salario", "Cantidad_Hijos"))
Trabajadores_IMP <-semi_join(Complete_rf, Trabajadores_IMP, by = "Horas_Trabajo_Semana")
Trabajadores_IMP <- semi_join(Complete_reg2, Trabajadores_IMP, by = "Experiencia")
Trabajadores_IMP <- semi_join(Complete_mode, Trabajadores_IMP, by = c("Propietario_Vivienda", "Sector_Laboral", "Estado_Civil"))
Trabajadores_IMP <- Trabajadores_IMP %>%
mutate(Rango_Salario = ifelse(is.na(Rango_Salario),
case_when(
Salario > 65000 ~ "Alto",
Salario <= 64900 & Salario > 30000 ~ "Medio",
Salario <= 30000 ~ "Bajo",
TRUE ~ "Desconocido"
),
Rango_Salario))
Analizando las comparaciones de las diferentes imputaciones contra los datos originales podemos determinar los mejores prospectos de imputación son:
Salario
: MICEExperiencia
: BootstrapCantidad_Hijos
: MICEHoras_Trabajo_Semana
: RFPropietario_Vivienda
: ModaSector_Laboral
: ModaEstado_Civil
: ModaRango_Salario
: Imputación ManualAnalizar y comparar los métodos de imputación es imperativo para conservar la naturaleza y relación de los datos. Aunque estos datos son generados aleatoriamente, aplicar un método de imputación que no es apropiado puede distorsionar los resultados de análisis posterior.
Los siguientes comandos transformaron las variables categóricas de tipo carácter a tipo factor:
# Convertir variables a tipo factor
Trabajadores_IMP <- Trabajadores_IMP %>%
mutate(Ciudad = factor(Ciudad),
Nivel_Educativo = factor(Nivel_Educativo),
Estado_Civil = factor(Estado_Civil),
Sector_Laboral = factor(Sector_Laboral),
Propietario_Vivienda = factor(Propietario_Vivienda),
Rango_Salario = factor(Rango_Salario))
Las variables se convirtieron de tipo carácter a tipo factor para
poder establecer sus valores como niveles definidos, en vez de guardar
un simple texto. Por ejemplo, la variable estado_civil
ahora solo guarda los valores de “soltero”, “casado”, y “divorciado”.
Igualmente, esta transformación también ayuda a los modelos estadísticos
utilizados más adelante a interpretar con certeza los valores en las
variables. Por ejemplo, las variables categóricas se manejan mejor como
factores en agrupaciones y en análisis gráficos como ggplot.
# Calcular la matriz de correlación con las variables numéricas
corr <- cor(dplyr::select_if(Trabajadores_IMP %>% select(-ID), is.numeric), use = "complete.obs")
# Crear el mapa de calor interactivo con Plotly
plot_ly(colors = "RdBu") %>%
add_heatmap(x = rownames(corr), y = colnames(corr), z = corr) %>%
colorbar(limits = c(-1, 1)) %>%
layout(title = "Mapa de Calor de Correlaciones")
El mapa de calor de correlaciones de variables numéricas muestran los colores rojos y azul. En este caso, los colores azules se utilizan para demostrar una correlación positiva, por lo cual las celdas con valores cercanos a +1 tendrán un color azul más intenso. Por otro lado, los colores rojos se utilizan para demostrar una correlación negativa y valores cercanos a -1.
Por lo tanto, podemos interpretar la correlación de las variables númericas de la siguiente manera:
# Crear tabla de frecuencia con la suma de la cantidad de hijos por rango de salario
tabla_frecuencia <- Trabajadores_IMP %>%
group_by(Rango_Salario) %>%
summarise(Total_Hijos = sum(Cantidad_Hijos, na.rm = TRUE), .groups = "drop")
# Crear gráfico
grafico_ggplot <- ggplot(tabla_frecuencia, aes(x = Rango_Salario, y = Total_Hijos, fill = Rango_Salario)) +
geom_bar(stat = "identity") +
labs(title = "Cantidad Total de Hijos por Rango de Salario",
x = "Rango de Salario",
y = "Cantidad de Hijos") +
theme_minimal()
# Crear gráfico interactivo
plot_interactivo <- ggplotly(grafico_ggplot)
#Mostrar gráfico
plot_interactivo
Podemos observar que hay un mayor número de hijos en el rango de salario “Medio” en comparación con los otros rangos. Por lo tanto, se puede asumir que familias con este tipo de ingreso suelen tener más hijos por factores socioeconómicos. Por otro lado, el rango de salario “Bajo” son los trabajadores que menos hijos tienen. Esto puede estar relacionado a restricciones económicas y tener una menor capacidad para criar hijos. Finalmente, el rango de salario “Alto” muestra una cantidad balanceada de hijos. Esto puede deberse a que familias con ingresos más alto tienen la capacidad de tomar decisiones más calculadas en base a la cantidad de hijos que quisieran tener.
p <- ggplot(Trabajadores, aes(x = Experiencia, y = Salario)) +
geom_point() +
geom_smooth(method = "lm", linetype = "dashed", fill = "blue") +
labs(title = "Relación entre Salario y Experiencia",
x = "Años de Experiencia",
y = "Salario") +
theme_minimal()
# Convertir el gráfico a interactivo con plotly
grafico_dispersión <- ggplotly(p)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 19 rows containing non-finite outside the scale range
## (`stat_smooth()`).
# Mostrar el gráfico
grafico_dispersión
La gráfica muestra la correlación entre las variables de Salario y Experiencia. Al igual que fue observado en el mapa de calor, es evidente que estas variables no tienen una relación significativa. Los puntos están distribuidos por toda la gráfica sin una tendencia clara, por lo cual podemos observar que las variables no están relacionadas de forma lineal.