6.2 Histogramas para graficar variables continuas

Un histograma es una representación gráfica de la distribución de los datos de una variable numérica continua. Está compuesto por rectángulos (barras) cuya altura es proporcional a la frecuencia de los valores representados y cuyo ancho es proporcional a la amplitud de los intervalos de clase (bins).

Como se mencionó anteriormente, para el análisis de encuestas se recomienda incorporar los factores de expansión o pesos muestrales, de modo que los histogramas reflejen la distribución poblacional estimada y no solo la de la muestra observada.

En esta sección, se construyen histogramas en R utilizando principalmente el paquete ggplot2, apoyados en patchwork para organizar comparaciones visuales.

6.2.1 Histogramas ponderados y no ponderados

En primera instancia se presenta un histograma de la variable Income, incluyendo los pesos muestrales (wk) de la encuesta. Para ello se definen:

  • la fuente de información (data),
  • la variable a graficar (x),
  • y los pesos de muestreo (weight).

Luego se especifica el tipo de gráfico con geom_histogram, se ajustan los títulos y se aplica un tema de estilo (en este caso, theme_cepal).

plot1_Ponde <- ggplot(
  data = encuesta,              
  aes(x = Income, weight = wk)) +
  geom_histogram(               
    aes(y = ..density..)) +        
  ylab("") +                   
  ggtitle("Ponderado") +        
  theme_cepal()  
plot1_Ponde

De manera análoga, se construye un histograma sin aplicar pesos, es decir, tomando la muestra sin expandir:

plot1_SinPonde <-
  ggplot(encuesta, aes(x = Income)) +
  geom_histogram(aes(y = ..density..)) +
  ylab("") +
  ggtitle("Sin ponderar") +
  theme_cepal()
plot1_SinPonde

Comparación con la población

Para efectos de contraste, se incluye también el histograma de la población completa (BigCity). Así es posible visualizar las diferencias entre la distribución poblacional, la estimación muestral ponderada y la no ponderada:

plot1_censo <- ggplot(BigCity, aes(x = Income)) +
  geom_histogram(aes(y = ..density..)) +
  ylab("") +
  ggtitle("Poblacional") +
  theme_cepal() +
  xlim(0, 2500)

plot1_censo | plot1_Ponde | plot1_SinPonde

Los histogramas muestran cómo se distribuyen los valores de una variable numérica continua en la encuesta. El eje horizontal se divide en intervalos (bins), y cada barra representa la frecuencia de observaciones en dicho rango.

A diferencia de un gráfico de barras, en un histograma el área de cada barra tiene un significado analítico: corresponde a la proporción de observaciones en el intervalo, mientras que la altura se obtiene dividiendo esa frecuencia por el ancho del bin.

En el caso de encuestas, los histogramas deben construirse incorporando los pesos de muestreo. Así, la distribución gráfica refleja la cantidad de unidades poblacionales representadas, en lugar de limitarse a la frecuencia de la muestra. Una aplicación común es graficar la distribución del ingreso o del gasto, permitiendo observar su forma, dispersión y tendencia poblacional.

Además, los histogramas pueden emplearse para comparar subgrupos de la población, como zonas geográficas (urbana y rural) o características demográficas (sexo, edad, etnia, etc.). Esta estrategia permite detectar diferencias relevantes, por ejemplo, en la forma como se distribuye el ingreso o el gasto en distintos segmentos de la población.

Cuando se combinan histogramas con curvas de densidad suavizadas, se obtiene una visión más detallada de las distribuciones poblacionales, lo que contribuye a un análisis más claro y robusto.

Por otro lado, repetimos ahora la secuencia de gráficos pero en este caso para la variable Expenditure:

plot2_Ponde <- ggplot(
  data =  encuesta,
  aes(x = Expenditure, weight = wk)
) +
  geom_histogram(aes(y = ..density..)) +
  ylab("") +
  ggtitle("Ponderado") +
  theme_cepal()
plot2_Ponde

plot2_SinPonde <- ggplot(data = encuesta,
      aes(x = Expenditure)) +
      geom_histogram(aes(y = ..density..)) +
      ylab("") +
      ggtitle("Sin ponderar") +
      theme_cepal()
plot2_SinPonde

plot2_censo <- ggplot(BigCity, aes(x = Expenditure)) +
  geom_histogram(aes(y = ..density..)) +
  ylab("") +
  ggtitle("Poblacional") +
  theme_cepal() +
  xlim(0, 1500)

plot2_censo | plot2_Ponde | plot2_SinPonde

Como conclusión, de ambos ejercicios, se puede observar que el histograma que mejor se aproxima al poblacional es aquel que utiliza los pesos de muestreo, aunque el gráfico que no los utiliza se aproxima bien y esto debido a la correcta selección de la muestra.

Por otro lado, cuando el interés ahora 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 sea el grupo. Para este ejemplo, se van a graficar subgrupos por zonas:

