2. Distribuição de frequências

Uma forma de lidar com grandes conjuntos de dados e identificar informações relevantes é agrupar estes dados. O agrupamento é feito em tabelas, denominadas de distribuições de frequências. A construção de distribuição de frequências é geralmente realizada de forma distinta para variáveis discretas (distribuição por pontos) e contínuas (distribuição por classes ou intervalos).

Neste exemplo, vamos utilizar os dados coletados do comprimento, diâmetro e cor de grão de café.

library(tidyverse)
library(rio)
library(metan)


# importar os dados do google sheet
df <- import("https://docs.google.com/spreadsheets/d/18aXD_2ISvzB8h8_kgOfSBbr9a9d9pT0QVazt-KjVLRw/edit#gid=655855284",
             dec = ",")
# mostrar os dados
knitr::kable(df)
amostra comp_grao diam_grao cor_grao
1 15.89 11.66 vermelho
2 14.68 11.37 vermelho
3 13.60 11.39 vermelho
4 11.39 11.58 vermelho
5 14.27 10.69 vermelho
6 15.02 11.28 vermelho
7 11.88 8.54 vermelho
8 15.06 10.99 amarelo
9 15.98 11.42 amarelo
10 13.32 9.38 amarelo
11 14.64 11.04 amarelo
12 12.15 9.30 amarelo
13 15.59 11.99 amarelo
14 14.26 10.47 verde
15 12.04 8.70 verde
16 10.95 8.43 verde
17 12.88 9.36 verde
18 11.86 9.10 verde
19 14.02 9.17 verde
20 11.99 10.20 verde
21 12.77 9.88 verde
22 12.47 8.53 verde
23 9.75 6.63 verde
24 9.09 7.29 verde
25 10.47 8.54 verde
26 10.14 8.32 verde
27 11.48 8.43 verde
28 12.66 9.25 verde

Variáveis qualitativas e quantitativas discretas

Para exemplificar a construção de tabelas de frequências de variáveis qualitativas / quantitativas discretas, utilizaremos a variável cor do grão. Neste caso, três classes (classes naturais) estão presentes: vermelho, amarelo e verde. Assim, a construção da tabela de frequência diz respeito a contagem de observações em cada uma destas classes e o cálculo das frequências relativas e absolutas.

Representação tabular

Pode-se criar facilmente esta tabela de frequência combinando as funções count() e mutate() do pacote dplyr (parte do tidyverse).

tab_feq <- 
  df %>%
  count(cor_grao) |>
  mutate(abs_freq = n,
         abs_freq_ac = cumsum(abs_freq),
         rel_freq = abs_freq / sum(abs_freq),
         rel_freq_ac = cumsum(rel_freq))

knitr::kable(tab_feq)
cor_grao n abs_freq abs_freq_ac rel_freq rel_freq_ac
amarelo 6 6 6 0.2142857 0.2142857
verde 15 15 21 0.5357143 0.7500000
vermelho 7 7 28 0.2500000 1.0000000

Representação gráfica

Para apresentar estes dados graficamente, pode-se construir um gráfico de barras, mostrando a contagem em cada classe.

ggplot(df, aes(cor_grao)) + 
  geom_histogram(stat="count") +
  scale_y_continuous(breaks = 0:15) + 
  labs(x = "Cor do grão",
       y = "Número de observações") +
  theme(panel.grid.minor = element_blank())
Warning in geom_histogram(stat = "count"): Ignoring unknown parameters:
`binwidth`, `bins`, and `pad`

Variáveis quantitativas

Para o caso de variáveis quantitativas contínuas (ex. X), precisamos agrupar os valores observados em intervalos de classe. Por exemplo, quando medimos uma altura de uma planta (ex. 1,86 m), a altura real não está limitado a segunda casa decimal. Então, a melhor forma será criar regiões (intervalos), de modo que possamos contemplar um conjunto de valores.

Um critério empírico, para definição do número de classes (\(k\)) a ser criado se baseia no número de elementos (\(n\)) na amostra. Caso (\(n\)) seja igual ou inferior a 100, calcula-se o número de classes com \(k = \sqrt{n}\). Caso (\(n\)) seja maior que 100, calcula-se o número de classes com \(k = 5 log_{10}(n)\).

Após a determinação do número de classes, é necessário determinar a amplitude total (\(A\)), dada por:

\[ A = \max(X) - \min(X) \]

Posteriormente, determina-se a amplitude da classe (\(c\)), dada por:

\[ c = \frac{A}{k - 1} \]

Por fim, calcula-se o o limite inferior (\(LI_1\)) e superior (\(LS_1\)) da primeira classe, dados por

\[ LI_1 = min(X) - c/2\\\\ \]

\[ LS_1 = LI_1 + c \]

O valor do limite superior não pertence a classe e será contabilizado para a próxima classe. Dizemos, então, que o conjunto é fechado a esquerda e aberto à direita. O limite inferior da segunda classe é dado pelo limite superior da primeira class (\(LI_2 = LS_1\)); o limite superior da segunda classe é dado por (\(LS_2 = LI_2 + c\)). Esta lógica segue até completar-se o número de classes do conjunto.

