Histograma en R
Un histograma en R es el gráfico más habitual para representar datos continuos. Este tipo de gráfico es similar a un diagrama de barras, pero que representa las frecuencias en las que aparecen las mediciones agrupadas en ciertos intervalos y cuenta cuántas observaciones caen en cada intervalo. Además, la altura está determinada por el ratio entre la frecuencia y el ancho del intervalo.
¿Cómo hacer un histograma en R? La función hist()
Para explicar los pasos para crear un histograma en R, vamos a utilizar los siguientes datos, que representan las distancia (en yardas) que recorre una pelota de golf después de ser golpeada.
distancia <- c(241.1, 284.4, 220.2, 272.4, 271.1, 268.3,
291.6, 241.6, 286.1, 285.9, 259.6, 299.6,
253.1, 239.6, 277.8, 263.8, 267.2, 272.6,
283.4, 234.5, 260.4, 264.2, 295.1, 276.4,
263.1, 251.4, 264.0, 269.2, 281.0, 283.2)
Puedes dibujar un histograma en R con la función hist. Por defecto, la función creará un histograma de frecuencias.
# Frecuencia
hist(distancia,
main = "Histograma de frecuencias", ylab = "Frecuencia")
Sin embargo, si estableces el argumento prob como TRUE, obtendrás un histograma de densidad.
# Densidad
hist(distancia,
prob = TRUE,
main = "Histograma de densidad", ylab = "Densidad")
Además, puedes añadir un grid al histograma con la función grid de la siguiente manera.
hist(distancia, prob = TRUE, ylab = "Densidad", main = "Grid")
grid(nx = NA, ny = NULL, lty = 2, col = "gray", lwd = 1)
hist(distancia, prob = TRUE, add = TRUE, col = "white")
Ten en cuenta que hay que dibujar dos veces el histograma para que el grid salga por debajo de las barras en lugar de por encima.
Desde R 4.0.0 los histogramas son grises por defecto, no blancos.
Cambiar el color del histograma
Ahora que ya sabes crear un histograma en R, también puedes personalizarlo. Si quieres cambiar el color de las barras puedes establecer el parámetro col al color que prefieras. Al igual que sucede con cualquier otro gráfico en R, puedes personalizar muchas características del gráfico, como el título, los ejes, el tamaño de fuente, la escala de los ejes, …
hist(distancia, main = "Cambiar color", ylab = "Frecuencia", col = "lightblue")
El argumento breaks
Los histogramas son muy útiles para representar la distribución subyacente de los datos si el número de barras o clases se selecciona correctamente. Sin embargo, la selección del número de barras (o el ancho de las barras) puede ser complicada:
- Pocas clases agruparán demasiado las observaciones.
- Con demasiadas clases habrá pocas observaciones en cada una de ellas aumentando la variabilidad del gráfico obtenido.
Hay varias reglas para determinar el número de barras. En R, el método de Sturges se usa por defecto. Si quieres cambiar el número de barras, pasa al argumento breaks el número de clases que quieras.
par(mfrow = c(1, 3))
hist(distancia, breaks = 2, main = "Pocas clases", ylab = "Frecuencia")
hist(distancia, breaks = 50, main = "Demasiadas clases", ylab = "Frecuencia")
hist(distancia, main = "Método de Sturges", ylab = "Frecuencia")
par(mfrow = c(1, 1))
También puedes usar el método plug-in (Wand, 1995) implementado en la librería KernSmooth para seleccionar el ancho de las barras del histograma:
# Método plug-in
# install.packages("KernSmooth")
library(KernSmooth)
ancho_barras <- dpih(distancia)
nbarras <- seq(min(distancia) - ancho_barras,
max(distancia) + ancho_barras, by = ancho_barras)
hist(distancia, breaks = nbarras, main = "Plug-in", ylab = "Frecuencia")
Histograma en R con dos variables
Establecer el argumento add como TRUE permite añadir un histograma sobre otro gráfico. Como ejemplo, puedes crear un histograma en R por grupo con el código del siguiente bloque:
set.seed(1)
x <- rnorm(1000) # Primer grupo
y <- rnorm(1000, 1) # Segundo grupo
hist(x, main = "Dos variables", ylab = "Frecuencia")
hist(y, add = TRUE, col = rgb(1, 0, 0, alpha = 0.5))
La función rgb permite establecer colores en canal RGB. El argumento alpha determina la transparencia. De hecho, cuando se combinan gráficos es una buena idea añadir colores con transparencia para no ocultar las representaciones entre si.
Histograma con curva normal
Para dibujar una curva normal sobre un histograma, puedes usar las funciones dnorm y lines de la siguiente manera:
hist(distancia, prob = TRUE,
main = "Histograma con curva normal", ylab = "Densidad")
x <- seq(min(distancia), max(distancia), length = 40)
f <- dnorm(x, mean = mean(distancia), sd = sd(distancia))
lines(x, f, col = "red", lwd = 2)
Añadir curva de densidad a un histograma en R
Para agregar una curva de densidad sobre un histograma, puedes usar la función lines para trazar la curva y la función density para calcular una estimación no paramétrica (tipo núcleo) de la distribución.
hist(distancia, freq = FALSE, main = "Curva densidad", ylab = "Densidad")
lines(density(distancia), lwd = 2, col = 'red')
La selección de ventana para ajustar las densidades no paramétricas es un área de intensa investigación. Además, ten en cuenta que por defecto, la función density usa un núcleo gaussiano. Para obtener más información, ejecuta ?density.
Vamos a unir los códigos anteriores dentro de una función para crear automáticamente un histograma con curvas normales y de densidad.
histDenNorm <- function (x, ...) {
hist(x, ...) # Histograma
lines(density(x), col = "blue", lwd = 2) # Densidad
x2 <- seq(min(x), max(x), length = 40)
f <- dnorm(x2, mean(x), sd(x))
lines(x2, f, col = "red", lwd = 2) # Normal
legend("topright", c("Histograma", "Densidad", "Normal"), box.lty = 0,
lty = 1, col = c("black", "blue", "red"), lwd = c(1, 2, 2))
}
Ahora puedes verificar el comportamiento de la función anterior con datos de muestra.
set.seed(1)
# Datos normales
x <- rnorm(n = 5000, mean = 110, sd = 5)
# Datos exponenciales
y <- rexp(n = 3000, rate = 1)
par(mfcol = c(1, 2))
histDenNorm(x, prob = TRUE, main = "Histograma de X")
histDenNorm(y, prob = TRUE, main = "Histograma de Y")
par(mfcol = c(1, 1))
Histograma y boxplot en R
Se puede agregar un diagrama de caja sobre un histograma escribiendo par(new = TRUE) entre los códigos de los dos gráficos.
hist(distancia, probability = TRUE, ylab = "", main = "",
col = rgb(1, 0, 0, alpha = 0.5), axes = FALSE)
axis(1) # Añade el eje horizontal
par(new = TRUE)
boxplot(distancia, horizontal = TRUE, axes = FALSE,
lwd = 2, col = rgb(0, 0, 0, alpha = 0.2))
También puedes agregar la curva normal o de densidad a la gráfica anterior.
Histograma en R con ggplot2
Para crear un histograma con el paquete ggplot2, debes usar las funciones ggplot junto con geom_histogram y pasar los datos como data frame. En el argumento aes debes especificar el nombre de la variable del data frame.
# install.packages("ggplot2")
library(ggplot2)
ggplot(data.frame(distancia), aes(x = distancia)) +
geom_histogram(color = "gray", fill = "white")
Este gráfico devolverá un mensaje advirtiéndote de que el histograma se calculó utilizando 30 clases. Esto se debe a que, de manera predeterminada, ggplot no utiliza el método de Sturges.
Ahora vamos a calcular el número de barras con el método Sturges como lo hace la función hist y establecerlo con el argumento breaks. Ten en cuenta que también puedes establecer el argumento binwidth si lo prefieres.
# Calculando el número de barras como la función hist()
nbreaks <- pretty(range(distancia), n = nclass.Sturges(distancia),
min.n = 1)
ggplot(data.frame(distancia), aes(x = distancia)) +
geom_histogram(breaks = nbreaks, color = "gray", fill = "white")
Como puedes ver, el siguiente gráfico es igual al primer histograma.
En ggplot2 también puedes agregar la curva de densidad con la función geom_density. Además, si quieres rellenar el área debajo de la curva, puedes indicar en el argumento fill el color que prefieras y en el argumento alpha el grado de transparencia del color. Ten en cuenta que necesitas establecer un nuevo aes dentro del geom_histogram de la siguiente manera:
ggplot(data.frame(distancia), aes(x = distancia)) +
geom_histogram(aes(y = ..density..), breaks = nbreaks,
color = "gray", fill = "white") +
geom_density(fill = "black", alpha = 0.2)
Histograma en Plotly
Una alternativa para crear histogramas es usar el paquete plotly (una adaptación de la librería de JavaScript para R), que crea gráficos en formato interactivo. Para nuestro ejemplo podríamos ejecutar lo siguiente:
install.packages("plotly")
library(plotly)
# Histograma de frecuencias
fig <- plot_ly(x = distancia, type = "histogram")
fig
# Histograma de densidad
fig <- plot_ly(x = distancia, type = "histogram", histnorm = "probability")
fig