Reiniciar Sesión
library(tidyverse) # tiene ggplot, dplyr, tidyr, y otros
[30m── [1mAttaching packages[22m ──────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──[39m
[30m[32m✔[30m [34mggplot2[30m 3.0.0 [32m✔[30m [34mpurrr [30m 0.2.5
[32m✔[30m [34mtibble [30m 1.4.2 [32m✔[30m [34mdplyr [30m 0.7.7
[32m✔[30m [34mtidyr [30m 0.8.1 [32m✔[30m [34mstringr[30m 1.3.1
[32m✔[30m [34mreadr [30m 1.1.1 [32m✔[30m [34mforcats[30m 0.3.0[39m
[30m── [1mConflicts[22m ─────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31m✖[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
library(ggthemes) # estilos de gráficos
library(ggrepel) # etiquetas de texto más prolijas que las de ggplot
Rbase tiene algunos comandos genéricos para realizar gráficos, que se adaptan al tipo de información que se le pide graficar, por ejemplo:
# iris es un set de datos clásico, que ya viene incorporado en R
iris
plot(iris)
#Al especificar una variable, puedo ver el valor que toma cada uno de sus registros (Index)
plot(iris$Sepal.Length,type = "p") # Un punto por cada valor
plot(iris$Sepal.Length,type = "l") # Una linea que una cada valor
plot(iris$Sepal.Length,type = "b") #Ambas
hist(iris$Sepal.Length, col = "lightsalmon1", main = "Histograma")
La función png()
nos permite grabar una imagen en el disco. Lleva como argumento principal la ruta completa a donde se desea guardar la misma, incluyendo el nombre que queremos dar al archivo. A su vez pueden especificarse otros argumetnos como el ancho y largo de la imagen, entre otros.
ruta_archivo <- "../Resultados/grafico1.PNG"
ruta_archivo
[1] "../Resultados/grafico1.PNG"
png(ruta_archivo)
plot(iris$Sepal.Length,type = "b")
dev.off()
null device
1
La función png()
abre el dispositivo de imagen en el directorio especificado. Luego creamos el gráfico que deseamos (o llamamos a uno previamente construido), el cual se desplegará en la ventana inferior derecha de la pantalla de Rstudio. Finalmente con dev.off()
se cierra el dispositivo y se graban los gráficos.
Los gráficos del R base son útiles para escribir de forma rápida y obtener alguna información mientras trabajamos. Muchos paquetes estadísticos permiten mostrar los resultados de forma gráfica con el comando plot (por ejemplo, las regresiones lineales lm()
).
Sin embargo, existen librerías mucho mejores para crear gráficos de nivel de publicación. La más importante es ggplot2, que a su vez tiene extensiones mediante otras librerías.
ggplot tiene su sintaxis propia. La idea central es pensar los gráficos como una sucesión de capas, que se construyen una a la vez.
El operador +
nos permite incorporar nuevas capas al gráfico.
El comando ggplot()
nos permite definir la fuente de datos y las variables que determinaran los ejes del grafico (x,y), así como el color y la forma de las líneas o puntos,etc.
Las sucesivas capas nos permiten definir:
geom_col()
, de línea, geom_line()
, de puntos,geom_point()
, boxplot, geom_boxplot()
)labs()
theme()
scale_y_continuous
,scale_x_discrete
facet_wrap()
,facet_grid()
ggplot tiene muchos comandos, y no tiene sentido saberlos de memoria, es siempre útil reutilizar gráficos viejos y tener a mano el machete.
A continuación se desplega un gráfico de varias capas de construcción, con su correspondiente porción de código. En el mismo se buscará visualizar, a partir de la base de datos iris la relación entre el ancho y el largo de los petalos, mediante un gráfico de puntos.
ggplot(data = iris, aes(x = Petal.Length, Petal.Width, color = Species))+
geom_point(alpha=0.75)+
labs(title = "Medidas de los pétalos por especie")+
theme(legend.position = 'none')+
facet_wrap(~Species)
Veamos ahora, el “paso a paso” del armado del mismo.
En primera instancia solo defino los ejes. Y en este caso un color particular para cada Especie.
g <- ggplot(data = iris, aes(x = Petal.Length, Petal.Width, color = Species))
g
Luego, defino el tipo de gráfico. El alpha me permite definir la intensidad de los puntos
g <- g + geom_point(alpha=0.25)
g
Las siguientes tres capas me permiten respectivamente:
g <- g +
labs(title = "Medidas de los pétalos por especie")+
theme(legend.position = 'none')+
facet_wrap(~Species)
g
Si quisieramos hacer un gráfico de columnas del promedio de las medidas por especie, primero necesitamos hacer una base con los promedios, y luego graficar eso.
iris_promedios <- iris %>%
group_by(Species) %>%
summarise_all(mean)
iris_promedios
ggplot(data = iris_promedios, aes(x = Species, Petal.Width, fill = Species))+
geom_col(alpha=0.75)+
labs(title = "Ancho promedio del pétalo por especie")+
theme(legend.position = 'none')
con geom_col()
podemos realizar el gráfico de columnas.
Individual_t117 <- read.table("../Fuentes/usu_individual_t117.txt",
sep=";", dec=",", header = TRUE, fill = TRUE)
En los gráficos utilizamos extensiones de ggplot:
geom_text_repel()
theme_tufte()
simplemente debemos recordar cargar las librerías si queremos utilizar esas funciones.
Los gráficos hasta aquí realizados (puntos y barras) son fácilmente reproducibles en un excel ya que utilizan la información agregada. Sin embargo, la gran ventaja del R se manifiesta a a la hora de realizar:
facet_wrap()
color =
fill =
shape =
size =
alpha =
Esto permite tener, en el plano, gráficos de muchas dimensiones de análisis
aes(... color = ingresos)
geom_col(color = 'green')
.Hacemos un procesamiento simple: Sacamos los ingresos iguales a cero y las no respuestas de nivel educativo.
Es importante que las variables sean del tipo que conceptualmente les corresponde (el nivel educativo es una variable categórica, no continua), para que el ggplot pueda graficarlo correctamente.
# Las variables sexo( CH04 ) y Nivel educativo están codificadas como números, y el R las entiende como numéricas.
class(Individual_t117$NIVEL_ED)
[1] "integer"
class(Individual_t117$CH04)
[1] "integer"
ggdata <- Individual_t117 %>%
filter(P21>0, !is.na(NIVEL_ED)) %>%
mutate(NIVEL_ED = as.factor(NIVEL_ED),
CH04 = as.factor(CH04))
ggplot(ggdata, aes(x = NIVEL_ED, y = P21, fill = NIVEL_ED)) +
geom_boxplot()+
scale_y_continuous(limits = c(0, 40000))#Restrinjo el gráfico hasta ingresos de $40000
Si queremos agregar la dimensión sexo, podemos hacer un facet_wrap()
ggplot(ggdata, aes(x= NIVEL_ED, y = P21, group = NIVEL_ED, fill = NIVEL_ED )) +
geom_boxplot()+
scale_y_continuous(limits = c(0, 40000))+
facet_wrap(~ CH04, labeller = "label_both")
Por la forma en que está presentado el gráfico, el foco de atención sigue puesto en las diferencias de ingresos entre niveles educativo. Simplemente se agrega un corte por la variable de sexo.
Si lo que queremos hacer es poner el foco de atención en las diferencias por sexo, simplemente basta con invertir la variable x especificada con la variable utilizada en el facet_wrap
ggplot(ggdata, aes(x= CH04, y = P21, group = CH04, fill = CH04 )) +
geom_boxplot()+
scale_y_continuous(limits = c(0, 40000))+
facet_grid(~ NIVEL_ED, labeller = "label_both") +
theme(legend.position = "none")
Otra forma de mostrar la distribución de una variable es utilizar un histograma. Este tipo de gráficos agrupa las observaciones en bins: intervalos dentro del rango de la variable. Luego cuenta la cantidad de observaciones que caen dentro de cada uno de estos bins.
Por ejemplo, si observamos el ingreso de la ocupación principal:
En este gráfico, los posibles valores de p21 se dividen en 30 bins consecutivos y el gráfico muestra cuantas observaciones caen en cada uno de ellos
La función geom_density()
nos permite construir kernels de la distribución. Esto es, un suavizado sobre los histogramas que se basa en alguna distribución supuesta dentro de cada bin. Es particularmente útil cuando tenemos una variable continua, dado que los histogramas rompen esa sensación de continuidad.
Veamos un ejemplo sencillo con los ingresos de la ocupación principal. Luego iremos complejizandolo
kernel_data <-Individual_t117 %>%
filter(P21>0)
ggplot(kernel_data, aes(x = P21,weights = PONDIIO))+
geom_density()+
scale_x_continuous(limits = c(0,50000))
El eje y no tiene demasiada interpretabilidad en los Kernel, porque hace a la forma en que se construyen las distribuciones.
El parametro adjust, dentro de la función geom_density
nos permite reducir o ampliar el rango de suavizado de la distribución. Su valor por default es 1. Veamos que sucede si lo seteamos en 2
ggplot(kernel_data, aes(x = P21,weights = PONDIIO))+
geom_density(adjust = 2)+
scale_x_continuous(limits = c(0,50000))
Como es esperable, la distribución del ingreso tiene “picos” en los valores redondos, ya que la gente suele declarar un valor aproximado al ingreso efectivo que percibe. Nadie declara ingresos de 30001. Al suavizar la serie con un kernel, eliminamos ese efecto.Si seteamos el rango para el suavizado en valores menores a 1, podemos observar estos picos.
ggplot(kernel_data, aes(x = P21,weights = PONDIIO))+
geom_density(adjust = 0.01)+
scale_x_continuous(limits = c(0,50000))
Ahora bien, como en todo grafico de R, podemos seguir agregando dimensiones para enriquecer el análisis.
kernel_data_2 <- kernel_data %>%
mutate(CH04= case_when(CH04 == 1 ~ "Varon",
CH04 == 2 ~ "Mujer"))
ggplot(kernel_data_2, aes(x = P21,
weights = PONDIIO,
group = CH04,
fill = CH04)) +
geom_density(alpha=0.7,adjust =2)+
labs(x="Distribución del ingreso", y="",
title=" Total según tipo de ingreso y género",
caption = "Fuente: Encuesta Permanente de Hogares")+
scale_x_continuous(limits = c(0,50000))+
theme_tufte()+
scale_fill_gdocs()+
theme(legend.position = "bottom",
plot.title = element_text(size=12))
ggsave(filename = "../Resultados/Kernel_1.png",scale = 2)
Saving 14.6 x 9 in image
Podemos agregar aún la dimensión de ingreso laboral respecto del no laboral
kernel_data_3 <-kernel_data_2 %>%
select(REGION,P47T,T_VI, TOT_P12, P21 , PONDII, CH04) %>%
filter(!is.na(P47T), P47T > 0 ) %>%
mutate(ingreso_laboral = TOT_P12 + P21,
ingreso_no_laboral = T_VI) %>%
gather(., key = Tipo_ingreso, Ingreso, c((ncol(.)-1):ncol(.))) %>%
filter( Ingreso !=0)# Para este gráfico, quiero eliminar los ingresos = 0
kernel_data_3
ggplot(kernel_data_3, aes(
x = Ingreso,
weights = PONDII,
group = Tipo_ingreso,
fill = Tipo_ingreso)) +
geom_density(alpha=0.7,adjust =2)+
labs(x="Distribución del ingreso", y="",
title=" Total según tipo de ingreso y género",
caption = "Fuente: Encuesta Permanente de Hogares")+
scale_x_continuous(limits = c(0,50000))+
theme_tufte()+
scale_fill_gdocs()+
theme(legend.position = "bottom",
plot.title = element_text(size=12))+
facet_wrap(~ CH04, scales = "free")
ggsave(filename = "../Resultados/Kernel_1.png",scale = 2)
Saving 14.6 x 9 in image
En este tipo de gráficos, importa mucho qué variable se utiliza para facetear y qué variable para agrupar, ya que la construcción de la distribución es diferente.
ggplot(kernel_data_3, aes(
x = Ingreso,
weights = PONDII,
group = CH04,
fill = CH04)) +
geom_density(alpha=0.7,adjust =2)+
labs(x="Distribución del ingreso", y="",
title=" Total según tipo de ingreso y género",
caption = "Fuente: Encuesta Permanente de Hogares")+
scale_x_continuous(limits = c(0,50000))+
theme_tufte()+
scale_fill_gdocs()+
theme(legend.position = "bottom",
plot.title = element_text(size=12))+
facet_wrap(~Tipo_ingreso, scales = "free")
ggsave(filename = "../Resultados/Kernel_1.png",scale = 2)
Saving 14.6 x 9 in image
Calcular el promedio del ingreso por ocupación principal (Variable P21) para asalariados con y sin descuento jubilatorio (Variable PP07H). Luego realizar un gráfico de barras donde se comparen ambos valores (para el 1er trimestre de 2017).
Pistas: Se deben filtrar previamente los ingresos mayores a 0 (P21>0).Chequear que ponderador corresponde utilizar
Graficar la distribución del ingreso por ocupación principal para Asalariados, Cuentapropistas y Patrones, con el tipo de gráfico Kernel
Pista: Usar la función facet_wrap para separar a cada una de las categorías ocupacionales)
Sugerencia: incorporar la línea scale_x_continuous(limits = c(0,50000))
entre las capas del gráfico. ¿Qué cambió?
Hacer un gráfico boxplot de la distribución de edades de los asalariados con descuento jubilatorio, y de los asalariados sin descuento jubilatorio.
Uniendo las bases de los distintos trimestres, calcular el procentaje de asalariados sin descuento jubilatorio como \(\frac{Asal. s/ desc jubil}{Asal. c/ desc jubil+ Asal.s/ desc jubil}\). Luego realizar un gráfico de linea con la evolución de este indicador