A função freq_table() está disponível no pacote metan e pode ser utilizada para automatizar o processo de construção de tabelas de frequências, tanto para variáveis qualitativas como quantitativas. Basta informar o conjunto de dados, a variável, e, opcionalmente, o número de classes a ser criado.

Apresentação tabular

frequencias <- freq_table(df, comp_grao)
knitr::kable(frequencias$freqs)
class abs_freq abs_freq_ac rel_freq rel_freq_ac
8.229 |— 9.952 2 2 0.071 0.071
9.952 |— 11.675 5 7 0.179 0.250
11.675 |— 13.398 10 17 0.357 0.607
13.398 |— 15.121 8 25 0.286 0.893
15.121 |—| 16.844 3 28 0.107 1.000
Total 28 28 1.000 1.000

Apresentação gráfica

freq_hist(frequencias)

Dados coletados em aula

Cor do grão do café

df_cor_grao <- import("https://docs.google.com/spreadsheets/d/18aXD_2ISvzB8h8_kgOfSBbr9a9d9pT0QVazt-KjVLRw/edit#gid=1550268554",
                      dec = ",")

freq_cafe <- freq_table(df_cor_grao, var = cor)
knitr::kable(freq_cafe$freqs)
cor abs_freq abs_freq_ac rel_freq rel_freq_ac
amarelo 6 6 0.25 0.25
verde 18 24 0.75 1.00
Total 24 24 1.00 1.00
# criar um histograma
freq_hist(freq_cafe)

Comprimento da folha do café

comp_folha <- import("https://docs.google.com/spreadsheets/d/18aXD_2ISvzB8h8_kgOfSBbr9a9d9pT0QVazt-KjVLRw/edit#gid=0",
                    dec = ",")

# Tabela
dist_comprimento <- freq_table(comp_folha, var = comprimento)
knitr::kable(dist_comprimento$freqs)
class abs_freq abs_freq_ac rel_freq rel_freq_ac
6.375 |— 8.625 2 2 0.095 0.095
8.625 |— 10.875 3 5 0.143 0.238
10.875 |— 13.125 3 8 0.143 0.381
13.125 |— 15.375 8 16 0.381 0.762
15.375 |—| 17.625 5 21 0.238 1.000
Total 21 21 1.000 1.000
# Gráfico
freq_hist(dist_comprimento)

Exercícios

  1. Considerando os dados disponível na planilha ‘grupos’ (https://docs.google.com/spreadsheets/d/18aXD_2ISvzB8h8_kgOfSBbr9a9d9pT0QVazt-KjVLRw/edit#gid=323183536), construa e interprete a tabela de frequências, referente ao número de folhas avaliadas em cada grupo (quantitativa discreta).
df_grupos <- 
  import("https://docs.google.com/spreadsheets/d/18aXD_2ISvzB8h8_kgOfSBbr9a9d9pT0QVazt-KjVLRw/edit#gid=323183536",
         dec = ",")

# filtrar somente folhas
df_folha <- subset(df_grupos, tipo == "Folha")
dist_numfolha <- freq_table(df_folha, var = grupo)
knitr::kable(dist_numfolha$freqs)
grupo abs_freq abs_freq_ac rel_freq rel_freq_ac
Grupo 1 12 12 0.211 0.211
Grupo 2 6 18 0.105 0.316
Grupo 3 11 29 0.193 0.509
Grupo 4 16 45 0.281 0.789
Grupo 5 12 57 0.211 1.000
Total 57 57 1.000 1.000
# Gráfico
freq_hist(dist_numfolha)

  1. Considerando as observações de todos os grupos para a variável quantitativa contínua comprimento da folha, calcule:

    1. O tamanho da amostra (n): 57
    (n <- nrow(df_folha))
    [1] 57
    1. O número de classes (k):
    (k <- round(sqrt(n)))
    [1] 8
    1. A amplitude dos dados:
    (ampl <- range_data(df_folha, comprimento))
      comprimento
    1          13
    1. O tamanho da classe
    ampl / (k - 1)
      comprimento
    1    1.857143
    1. A tabela de distribuição de frequências contendo as frequências relativas e absolutas de cada classe.
dist_largf <- 
  freq_table(df_folha,
             var = comprimento)
knitr::kable(dist_largf$freqs)
class abs_freq abs_freq_ac rel_freq rel_freq_ac
4.072 |— 5.929 2 2 0.035 0.035
5.929 |— 7.786 2 4 0.035 0.070
7.786 |— 9.642 7 11 0.123 0.193
9.642 |— 11.499 8 19 0.140 0.333
11.499 |— 13.356 18 37 0.316 0.649
13.356 |— 15.213 11 48 0.193 0.842
15.213 |— 17.07 7 55 0.123 0.965
17.07 |—| 18.927 2 57 0.035 1.000
Total 57 57 1.000 1.000
# Gráfico
freq_hist(dist_largf)

Tutorial R

Free Website Hit Counter
Free website hit counter