Tablas de frecuencia

La forma más simple de hacer estadística es contar. Una tabla de frecuencias es una manera fancy de decir tabla de conteo por categorías.

Veamos a ver cómo se construyen tablas de frecuencia en R utilizando paquetes del tidyverse. ¡Listos para utilizar esto en el trabajo!

Primero vamos a convertir el conjunto de datos iris en un tibble y vamos a limpiar los nombres con janitor::clean_names(). La idea es que los nombre de las variables que cumplan con la guía de estilos del tidyverse. Si copias y pegas código más adelante, no olvides correr esto primero.

library(dplyr)
library(janitor)

iris <- as_tibble(iris) %>% clean_names()

Tablas de frecuencia para variables cualitativas

Ahora sí, vamos a contruir la tabla de frecuencias para species.

iris %>% 
  group_by(species) %>% 
  summarise(frequency = n())
## # A tibble: 3 x 2
##   species    frequency
##   <fct>          <int>
## 1 setosa            50
## 2 versicolor        50
## 3 virginica         50

En R utilizamos la n() para contar filas por grupos. Puedes ver más detalle en el artículo acerca de Encadenar operaciones en dplyr

Según este resultado, las tres categorías de la variable species aparecen 50 veces cada una. Y ya está, ahí tienes una tabla de frecuencias.

Graficar una tabla de frecuencias

Lo más fácil para visualizar una tabla de frecuencias es utilizar un gráfico de barras. Hacer este gráfico con ggplot2 es muy fácil

library(ggplot2)

iris %>% 
  group_by(species) %>% 
  summarise(frequency = n()) %>% 
  ggplot() +
  geom_bar(aes(x = species, y = frequency), stat = 'identity')

Pregunta

Si sumas todas las frecuencias ¿Qué resultado deberías tener?

  • El tamaño de la muestra, n
  • La suma de todos los valores de x
  • No se puede saber


Mostrar respuesta

Pregunta

Si tenemos la siguiente tabla de frecuencias, cuál sería el valor de \(X\)

Categoria Frecuencia
Tipo 1 10
Tipo 2 20
Tipo 3 \(X\)
Tipo 4 15
\(n\) 55


Mostrar respuesta

Tablas de frecuencia para variables cuantitativas

Supón que ahora quieres una tabla de frecuencias para sepal_length. Si sigues el mismo procedimiento, vas a terminar con un resultado prácticamente inútil.

iris %>% 
  group_by(sepal_length) %>% 
  summarise(frequency = n())
## # A tibble: 35 x 2
##    sepal_length frequency
##           <dbl>     <int>
##  1          4.3         1
##  2          4.4         3
##  3          4.5         1
##  4          4.6         4
##  5          4.7         2
##  6          4.8         5
##  7          4.9         6
##  8          5          10
##  9          5.1         9
## 10          5.2         4
## # … with 25 more rows

Dos observaciones con respecto a este resultado:

  1. Hay 35 valores distintos para esta variable y leer una tabla tan larga no es práctico. dplyr de hecho corta el resultado. Tendrías que usar alguna otra función como View() para ver toda la tabla.
  2. Puede ser más interesante agrupar valores cercanos, como 4.3 y 4.4; esta agrupación resuelve el punto 1 también.

Especificando el número de intervalos

Para agrupar valores de una variable cuantitativa en intervalos utilizamos la función cut. El procedimiento entonces queda como:

iris %>% 
  mutate(sepal_length_group = cut(sepal_length, breaks = 5)) %>% 
  group_by(sepal_length_group) %>% 
  summarise(frequency = n())
## # A tibble: 5 x 2
##   sepal_length_group frequency
##   <fct>                  <int>
## 1 (4.3,5.02]                32
## 2 (5.02,5.74]               41
## 3 (5.74,6.46]               42
## 4 (6.46,7.18]               24
## 5 (7.18,7.9]                11

¡El resultado es que tenemos 5 categorías en una tabla más legible!

Especificando los cortes o límites de los intervalos

Aunque el resultado anterior no tiene nada incorrecto, podríamos hacer que los intervalos sean más legibles. El truco es que el argumento breaks no sólo acepta el número de intervalos que queremos, sino que también podemos indicar los puntos en los que queremos hacer los cortes. Por ejemplo, vamos a hacer intervalos de longitud 1, desde el 4 hasta el 8. Esto lo podemos hacer con la función seq.

seq(from = 4, to = 8, by = 1)
## [1] 4 5 6 7 8
breaks <- seq(from = 4, to = 8, by = 1)