plot3_Ponde <- ggplot(
  encuesta,
  aes(x = Income, weight = wk)) +
  geom_histogram(
    aes(y = ..density.., fill = Zone),
    alpha = 0.5,
     position = "identity" 
  ) +
  ylab("") +
  ggtitle("Ponderado") +
  theme_cepal()
plot3_Ponde

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

Ahora se graficará la misma variable pero esta vez sin los pesos de muestreo:

plot3_SinPonde <- ggplot(encuesta, aes(x = Income)) +
  geom_histogram(aes(y = ..density.., fill = Zone),
    alpha = 0.5, position = "identity"
  ) +
  ggtitle("Sin ponderar") +
  theme_cepal() +
  ylab("")
plot3_SinPonde

Ahora, siguiendo el esquema de comparación anterior, se graficará la variable ingreso usando la información de la población y los subgrupos de zonas definidos anteriormente y por último, se muestran los 3 histogramas para poder compararlos:

plot3_censo <- ggplot(BigCity, aes(x = Income)) +
  geom_histogram(aes(y = ..density.., fill = Zone),
    alpha = 0.5, position = "identity"
  ) +
  ggtitle("Poblacional") +
  theme_cepal() +
  xlim(0, 1500) +
  ylab("")
plot3_censo | plot3_Ponde | plot3_SinPonde

Ahora, repetimos la secuencia de gráficos anteriores pero, para la variable Expenditure:

plot4_Ponde <- ggplot(
  encuesta,
  aes(x = Expenditure, weight = wk)
) +
  geom_histogram(aes(y = ..density.., fill = Zone),
    alpha = 0.5, position = "identity"
  ) +
  ylab("") +
  ggtitle("Ponderado") +
  theme_cepal()
plot4_Ponde

Sin ponderar,

plot4_SinPonde <- ggplot(
  encuesta,
  aes(x = Expenditure)
) +
  geom_histogram(aes(y = ..density.., fill = Zone),
    alpha = 0.5, position = "identity"
  ) +
  ggtitle("Sin ponderar") +
  theme_cepal() +
  ylab("")
plot4_SinPonde

Poblacional,

plot4_censo <- ggplot(BigCity, aes(x = Expenditure)) +
  geom_histogram(aes(y = ..density.., fill = Zone),
    alpha = 0.5, position = "identity"
  ) +
  ggtitle("Poblacional") +
  theme_cepal() +
  xlim(0, 1500) +
  ylab("")
plot4_censo | plot4_Ponde | plot4_SinPonde

Ahora, repetimos la secuencia de gráficos para la variable Income, pero hacemos las particiones por la variable sexo, Primero, hagamos el histogramas ponderado:

plot5_Ponde <- ggplot(
  encuesta,
  aes(x = Income, weight = wk)
) +
  geom_histogram(aes(y = ..density.., fill = Sex),
    alpha = 0.5, position = "identity"
  ) +
  ylab("") +
  ggtitle("Ponderado") +
  theme_cepal()
plot5_Ponde

Sin ponderar,

plot5_SinPonde <- ggplot(encuesta, aes(x = Income)) +
  geom_histogram(aes(y = ..density.., fill = Sex),
    alpha = 0.5, position = "identity"
  ) +
  ggtitle("Sin ponderar") +
  theme_cepal() +
  ylab("")
plot5_SinPonde

Poblacional,

plot5_censo <- ggplot(BigCity, aes(x = Income)) +
  geom_histogram(aes(y = ..density.., fill = Sex),
    alpha = 0.5, position = "identity"
  ) +
  ggtitle("Poblacional") +
  theme_cepal() +
  xlim(0, 1500) +
  ylab("")
plot5_censo | plot5_Ponde | plot5_SinPonde

Ahora, repetimos la secuencia de gráficos para la variable Expenditure desagregada por la variable sexo, primero, ponderado:

plot6_Ponde <- ggplot(
  encuesta,
  aes(x = Expenditure, weight = wk)
) +
  geom_histogram(aes(y = ..density.., fill = Sex),
    alpha = 0.5, position = "identity"
  ) +
  ylab("") +
  ggtitle("Ponderado") +
  theme_cepal()
plot6_Ponde

Sin ponderar,

plot6_SinPonde <- ggplot(encuesta, aes(x = Expenditure)) +
  geom_histogram(aes(y = ..density.., fill = Sex),
    alpha = 0.5, position = "identity"
  ) +
  ggtitle("Sin ponderar") +
  theme_cepal() +
  ylab("")
plot6_SinPonde

Poblacional,

plot6_censo <- ggplot(BigCity, aes(x = Expenditure)) +
  geom_histogram(aes(y = ..density.., fill = Sex),
    alpha = 0.5, position = "identity"
  ) +
  ggtitle("Poblacional") +
  theme_cepal() +
  xlim(0, 1500) +
  ylab("")
plot6_censo | plot6_Ponde | plot6_SinPonde