En esta sesión veremos la exploración de variables cuantitativas utilizando tablas de frecuencias y gráficos para estas variables.

Contenido:

Comenzamos creando un nuevo script en R que llamaremos exploracion_cuanti en donde iremos añadiendo los códigos que describimos más adelante.

1. Lectura de datos.

Los datos que utilizaremos son datos sobre abulones negros del estrecho de Bass que separa Tasmania de Australia continental. Estos datos se publicaron originalmente como parte del siguiente estudio:

“WJ Nash, TL Sellers, SR Talbot, AJ Cawthorn and WB Ford (1994). The Population Biology of Abalone (Haliotis species) in Tasmania. I. Blacklip Abalone (H. rubra) from the North Coast and Islands of Bass Strait. Sea Fisheries Division, Technical Report No. 48 (ISSN 1034-3288)”

Para leer los datos desde un enlace en la web, utilizamos el siguiente enlace:

# Datos Abulones
datos <- read.table("https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data", sep=",")
names(datos) <- c("sex","length","Diameter","Height","WholeHeight","ShuckedWeight","VisceraWeight","ShellWeight","Rings")
## Mas informacion en: https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.names

Realizamos una transformación en las columnas para obtener las medidas en milimetros y en gramos.

datos$length <- datos$length*200
datos$Diameter <- datos$Diameter*200
datos$Height <- datos$Height*200
datos$WholeHeight <- datos$WholeHeight*200
datos$ShuckedWeight <- datos$ShuckedWeight*200
datos$VisceraWeight <- datos$VisceraWeight*200
datos$ShellWeight <- datos$ShellWeight*200

2. Exploración inicial

Para explorarl los datos, el comando head nos mostrará los primeros 6 registros:

head(datos) # primeros 6 
##   sex length Diameter Height WholeHeight 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

Tambien, realizamos una exploración de las 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 ...
##  $ WholeHeight  : 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 ...

En este dataframe, todas las columnas son numéricas excepto sex que es de tipo texto.

Instalamos utilizando:

install.packages("janitor")

Exploramos la unica variables cualitativa sex.

library(janitor)
tabyl(datos$sex, sort = TRUE)# Tabla de frecuencias para sex
##  datos$sex    n   percent
##          F 1307 0.3129040
##          I 1342 0.3212832
##          M 1528 0.3658128

Note que F: Femenino, M: masculino, y I: Bebé (infante)

Como ejercicio, interpretar los resultados. ¿Qué categoría es la más frecuente? ¿y la categoría menos frecuente, cuál es? ¿Cuál es la moda? ¿Podemos calcular la mediana?

3. Organización y visualización: Variables cuantitativas.

Ahora, comenzamos a explorar las variables cuantativas continuas.
Iniciamos explorando la variable length: el largo de los abulones.

3.1. Gráfico de bastones:

Se utiliza para gráficar la distribución de variables cuantitativas discretas con pocos valores únicos.
En nuestro caso, lo utilizaremos para la variable Rings como ejemplo. Ejecutar el siguiente código:

plot(table(datos$Rings)) # Realiza el gráfico de bastones

Como vemos, se muestras demasiados bastones. Esto no es conveniente ya que puede dificultar su lectura. Recomendamos utilizar, en el caso de variables cuantitativas discretas con muchos valores, un histograma.

A modo de ejemplo, utilizaremos el dataset ToothGrowth de la librería datasets en donde encontramos la variable cuantitativa discreta dose: niveles de dosis de vitamina C utilizada en experimentos para el crecimiento de odontoblastos, células responsables del crecimiento de los dientes de cuyes.

library(datasets) # La librería datasets contiene muchas bases de datos para explorar y analizar.
head(ToothGrowth) # Vemos las 6 primeras filas de los datos ToothGrowth.
##    len supp dose
## 1  4.2   VC  0.5
## 2 11.5   VC  0.5
## 3  7.3   VC  0.5
## 4  5.8   VC  0.5
## 5  6.4   VC  0.5
## 6 10.0   VC  0.5
# Finalmente, graficamos la variable dose (Dosis) utilizada en los experimentos.
plot(table(ToothGrowth$dose),
     main="Gráfico de bastones para la dosis",
     xlab="Dosis de vitamina C (mg/día)")


Observemos que las barras tienen la misma altura (20). Esto se debe a que estos son los datos de un experimento en donde se ha realizado 20 repeticiones con cada uno de los niveles de dosis: 0.5, 1 y 2 miligramos por día.

3.2. Histograma:

El histograma nos servirá para graficar la distribución de una variable cuantitativa continua o una variable cuantitativa discreta con muchos valores únicos.

Iniciamos, utilizando el histograma en la variable length con el siguiente código:

hist(datos$length)

