El mínimo y el máximo en un conjunto de datos identifican los extremos de la distribución: los valores más pequeños y más grandes, respectivamente. La mediana divide los datos en dos mitades iguales. Si dividimos cada una de esas mitades nuevamente, obtenemos dos estadísticas adicionales conocidas como el primer (Q1) y tercer (Q3) cuartiles. Juntos, estos cinco números proporcionan un buen resumen de las características importantes de la distribución y se conocen como el resumen de cinco puntos.
Para calcular estos cinco números en R se dispone de dos alternativas: una de ellas es usar la función summary() y la otra es usar la función fivenum(). La primera en realidad devuelve 6 números ya que incluye el valor de la media. Considere la siguiente serie de datos:
datos <- c(179, 160, 136, 227, 217, 168, 108, 124, 143, 140, 309, 229, 181, 141, 260, 203, 148, 169, 213, 257, 244, 271, 243, 230, 248, 327, 329, 250, 193, 271, 316, 267, 199, 171, 158, 248, 423, 340, 392, 339, 341, 226, 320, 295, 334, 322, 297, 318, 325, 257, 303, 315, 380, 153, 263, 242, 206, 344, 258, 368, 390, 379, 260, 404, 318, 352, 359, 216, 222, 283, 332)
Para calcular el resumen de cinco puntos utilizamos el siguiente código:
summary(datos)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 108.0 204.5 258.0 261.3 323.5 423.0
O podemos utilizar la función fivenum()
fivenum(datos)
## [1] 108.0 204.5 258.0 323.5 423.0
Esta última alternativa sólo devuelve los 5 datos sin ningún rótulo que los distinga, pero se asume que el orden es: min, Q1, Q2, Q3 y max. En algunas ocasiones podrían haber diferencias en los valores calculados por ambas funciones, pero estas son pequeñas.
Una gráfica de caja es una representación gráfica del resumen de cinco números para una sola variable cuantitativa. El diagrama muestra la forma general de la distribución, identifica el 50% central de los datos y resalta los valores atípicos si existen. La relación se muestra en la siguiente figura:
Como se puede apreciar, el gráfico inicia con la menor de las observaciones, luego se forma una caja que comienza en el primer cuartil y termina en el tercero. Por lo tanto, la caja representa el 50% central de los datos, con una línea dentro que representa la mediana. El diagrama termina con la mayor de las observaciones. Los valores atípicos (outliers) en caso de existir, se representarán con pequeños círculos.
La función en R para construir un diagrama de caja es boxplot(x, …) donde x es la serie de datos que se quiere representar con el diagrama.
Por ejemplo, para la variable datos definida previamente el boxplot se genera con el siguiente código.
boxplot(datos)
Copia y ejecuta el código en RStudioCloud para generar el gráfico.
El boxplot es una herramienta muy versatil para visualizar la forma de la distribución de una o de varias series de datos.
1. Caso de una distribución aproximadamente simétrica. Cuando la distribución es aproximadamente simétrica, el largo de los dos segmentos que salen de la caja serán aproximadamente iguales. Copia y ejecuta varias veces el siguiente código para lograr un «registro visual» de lo que significa aproximadamente simétrico. Modifica además el valor de n a 5, 10, 50 y 100.
n <- 500
DatSimetricos <- rnorm(n,5,5)
boxplot(DatSimetricos,horizontal = TRUE, col = rgb(0, 1, 1, alpha = 0.15))
A partir de las simulaciones podemos establecer que:
n <- 500
SesDer <- rbeta(n,2,5)
boxplot(SesDer, horizontal = TRUE, col = "steelblue", main = "Distribución sesgada a la derecha")
n <- 500
SesIzq <- rbeta(n,5,2)
boxplot(SesIzq, horizontal = TRUE, col = "steelblue", main = "Distribución sesgada a la izquierda")
Copie las siguientes porciones de código y ejecútelas varias veces para observar la relación entre el boxplot y el histograma.
1. Caso de una distribución aproximadamente simétrica
par(mfrow=c(2,1))
n <- 500
DatSimetricos <- rnorm(n,4,4)
boxplot(DatSimetricos, horizontal = TRUE, col = "steelblue", main = "Boxplot e Histograma para una serie de datos \n aproximadamente simétrica")
hist(DatSimetricos, col = "steelblue", border = "white", main = "")
par(mfrow=c(2,1))
n <- 500
SesDer <- rbeta(n,1,5)
boxplot(SesDer, horizontal = TRUE, col = "steelblue", main = "Boxplot e Histograma para una serie de datos sesgada a la derecha")
hist(SesDer, col = "steelblue", border = "white", main = "")
par(mfrow=c(2,1))
n <- 500
SesIzq <- rbeta(n,5,1)
boxplot(SesIzq, horizontal = TRUE, col = "steelblue", main = "Boxplot e Histograma para una serie de datos sesgada a la izquierda")
hist(SesIzq, col = "steelblue", border = "white", main = "")
Modifica en ambos casos el tamaño de n para ver el efecto que produce.
R incorpora por defecto algunas bases de datos que podemos analizar. En esta parte utilizaremos la base de datos chickwts. Para acceder a ella y visualizar los datos copia el siguiente código y ejecútalo en RStudioCloud.
head(chickwts) #visualiza los primeros 6 registros
## weight feed
## 1 179 horsebean
## 2 160 horsebean
## 3 136 horsebean
## 4 227 horsebean
## 5 217 horsebean
## 6 168 horsebean
tail(chickwts) #visualiza los últimos 6 registros
## weight feed
## 66 352 casein
## 67 359 casein
## 68 216 casein
## 69 222 casein
## 70 283 casein
## 71 332 casein
Esto permite visualizar los primeros y los últimos seis registros para que podamos ver la estructura de la base de datos. En este caso los datos representan el peso (weight) de pollos sometidos a diferentes dietas (feed).
Si se necesita más detalle de la base de datos se puede usar la función str() que devuelve el tipo de variable de cada columna.
str(chickwts)
## 'data.frame': 71 obs. of 2 variables:
## $ weight: num 179 160 136 227 217 168 108 124 143 140 ...
## $ feed : Factor w/ 6 levels "casein","horsebean",..: 2 2 2 2 2 2 2 2 2 2 ...
En esta caso la función nos indica que la serie de datos es un data frame (una estructura similar a una hoja de datos) que tiene 71 observaciones y dos variables: weight (del tipo numérica) y feed (del tipo factor) que tiene 6 niveles: casein, horsebean y otros 4 que no lista. En el caso de que se desee saber cuáles son los niveles de la variable feed se puede usar la función levels() de la siguiente manera:
levels(chickwts$feed)
## [1] "casein" "horsebean" "linseed" "meatmeal" "soybean" "sunflower"
En el código anterior el símbolo de dolar entre chickwts y feed sirve para hacer referencia a la columna correspondiente a la variable feed del data frame chickwts (la segunda colunma en la siguiente figura). Si se desea trabajar con la columna weight escribimos chickwts$weight
Ahora que nos hemos familiarizado con la estructura de los datos, podemos proceder a hacer algunos análisis. La primera pregunta que podría surgir es ¿cómo se distribuyen los pesos de los pollos? Para responderla, podemos construir un diagrama de caja para la variable weight
boxplot(chickwts$weight, col = "steelblue", main = "Distribución del peso de pollos")
De la figura, podemos concluir que:
* La distribución de los datos es aproximadamente simétrica
* La distribución no presenta valores atípicos,
Ademas, podemos calcular el resumen de 5 puntos y la desviación estándar:
summary(chickwts$weight)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 108.0 204.5 258.0 261.3 323.5 423.0
sd(chickwts$weight)
## [1] 78.0737
Con esta información adicional podemos decir que la distribución está centrada en un valor cercano a 258 (si usamos la mediana como medida de tendencia central) o que esta centrada en 261.3 (si usamos la media como medida de tendencia central). Un valor respresentativo de la variabilidad de esta serie de datos es 78.07.
Tanbién es importante realizar un análisis por grupo, es decir cómo se comportan los pesos según el tipo de comida. Esto se logra con cualquiera de los siguientes códigos.
boxplot(chickwts$weight ~ chickwts$feed, col = "steelblue") # una forma de hacerlo
boxplot(weight ~ feed, data = chickwts, col = "lightgray") # otra forma de generar el mismo gráfico
En ambos casos el operador “~” (virgulilla) le indica a R que debe elaborar un boxplot para cada uno de los niveles de la variable feed.
Nota: puede resultar útil el siguiente código que ordena los diagramas en orden creciente o decreciente de sus medianas:
## Un forma de reordenar
## Ascendente
medianas <- reorder(chickwts$feed, chickwts$weight, median)
boxplot(chickwts$weight ~ medianas, las = 2, xlab = "", ylab = "")
## Descendente
medianas <- reorder(chickwts$feed, -chickwts$weight, median)
boxplot(chickwts$weight ~ medianas, las = 2, xlab = "", ylab = "")