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).
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
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
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
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
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
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)
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
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
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
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