Como se puede observar, este gráfico tiene los títulos en inglés. Podemos personalizarlo añadiendo unas líneas adicionales de código:

hist(datos$length,
     main="Histograma del largo de los abulones",
     xlab="Largo de los abulones (mm)",
     ylab="Proporción",
     probability = TRUE)

Tambien podemos añadir colores con un par de lineas adicionales:

hist(datos$length,
     main="Histograma del largo de los abulones",
     xlab="Largo de los abulones (mm)",
     ylab="Frecuencia",
     col="orange",
     border="blue")

3.3. Tablas de frecuencia

Las tablas de frecuencia se construirán tomando como base los cortes realizados en el histograma. A partir de estos cortes, se crea una nueva variable y se muestra con una tabla. Utilizaremos el paquete summarytools para obtener una visualización completa de la tabla de frecuencias.

Instalamos utilizando:

install.packages("summarytools")
library(summarytools)
histo <- hist(datos$length) # Crea el histograma

cortes <- histo$breaks # Obtiene los cortes para la variable a partir del histograma
variable_categorizada <- cut(datos$length,cortes) #Crea la variable categorizada
freq(variable_categorizada) # Muestra la tabla de frecuencias
## Frequencies  
## variable_categorizada  
## Type: Factor  
## 
##                   Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## --------------- ------ --------- -------------- --------- --------------
##         (10,20]      1     0.024          0.024     0.024          0.024
##         (20,30]      7     0.168          0.192     0.168          0.192
##         (30,40]     41     0.982          1.173     0.982          1.173
##         (40,50]     57     1.365          2.538     1.365          2.538
##         (50,60]    122     2.921          5.458     2.921          5.458
##         (60,70]    180     4.309          9.768     4.309          9.768
##         (70,80]    287     6.871         16.639     6.871         16.639
##         (80,90]    372     8.906         25.545     8.906         25.545
##        (90,100]    524    12.545         38.090    12.545         38.090
##       (100,110]    543    13.000         51.089    13.000         51.089
##       (110,120]    827    19.799         70.888    19.799         70.888
##       (120,130]    728    17.429         88.317    17.429         88.317
##       (130,140]    336     8.044         96.361     8.044         96.361
##       (140,150]    136     3.256         99.617     3.256         99.617
##       (150,160]     15     0.359         99.976     0.359         99.976
##       (160,170]      1     0.024        100.000     0.024        100.000
##            <NA>      0                              0.000        100.000
##           Total   4177   100.000        100.000   100.000        100.000

4. Ejercicio

Por ejemplo, para la variable Diameter utilizaremos el siguiente código.

library(summarytools)

# Primero, crea el histograma con el siguiente código:
histo <- hist(datos$Diameter,
              main="Histograma del diámetro",
              xlab="Diametro (mm) ")

# Luego, crear la tabla de frecuencia con las líneas siguientes:
cortes <- histo$breaks # Obtiene los cortes para la variable a partir del histograma
variable_categorizada <- cut(datos$Diameter, cortes) #Crea la variable categorizada
freq(variable_categorizada) # Muestra la tabla de frecuencias
## Frequencies  
## variable_categorizada  
## Type: Factor  
## 
##                   Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## --------------- ------ --------- -------------- --------- --------------
##         (10,20]      5      0.12           0.12      0.12           0.12
##         (20,30]     54      1.29           1.41      1.29           1.41
##         (30,40]     91      2.18           3.59      2.18           3.59
##         (40,50]    187      4.48           8.07      4.48           8.07
##         (50,60]    332      7.95          16.02      7.95          16.02
##         (60,70]    447     10.70          26.72     10.70          26.72
##         (70,80]    678     16.23          42.95     16.23          42.95
##         (80,90]    791     18.94          61.89     18.94          61.89
##        (90,100]    913     21.86          83.74     21.86          83.74
##       (100,110]    473     11.32          95.07     11.32          95.07
##       (110,120]    195      4.67          99.74      4.67          99.74
##       (120,130]     11      0.26         100.00      0.26         100.00
##            <NA>      0                               0.00         100.00
##           Total   4177    100.00         100.00    100.00         100.00

En su reporte escribir sus conclusiones:

  1. ¿Entre qué valores se encuentran los datos del diámetro?
  2. ¿En qué rango de diámetros encontramos mayor frecuencia?
  3. ¿En qué rangos encontramos frecuencias menores a 5%?

Ejemplo:

Se observa que el diámetro de los abulones estudiados se encuentra entre 10mm y 130mm. Además, los abulones más frecuentes tienen entre 90mm y 100mm de diámetro mientras que los abulones menos frecuentes son aquellos que tienen diámetros menores o iguales a 50mm y mayores a 110mm.

Materiales adicionales: