Consiste en un gráfico que permite observar algunas propiedades de una variable, como su centralidad (media, moda), su dispersión y su grado de simetría, así como definir valores atípicos. Aunque puede utilizarse sólo representando variables cuantitativas, su uso habitual combina variables cuantitativas y cualitativas.
Consiste en un rectángulo, alineado horizontal o verticalmente, en el que aparecen los tres cuartiles (1º, 2º y 3º), al igual que los valores mínimo y máximo de los datos, a partir de los cuales también se pueden definir el intervalo intercuartílico (ancho de la caja) así como los valores atípicos. Un valor atípico se define como aquel en el que un valor es mayor que Q3 + 1,5 IQR o menor que < Q1 - 1.5 * IQR, siendo Q1 primer cuartil, Q3 tercer cuartil.
Para esta activadad también se utilizará el dataframe
alumnos_UC.RData.
par(mfrow=c(1,2)) # Fraccionamos la ventana grafica en 2x2.
boxplot(alumnos_uc$peso,
main = "Vertical")
boxplot(alumnos_uc$peso,
main = "Horizontal",
horizontal = TRUE) # Disposición horizontal
par(mfrow=c(1,1)) # Vuelta al gráfico inicial
Suele ser conveniente añadir una línea con el valor medio de la
variable. Para ello, primero se imprime el gráfico y luego se
representan una línea (función segments()) y, en ocasiones,
un punto (función points()).
boxplot(alumnos_uc$peso)
segments(x0 = 0.8,
y0 = mean(alumnos_uc$peso), # Los puntos de inicio y de final de la línea se especifican con los argumentos x0, x1, y0 e y1
x1 = 1.2,
y1 = mean(alumnos_uc$peso),
col = "red",
lwd = 2,)
points(mean(alumnos_uc$peso), # Adición de un punto con la media
col = 3, # Color verde
pch = 19) # Tipo de símbolo
Creando un objeto a partir de la función boxplot(), se
puede acceder a una lista con los diferentes componentes que proporciona
la función. Para ello, primero se crea el diagrama de caja y bigotes y
luego se almacena como objeto. Con el argumento statsse
obtienen:
Límite inferior casos atípicos.
Cuartil inferior.
Mediana (2º cuartil).
Cuartil superior
Límite superior de casos atípicos.
objeto <- boxplot(alumnos_uc$peso)
objeto$stats # Estadísticos
## [,1]
## [1,] 59.02050
## [2,] 71.61213
## [3,] 81.45998
## [4,] 89.25927
## [5,] 95.95121
objeto$n # Número de observaciones de cada grupo.
## [1] 100
objeto$conf # Extremos inferior y superior del intervalo de confianza de la mediana.
## [,1]
## [1,] 78.67173
## [2,] 84.24823
objeto$out # Valores atípicos.
## numeric(0)
Una limitación de los gráficos de caja y bigotes es que no están diseñados para detectar variables con más de una moda (multimodalidad). Por ello, en ocasiones es recomendable combinar un diagrama de caja con un histograma o una curva de densidad.
# Histograma
hist(alumnos_uc$peso,
probability = TRUE,
ylab = "", # Sin etiquetas en el eje y
col = "grey", # Color de las barras del histograma
axes = FALSE, # Sin ejes
main = "") # Sin título
axis(1) # AÁ±adimos eje X
# Curva
lines(density(alumnos_uc$peso), col = "red", lwd = 2)
# Diagrama de caja y bigotes
par(new = TRUE)
boxplot(alumnos_uc$peso, horizontal = TRUE, axes = FALSE,
lwd = 2, col = rgb(0, 1, 1, alpha = 0.15))
Este tipo de gráfico permite analizar y comparar las características de una misma variable según dos o más grupos (factores).
boxplot(alumnos_uc$peso ~ alumnos_uc$genero)
abline(h = mean(alumnos_uc$peso),
col = 2,
lwd = 2) # Añade el valor medio
La sintaxis anterior es equivalente a ésta:
boxplot(peso ~ genero,
data = alumnos_uc,
notch = TRUE) # Intervalos de confianza al 95% para la mediana. Si no se superponen las medianas son diferentes estadísticamente.
Por defecto, los diagramas de caja se dibujan con el orden con el que
aparecen los factores en los datos originales. En ocasiones, puede ser
conveniente modificar dicho orden aplicando la función
reorder() tomando como referencia la posición de cada grupo
respecto a un estadístico como la mediana o la media de los datos.
mediana <- with(alumnos_uc, reorder(procedencia, peso, median))
boxplot(alumnos_uc$peso ~ mediana,
las = 2)
abline(h = mean(alumnos_uc$peso),
col = 2,
lwd = 2)
mediana <- with(alumnos_uc, reorder(procedencia, -peso, median))
boxplot(alumnos_uc$peso ~ mediana,
las = 2)
abline(h = mean(alumnos_uc$peso),
col = 2,
lwd = 2)
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE CAJA Y BIGOTES::
Representa con un diagrama de caja y bigotes la variabilidad de la
variable Temp según los meses del año. Rellena el gráfico
con las etiquetas correspondientes. Añade una línea con el valor medio
de la variable Temp.
boxplot(airquality$Temp ~ airquality$Month)
abline(h = mean(airquality$Temp),
col = 2,
lwd = 2) # Añade el valor medio
Son una alternativa a los diagramas de caja que resuelven algunos de los problemas relacionados con la visualización de la distribución de los datos. Por ejemplo, a diferencia del diagrama de caja, que fundamentalmente muestra estadísticos básicos, los gráficos de violín también muestran la curva de densidad de cada variable.
El punto blanco representa la mediana.
La caja representa el rango intercuartílico.
Los límites del violín representan el resto de la distribución. Estos límites constituyen una estimación de una densidad (kernel) para mostrar la forma de la distribución de los datos. La sección ancha representa que esos valores tendran una alta probabilidad, mientras que la zona estrecha una baja probabilidad.
Para dibujar este tipo de gráfico se necesita cargar el paquete vioplot y su función homónima.
# install.packages("vioplot")
library(vioplot)
Función básica del paquete:
vioplot(alumnos_uc$peso,
horizontal = FALSE, # Horizontal = TRUE lo dibuja en posición horizontal
col = 2, # Color del área
rectCol = "red", # Color del rectángulo
lineCol = "white", # Color de la línea
colMed = "green", # Color del símmbolo pch
border = "black", # Color del borde del violín
pchMed = 16, # Símbolo pch para la mediana
plotCentre = "points") # Si "line", dibuja una línea en la mediana
Es posible dibujar un violin plot sin tener en
cuenta los datos atípicos. Para ese propósito, se puede asignar a una
variable la salida de la función boxplot() y luego devolver
los valores del vector original que no son valores atípicos.
box <- boxplot(alumnos_uc$peso)
z <- alumnos_uc$peso[!(alumnos_uc$peso %in% box$out)] # Nos quedamos con los datos no atípicos
vioplot(z)
Por último, ten en cuenta que puedes dibujar un violin plot sobre un histograma. Considera, por ejemplo, que la distribución subyacente de tus datos presenta multimodalidad. En este caso, un diagrama de caja y bigotes no representa esta condición, mientras que un gráfico de violín sí lo hará.
set.seed(1)
# Creación de un conjunto de datos multimodal.
n <- 10000
ii <- rbinom(n, 1, 0.5)
datos <- rnorm(n, mean = 130, sd = 10) * ii +
rnorm(n, mean = 80, sd = 5) * (1 - ii)
# Histograma
hist(datos, probability = TRUE, col = "grey", axes = FALSE,
main = "", xlab = "", ylab = "")
# Eje X
axis(1)
# Densidad
lines(density(datos), lwd = 2, col = "red")
# Violin plot
par(new = TRUE)
vioplot(datos, horizontal = TRUE, yaxt = "n", axes = FALSE,
col = rgb(0, 1, 1, alpha = 0.15))
También se puede realizar un gráfico de violín con datos de dos grupos en lados diferentes
hombres <- alumnos_uc[alumnos_uc$genero == "Masculino", ]
mujeres <- alumnos_uc[alumnos_uc$genero == "Femenino", ]
vioplot(hombres$peso,
plotCentre = "line", # Mediana con una línea
side = "right", # Lado derecho
col = "#5773CC",
xlab = "Peso según sexo",
ylim = c(50, 110)) # Color del lado derecho
vioplot(mujeres$peso,
plotCentre = "line", # Mediana con una línea
side = "left", # Lado izquierdo
col = "#FFB900", # Color del lado izquierdo
add = TRUE) # Sobre el gráfico anterior
legend("topleft",
legend = c("Hombres", "Mujeres"),
fill = c("#5773CC", "#FFB900"))
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: DIAGRAMA DE VIOLÍN:
Ozone del dataframe
airquality:vioplot(airquality$Ozone,
horizontal = FALSE, # Horizontal = TRUE lo dibuja en posición horizontal
col = 2, # Color del área
rectCol = "red", # Color del rectángulo
lineCol = "white", # Color de la línea
colMed = "green", # Color del símmbolo pch
border = "black", # Color del borde del violín
pchMed = 16, # Símbolo pch para la mediana
plotCentre = "points") # Si "line", dibuja una línea en la mediana
airquality los valores de la
variable Ozone correspondientes a los meses de mayo y
agosto. A continuación, elabora un gráfico o diagrama de violín con
estos datos. Cambia las etiquetas y los colores con respecto al modelo
comentado en clase. Coméntalo posteriormente.mayo <- airquality[airquality$Month == 5, ]
agosto <- airquality[airquality$Month == 8, ]
vioplot(mayo$Ozone,
plotCentre = "line", # Mediana con una línea
side = "right", # Lado derecho
col = "#5773CC",
xlab = "Concentración de ozono",
ylim = c(0, 200)) # Color del lado derecho
vioplot(agosto$Ozone,
plotCentre = "line", # Mediana con una línea
side = "left", # Lado izquierdo
col = "#FFB900", # Color del lado izquierdo
add = TRUE) # Sobre el gráfico anterior
legend("topleft",
legend = c("Mayo", "Agosto"),
fill = c("#5773CC", "#FFB900"))
Debido a que los diagramas de caja suelen dificultar la observación
de la distribución subyacente de los datos, este problema se puede
resolver agregando puntos representando a los datos con la función
stripchart().
boxplot(peso ~ procedencia, # Variables a representar
data = alumnos_uc, # Dataframe de origen
col = "white") # Color del fondo de las cajas
stripchart(peso ~ procedencia,
data = alumnos_uc,
vertical = TRUE, # Diagrama vertical
method = "jitter", # Evita dibujar sobre los datos atÁpicos. Distribuye aleatoriamente los puntos
pch = 19, # Tipo de símmbolo
add = TRUE, # Superpone el stripchart al diagrama de caja y bigotes
col = "red") # Color del símbbolo
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: GRÁFICO STRIPCHART:
Representa con un gráfico stripschar la variabilidad
mensual de la variable Ozone en el dataframe
airquality. Cambia el color de los puntos a azul oscuro y
el tipo de símbolo (puedes consultar las posibilidades en https://r-coder.com/plot-en-r/)
boxplot(Ozone ~ Month, # Variables a representar
data = airquality, # Dataframe de origen
col = "white") # Color del fondo de las cajas
stripchart(Ozone ~ Month, # Variables a representar
data = airquality,
vertical = TRUE, # Diagrama vertical
method = "jitter", # Evita dibujar sobre los datos atÁpicos. Distribuye aleatoriamente los puntos
pch = 19, # Tipo de símmbolo
add = TRUE, # Superpone el stripchart al diagrama de caja y bigotes
col = "red") # Color del símbbolo
Los diagramas de enjambre (“bee swarm”) son similares a los strip charts. Su objetivo es mostrar la distribución subyacente de los datos, pero los datos se agrupan de tal manera que se evita que se solapen.
# install.packages("beeswarm")
library(beeswarm)
beeswarm(alumnos_uc$peso,
col = 2, # Color
pch = 18, # Símbolo
cex = 1.5, # Tamaño
method = "swarm")
Hay varios métodos disponibles para ordenar los puntos de datos. Cada método usa un algoritmo diferente que asegura que los puntos de datos no se solapan. El método “swarm” (por defecto) coloca los puntos en orden creciente. Otros métodos son:
“center”: crea un panal simétrico usando una rejilla cuadrada.
“hex”: usa un grid hexagonal para colocar los puntos.
“square”: coloca los puntos en un grid cuadrado.
beeswarm( alumnos_uc$peso ~ alumnos_uc$procedencia,
col = 4, # Color
pch = 18, # SÁmbolo
cex = 1.5, # TamaÁ±o
vertical = FALSE) # Disposición vertical
Cuando las observaciones se extienden por todo el gráfico, se pueden
ajustar usando como argumento corral().
beeswarm(alumnos_uc$peso ~ alumnos_uc$procedencia,
pch = 18,
cex = 1.5,
col = c("#800080", "#3FA0FF", "#FFE099", "#F76D5E"),
corral = "wrap") # Otros métodos: "wrap", "random", "omit"
Es posible mostrar solo uno de los lados de un beeswarm.
beeswarm(alumnos_uc$peso ~ alumnos_uc$procedencia,
pch = 19,
col = c("#800080","#3FA0FF", "#FFE099", "#F76D5E"),
side = 1) # Si lado izquierdo = -1
Se puede modificar el orden de la varible categórica (eje X). El método por defecto es “ascending”.
beeswarm(alumnos_uc$peso ~ alumnos_uc$procedencia,
pch = 19,
col = c("#800080","#3FA0FF", "#FFE099", "#F76D5E"),
priority = "descending") # Otros valores: "random", "density", "non"
R soporta varios formatos populares, tales como jpg, png, tiff, palumnos_uc. En todos los casos, el procedimiento para exportar consiste en tres pasos:
jpeg("mi_plot.jpeg", # PASO 1: abrimos dispositivo (ejemplo JPEG)
quality = 75)
plot(rnorm(20)) # PASO 2: creamos el gráfico
dev.off() # PASO 3: cerramos el dispositivo
Como alternativa, es posible:
savePlot(filename = "Rplot", # Nombre del archivo a ser guadado
type = c("wmf", "emf", "png", # Tipo de archivo
"jpg", "jpeg", "bmp",
"tif", "tiff", "ps",
"eps", "palumnos_uc"),
device = dev.cur(), # Número de dispositivo gráfico a ser exportado
restoreConsole = TRUE)
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA GRAFICOS ESTADÍSTICOS
Una vez concluida la explicación teórica, el alumnado procederá a elaborar los siguientes ejercicios:
Ejercicio de elaboración de gráficos a partir de la información proporcionada por el fichero barrios.
Ejercicio de elaboración de gráficos a partir de la información proporcionada por el fichero valle_cantabrico.
Ejercicio de elaboración de gráficos a partir de la información proporcionada por los ficheros creados a partir de los países elegidos.