iris %>% 
  mutate(
    sepal_length_group = cut(sepal_length, breaks = breaks)
  ) %>% 
  group_by(sepal_length_group) %>% 
  summarise(frequency = n())
## # A tibble: 4 x 2
##   sepal_length_group frequency
##   <fct>                  <int>
## 1 (4,5]                     32
## 2 (5,6]                     57
## 3 (6,7]                     49
## 4 (7,8]                     12

¡Mira qué linda tabla! A primera vista lo que se aprecia es que hay más valores bajos (entre 4 y 6) que altos (entre 6 y 8), y también que están más concentrados en el medio, (entre 5 y 6).

Los intervalos son abiertos a la izquierda y cerrados a la derecha. Esto implica que el 5 está incluído en el primer intervalo y no en el segundo

Frecuencias acumuladas

Podemos agregar una columna más a la tabla de frecuencias, acumulando las frecuencias para cada clase, utilizando la función cumsum.

breaks <- seq(from = 4, to = 8, by = 1)

iris %>% 
  mutate(
    sepal_length_group = cut(sepal_length, breaks = breaks)
  ) %>% 
  group_by(sepal_length_group) %>% 
  summarise(frequency = n()) %>% 
  mutate(cum_frequency = cumsum(frequency))
## # A tibble: 4 x 3
##   sepal_length_group frequency cum_frequency
##   <fct>                  <int>         <int>
## 1 (4,5]                     32            32
## 2 (5,6]                     57            89
## 3 (6,7]                     49           138
## 4 (7,8]                     12           150

Pregunta

Si tenemos la siguiente tabla de frecuencias

Categoria Frecuencia Frecuencia acumulada
(0 - 10] - 20
(10 - 20] - 50
(X - 30] - 80
(30 - 40] - 100
  1. ¿Cuál es el tamaño de la muestra?
  2. ¿Cuál es la frecuencia del intervalo (10 - 20]?
  3. ¿Cuánto vale X?


Mostrar respuesta

Graficar una tabla de frecuencias de una variable cuantitativa

Podríamos seguir los mismo pasos que para una variable cualitativa y utilizar geom_bar

breaks <- seq(from = 4, to = 8, by = 1)

iris %>% 
  mutate(sepal_length_group = cut(sepal_length, breaks = breaks)) %>% 
  group_by(sepal_length_group) %>% 
  summarise(frequency = n()) %>% 
  ggplot() +
  geom_bar(aes(x = sepal_length_group, y = frequency), stat = 'identity')

Sin embargo, un histograma es más apropiado. Un histograma es un tipo particular de gráfico de barras. Las principales diferencias son:

  • Las etiquetas en el eje de las \(x\) se colocan los límites de los intervalos
  • Si hay algún intervalo cuya frecuencia sea 0, este intervalo sigue mostrándose en el eje \(x\), mientras que en un gráfico de barras no necesariamente
  • Como el límite superior de un intervalo es el límite inferior del siguiente, no hay espacio entre las barras
  • Las barras podrían tener anchos distintos, aunque esto no es muy común
  • En el eje de las \(y\) siempre van las frecuencias. Si no, no es un histograma

Como los histogramas son gráficos muy comunes, existe la función geom_histogram para ahorrarnos algunas líneas de código.

breaks <- seq(from = 4, to = 8, by = 1)

iris %>% 
  ggplot() +
  geom_histogram(aes(x = sepal_length), binwidth = 1, boundary = 4, colour = 'lightgrey')

Para tener el mismo gráfico que antes, especifiqué que el ancho de los intervalos sea bidwidth = 1 y que uno de los límites sea boundary = 4. También agregué colour = 'lightgrey' para que los bordes fuesen gris claro; no es necesario, pero me gusta más cómo se ve así que sin separación entre las barras.

Ya que estamos viendo todo en un gráfico y no hay que leer, nos podemos dar el lujo de tener intervalos más cortos y por lo tanto más intervalos y más detalle.

breaks <- seq(from = 4, to = 8, by = 0.5)

iris %>% 
  ggplot() +
  geom_histogram(aes(x = sepal_length), breaks = breaks, colour = 'lightgrey') +
  ggtitle('Frequency distribution of Sepal Length', subtitle = 'Histogram') +
  labs(x = 'Sepal length', y = 'Frequency')

Conclusión

Las tablas de frecuencia son una herramienta bastante útil para saber de qué va una variable, y además se contruyen súper fácil en R. También vimos lo fácil que es visualizar las tablas con un gráfico de barras en el caso de una variable cualitativa y con un histograma en el caso de una variable cuantitativa.