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.