Repaso de la ultima clase, construir una nueva variable y visualización

1 Repaso de la última clase

En la última clase aprendimos a:

  1. Crear objetos con <-
  2. Usar el operador pipe %>%
  3. Cargar la EPH con get_microdata()
  4. Asignar etiquetas a variables organize_labels()
  5. Explorar conjuntos de datos con glimpse()
  6. Resumir valores con summarise()
  7. Ordenar datos con arrange()
  8. Crear nuevas variables con mutate()
  9. Recategorizar datos con case_when()
  10. Realizar análisis de distribuciones con calculate_tabulets()
  11. Filtrar datos con filter()

2 Construir una nueva variable

Construir nuevas variables es una de tarea central en las ciencias sociales. A partir de combinar las categorías de una o varias variables podremos obtener nuevas perspectivas sobre un fenómeno.

El primer paso, como siempre, es cargar los paquetes con los que vamos a trabajar

library("eph")
library("tidyverse")

Luego cargar la eph y ponerle sus etiquetas.

eph23_3<-get_microdata(year = 2023, period = 3, type = "individual") %>% 
  organize_labels(.,"individual")

Ahora, propongámonos construir una variable que pueda medir los niveles de formalidad de un trabajo.

Para esto podemos analizar el diseño de registro de la EPH publicado en INDEC. Si bien son varias las dimensiones sobre el trabajo de la personas que se analizan, nosotros nos focalizaremos en la sección titulada Ocupación principal de los asalariados (pág. 27) y dentro de esta sección tomaremos seis variables.

¿Este trabajo tiene…

  1. PP07C -> … tiempo de fiscalización? Si/No
  2. PP07G1 -> … vacaciones pagas? Si/No
  3. PP07G2 -> … aguinaldo? Si/No
  4. PP07G3 -> … días pagos por enfermedad? Si/No
  5. PP07G4 -> … obra social? Si/No
  6. PP07H -> … descuento jubilatorio? Si/No

Considerando estad variables deberíamos construir una tipología de los asalariados según las condiciones de trabajo, el cual diferencie alta precariedad (no tiene ningún derecho), mediana precariedad (al menos un derecho no se le respeta) y baja precariedad (tiene todos los derechos). ¿De qué manera se les ocurre que se pueden combinar las variables para crear un índice que permita clasificar a los asalariados?

Empecemos por explorar una de las variables, por ejemplo PP07G2. Para seleccionar solo una variable de un data set la traemos a partir de poner el nombre de la base + $ + nombre de la variable.

En nuestro caso sería eph23_3$PP07G2.

La función summary() nos indica los valores máximos mínimos y los cuartiles de nuestra variable. La función table() la cantidad de casos en cada uno de ellos.

summary(eph23_3$PP07G2)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   1.000   1.000   1.009   2.000   9.000   26711
table(eph23_3$PP07G2)
## 
##        0       Si       No Ns./Nr.. 
##     5356    10815     5440       13
Base_n <- eph23_3 %>% 
  filter ( CAT_OCUP == 3 & ESTADO == 1)

table(Base_n$PP07G2)
## 
##        0       Si       No Ns./Nr.. 
##       45    10815     5440       13

A partir de explorar estas variables nos damos cuenta que las categorías de nuestras variables son 1 = si, 2 = no, 0 = no corresponde y 9 = NS/NR. De hecho cuando filtramos por ocupado y obreros o empleados, las 0 se reducen.

De esta manera podríamos intentar crear una nueva variable que surja sumar estos resultados. Para esto primero deberíamos recategorizar algunas variables.

