6.2 Análisis gráfico con la librería ggplot2
La librería ggplot2
es una herramienta destacada para la visualización de datos en R
. Es ampliament econocida y usada por los investigadores alrededor del mundo y es conocida por su sintaxis declarativa y flexibilidad. Al adoptar un enfoque basado en capas, permite a los usuarios crear visualizaciones complejas de manera intuitiva.
6.2.1 Definición del tema
En el ámbito de encuestas de hogares, ggplot2
se convierte en una herramienta valiosa para representar visualmente tendencias en el tiempo, distribuciones de variables continuas y otros patrones relevantes. De hecho, su capacidad para trabajar con datos complejos facilita la exploración de este tipo de bases de datos, proporcionando una visión clara y efectiva de la realidad social que reflejan las encuestas de hogares.
Para crear las gráficas de este documento es posible se utilizará por defecto un tema específico, que define la apariencia visual de los gráficos. El tema incluye aspectos como colores, fuentes, márgenes y otros elementos estéticos que permiten personalizar la presentación de un gráfico de acuerdo con las preferencias del usuario. La librería ggplot2 proporciona una variedad de temas predefinidos que pueden aplicarse a los gráficos para cambiar su apariencia de manera rápida y sencilla. El siguiente código define el tema que se usará en los gráficos del docuemnto.
theme_cepal <- function(...) {
theme_light(10) +
theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
legend.position = "bottom",
legend.justification = "left",
legend.direction = "horizontal",
plot.title = element_text(size = 10, hjust = 0.5),
...
)
}
Basado en lo anterior, los argumentos dentro de la función theme()
en ggplot2
se utilizan para personalizar la apariencia de diferentes elementos en un gráfico. en particular:
axis.text.x
yaxis.ticks.x
controlan la apariencia de las etiquetas y marcas en el eje x. En este caso, se estableceelement_blank()
para ocultar tanto las etiquetas como las marcas en el eje x.axis.text.y
yaxis.ticks.y
controlan la apariencia de las etiquetas y marcas en el eje y. Aquí también se estableceelement_blank()
para ocultar ambas.legend.position
define la posición de la leyenda en el gráfico. En este caso, se establece enbottom
, lo que significa que la leyenda se situará en la parte inferior del gráfico.legend.justification
ylegend.direction
define la alineación y dirección de la leyenda. En este caso, la leyenda se justifica a la izquierda (“left”) y se presenta en dirección horizontal.plot.title
controla la apariencia del título del gráfico. Se estableceelement_text(size = 20, hjust = 0.5)
para especificar que el tamaño del texto del título sea 20 y que esté centrado horizontalmente (hjust = 0.5
).
6.2.2 Histogramas
Un histograma es una representación gráfica de los datos de una variable empleando rectángulos (barras) cuya altura es proporcional a la frecuencia de los valores representados y su ancho proporcional a la amplitud de los intervalos de la clase. A continuación, se presenta cómo realizar un histograma para la variable ingresos utilizando los factores de expansión de la encuesta. EN primera instancia se define la fuente de información (data
), luego se definen la variable que se desea graficar (x
) y los pesos de muestreo (weight
). Una vez definidos los parámetros generales, se define el tipo de gráfico, que para el caso de los histogramas es geom_histogram
. Además, se definen los títulos que se quiere que tenga el histograma y por último, se aplica el tema de la CEPAL.
HistInc <- ggplot(data = encuesta,
aes(x = Income, weight = wk)) +
geom_histogram(aes(y = ..density..)) +
ylab("") +
ggtitle("Histograma ponderado del ingreso") +
theme_cepal()
HistInc
Por otro lado, repetimos ahora la secuencia de gráficos pero en este caso para la variable Expenditure
:
ggplot(data = encuesta,
aes(x = Expenditure, weight = wk)) +
geom_histogram(aes(y = ..density..)) +
ylab("") +
ggtitle("Histograma ponderado del gasto") +
theme_cepal()
Cuando el interés es realizar comparaciones entre dos o más agrupaciones, es posible hacer uso del parámetro fill
, el cual rellena las barras del histograma con diferentes colores según el subgrupo poblacional. El siguiente ejemplo proporciona el código para realizar la comparación de la distribución de los ingresos poblacionales por zonas:
ggplot(encuesta,
aes(x = Income, weight = wk)) +
geom_histogram(aes(y = ..density.., fill = Zone),
alpha = 0.5,
position = "identity") +
ylab("") +
ggtitle("Histogramas ponderados del ingreso por zona") +
theme_cepal()
Como se pudo observar en la generación del histograma, se utilizó el parámetro position
, el cual permite que las barras del gráfico sean distinguibles. Ahora, repetimos la secuencia de gráficos para la variable Expenditure
.
ggplot(encuesta,
aes(x = Expenditure, weight = wk)) +
geom_histogram(aes(y = ..density.., fill = Zone),
alpha = 0.5,
position = "identity") +
ylab("") +
ggtitle("Histogramas ponderados del gasto por zona") +
theme_cepal()
Si quisieramos hacer una desagregación de la distribución del ingreso y del gasto por sexo, se debería usar el siguiente código que hace uso de la librería patchworks
para posiconarlos de forma paralela.
HistIncSex <- ggplot(encuesta,
aes(x = Income, weight = wk)) +
geom_histogram(aes(y = ..density.., fill = Sex),
alpha = 0.5,
position = "identity") +
ylab("") +
ggtitle("Histogramas del ingreso por sexo") +
theme_cepal()
HistExpSex <- ggplot(encuesta,
aes(x = Expenditure, weight = wk)) +
geom_histogram(aes(y = ..density.., fill = Sex),
alpha = 0.5,
position = "identity") +
ylab("") +
ggtitle("Histogramas del gasto por sexo") +
theme_cepal()
HistIncSex | HistExpSex
6.2.3 Densidades
Dadas las cualidades de la librería ggplot2
, se pueden agregar nuevas capas a los gráficos; particularmente, a los histogramas antes realizados. La densidad se agrega con el argumento geom_density
y se incorpora el parámetro alpha
que regula la transparencia del relleno. Esta capa de densidad es útil cuando se trabaja con variables continuas, ya que proporciona una estimación suavizada de la función de densidad de probabilidad de los datos. Esta función utiliza un kernel de suavizamiento para construir una curva suave que se ajusta a los datos, ayudando a obtener una representación visual más clara de la forma general de la distribución. A continuación, se muestra cómo se agregan las densidades:
Ahora bien, al aplicar el argumento aes(fill = Zone)
permite que la densidad sea agregada para cada una de las agrupaciones como se muestra a continuación.
6.2.4 Diagramas de caja
Los diagramas de caja (boxplot) son gráficos de resumen ampliamente utilizados en la práctica estadística. Este tipo de diagramas permite visualizar de forma general un conjunto de datos empleando la estimación directa de cinco cantidades: el mínimo, el máximo y los cuartiles Q1, Q2 y Q3. La forma generada por este gráfico compuesto por un rectángulo y dos brazos suministra información sobre la relación entre estas cantidades y permite verificar la existencia de valores atípicos.
Para realizar este gráfico en ggplot2
se utiliza la función geom_boxplot
. A continuación, se presentan los Boxplot para las variables ingresos y gastos respectivamente:
BoxInc <- ggplot(encuesta,
aes(x = Income, weight = wk)) +
geom_boxplot() +
ggtitle("Boxplot ponderado de los ingresos") +
coord_flip() +
theme_cepal()
BoxExp <- ggplot(encuesta,
aes(x = Expenditure, weight = wk)) +
geom_boxplot() +
ggtitle("Boxplot ponderado de los gastos") +
coord_flip() +
theme_cepal()
BoxInc | BoxExp
En los gráficos anteriores se puede observar que la variable ingresos tiene más variabilidad que la variable gastos. En ambos gráficos se observan datos atípicos. Ahora bien, esta clase de diagramas también permiten la comparación entre dos o más niveles de agrupamiento, por ejemplo, por zonas para las variables ingresos y gastos como se muestra a continuación.
BoxIncZone <- ggplot(encuesta,
aes(x = Income, weight = wk)) +
geom_boxplot(aes(fill = Zone)) +
ggtitle("Boxplot de los ingresos por zona") +
coord_flip() +
theme_cepal()
BoxExpZone <- ggplot(encuesta,
aes(x = Expenditure, weight = wk)) +
geom_boxplot(aes(fill = Zone)) +
ggtitle("Boxplot de los gastos por zona") +
coord_flip() +
theme_cepal()
BoxIncZone | BoxExpZone
Observándose, entre otros que, para la variable gasto en la zona rural es donde más datos atípicos hay. Ahora, si se desea personalizar los colores del relleno, es posible hacer uso de la función scale_fill_manual
como se muestra a continuación:
colorZona <- c(Urban = "#48C9B0", Rural = "#117864")
BoxIncZone + scale_fill_manual(values = colorZona) |
BoxExpZone + scale_fill_manual(values = colorZona)
Realizando la comparación para más de dos categorías, por ejemplo región, se procede como:
BoxIncReg <- ggplot(
data = encuesta,
aes(x = Income, weight = wk)) +
geom_boxplot(aes(fill = Region)) +
ggtitle("Boxplot de los ingresos por región") +
coord_flip() +
theme_cepal()
BoxExpReg <- ggplot(
data = encuesta,
aes(x = Expenditure, weight = wk)) +
geom_boxplot(aes(fill = Region)) +
ggtitle("Boxplot de los gastos por región") +
coord_flip() +
theme_cepal()
BoxIncReg | BoxExpReg
Una ventaja de este tipo de visualizaciones es que se pueden extender las comparaciones a variables que tienen más de dos categorías, creándose así una sinergia de posibles conclusiones sobre la distribución de las variables.
ggplot(data = encuesta,
aes(x = Income, y = Sex, weight = wk)) +
geom_boxplot(aes(fill = Region)) +
ggtitle("Boxplot de los ingresos por región y sexo") +
coord_flip()
6.2.5 Diagramas de dispersión
Un diagrama de dispersión (scaterplot) representa cada observación como un punto, posicionado según el valor de dos variables continuas. Además de una posición horizontal y vertical, cada punto también puede tener un tamaño, un color y una forma. Estos atributos se denominan estética y son las propiedades que se pueden percibir en el gráfico. Cada estética puede asignarse a una variable o establecerse en un valor constante.
Para visualizar estas relaciones en encuestas que provienen de un diseño de muestreo complejo que podría asignar diferentes factores de expansión a cada hogar, es posible realizar un diagrama de dispersión ponderado. Este es una representación gráfica de los datos que incorpora los pesos de muestreo finales para resaltar la importancia relativa de cada unidad observada en la población. En un diagrama de dispersión convencional, cada punto tiene el mismo peso en la visualización, lo que significa que todos los puntos se tratan de manera igualitaria. En cambio, uno ponderado asigna pesos específicos a cada punto, reflejando su relevancia o contribución a la representación global.
La ponderación generalmente se logra mediante el uso de un tercer conjunto de datos que proporciona los pesos correspondientes a cada observación. Para realizar este tipo de gráfico se usará la función geom_point
, como se muestra a continuación:
ggplot(data = encuesta,
aes(y = Income,
x = Expenditure,
weight = wk)) +
geom_point() +
ggtitle("Scatterplot ponderado entre los ingresos y los gastos") +
theme_cepal()
Note que, en este caso, el parámetro weight
no está aportando información visual al gráfico. Luego, el parámetro alpha
se puede usar para controlar el tamaño de los puntos, para tener un mejor panorama del comportamiento de la muestra y su expansión.
ggplot(data = encuesta,
aes(y = Income, x = Expenditure)) +
geom_point(aes(size = wk), alpha = 0.1) +
ggtitle("Scatterplot ponderado entre los ingresos y los gastos") +
theme_cepal()
Otra forma de usar la variable wk
, es asignar la intensidad del color según el valor de los factores de expansión.
ggplot(data = encuesta,
aes(y = Income, x = Expenditure)) +
geom_point(aes(col = wk), alpha = 0.3) +
ggtitle("Scatterplot ponderado entre los ingresos y los gastos") +
theme_cepal()
Se puede extender las bondades de los gráficos de ggplot2
para obtener mayor información de las muestra. Por ejemplo, agrupar los datos por Zona. Para lograr esto se introduce el parámetro shape
.
ggplot(
data = encuesta,
aes(y = Income,
x = Expenditure,
shape = Zone)) +
geom_point(aes(size = wk, color = Zone), alpha = 0.3) +
labs(size = "Peso") +
ggtitle("Scatterplot por zona entre los ingresos y los gastos") +
theme_cepal()
6.2.6 Diagrama de barras
Un diagrama de barras es una representación gráfica que utiliza barras rectangulares para mostrar la relación entre distintas categorías. Cada barra representa la frecuencia, proporción o cantidad asociada a una categoría específica, y la longitud de la barra es proporcional al valor que está representando. Estos diagramas son efectivos para visualizar datos discretos y comparar cantidades entre diferentes categorías de manera clara y sencilla. Sin embargo, en encuestas de hogares, la altura de las barras siempre va a representar una estimación que, a su vez, está sujeta al error de muestreo. Incorporar esta incertidumbre en los gráficos es una manera rápida y correcta de plantear hipótesis en la comparación de subgrupos poblacionales.
Para realizar estos gráficos, en primer lugar, se deben realizar las estimaciones puntuales de los valores que se van a graficar. En el siguiente ejemplo, se estima la cantidad de personas en la zona urbana y la rural, junto con sus respectivos errores estándar.
tamano_zona <- diseno %>%
group_by(Zone) %>%
summarise( Nd = survey_total(vartype = c("se", "ci")))
tamano_zona
Zone | Nd | Nd_se | Nd_low | Nd_upp |
---|---|---|---|---|
Rural | 72102 | 3062 | 66039 | 78165 |
Urban | 78164 | 2847 | 72526 | 83802 |
Para realizar este tipo de gráficos se requerirá de dos funciones, la primera geom_bar
, que se utiliza para crear la capa de las barras que representarán la estimación del tamaño de cada zona; la altura de la barra es proporcional al valor que representa. La segunda función es geom_errorbar
que se utiliza para agregar barras de error a un gráfico, que es útil porque precisamente queremos representar la variabilidad asociada con los valores estimados en la barra. El siguiente código permite reproducir este tipo de gráficos. Note que, los valores ymax
y ymin
se utilizan para definir los extremos superior e inferior de las barras de error, los cuales corresponden a los límites superior e inferior de los intervalos de confianza de la tabal anterior.
ggplot(data = tamano_zona,
aes(
x = Zone,
y = Nd,
ymax = Nd_upp,
ymin = Nd_low,
fill = Zone
)) +
geom_bar(stat = "identity", position = "dodge") +
geom_errorbar(position = position_dodge(width = 0.9),
width = 0.3) +
theme_bw()
Como se ha visto en los gráficos anteriores, este tipo de gráficos se pueden extender también a variables con más de dos categorías. Primero se realiza la estimación puntual junto con sus errores estándar asociados.
tamano_pobreza <- diseno %>%
group_by(Poverty) %>%
summarise(Nd = survey_total(vartype = c("se", "ci")))
tamano_pobreza
Poverty | Nd | Nd_se | Nd_low | Nd_upp |
---|---|---|---|---|
NotPoor | 91398 | 4395 | 82696 | 100101 |
Extreme | 21519 | 4949 | 11719 | 31319 |
Relative | 37349 | 3695 | 30032 | 44666 |
El gráfico asociado a las anteriores estimaciones se obtiene con una sintaxis homologa a la anterior.
ggplot(data = tamano_pobreza,
aes(
x = Poverty,
y = Nd,
ymax = Nd_upp,
ymin = Nd_low,
fill = Poverty
)) +
geom_bar(stat = "identity", position = "dodge") +
geom_errorbar(position = position_dodge(width = 0.9),
width = 0.3) +
theme_bw()
De forma similar a los gráficos Boxplot, es posible realizar comparaciones entre más de dos variables. A continuación, se obtienen las estimaciones puntuales y los errores estándar para los tamaños absolutos de los cruces entre las dos categorías de desempleo y las tres categorías de pobreza.
tamano_ocupacion_pobreza <- diseno %>%
filter(!is.na(desempleo)) %>%
group_by(desempleo, Poverty) %>%
summarise(Nd = survey_total(vartype = c("se", "ci"))) %>%
as.data.frame()
tamano_ocupacion_pobreza
desempleo | Poverty | Nd | Nd_se | Nd_low | Nd_upp |
---|---|---|---|---|---|
0 | NotPoor | 68946 | 3676.3 | 61666.8 | 76226 |
0 | Extreme | 11549 | 2208.8 | 7175.8 | 15923 |
0 | Relative | 22847 | 2558.5 | 17780.5 | 27913 |
1 | NotPoor | 1768 | 405.4 | 965.7 | 2571 |
1 | Extreme | 1169 | 348.1 | 479.9 | 1859 |
1 | Relative | 1697 | 457.8 | 790.7 | 2604 |
El gráfico para la tabla anterior queda de ejemplificado de la siguiente manera.
ggplot(data = tamano_ocupacion_pobreza,
aes(
x = Poverty,
y = Nd,
ymax = Nd_upp,
ymin = Nd_low,
fill = as.factor(desempleo)
)) +
geom_bar(stat = "identity", position = "dodge") +
geom_errorbar(position = position_dodge(width = 0.9),
width = 0.3) +
theme_bw()
En estos gráficos también se pueden presentar proporciones estimadas, o frecuencias relativas, como se muestra a continuación para la estimación de la proporción de personas en las tres categorías de pobreza cruzada con la zona.
prop_ZonaH_Pobreza <- sub_Hombre %>%
group_by(Zone, Poverty) %>%
summarise(prop = survey_prop(vartype = c("se", "ci")))
prop_ZonaH_Pobreza
## # A tibble: 6 × 6
## # Groups: Zone [2]
## Zone Poverty prop prop_se prop_low prop_upp
## <chr> <fct> <dbl> <dbl> <dbl> <dbl>
## 1 Rural NotPoor 0.549 0.0626 0.424 0.668
## 2 Rural Extreme 0.198 0.0675 0.0958 0.364
## 3 Rural Relative 0.254 0.0372 0.187 0.334
## 4 Urban NotPoor 0.660 0.0366 0.584 0.728
## 5 Urban Extreme 0.113 0.0245 0.0726 0.171
## 6 Urban Relative 0.227 0.0260 0.180 0.283
Después de obtener la tabla con los valores que se quieren presentar en el gráfico, los códigos computacionales para realizar un diagrama de barras es el siguiente:
ggplot(data = prop_ZonaH_Pobreza,
aes(
x = Poverty,
y = prop,
ymax = prop_upp,
ymin = prop_low,
fill = Zone
)) +
geom_bar(stat = "identity", position = "dodge") +
geom_errorbar(position = position_dodge(width = 0.9),
width = 0.3) + scale_fill_manual(values = colorZona) +
theme_bw()