Torre de Babel

Cómo analizar la distribución de los datos con R

by Francisco Charte.

En ocasiones trabajaremos con una o más series de datos y lo que nos interesará no será hacer comparaciones o analizar la evolución, sino estudiar cómo se distribuyen esas muestras y comparar las distribuciones. Con este fin recurriremos habitualmente a dos tipos de representaciones: los diagramas de cajas y bigotes y los histogramas.

Diagrama de cajas y bigotes (boxplot)

Sirven para obtener los estadísticos esenciales de la distribución de un conjunto de valores. Podemos generar este tipo representación con el comando boxplot() o bien con ggplot(), como otros tipos de gráficas.

boxplot(iris) # Distribución de cada una de las variables

boxplot(iris$Sepal.Length ~ iris$Species) # Distribución de una variable agrupada según los valores de otras

ggplot(iris, aes("", Sepal.Width)) + geom_boxplot()

ggplot(iris, aes(Species, Sepal.Width)) + geom_boxplot()

Podemos superponer a los diagramas de cajas y bigotes la posición que ocupe cada integrante de la muestra:

ggplot(iris, aes(Species, Sepal.Width)) + geom_boxplot() + geom_jitter()

Ajustes visuales de un diagrama de cajas y bigotes

  • Podemos personalizar la apariencia de algunos de los elementos de este tipo de gráfica con los siguientes parámetros:

    • color y fill: establecen el color de borde y relleno de las cajas
    • outlier.colour y outlier.size: establecen el color y tamaño de los casos extremos (outliers)
    • coord_flip(): al igual que con las gráficas de barras, podemos girar los ejes de coordenadas
    • notch: por defecto es FALSE. Asignándole TRUE se dibujará el intervalo de confianza de la mediana
ggplot(iris, aes(Species, Sepal.Width)) + 
  geom_boxplot(aes(fill=Species), color = "blue", outlier.colour = "red", notch = TRUE) +
  coord_flip()

Histogramas

Se utilizan para agrupar los valores de una muestra de datos en intervalos y representar la frecuencia de cada intervalo, facilitando así el análisis de la distribución subyacente.

hist(rnorm(1000))  # Histograma de una distribución normal

hist(diamonds$price) # Histograma del precio de los diamantes

ggplot(diamonds, aes(price)) + geom_histogram(color="black") # Alternativa con ggplot
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

El número de divisiones (bins) en que se agrupan los valores es configurable. Usaremos breaks en el caso del comando hist() y bins con ggplot. También podemos establecer títulos de los ejes y color de las barras:

hist(diamonds$price, breaks=40, 
     xlab="Precio", ylab = "Cantidad", main="Diamantes", col = "yellow")

ggplot(diamonds, aes(price)) + 
  geom_histogram(bins = 40, color="black", fill="yellow") +
  labs(title = "Diamantes", x = "Precio", y = "Cantidad")

Es posible ajustar el color de las barras de forma individual, por ejemplo usando una gama de colores concreta, estableciendo el color en función del valor representado o incluso estableciendo criterios a medida:

hist(diamonds$price, breaks=40, col=topo.colors(10), main="Diamantes", xlab="Precio")

ggplot(diamonds, aes(price)) + 
  geom_histogram(bins = 40, color="black", aes(fill=..count..)) + 
  scale_fill_gradient("Count", low = "blue", high = "red")

histograma <- hist(diamonds$price, breaks = 100)

plot(histograma, col = 
       ifelse(histograma$breaks < 2500, 'green', 
              ifelse(histograma$breaks > 10000,  "red", "blue")), 
     main = 'Diamantes', xlab = 'Precio')

Curva de densidad

Una representación alternativa de la distribución de un conjunto de valores es la curva de densidad. En esta no se dibujan barras, como en el caso del histograma, sino una línea continua que denota la densidad en cada punto de la escala X:

ggplot(diamonds, aes(price)) + geom_density() 

Podemos superponer la curva de densidad al histograma:

ggplot(diamonds, aes(price)) + geom_histogram(color="black", aes(y=..density..))  + geom_density(color="green", size=2, alpha=0.5)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Este tipo de gráfica permite representar simultáneamente la distribución de varias variables, por ejemplo agrupando los precios según el tipo de corte:

ggplot(diamonds, aes(price, fill=cut)) + 
  geom_density(alpha=0.25)