R Trabajo Final

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.

  1. Procesamiento: Selección de variables
eph_gmza_ocupados <- eph_data%>% filter(AGLOMERADO == 10, ESTADO == 1, CH06 >= 18, P21 >0)  
  1. Procesamiento: Nominación de variables según categorias predifinidas, por grupo de edad, por ingreso siguiendo los lineamientos del INDEC, salario minimo en el 2025 y por género.
  #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"
)
)
  1. Cruces de variables: visualización de tablas

##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")
Tabla de ingresos promedio por edad
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")
Tabla de ingresos promedio por genero
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")
Tabla de ingresos promedio por genero y grupo de edad
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()

  1. Procesamiento:

#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>, …
  1. Cruce de variables: visualización de tablas

##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")

  1. Cruce de variables: visualización de tablas

##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")

  1. Conclusión