Usaremos nuevamente el paquete summarytools para obtener medidas descriptivas de variables cuantitativas

Cargamos el paquete

library(summarytools)

Para resumir la variable ingresos totales individuales (P47T), simplemente, la instrucción

descr(eph.4.22$P47T)
## Descriptive Statistics  
## eph.4.22$P47T  
## N: 48545  
## 
##                           P47T
## ----------------- ------------
##              Mean     44555.54
##           Std.Dev     71279.07
##               Min        -9.00
##                Q1         0.00
##            Median     17500.00
##                Q3     70000.00
##               Max   5300000.00
##               MAD     25958.84
##               IQR     70000.00
##                CV         1.60
##          Skewness        11.24
##       SE.Skewness         0.01
##          Kurtosis       632.69
##           N.Valid     48464.00
##         Pct.Valid        99.83

Ofrece un conjunto amplio de medidas descriptivas.
Debido a que no hemos puesto retricciones sobre los valores de P47T, encontramos resultados no interpretables, como que el mínimo es -9, se trata de una codificación de valores perdidos. Además está contada una población importante de personas que carecen de ingreso. Vamos a reducir la base a personas que tengan ingresos no nulos, y a ese subconjunto lo llamaremos con ingresos

con.ingresos<-eph.4.22[eph.4.22$P47T>0,]

La instrucción dice que, de la base eph.4.22 se retengan las filas que cumplan con la condición de p47T mayor que cero, y que no se haga nada con las columnas

La descripción ahora muestra

descr(con.ingresos$P47T)
## Descriptive Statistics  
## con.ingresos$P47T  
## N: 26152  
## 
##                           P47T
## ----------------- ------------
##              Mean     82827.10
##           Std.Dev     79212.95
##               Min       200.00
##                Q1     40000.00
##            Median     61500.00
##                Q3    100000.00
##               Max   5300000.00
##               MAD     42254.10
##               IQR     60000.00
##                CV         0.96
##          Skewness        13.82
##       SE.Skewness         0.02
##          Kurtosis       743.52
##           N.Valid     26071.00
##         Pct.Valid        99.69

El mínimo pasó a ser $200, pero el valor máximo es muy elevado, al punto que distorsiona la forma de la distribución. Podemos ver eso con un gráfico, para esta variable el histograma es adecuado

hist(con.ingresos$P47T)

La escala del eje horizontal no puede representar la gran variabilidad de los ingresos. Una opción para reducirla consiste en quitar los valores más extremos, como pueden ser lo que incluyan al 1% superior de la distribución. Para ello, mantenemos solo las filas en las que P47T sea menor que el cuantil .99 (percentil 99) de la distribución

con.ingresos<-con.ingresos[con.ingresos$P47T<quantile(
  con.ingresos$P47T, .99, na.rm=T),]

El histograma queda ahora

hist(con.ingresos$P47T)


Vamos a usar un paquete que permitirá trabajar de un modo diferente sobre los datos. Si bien es un modo mucho más eficiente de aplicar las funciones, su lógica requiere un poco de práctica. El primer uso que haremos de él será realizar las operaciones que nos interesen por separado para diferentes grupos. Por ejemplo, se repetirá la descripción de P47T por separado para varones y mujeres.
El paquete debe instalarse y cargarse en la sesión

install.packages("dplyr")
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

Este paquete una un comando que se llama pipe, que se expresa %>%, que se puede tipear con cada signo u obtenerse con la combinación de teclas shift+ctrl+M.
Veamos la aplicación primero y luego los detalles

con.ingresos %>%
  group_by(sexo) %>%
  summarise(ingreso_medio=mean(P47T, na.rm = T))
## # A tibble: 3 × 2
##   sexo    ingreso_medio
##   <fct>           <dbl>
## 1 varones        86877.
## 2 mujeres        70506.
## 3 <NA>             NaN

El cálculo solicitado como argumento del comando summarise se realizó por separado para las categorías de la variable de agrupación. La sintaxis comienza por indicar el origen de los datos, es decir, la base de donde provienen las variables. Luego se ”pipea” el primer comando que es el de agrupar según… sexo y luego se pipea nuevamente para indicar las operaciones. Aquí se trata de operaciones de resumen, por eso el comando es summarise (que no es summary). En el argumento, definimos ingreso_medio como la media de los ingresos. Nótese que, al hacer referencia a cada variable (sexo, P47T) no es necesario indicar la base de donde proviene, ya que esto esta establecido en la primera línea del comando.

Para la aplicación siguiente necesitamos categorizar la variable edad (CH06) en grupos: 16-19, 20-40, 41-60, 61-75, 76 y más, y será guardada en la variable edad.grupos. Luego solilcitamos una tabla para ver como se distribuyen los casos en los grupos

