Carga y procesamiento de datos

Lectura de archivo para cargar datos

Por medio de R se pueden utilizar distintos orígenes de datos. Los mismos pueden ser escritor directamente desde R, importarse desde diversas extensiones de archivos de bases de datos estruturadas, construir desde datos no estructurados, entre otros.

En esta instancia, se trabajará con la importanción de datos estructurados, ya sea en formato .csv, .xlsx, o incluso .dta o .spss. La diferencia entre dichas alternativas será la necesidad de contar con alguna librería específica o no, como haven readxl

A modo de ejemplo, vamos a importar datos de la base de la Encuesta Permanente de Hogares (EPH) individual del primer trimestre 2023. Para ello, utilizaremos la función read.csv(), donde deberemos específicar los arguentos de ruta del archivo path, si cuenta con nombre de columna header, el separador de columnas sep, el identificador decimal dec, entre otros.

df <- read.csv(file="datos/usu_individual_T123.txt", 
                header = TRUE, 
                sep = ";", 
                dec= ",")

De esta forma se carga el archivo de EPH con formato .txt en el objeto df, el cual queda en el Environment de RStudio, como un data frame. Allí se puede ver la cantidad de observaciones (48638) y la cantidad de variables (177).

Acceder a variables dentro de un data frame

Desde el mismo, podemos acceder a distintas variables por medio del signo $ y mencionando la variable de interés. Por ejemplo, utilizando la función mean(), la cual calcula el promedio de una variable, se le incorpora como argumento la variable CH06 de la base de datos df, que contiene la edad del individuo. Por lo tanto, en el argunmento de la función (la parte entre paréntesis) colocamos la selección de la variable dentro de la base de datos especificada mean(df$CH06).

mean(df$CH06)
## [1] 35.74386

De esta forma solo me muestra el promedio. Si quisiera guardarlo como un objeto específico, debo colocarle un nombre bajo las características mencionadas previamente, y asignarle el valor de la función con el conector <-.

edad_media <- mean(df$CH06)
edad_media
## [1] 35.74386

Filtros

Para filtrar el cálculo que se realiza, se puede utilizar la selección de casos por medio de [], donde se puede reducir la dimensionalidad del objeto, en este caso de un Data Frame. Como un DF tiene dos dimensiones (filas y columnas), la selección entre corchetes se hace teniendo en cuenta primero las condiciones de las filas, luego las condiciones de las columnas, separados por una coma, de forma [,]. Si no se ponen condiciones, se entiende que se utilizan todos los casos (filas o columnas).

Supongamos que queremos ver la edad promedio de los hombres y las mujeres por separado, podemos utilizar la variable CH04 que asume valores 1 para hombres y 2 para mujeres. Por esto, podemos establecer el filtro que considere dentro del df solo los casos CH04==1 . Para esto, se expresa el df de la forma df[df$CH04==1,].

edad_media_hombres <- mean(df[df$CH04==1,]$CH06)
edad_media_hombres
## [1] 34.38988

Para el caso de mujeres

edad_media_mujeres <- mean(df[df$CH04==2,]$CH06)
edad_media_mujeres
## [1] 36.99048

Librería dplyr

filtros con dplyr

A través de la librería dplyr se puede acceder a una serie de funciones útiles para manipular bases de datos, tales como filtrar, crear variables, ordenar, agrupar, etc., las cuales iremos utilizando a lo largo del taller. Asimismo, también incorpora el caracter %>% conocido como pipe o tubería.

El caracter %>% toma el set de datos que están a su izquierda y los transforma según el comando de la derecha. Esta forma permite trabajar en forma secuencial y lógica, evitando el anidado excesivo.

Siguiendo el ejemplo anterior, si quisiera obtener la edad promedio de los hombres y de las mujeres, podría utilizar la función filter del paquete dplyr de la siguiente forma:

library(dplyr)

df %>% 
  filter( CH04 == 1) %>% 
  summarise(mean(CH06))
##   mean(CH06)
## 1   34.38988

Renmobrar variables

La librería dplyr cuenta con la función rename que permite cambiar el nombre de las variables. La lógica de sintaxis es df %>% rename(nombre_nuevo = nombre_viejo).

df <- df %>% rename(edad = CH06)

df %>% filter(CH04 == 1) %>% summarise(mean(edad))
##   mean(edad)
## 1   34.38988

Crear nuevas variables: mutate y case_when

Para crear una nueva variable se pueden usar distintas funciones de la librería dplyr. La función mutate agrega una nueva variable que se obtiene como cálculo de otra/s variables. La sintaxis de la función debe tener mutate(nombre_nuevo = variable y operación). Por ejemplo, si queremos obtener el cuadrado de la edad de cada individuo, podemos plantear:

df <- df %>% mutate(edad_2 = edad^2)
df %>% summarise(mean(edad_2))
##   mean(edad_2)
## 1     1771.926

Otra opción es utilizar la función case_when permite establecer diversas condiciones lógicas y a partir de las mismas darle un valor a una variable nueva. Si existen casos donde no se cumple ninguna condición lógica, le asigna NA. La sintaxis de esta función es: mutate(nombre_nuevo = case_when(condición 1 ~ valor 1, condición 2 ~ valor 2, ... condición n ~ valor n))