Base_n <- Base_n %>%
  mutate(PP07C_r = case_when(
    PP07C == 1 ~ 0,
    PP07C == 2 ~ 1, 
    TRUE ~ 0 )) %>%
  mutate(PP07G1_r = case_when(
    PP07G1 == 1 ~ 1,
    PP07G1 == 2 ~ 0, 
    TRUE ~ 0 )) %>%
  mutate(PP07G2_r = case_when(
    PP07G2 == 1 ~ 1,
    PP07G2 == 2 ~ 0, 
    TRUE ~ 0 )) %>%
  mutate(PP07G3_r = case_when(
    PP07G3 == 1 ~ 1,
    PP07G3 == 2 ~ 0, 
    TRUE ~ 0 )) %>%
  mutate(PP07G4_r = case_when(
    PP07G4 == 1 ~ 1,
    PP07G4 == 2 ~ 0, 
    TRUE ~ 0 )) %>%
  mutate(PP07H_r = case_when(
    PP07H == 1 ~ 1,
    PP07H == 2 ~ 0, 
    TRUE ~ 0 )) %>%
  mutate(IPL_r = PP07C_r + PP07G1_r + PP07G2_r + PP07G3_r + PP07G4_r + PP07H_r) %>%
  mutate(IPL = case_when(
    IPL_r == 0 ~ "Bajo",
    IPL_r %in% 1:5 ~ "Medio",
    IPL_r == 6 ~ "Alto"
  )) %>%
  mutate(IPL = factor(IPL, levels = c("Bajo", "Medio", "Alto")))

table(Base_n$IPL)
## 
##  Bajo Medio  Alto 
##  3206  3623  9484
IPL <- Base_n %>%
  calculate_tabulates("IPL", weights = "PONDERA", add.totals = "row")
IPL
##     IPL     Freq
## 1  Bajo  1674373
## 2 Medio  2528514
## 3  Alto  5821430
## 4 Total 10024317

3 Visualización de datos

La visualización de datos es el proceso por el cual se representa la información de forma gráfica para hacerla mas fácil y comprensible al lector. Esto puede asumir muchas formas como gráficos, diagramas, mapas, etc. Esto, ademas de aportar claridad, nos permite resumir mucha información en poca cantidad de espacio. Representar gráficamente nuestros datos es también otra forma de presentar distribuciones.

3.1 Hay una historia en sus datos

Ser capaz de contar historias con datos es una habilidad que se está volviendo cada vez más importante en un mundo en el que cada vez hay más datos y en el que se desea tomar decisiones basadas en ellos. Una visualización de datos eficaz puede significar la diferencia entre el éxito y el fracaso a la hora de comunicar los resultados de su estudio, recaudar dinero para su organización sin ánimo de lucro, presentar a su junta directiva, o simplemente hacer llegar su punto de vista a su público.

3.2 Se grafica solo con 6 elementos

  1. Posición
  2. Forma
  3. Tamaño
  4. Color
  5. Ancho de la línea
  6. Tipo de Linea

3.3 Ley de Gestalt

La Escuela de Psicología de la Gestalt se propuso, a principios del siglo XX, comprender cómo los individuos perciben el orden en el mundo que les rodea. Lo que obtuvieron son 6 principios de la percepción visual que aún se aceptan que definen cómo las personas interactúan con los estímulos visuales y crean de los estímulos visuales.

Proximidad: Si unos elementos se encuentran juntos se perciben como un grupo, los tres grupos de puntos.

Similitud o semejanza: Los atributos con colores o formas semejantes se perciben como parte del mismo grupo, como el caso de los círculos y triángulos o el color rojo y el turquesa.

Cierre: Los elementos que parecen tener un contorno o borde alrededor se perciben como parte de un mismo grupo.

Compleción: Nuestra percepción tiende a completar las partes que faltan rellenándolas con los elementos que faltan.

Continuidad: Los elementos que están uno al lado del otro se perciben elementos continuos aunque haya espacios.

Conexión: Los elementos conectados físicamente entre si se perciben como un grupo de manera mas fuerte que todas las demás leyes.

3.3 El desorden es tu enemigo!

Es necesario poner la mínima cantidad de información necesario en nuestra visualizaciones

4 GGPLOT2

Ggplot2 es la biblioteca de visualización de datos mas usada en R. Esta basada en el concepto de “gramática de gráficos”, que proporciona una forma estructurada y coherente de construir visualizaciones. La clave de esta gramática esta la posibilidad de trabajar por capas en la construcción de nuestras visualizaciones. Ggplot permite visualizar un gran cantidad de información a la par que un nivel muy detallado de personalización de nuestros gráficos.

