if (!require("pacman")) install.packages("pacman")
## Loading required package: pacman
pacman::p_load("janitor", "writexl", "tidyverse", "moments", "wesanderson", "RColorBrewer")
setwd("C:/Users/molar/Dropbox/2022_Trabajos/FLACSO") #Directorio de trabajo
load("Datos/concentrado.RData") #Carga base de datos
Para elaborar nuestra tabla de frecuencias, convertiremos la variable de sexo_jefe, a una variable de factor
concentrado <- concentrado %>%
mutate(sexo_factor=factor(concentrado$sexo_jefe,
labels= c("Hombre", "Mujer")))
Hacemos la tabla de frecuencias
table(concentrado$sexo_factor)
##
## Hombre Mujer
## 63230 25776
prop.table(table(concentrado$sexo_factor))
##
## Hombre Mujer
## 0.7104015 0.2895985
Con la función “tabyl”
concentrado %>%
tabyl(sexo_factor, show_missing_levels=F)
## sexo_factor n percent
## Hombre 63230 0.7104015
## Mujer 25776 0.2895985
Queremos agregar el total de casos
concentrado %>%
tabyl(sexo_factor, show_missing_levels=F) %>%
adorn_totals()
## sexo_factor n percent
## Hombre 63230 0.7104015
## Mujer 25776 0.2895985
## Total 89006 1.0000000
Ahora, agregar los porcentajes
concentrado %>%
tabyl(sexo_factor, show_missing_levels=F) %>%
adorn_totals() %>%
adorn_pct_formatting()
## sexo_factor n percent
## Hombre 63230 71.0%
## Mujer 25776 29.0%
## Total 89006 100.0%
La guardamos en un objeto y exportamos a excel
tabla1 <- concentrado %>%
tabyl(sexo_factor, show_missing_levels=F) %>%
adorn_totals() %>%
adorn_pct_formatting() %>%
writexl::write_xlsx(path="tabla1.xlsx")
Ahora graficaremos los porcentajes que calculamos en la tabla.
En la parte de datos: incluiremos la variable que queremos graficar. En este caso: el sexo del jefe del hogar
concentrado %>%
ggplot(aes(x=sexo_jefe))
Ahora agregaremos la geometría
concentrado %>%
ggplot(aes(x=sexo_jefe)) +
geom_bar()
Podemos voltear la geometría
concentrado %>%
ggplot(aes(x=sexo_jefe)) +
geom_bar()+
coord_flip()
Aunque, se ve mejor como estaba antes.
Para hacer nuestra gráfica de barras y que se vean las etiquetas con facilidad, convertiremos nuestra variable sexo_jefe en factor
concentrado <- concentrado %>%
mutate(sexo_factor = factor(concentrado$sexo_jefe,
labels = c("Hombre", "Mujer")))
Ahora sí podemos ver las etiquetas en nuestro gráfico
concentrado %>%
ggplot(aes(x=sexo_factor)) +
geom_bar()
Vamos a ponerle un color a hombre y otro a mujer y a quitar el fondo gris
concentrado %>%
ggplot(aes(x = sexo_factor, fill = sexo_factor)) +
geom_bar() +
scale_fill_manual(
values = c(Hombre = "#440154",
Mujer = "#3EB0F2")
) +
theme_classic()
Pero, no queremos el conteo, sino los porcentajes
concentrado %>%
count(sexo_factor) %>%
mutate(pct = prop.table(n)) %>%
ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
geom_col(position = 'dodge') +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(
values = c(Hombre = "#440154",
Mujer = "#3EB0F2")) +
theme_classic()
Ahora, le agregamos las etiquetas de los datos
concentrado %>%
count(sexo_factor) %>%
mutate(pct = prop.table(n)) %>%
ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
geom_col(position = 'dodge') +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(
values = c(Hombre = "#440154",
Mujer = "#3EB0F2")) +
theme_classic()+
geom_text(position = position_dodge(width = .9),
vjust = -0.5,
size = 3,
colour = "black")
Modificamos los títulos y ejes
concentrado %>%
count(sexo_factor) %>%
mutate(pct = prop.table(n)) %>%
ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
geom_col(position = 'dodge') +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(
values = c(Hombre = "#440154",
Mujer = "#3EB0F2")) +
theme_classic()+
geom_text(position = position_dodge(width = .9),
vjust = -0.5,
size = 3,
colour = "black") +
labs(
x = "Sexo del jefe del hogar",
y = "Porcentaje",
title = "Sexo de los jefes y jefas de hogar en México, 2020",
caption = "Fuente: elaboración propia con base en ENIGH 2020",
fill = "Sexo del jefe del hogar"
)
Modificamos el estilo del título y la fuente
concentrado %>%
count(sexo_factor) %>%
mutate(pct = prop.table(n)) %>%
ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
geom_col(position = 'dodge') +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(
values = c(Hombre = "#440154",
Mujer = "#3EB0F2")) +
theme_classic()+
geom_text(position = position_dodge(width = .9),
vjust = -0.5,
size = 3,
colour = "black") +
labs(
x = "Sexo del jefe del hogar",
y = "Porcentaje",
title = "Sexo de los jefes y jefas de hogar en México, 2020",
caption = "Fuente: elaboración propia con base en ENIGH 2020",
fill = "Sexo del jefe del hogar"
) +
theme(
plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
plot.caption = element_text(face = "italic")
)
Hay un paquete que nos permite graficar de manera más amable: install.packages(“esquisse”)
concentrado$mujeres <- as.numeric(concentrado$mujeres)
descriptivos <- concentrado %>%
summarise(media_mujeres=mean(mujeres, na.rm=T),
var_mujeres=var(mujeres,na.rm=T),
sd_mujeres=sd(mujeres, na.rm=T),
rango_mujeres=diff(range(mujeres, na.rm=T)),
simetria_mujeres=skewness(mujeres, na.rm=T),
curtosis_mujeres=kurtosis(mujeres, na.rm=T)) %>%
writexl::write_xlsx(path="resumen.xlsx")
Para las variables cuantitativas, las gráficas más utilizadas son los histogramas, gráficos de densidad.
Menos utilizados: de área y polígonos de frecuencias (ver https://r-graph-gallery.com/)
Bueno, en series de tiempo también se utilizan los gráficos de líneas.
Veamos primero los componentes de nuestra gramática. En los datos incluimos la variable que queremos y la base de datos que ocuparemos. En este caso es la edad del jefe del hogar.
concentrado %>%
ggplot(aes(x=edad_jefe))
Ahora agregaremos la geometría.
concentrado %>%
ggplot(aes(x=edad_jefe)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Vemos que el software nos avisa cuántas clases/intervalos está utilizando. Podemos cambiarlas.
concentrado %>%
ggplot(aes(x=edad_jefe)) +
geom_histogram(bins=12)
Una vez que tenemos nuestros datos y geometría, vamos a editar: primero le cambiamos el color y le quitamos el fondo gris
concentrado %>%
ggplot(aes(x=edad_jefe)) +
geom_histogram(bins=12, color="#000000", fill="darkblue")+
theme_classic()
Sobre los colores en R:Podemos agregar manualmente los colores, como lo hicimos anteriormente.
Sin embargo, existen paquetes que ya traen paletas cargadas y que se pueden utilizar dependiendo de los datos.
Una paleta es la de RColorBrewer: https://www.geeksforgeeks.org/introduction-to-color-palettes-in-r-with-rcolorbrewer/ Esta paleta de colores distingue si los datos son secuenciales, divergentes o cualitativos. Por ejemplo:
display.brewer.all(type="seq") #secuenciales
display.brewer.all(type="div") #divergentes
display.brewer.all(type="qual") #datos cualitativos
brewer.pal.info #Podemos enlistar todos los colores
## maxcolors category colorblind
## BrBG 11 div TRUE
## PiYG 11 div TRUE
## PRGn 11 div TRUE
## PuOr 11 div TRUE
## RdBu 11 div TRUE
## RdGy 11 div FALSE
## RdYlBu 11 div TRUE
## RdYlGn 11 div FALSE
## Spectral 11 div FALSE
## Accent 8 qual FALSE
## Dark2 8 qual TRUE
## Paired 12 qual TRUE
## Pastel1 9 qual FALSE
## Pastel2 8 qual FALSE
## Set1 9 qual FALSE
## Set2 8 qual TRUE
## Set3 12 qual FALSE
## Blues 9 seq TRUE
## BuGn 9 seq TRUE
## BuPu 9 seq TRUE
## GnBu 9 seq TRUE
## Greens 9 seq TRUE
## Greys 9 seq TRUE
## Oranges 9 seq TRUE
## OrRd 9 seq TRUE
## PuBu 9 seq TRUE
## PuBuGn 9 seq TRUE
## PuRd 9 seq TRUE
## Purples 9 seq TRUE
## RdPu 9 seq TRUE
## Reds 9 seq TRUE
## YlGn 9 seq TRUE
## YlGnBu 9 seq TRUE
## YlOrBr 9 seq TRUE
## YlOrRd 9 seq TRUE
display.brewer.all(colorblindFriendly=T) #La última columna nos dice si alguien con problemas para distinguir colores, los puede ver o no.
Otra paleta es la de Wesanderson, se inspira en sus peliculas: https://rforpoliticalscience.com/2020/07/26/make-wes-anderson-themed-graphs-with-wesanderson-package-in-r/ Debes escoger el nombre de la paleta y cuántos colores vas a usar.
wes_palette("Royal1")
wes_palette("GrandBudapest1")
wes_palette("Cavalcanti1")
wes_palette("Cavalcanti1", 3)
La lógica de estos paquetes es crear nuestra paleta de colores pensando en cuántos vamos a tener que utilizar. Entonces, haremos la nuestra.
pal <- wes_palette(12, name = "Royal1", type = "continuous")
Entonces, podemos volver a hacer nuestro gráfico escogiendo alguno de ellos.
concentrado %>%
ggplot(aes(x=edad_jefe)) +
geom_histogram(bins=12, color="#000000", fill=pal)+
theme_classic()
Podemos agregarle el valor mínimo, máximo y la media, pero para eso tenemos que hacer un pequeño dataframe
anotaciones <- data.frame(
x = c(round(min(concentrado$edad_jefe), 2), round(mean(concentrado$edad_jefe), 2), round(max(concentrado$edad_jefe), 2)),
y = c(2500, 17000, 2000),
label = c("Min:", "Media:", "Max:")
)
concentrado %>%
ggplot(aes(x=edad_jefe)) +
geom_histogram(bins=12, color="#000000", fill="darkblue")+
theme_classic()+
geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")
También le vamos a agregar el título, subtítulo y fuente
concentrado %>%
ggplot(aes(x=edad_jefe)) +
geom_histogram(bins=12, color="#000000", fill="darkblue")+
theme_classic()+
geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
labs(
x = "Edad del jefe del hogar",
y = "Frecuencia",
title = "Edades de los jefes y jefas de hogar en México, 2020",
caption = "Fuente: elaboración propia con base en ENIGH 2020"
)
Al título y fuente también podemos agregarle los tipos de letra
concentrado %>%
ggplot(aes(x=edad_jefe)) +
geom_histogram(bins=12, color="#000000", fill="darkblue")+
theme_classic()+
geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
labs(
x = "Edad del jefe del hogar",
y = "Frecuencia",
title = "Edades de los jefes y jefas de hogar en México, 2020",
caption = "Fuente: elaboración propia con base en ENIGH 2020"
)+
theme(
plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
plot.caption = element_text(face = "italic")
)
Podemos cambiar el histograma por un gráfico de densidad, para ello cambiamos nuestra base pequeña de anotaciones.
anotaciones <- data.frame(
x = c(round(min(concentrado$edad_jefe), 2), round(mean(concentrado$edad_jefe), 2), round(max(concentrado$edad_jefe), 2)),
y = c(0.0025, 0.025, 0.0025),
label = c("Min:", "Media:", "Max:")
)
concentrado %>%
ggplot(aes(x=edad_jefe)) +
geom_density(adjust = 1L, color="#000000", fill="darkblue")+
theme_classic()+
geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
labs(
x = "Edad del jefe del hogar",
y = "Densidad",
title = "Edades de los jefes y jefas de hogar en México, 2020",
caption = "Fuente: elaboración propia con base en ENIGH 2020"
)+
theme(
plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
plot.caption = element_text(face = "italic")
)
Por último, también podemos hacer un boxplot
anotaciones <- data.frame(
x = c(round(min(concentrado$edad_jefe), 2), round(mean(concentrado$edad_jefe), 2), round(max(concentrado$edad_jefe), 2)),
y = c(-0.37, 0.4, -0.37),
label = c("Min:", "Media:", "Max:")
)
concentrado %>%
ggplot(aes(x=edad_jefe)) +
geom_boxplot(color="#000000", fill="darkblue") +
theme_classic()+
geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
labs(
x = "Edad del jefe del hogar",
y = "",
title = "Edades de los jefes y jefas de hogar en México, 2020",
caption = "Fuente: elaboración propia con base en ENIGH 2020"
)+
theme(
plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
plot.caption = element_text(face = "italic")
)
Además, podemos hacer un boxplot contemplando los hombres y las mujeres.
concentrado$edad_jefe <- as.numeric(concentrado$edad_jefe)
ggplot(concentrado) +
aes(x = edad_jefe, y = sexo_factor, fill = sexo_factor) +
geom_boxplot() +
scale_fill_manual(
values = c(Hombre = "#270122",
Mujer = "#03D9AE")
) +
labs(
x = "Edad del jefe del hogar",
y = "Sexo del jefe del hogar",
title = "Distribución de las edades de los jefes y jefas de los hogares de México, 2020",
subtitle = "Según sexo del jefe del hogar",
caption = "Fuente: Elaboración propia con base en ENIGH 2020",
fill = "Sexo del jefe del hogar"
) +
theme_minimal()