con.ingresos$edad.grupos<-cut(con.ingresos$CH06, c(0,16,19,40,60,75,110))
table(con.ingresos$edad.grupos)
## 
##   (0,16]  (16,19]  (19,40]  (40,60]  (60,75] (75,110] 
##      181      677     9920     8256     4848     1901

Los paréntesis en los límites inferiores de cada intervalo indican que éstos son abiertos, es decir que no incluyen al valor de la izquierda, por ejemplo, el tercer intervalo inicia en 20, porque el 19 pertenece al intervalo anterior, lo que está indicado en el corchete a la derecha del intervalo 16-19.
Con esta recodificación de las edades, podemos observar los ingresos medios en cada grupo, además de eso, como argumento de summarise, pueden agregarse otras medidas, por ejemplo, la mediana

con.ingresos %>%
  group_by(edad.grupos) %>%
  summarise(ingreso_medio=mean(P47T, na.rm = T),
            ingreso_mediano=median(P47T, na.rm=T))
## # A tibble: 7 × 3
##   edad.grupos ingreso_medio ingreso_mediano
##   <fct>               <dbl>           <dbl>
## 1 (0,16]             16830.            8000
## 2 (16,19]            25648.           16000
## 3 (19,40]            73668.           60000
## 4 (40,60]            91573.           80000
## 5 (60,75]            76839.           57000
## 6 (75,110]           72645.           56000
## 7 <NA>               27000            27000

Se observa que los ingresos medios crecen con la edad hasta el período 40-60, para decrecer más tarde.

La variable de agrupación no debe ser obligadamente una sola, pueden usarse más

con.ingresos %>%
  group_by(edad.grupos, sexo) %>%
  summarise(ingreso_medio=mean(P47T, na.rm = T),
            ingreso_mediano=median(P47T, na.rm=T))
## `summarise()` has grouped output by 'edad.grupos'. You can override using the
## `.groups` argument.
## # A tibble: 14 × 4
## # Groups:   edad.grupos [7]
##    edad.grupos sexo    ingreso_medio ingreso_mediano
##    <fct>       <fct>           <dbl>           <dbl>
##  1 (0,16]      varones        18532.           10000
##  2 (0,16]      mujeres        15324.            7000
##  3 (16,19]     varones        29889.           24000
##  4 (16,19]     mujeres        21318.           12000
##  5 (19,40]     varones        82721.           70000
##  6 (19,40]     mujeres        64572.           50000
##  7 (40,60]     varones       101046.           90000
##  8 (40,60]     mujeres        82558.           67000
##  9 (60,75]     varones        85705.           70000
## 10 (60,75]     mujeres        70176.           50352
## 11 (75,110]    varones        74744.           57000
## 12 (75,110]    mujeres        71403.           56000
## 13 <NA>        varones        27000            27000
## 14 <NA>        <NA>             NaN               NA

En esta salida podemos ver, para cada grupo de edad los ingresos medios y medianos de varones y mujeres.

Un dato que es de interés reportar cuando se presentan estas descripciones es el número de observacions, es decir el tamaño de las muestras. Eso se pide como argumento de summarise:

con.ingresos %>%
  group_by(edad.grupos, sexo) %>%
  summarise(ingreso_medio=mean(P47T, na.rm = T),
            ingreso_mediano=median(P47T, na.rm=T), casos=n())
## `summarise()` has grouped output by 'edad.grupos'. You can override using the
## `.groups` argument.
## # A tibble: 14 × 5
## # Groups:   edad.grupos [7]
##    edad.grupos sexo    ingreso_medio ingreso_mediano casos
##    <fct>       <fct>           <dbl>           <dbl> <int>
##  1 (0,16]      varones        18532.           10000    85
##  2 (0,16]      mujeres        15324.            7000    96
##  3 (16,19]     varones        29889.           24000   342
##  4 (16,19]     mujeres        21318.           12000   335
##  5 (19,40]     varones        82721.           70000  4972
##  6 (19,40]     mujeres        64572.           50000  4948
##  7 (40,60]     varones       101046.           90000  4026
##  8 (40,60]     mujeres        82558.           67000  4230
##  9 (60,75]     varones        85705.           70000  2080
## 10 (60,75]     mujeres        70176.           50352  2768
## 11 (75,110]    varones        74744.           57000   707
## 12 (75,110]    mujeres        71403.           56000  1194
## 13 <NA>        varones        27000            27000     1
## 14 <NA>        <NA>             NaN               NA    81

Con esa información, debemos ser cautos con la interpretación de los valores medios para los primeros grupos de edad, por la pequeña cantidad de observaciones.

El resultado puede asignarse a un objeto, que tiene estructura de data frame, la llamamos u

u<-con.ingresos %>%
  group_by(edad.grupos, sexo) %>%
  summarise(ingreso_medio=mean(P47T, na.rm = T),
            ingreso_mediano=median(P47T, na.rm=T), casos=n())
## `summarise()` has grouped output by 'edad.grupos'. You can override using the
## `.groups` argument.