Como dijimos ggplot trabaja creando “capas” (layers en ingles). Las capas pueden definir geometrías, calcular estadísticas de resumen, definir qué escalas usar o incluso cambiar estilos. Usamos el símbolo + para ir añiniedo nuevas capas a nuestro gráfico.

Para buscar ejemplos y tutoriales sobre gráficos con ggplot2 The R Graph Gallery una excelente fuente.

4.1 Mapeos estéticos

La primera capa es el mapeo estético (aesthetic mappings en inglés). Los mapeos estéticos vinculan propiedades de los datos con características visuales del gráfico, como posición en un eje, tamaño o color. Usando la función aes(), establecemos estas conexiones, lo que la convierte en una herramienta fundamental para la creación de gráficos. Normalmente, el resultado de aes se pasa como argumento a funciones geométricas para completar el gráfico

De esta manera, abrimos primero la función ggplot() establecemos nuestro data set como primer parametro y luego la función aes(). Adentro de esta ultima operación es necesario aclarar que rol tiene las variables que queremos trabajar. Serán el eje x? el eje y? el color? la forma? Esto es lo que hay pensar y definir.

Usemos nuestra variable IPL como ejemplo. Indiquemos la nuestro datset “Base_N” y dentro del aes() que en el eje x queremos la variable IPL y que ponderamos (weights en ingles) con PONDERA. Por ultimo, asignamos todo al objeto “gráfico1”

grafico1 <- ggplot(data = Base_n, aes(x = IPL, weights = PONDERA))
  
grafico1

Como resultado obtuvimos un plano vacío (el “lienzo”) en donde se estableció en el eje x las categorías de las variable IPL. Ahora bien ningún tipo de forma geométrica. Este es el próximo paso.

4.2 Agregando los objetos gemotricos (geoms)

En este sentido quedaría es establecer las figuras de los gráficos. En función de que tipo de gráfico queramos hacer es el geom que tenemos que usar

4.2.1 Grafico de barras

Primero entonces realicemos un gráfico de barras. Para esto tenemos que adosar un + y la función geom_bar() a nuestra linea de código anterior

Este tipo de gráficos se utilizan comúnmente para mostrar la distribución de una variable categórica o para comparar cantidades entre diferentes categorías. En un gráfico de barras, las categorías se muestran en el eje horizontal (eje x), mientras que las alturas de las barras representan las frecuencias, recuentos o valores asociados con cada categoría y se muestran en el eje vertical (eje y).

options(scipen=999) 

grafico1 <- ggplot(data = Base_n, aes(x = IPL, weights = PONDERA)) +
  geom_bar()

grafico1

4.2.2 Temas

Existen algunos parámetros estéticos que podemos modificar de este gráfico. Podemos, por ejemplo, elegir entre estos “temas” para modificar sus componentes:

theme_grey, theme_bw, theme_linedraw, theme_light, theme_dark, theme_minimal o theme_classic.

Probamos?

grafico1 <- ggplot(data = Base_n, aes(x = IPL, weights = PONDERA)) +
  geom_bar()+ 
  theme_classic()

grafico1

4.2.3 Títulos y leyendas de ejes

Que piensan de este gráfico? siguiendo los consejos que vimos al principio seria bueno quitar todo tipo de información redundante. En este sentido los nombres de las variable no aportan demasiado, sobre todo si logramos pasar algunas cosa a títulos o etiquetas.

Para poner títulos y subtitulos usamos la función labs(). Como siempre sumamos otra linea de código con el +. Una vez que aclaramos esto en el titulo es redundante tener el nombre de la categoría en el eje x. Podemos modificar los componentes de los ejes a través de la función theme(). Dentro de esta función establecemos que axis.title.x = element_blank(). Traducido al castellano seria: eje.titulo.x = elemento_vació . Con esta misma lógica podemos ir modificando todo el resto de los elementos del gráfico( por ejemplo: tamaños, colores, fuentes y posiciones de títulos, ejes y leyendas)

