Integrantes:
Elias Funes, Julieta Lozano, Mora Vallesi, Coco, como es tu apellido?
En un territorio predominantemente urbano, con una estructura productiva caracterizada por la tercerización y una marcada orientación hacia los servicios, como es el caso del Gran Mendoza, el presente estudio se propone caracterizar una de las ramas de actividad más dinámicas tanto del sector como de la estructura económica en general: la rama de comercio y reparaciones. Esta se analiza en función de su significativo aporte tanto al producto como al empleo asalariado en este aglomerado.
Durante el 2024 se presenció un escenario de contracción de los puestos asalariados del sector privado a nivel nacional, en el que la mayoría de las ramas de actividad registraron variaciones negativas. No obstante, algunas excepciones se destacan, como agricultura y ganadería (2,8%), pesca (5,0%) y comercio y reparaciones (1,3%) (Pol et al., 2025). En este marco, la rama de actividad bajo estudio concentró el 20% de los puestos asalariados registrados (Pol et al., 2025).
En lo que respecta a Gran Mendoza, durante el año 2024 también registró un saldo negativo en términos de pérdida de puestos de trabajo. De acuerdo con los datos de la Encuesta de Indicadores Laborales de la Secretaria de Trabajo Empleo y Seguridad Social, para el cuarto trimestre de 2024 la mayoría de las actividades del Gran Mendoza presentaron un comportamiento negativo en términos de empleo formal en empresas de 10 y más trabajadores y las ramas que experimentaron mayor reducción fueron en primer lugar construcción (-7,6%), seguida de comercio, hoteles y restaurantes (-0,8%) (Pol et al., 2025).
En este contexto, y considerando tanto la relevancia estructural de la rama de comercio y reparaciones como su comportamiento en un escenario general de contracción del empleo, el presente estudio se propone profundizar su análisis a nivel local. En particular, se trabajará con datos correspondientes al tercer trimestre de 2025 para el aglomerado Gran Mendoza, con el objetivo de captar la dinámica reciente del sector en un contexto de reconfiguración del mercado de trabajo. Específicamente, el análisis se centrará en la composición de la fuerza de trabajo al interior de la rama según edad y género, así como en las características de los ingresos laborales, con especial atención a las brechas salariales. De este modo, se busca aportar a la comprensión de una heterogeneidad salarial posible entre los diferentes grupos que componen los/as asalariados/as del sector bajo estudio.
#Carga de librerias
#Datos que vamos a utilizar:
eph_data <- get_microdata(year = 2025, trimester = 3, type = "individual")
#Mendoza
Dichos sectores van a ser analizados a la luz del aglomerado del Gran Mendoza, utilizando población ocupada mayor de 18 años de edad.
Considerando necesario trabajar con las variables (PP047B_COD) transformadada en Prod_establecimiento, en pos de observar el dinamismo del mercado de trabajo según rama de actividad, para este trabajo el sector comercio y construcción. Trabajando a su vez con el promedio de ingresos, la variable (PONDIIO) a fin de que achicar la brecha de ingresos dado en algunos casos el achicamiento del número de casos y (P21) solamente con ingresos mayores a 0, eliminando los NA.
eph_gmza_ocupados <- eph_data%>% filter(AGLOMERADO == 10, ESTADO == 1, CH06 >= 18, P21 >0)
#Recodificar variable de ocupadxs según edad
eph_gmza_ocupados <- eph_gmza_ocupados %>%
mutate(categoria_edad = case_when(
CH06 >= 60 ~ "Adulto mayor",
CH06 >= 30 ~ "Adulto",
CH06 >= 18 ~ "Joven"
))
#Renombrar variable edad
eph_gmza_ocupados <- eph_gmza_ocupados %>%
rename("Grupo de Edad" = categoria_edad)
#Comprouebo si se aplicó bien la clasificación de grupo de edad
table(eph_gmza_ocupados$`Grupo de Edad`)
##
## Adulto Adulto mayor Joven
## 421 50 103
#Recodificar variable de ingresos en bajo, medio y alto
eph_gmza_ocupados <- eph_gmza_ocupados %>%
mutate(categoria_ingreso = case_when(
P21 < 322000 ~ "Bajo",
P21 >= 322000 & P21 < 1300000 ~ "Medio",
P21 >= 1300000 ~ "Alto"))
#Comprouebo si se aplicó bien la clasificación
table(eph_gmza_ocupados$categoria_ingreso)
##
## Alto Bajo Medio
## 87 129 358
#Recodificar variable de ocupadxs según genero
eph_gmza_ocupados <- eph_gmza_ocupados %>%
mutate(categoria_genero = case_when(
CH04 == 1 ~ "Varón",
CH04 == 2 ~ "Mujer"))
#Renombrar variable genero
eph_gmza_ocupados <- eph_gmza_ocupados %>%
rename("Genero" = categoria_genero)
table(eph_gmza_ocupados$`Genero`)
##
## Mujer Varón
## 277 297
#Analísis por sector ##Comercio
#Ahora vamos a filtrar solo el sector comercio
comercio_mza <- eph_gmza_ocupados %>%
filter(
substr(PP04B_COD, 1, 2) %in% c("45", "48"),
P21 > 0
) %>%
mutate(
Prod_establecimiento_comercio = case_when(
substr(PP04B_COD, 1, 2) == "45" ~ "Comercio y reparación de vehículos automotores y motocicletas",
substr(PP04B_COD, 1, 2) == "48" ~ "Comercio (resto)",
TRUE ~ "Otros"
)
)
##Ingresos en el sector comercio por grupo de edad
##
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
#Cruzamos ingresos con grupo etario , calculando el
#ingreso promedio de cada uno, la cantidad de personas que lo componen y la mediana
resumen_edad <- comercio_mza %>%
group_by(`Grupo de Edad`) %>%
summarise(
Casos = n(),
Ingreso_Promedio = mean(P21, na.rm = TRUE),
# Si quisieras el promedio real de la población:
Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm = TRUE) / sum(PONDIIO, na.rm = TRUE),
Mediana_Ingreso = median(P21, na.rm = TRUE))
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm =
## TRUE)/sum(PONDIIO, na.rm = TRUE)`.
## ℹ In group 1: `Grupo de Edad = "Adulto"`.
## Caused by warning in `P21 * PONDIIO`:
## ! NAs producidos por enteros excedidos
print (resumen_edad)
## # A tibble: 3 × 5
## `Grupo de Edad` Casos Ingreso_Promedio Ingreso_Ponderado Mediana_Ingreso
## <chr> <int> <dbl> <dbl> <dbl>
## 1 Adulto 67 878955. 653716. 750000
## 2 Adulto mayor 10 490000 520161. 400000
## 3 Joven 22 589545. 617973. 450000
resumen_edad %>%
kable(format = "html", caption = "Tabla de ingresos promedio por edad") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE, position = "center")
| Grupo de Edad | Casos | Ingreso_Promedio | Ingreso_Ponderado | Mediana_Ingreso |
|---|---|---|---|---|
| Adulto | 67 | 878955.2 | 653715.6 | 750000 |
| Adulto mayor | 10 | 490000.0 | 520161.3 | 400000 |
| Joven | 22 | 589545.5 | 617972.9 | 450000 |
##Graficos ingresos por grupo de edad
ggplot(resumen_edad, aes(x = `Grupo de Edad`, y = Ingreso_Promedio, fill = `Grupo de Edad`)) +
geom_col() + # Crea las barras
geom_text(aes(label = round(Ingreso_Promedio, 0)), vjust = -0.5) + # Agrega el valor arriba
labs(title = "Ingreso Promedio por Grupo de edad en el Sector Comercio",
subtitle = "Gran Mendoza - EPH",
x = "Grupo de Edad",
y = "Ingreso Promedio ($)",
fill = "Grupo de Edad") +
theme_minimal() + # Un diseño limpio
scale_fill_manual(values = c("Adulto" = "#f377c9", "Adulto Mayor" = "#1f77b7")) # Colores opcionales
4)Cruces de variables: visualización de tablas
##Ingresos en el sector comercio según genero
#comparamos ingresos con genero en el sector
resumen_genero <- comercio_mza %>%
group_by(`Genero`) %>%
summarise(
Casos = n(),
Ingreso_Promedio = mean(P21, na.rm = TRUE),
# Si quisieras el promedio real de la población:
Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm = TRUE) / sum(PONDIIO, na.rm = TRUE),
Mediana_Ingreso = median(P21, na.rm = TRUE))
## Warning: There were 2 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm =
## TRUE)/sum(PONDIIO, na.rm = TRUE)`.
## ℹ In group 1: `Genero = "Mujer"`.
## Caused by warning in `P21 * PONDIIO`:
## ! NAs producidos por enteros excedidos
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 1 remaining warning.
print (resumen_genero)
## # A tibble: 2 × 5
## Genero Casos Ingreso_Promedio Ingreso_Ponderado Mediana_Ingreso
## <chr> <int> <dbl> <dbl> <dbl>
## 1 Mujer 49 588163. 514234. 500000
## 2 Varón 50 958800 738896. 800000
resumen_genero %>%
kable(format = "html", caption = "Tabla de ingresos promedio por genero") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE, position = "center")
| Genero | Casos | Ingreso_Promedio | Ingreso_Ponderado | Mediana_Ingreso |
|---|---|---|---|---|
| Mujer | 49 | 588163.3 | 514234.3 | 5e+05 |
| Varón | 50 | 958800.0 | 738896.1 | 8e+05 |
##Graficos ingresos por grupo de edad
ggplot(resumen_genero, aes(x = Genero, y = Ingreso_Promedio, fill = Genero)) +
geom_col() + # Crea las barras
geom_text(aes(label = round(Ingreso_Promedio, 0)), vjust = -0.5) + # Agrega el valor arriba
labs(title = "Ingreso Promedio por Género en el Sector Comercio",
subtitle = "Gran Mendoza - EPH",
x = "Género",
y = "Ingreso Promedio ($)",
fill = "Género") +
theme_minimal() + # Un diseño limpio
scale_fill_manual(values = c("Mujer" = "#e377c2", "Varón" = "#1f77b4")) # Colores opcionales
4)Cruces de variables: visualización de tablas
##Ingresos en el sector comercio por grupo de edad y género
genero_edadmza<-comercio_mza %>%
group_by(`Grupo de Edad`, `Genero`) %>%
summarise(
Casos = n(),
Ingreso_Promedio = mean(P21, na.rm = TRUE),
# Si quisieras el promedio real de la población:
Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm = TRUE) / sum(PONDIIO, na.rm = TRUE),
Mediana_Ingreso = median(P21, na.rm = TRUE))
## Warning: There were 2 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm =
## TRUE)/sum(PONDIIO, na.rm = TRUE)`.
## ℹ In group 1: `Grupo de Edad = "Adulto"`, `Genero = "Mujer"`.
## Caused by warning in `P21 * PONDIIO`:
## ! NAs producidos por enteros excedidos
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 1 remaining warning.
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by Grupo de Edad and Genero.
## ℹ Output is grouped by Grupo de Edad.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(Grupo de Edad, Genero))` for per-operation grouping
## (`?dplyr::dplyr_by`) instead.
print(genero_edadmza)
## # A tibble: 6 × 6
## # Groups: Grupo de Edad [3]
## `Grupo de Edad` Genero Casos Ingreso_Promedio Ingreso_Ponderado
## <chr> <chr> <int> <dbl> <dbl>
## 1 Adulto Mujer 34 679118. 570427.
## 2 Adulto Varón 33 1084848. 733342.
## 3 Adulto mayor Mujer 4 287500 273356.
## 4 Adulto mayor Varón 6 625000 646353.
## 5 Joven Mujer 11 416364. 411264.
## 6 Joven Varón 11 762727. 798648.
## # ℹ 1 more variable: Mediana_Ingreso <dbl>
genero_edadmza %>%
kable(format = "html", caption = "Tabla de ingresos promedio por genero y grupo de edad ") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE, position = "center")
| Grupo de Edad | Genero | Casos | Ingreso_Promedio | Ingreso_Ponderado | Mediana_Ingreso |
|---|---|---|---|---|---|
| Adulto | Mujer | 34 | 679117.6 | 570426.6 | 650000 |
| Adulto | Varón | 33 | 1084848.5 | 733341.8 | 800000 |
| Adulto mayor | Mujer | 4 | 287500.0 | 273356.4 | 300000 |
| Adulto mayor | Varón | 6 | 625000.0 | 646353.4 | 400000 |
| Joven | Mujer | 11 | 416363.6 | 411264.1 | 400000 |
| Joven | Varón | 11 | 762727.3 | 798648.3 | 800000 |
##Graficos ingresos por grupo de edad y género
ggplot(genero_edadmza, aes(x = `Grupo de Edad`, y = Ingreso_Promedio, fill = Genero)) +
geom_col(position = "dodge") + # "dodge" pone las barras una al lado de la otra
geom_text(aes(label = dollar(Ingreso_Promedio, big.mark = ".", decimal.mark = ",", prefix = "$")),
position = position_dodge(0.9),
vjust = -0.5, # Lo sube un poquito para que no pise la barra
size = 3.5) +
scale_y_continuous(labels = label_comma(big.mark = ".", decimal.mark = ",")) +
labs(title = "Ingreso Promedio por Género y Grupo de Edad",
subtitle = "Sector Comercio - Gran Mendoza",
x = "Grupo de Edad",
y = "Ingreso Promedio ($)") +
scale_fill_manual(values = c("Mujer" = "#e377c2", "Varón" = "#1f77b4")) +
theme_minimal()
#Analísis por sector ##Construcción
# Filtramos PP04B_COD en la actividad construcción
construccion_mza <- eph_gmza_ocupados %>%
filter(startsWith(as.character(PP04B_COD), "4000"), P21 > 0) %>%
mutate(sector_nombre = "Construcción")
print(construccion_mza)
## # A tibble: 59 × 239
## CODUSU ANO4 TRIMESTRE NRO_HOGAR COMPONENTE H15 REGION MAS_500 AGLOMERADO
## <chr> <int> <int> <int> <int> <int> <int> <chr> <int>
## 1 TQRMNOP… 2025 3 1 1 1 42 S 10
## 2 TQRMNOP… 2025 3 1 5 1 42 S 10
## 3 TQRMNOP… 2025 3 1 1 1 42 S 10
## 4 TQRMNOP… 2025 3 1 2 1 42 S 10
## 5 TQRMNOQ… 2025 3 1 1 1 42 S 10
## 6 TQRMNOR… 2025 3 1 4 1 42 S 10
## 7 TQSMNOR… 2025 3 1 2 1 42 S 10
## 8 TQRMNOR… 2025 3 1 1 1 42 S 10
## 9 TQRMNOR… 2025 3 1 1 1 42 S 10
## 10 TQRMNOQ… 2025 3 1 1 1 42 S 10
## # ℹ 49 more rows
## # ℹ 230 more variables: PONDERA <int>, CH03 <int>, CH04 <int>, CH05 <chr>,
## # CH06 <int>, CH07 <int>, CH08 <int>, CH09 <int>, CH10 <int>, CH11 <int>,
## # CH12 <int>, CH13 <int>, CH14 <chr>, CH15 <int>, CH15_COD <int>, CH16 <int>,
## # CH16_COD <int>, NIVEL_ED <int>, ESTADO <int>, CAT_OCUP <int>,
## # CAT_INAC <int>, IMPUTA <int>, PP02C1 <int>, PP02C2 <int>, PP02C3 <int>,
## # PP02C4 <int>, PP02C5 <int>, PP02C6 <int>, PP02C7 <int>, PP02C8 <int>, …
##Ingresos en el sector construcción por grupo de edad
#Cruzamos ingresos con grupo de edad, calculando el ingreso promedio de cada uno, la cantidad ed personas que lo componen y la mediana
construccion_edad <- construccion_mza %>%
group_by(`Grupo de Edad`) %>%
summarise(
Casos = n(),
Ingreso_Promedio = mean(P21, na.rm = TRUE),
# Si quisieras el promedio real de la población:
Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm = TRUE) / sum(PONDIIO, na.rm = TRUE),
Mediana_Ingreso = median(P21, na.rm = TRUE))
## Warning: There were 2 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm =
## TRUE)/sum(PONDIIO, na.rm = TRUE)`.
## ℹ In group 1: `Grupo de Edad = "Adulto"`.
## Caused by warning in `P21 * PONDIIO`:
## ! NAs producidos por enteros excedidos
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 1 remaining warning.
print (construccion_edad)
## # A tibble: 3 × 5
## `Grupo de Edad` Casos Ingreso_Promedio Ingreso_Ponderado Mediana_Ingreso
## <chr> <int> <dbl> <dbl> <dbl>
## 1 Adulto 41 844390. 727204. 700000
## 2 Adulto mayor 4 2475000 301513. 1850000
## 3 Joven 14 547143. 557358. 500000
#Graficos ingresos por grupo de edad
ggplot(construccion_edad, aes(x = `Grupo de Edad`, y = Ingreso_Ponderado, fill = `Grupo de Edad`)) +
geom_col() + # Crea las barras
geom_text(aes(label = dollar(Ingreso_Ponderado , big.mark = ".", decimal.mark = ",", prefix = "$")),
position = position_dodge(0.9),
vjust = -0.5, # Lo sube un poquito para que no pise la barra
size = 3.5) +
scale_y_continuous(labels = label_comma(big.mark = ".", decimal.mark = ",")) +
labs(title = "Ingreso Ponderado por Grupo de edad en el Sector Construcción",
subtitle = "Gran Mendoza - EPH 2025 3°Trimestre",
x = "Grupo de Edad",
y = "Ingreso Ponderado ($)",
fill = "Grupo de Edad") +
theme_minimal() + # Un diseño limpio
scale_fill_brewer(palette = "Set1")
##Ingresos en el sector construcción por categorias
construccion_ingreso <- construccion_mza %>%
group_by( categoria_ingreso ) %>%
summarise(
Casos = n(),
Ingreso_Promedio = mean(P21, na.rm = TRUE),
Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm = TRUE) / sum(PONDIIO, na.rm = TRUE),
Mediana_Ingreso = median(P21, na.rm = TRUE)
)
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `Ingreso_Ponderado = sum(P21 * PONDIIO, na.rm =
## TRUE)/sum(PONDIIO, na.rm = TRUE)`.
## ℹ In group 1: `categoria_ingreso = "Alto"`.
## Caused by warning in `P21 * PONDIIO`:
## ! NAs producidos por enteros excedidos
print(construccion_ingreso)
## # A tibble: 3 × 5
## categoria_ingreso Casos Ingreso_Promedio Ingreso_Ponderado Mediana_Ingreso
## <chr> <int> <dbl> <dbl> <dbl>
## 1 Alto 9 2455556. 1063878. 2200000
## 2 Bajo 8 218750 229275. 200000
## 3 Medio 42 674524. 672293. 625000
#Graficos ingresos en el sector construcción por categorías
# Dada la cantidad desigual de casos con el nivel de ingresos se coloca en cada barra la cantidad de casos que representa
ggplot(construccion_ingreso, aes(x = categoria_ingreso, y = Ingreso_Ponderado, fill = categoria_ingreso)) +
geom_col(alpha = 0.8) +
geom_text(aes(label = paste0(dollar(Ingreso_Ponderado, big.mark = ".", decimal.mark = ",", prefix = "$"),
"\n(n = ", Casos, ")")),
position = position_dodge(0.9),
vjust = -0.2, # Ajustado para que entren las dos líneas
size = 3.5,
lineheight = 0.8) + # Reduce el espacio entre el $ y el (n)
scale_y_continuous(labels = label_comma(big.mark = ".", decimal.mark = ","),
expand = expansion(mult = c(0, 0.15))) + # Da más aire arriba para las etiquetas
labs(title = "Ingreso Ponderado y Tamaño de Muestra",
subtitle = "Sector Construcción - Gran Mendoza - EPH 2025 3° Trim.",
x = "Categoría de Ingreso",
y = "Ingreso Ponderado ($)",
fill = "Categoría") +
theme_minimal() +
scale_fill_brewer(palette = "Set1")