En esta sesión veremos la exploración de variables cuantitativas utilizando medidas de resumen y gráficos de caja.
Comenzamos creando un nuevo script en R y lo guardamos como medidas_boxplot. En este script iremos añadiendo los códigos que describimos más adelante.
Utilizaremos el conjunto de datos de abalones disponible gratuitamente online. La documentación se encuentra en el siguiente enlace: https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.names
# Datos Abulones
enlace <- "https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data"
datos <- read.table(enlace, sep=",")
names(datos) <- c("sex","length","Diameter","Height","WholeWeight",
"ShuckedWeight","VisceraWeight","ShellWeight","Rings")
Luego, realizamos una transformación en las columnas para obtener las variables en milimetros y en gramos.
datos$length <- datos$length*200
datos$Diameter <- datos$Diameter*200
datos$Height <- datos$Height*200
datos$WholeWeight <- datos$WholeWeight*200
datos$ShuckedWeight <- datos$ShuckedWeight*200
datos$VisceraWeight <- datos$VisceraWeight*200
datos$ShellWeight <- datos$ShellWeight*200
Vemos los primeros 6 registros:
head(datos) # primeros 6
## sex length Diameter Height WholeWeight ShuckedWeight VisceraWeight
## 1 M 91 73 19 102.8 44.9 20.2
## 2 M 70 53 18 45.1 19.9 9.7
## 3 F 106 84 27 135.4 51.3 28.3
## 4 M 88 73 25 103.2 43.1 22.8
## 5 I 66 51 16 41.0 17.9 7.9
## 6 I 85 60 19 70.3 28.2 15.5
## ShellWeight Rings
## 1 30 15
## 2 14 7
## 3 42 9
## 4 31 10
## 5 11 7
## 6 24 8
Realizamos una exploración del tipo de columnas que tiene este dataset.
str(datos)
## 'data.frame': 4177 obs. of 9 variables:
## $ sex : chr "M" "M" "F" "M" ...
## $ length : num 91 70 106 88 66 85 106 109 95 110 ...
## $ Diameter : num 73 53 84 73 51 60 83 85 74 88 ...
## $ Height : num 19 18 27 25 16 19 30 25 25 30 ...
## $ WholeWeight : num 102.8 45.1 135.4 103.2 41 ...
## $ ShuckedWeight: num 44.9 19.9 51.3 43.1 17.9 28.2 47.4 58.8 43.3 62.9 ...
## $ VisceraWeight: num 20.2 9.7 28.3 22.8 7.9 15.5 28.3 29.9 22.5 30.2 ...
## $ ShellWeight : num 30 14 42 31 11 24 66 52 33 64 ...
## $ Rings : int 15 7 9 10 7 8 20 16 9 19 ...
Observamos que en este dataframe todas las columnas son cuantitativas excepto sex
. La variable sex
es de tipo cualitativa y escala nominal.
Ahora, exploramos las medidas de tendencia central, de dispersión y de posición. Además, en aquellos casos pertinentes, crearemos también gráficos de cajas.
Primero, vemos que la primera variable (sex) es una variable cualitativa nominal. En este caso, no podemos calcular más indicadores que la frecuencia y la moda. Lo realizamos creando una tabla de frecuencias:
library(summarytools)
freq(datos$sex)
## Frequencies
## datos$sex
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## F 1307 31.29 31.29 31.29 31.29
## I 1342 32.13 63.42 32.13 63.42
## M 1528 36.58 100.00 36.58 100.00
## <NA> 0 0.00 100.00
## Total 4177 100.00 100.00 100.00 100.00
De esta tabla, observamos la frecuencia de cada una de las clases (F, M e I) y podemos determinar la moda: M con una proporción de 36.58%.
Analizamos la variable length ya que es de tipo cuantitativa y de escala de razón. Por ello, podemos calcular todos los indicadores: medidas de posición, tendencia central y dispersión.
Utilizamos el comando summary
para observar algunas medida de resumen:
summary(datos$length)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 15.0 90.0 109.0 104.8 123.0 163.0
Observemos que con este comando podemos obtener las medidas de tendencia central (media, mediana) y algunas medidas de posición (percentiles).
Para otras métricas, se debe utilizar comandos adicionales. Por ejemplo, para las medidas más comunes: media, varianza, desviación estandard, y coeficiente de variación, utilizaremos lo siguiente:
# Primero, asignamos la columna length a una variable llamada "x"
x <- datos$length
# Utilizamos los comandos correspondientes para obtener media, varianza y desv. estandard.
mean(x, na.rm = FALSE) # Media aritmetica
## [1] 104.7984
var(x) # Varianza de una muestra
## [1] 576.8923
sd(x) # Desviación standard de una muestra
## [1] 24.01858
CV = sd(x)/mean(x) # Coeficiente de variación
CV # 22.91%
## [1] 0.2291884
Otros indicadores que se pueden obtener, son los siguientes:
median(x) # Mediana
## [1] 109
quantile(x, probs=c(0.5)) # Cuantil; probs: vector de probabilidades
## 50%
## 109
min(x) # Valor mínimo de X
## [1] 15
max(x) # Valor máximo de X
## [1] 163
range(x) # Rango: Min y Max
## [1] 15 163
Las variable cuantitativas ordinales, intervalo o de razon, pueden ser analizadas usando gráficos de caja.
Utilizaremos el siguiente comando simple para obtener un gráfico de cajas básico de la variable length:
boxplot(datos$length)
Con algunas líneas de código adicionales podemos personalizarlo:
boxplot(datos$length,
main="Boxplot para el largo de los abulones"
)
boxplot(datos$length,
main="Boxplot para el largo de los abulones",
horizontal=TRUE,
notch = TRUE
)
Algunos ejemplos de boxplots para otras variables se ven a continuación:
boxplot(datos$Height,
horizontal=TRUE,
notch = TRUE
)
boxplot(datos$Rings,
horizontal=TRUE,
notch = TRUE
)
# Gráfico de cajas de color celeste.
boxplot(datos$length,
main="Boxplot para el largo de los abulones",
col="skyblue"
)
# Punto que representa el promedio de los datos.
points(mean(datos$length),
col="red")
Utilizamos gráficos de cajas para comparar la distribución de una variable entre diferentes grupos.
# Gráfico de cajas de color celeste.
boxplot(length~sex,datos,
main="Boxplot para el largo de los abulones"
)
boxplot(Rings~sex,datos,
main="Boxplot para el peso total de los abulones"
)
# Gráfico de cajas de color celeste.
boxplot(length~sex,datos,
main="Boxplot para el largo de los abulones por sexo",
col=(c("green","pink","orange"))
)