grafico1 <- ggplot(data = Base_n, aes(x = IPL, weights = PONDERA)) +
  geom_bar()+ 
  theme_classic()+
  labs( title = "Cantidad de trabajadores según indice de precariedad laboral (IPL)" , subtitle = "EPH: 3° trim. 2023")+
  theme(axis.title.x = element_blank())

grafico1

4.2.4 Etiquetas

Es un poco difícil de distinguir el valor de cada columna a simple vista. En este sentido es que siempre es deseable, en la medida que se pueda poner etiquetas a los gráficos. Para esto sumamos otro geom a nuestro código: geom_text. Esta función requiere que le pasemos algunos parámetros dado que no indicamos una variable y (lo veremos la próximas clases).

  1. aes(label = ..count..): Esto especifica que el texto que se mostrará en cada etiqueta (label en ingles) la variable “count”. Esto es una variable interna proporcionada por stat = “count” que representa el recuento de observaciones en cada barra.
  2. stat = “count”: Esto le dice a geom_text() que utilice el recuento de observaciones en cada barra para determinar qué texto mostrar en las etiquetas.
  3. vjust = -0.5: Esta opción ajusta la posición vertical del texto. Un valor negativo como -0.5 significa que el texto se moverá hacia arriba desde el centro de la barra. Esto se hace para colocar las etiquetas encima de las barras.
grafico1 <- ggplot(data = Base_n, aes(x = IPL, weights = PONDERA)) +
  geom_bar()+
  geom_text(aes( label = ..count..), stat = "count", vjust =-0.5)+
  theme_classic()+
  labs( title = "Cantidad de trabajadores según indice de precariedad laboral (IPL)" , subtitle = "EPH: 3° trim. 2023")+
  theme(axis.title.x = element_blank())

grafico1

Por ultimo, ahora que tenemos las etiquetas sobre las barras todo el eje Y carece de sentido, quitemoslo. Configuremos el texto del eje (axis.text.y), el titulo del eje (axis.title.y) y las lineas del eje (axis.line.y) como vacías (element_blank)

grafico1 <- ggplot(data = Base_n, aes(x = IPL, weights = PONDERA)) +
  geom_bar()+
  geom_text(aes( label = ..count..), stat = "count", vjust =-0.5)+
  theme_classic()+
  labs( title = "Cantidad de trabajadores según indice de precariedad laboral (IPL)", subtitle = "EPH: 3° trim. 2023")+
  theme(axis.title.x = element_blank(), axis.text.y = element_blank(), axis.line.y = element_blank(), axis.title.y = element_blank())

grafico1

## 5 Más ejercicios para practicar

a- Simplifique la variable Nivel Educativo (NIVEL_ED) para que solamente tenga 3 categorías. b - Elabore un gráfico de barras para visualizar los resultados.

Base_r <- eph23_3 %>% 
  mutate(NIVEL_ED_R = case_when(NIVEL_ED <= 3 | NIVEL_ED == 7 ~ "Bajo", 
         NIVEL_ED == 4 ~ "Medio",
         NIVEL_ED >= 5 & NIVEL_ED <= 6  ~ "Alto",
         TRUE ~ "Otro" )) %>% 
  mutate(NIVEL_ED_R = factor(NIVEL_ED_R, levels = c("Bajo", "Medio", "Alto")))
  

table(Base_r$NIVEL_ED_R)
## 
##  Bajo Medio  Alto 
## 25552 10104 12679
grafico2 <- ggplot(data = Base_r, aes(x = NIVEL_ED_R, weights = PONDERA)) +
  geom_bar()+
  geom_text(aes( label = ..count..), stat = "count", vjust =-0.5)+
  theme_classic()+
  labs( title = "Cantidad de personas según nivel educativo simplificado", subtitle = "EPH: 3° trim. 2023")+
  theme(axis.title.x = element_blank(), axis.text.y = element_blank(), axis.line.y = element_blank(), axis.title.y = element_blank())

grafico2