Supongamos que queremos crear una variable sexo_edad que agrupe a los mayores de edad por sexo en cuatro categoría: hombres menores de edad hombres mayores de edad mujeres menores de edad y mujeres mayores de edad. De esta forma, la función case_when puede plantear:

df <- df %>% mutate(edad_sexo = case_when(edad < 18 & CH04 == 1 ~ "hombre menor de edad",
                                          edad >= 18 & CH04 == 1 ~"hombre mayor de edad",
                                          edad < 18 & CH04 == 2 ~ "mujer menor de edad",
                                          edad >=18 & CH04 == 2 ~"mujer mayor de edad"))

table(df$edad_sexo)
## 
## hombre mayor de edad hombre menor de edad  mujer mayor de edad 
##                17070                 6245                19171 
##  mujer menor de edad 
##                 6152

Seleccionar columnas para nuevo dataframe

La función select permite seleccionar columnas específicas para crear un nuevo data.frame. O bien, seleccionar para descartarlas. Por ejemplo, si quiero crear un data frame solo con las variables sexo y edad, se podría realizar:

df2 <- df %>% select(CH04, edad)
head(df2)
##   CH04 edad
## 1    1    7
## 2    2   83
## 3    2   30
## 4    1   32
## 5    1   45
## 6    2   37

O para eliminar la variable edad_2 que creamos:

df <- df %>% select(-edad_2)

Ordernar la base de datos

Para ordenar el df podemos utilizar la función arrange, la cual nos permite ordenar el df según las variables que le especifiquemos, ya sea ne orden ascendente o descendente.

df2 <- df2 %>% arrange(edad)
head(df2)
##   CH04 edad
## 1    2   -1
## 2    1   -1
## 3    1   -1
## 4    1   -1
## 5    1   -1
## 6    1   -1

Primerias medidas descriptivas

Dentro de la librería dplyr se encuentra la función summarise, la cual permite crear tablas o mediciones individuales de estadísticas descriptivas, tales como promedio, mediana, suma, varianza, desvío, minimo y máximo. Por ejemplo, retomando la variable edad, se puede estimar el promedio, la mediana, el desvío estandar y el máximo:

df %>% summarise(promedio_edad = mean(edad), mediana_edad = median(edad), ds_edad = sd(edad), max_edad = max(edad))
##   promedio_edad mediana_edad  ds_edad max_edad
## 1      35.74386           33 22.23314      101

Agrupar variables para operarlas

La función group_by permite hacer cálculos en forma agrupada por otra variable. Por ejemplo, si quisiera calcular la edad promedio por sexo, podría utilizar dicha función:

df %>% 
  group_by(CH04) %>%
  summarise(promedio = mean(edad), mediana = median(edad))
## # A tibble: 2 × 3
##    CH04 promedio mediana
##   <int>    <dbl>   <int>
## 1     1     34.4      32
## 2     2     37.0      35

Ejemplo con la EPH

Tasa de desempleo

Usemos algunas de las funciones mencionadas anteriormente para reproducir resultados del mercado laboral de Argentina. Supongamos que queremos obtener las principales tasas laborales, lo mismo podemos realizarlo a partir de la variable ESTADO de la EPH. Si creamos una tabla que llamaremos tabla1 que contenga la cantidad de personas que pertenecen a cada estado, podemos realizar:

tab1 <- df %>% 
  group_by(ESTADO) %>%
  summarise(personas = sum(PONDERA))

tab1
## # A tibble: 5 × 2
##   ESTADO personas
##    <int>    <int>
## 1      0    59534
## 2      1 13191361
## 3      2   973787
## 4      3 10882639
## 5      4  4227834

Recordando que las etiquetas de ESTADO son 0 = Entrevista no realizada, 1 = Ocupado, 2 = Desocupado, 3 = Inactivo, 4 = Menor de 10 años. De esta forma, la tasa de desempleo se podría calcular como:

t_desempleo <- sum(tab1[tab1$ESTADO == 2,]$personas) / (sum(tab1[tab1$ESTADO==1,]$personas) + sum(tab1[tab1$ESTADO==2,]$personas) )

t_desempleo * 100
## [1] 6.874528

Ahora, si quisiera hacer dicho cálculo solo para el aglomerado Gran Paraná, se puede filtrar previamente, de forma tal:

tab2 <- df %>% 
  filter(AGLOMERADO == 6) %>%
  group_by(ESTADO) %>%
  summarise(personas = sum(PONDERA))

tab2
## # A tibble: 5 × 2
##   ESTADO personas
##    <int>    <int>
## 1      0      432
## 2      1   124534
## 3      2     6194
## 4      3   118284
## 5      4    35051
t_desempleo_pna <- sum(tab2[tab2$ESTADO == 2,]$personas) / (sum(tab2[tab2$ESTADO==1,]$personas) + sum(tab2[tab2$ESTADO==2,]$personas) )

t_desempleo_pna * 100
## [1] 4.738082