Parte 1: El resumen de cinco puntos

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.

Cálculo del 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.


Parte 2: Diagramas de caja: una representación gráfica del resumen de 5 puntos

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.

Construcción del diagrama de caja usando R

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.

Reto 1: Cambiando la apariencia del boxplot

  1. Cambiando la orienteación del diagrama. Por defecto el diagrama de caja será vertical, pero se puede cambiar la oriengación estableciendo el argumento horizontal a TRUE. Agrega este argumento a la función boxplot() y verifica que la orientación del diagrama cambia.
  2. Cambiando el color del diagrama. Por defecto el diagrama se dibuja sin ningún color de relleno lo cual resulta perfecto para el tipo de informes que se elaboran en ingeniería. Sin embargo, podemos cambiar el color de relleno del boxplot i) usando el argumento col = colordeseado. El color se puede i) escribir entre comillas (prueba usando el color “steelblue”), ii) usando el código RGB() (prueba usando col = rgb(252,231,231) ) o iii) puede usarse el código exadecimal (prueba usando col=“#3399FF”). Puede ser útil una tabla de colores que permita generar estos códigos automáticamente. Prueba establecer este argumento en las tres maneras indicadas hasta que te familiarices con la sintaxis. Se recomienda usar los códigos hexadecimales.
  3. Otros aspectos gráficos como el título principal, subtítulos, rótulos de los ejes etc. se fijan con los argumentos que se han trabajado en las prácticas anteriores.

Reto 2: Visualizando distribuciones de datos con un boxplot

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:

  • No existe la simetría perfecta (por eso preferimos decir «aproximadamente simétrica»)
  • Para n pequeño la simetría es más dificil de visualizar
  • A medida que n se vuelve más grande, la simetría se hace más evidente.
  • Es común que aparezcan outliers en ambos lados del diagrama, pero la existencia de estos valores solamente en uno de los lados (derecha o izquierda) por lo general indica que la distribución no es simétrica.
  1. Caso de una distribución sesgada. Cuando la distribución es sesgada, la longitud de uno de los segmentos que salen de la caja será mayor que la del otro indicando un sesgo a la derecha o izquierda. Ejecuta varias veces las siguientes porciones de código y cambia el valor de n para ver el efecto.
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")

Reto 3: Relacionando un boxplot y un histograma

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 = "")

  1. Caso de una distribución sesgada
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.


Parte 3: Explorando datos reales.

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.


Reto 4: Aplica los 7 pasos del EDA al gráfico que se ha generado.

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 = "")