12  Histogramas

Data de Publicação

6 de maio de 2025

12.1 Introdução

Este tutorial incide sobre a construção e parametrização de histogramas no R.

Ao longo do texto será utilizado um vetor com 80 observações, coin, gerado de forma aleatória. Admita-se que se trata de 80 réplicas da contagem do número de caras (ou coroas) em 100 lançamentos de uma moeda.

set.seed(123)
coin <- replicate(80, sum(sample(c(0, 1), 100, replace = TRUE)))
coin
 [1] 43 54 49 43 50 57 53 49 44 52 50 49 49 44 47 54 45 51 49 47 46 48 55 51 48
[26] 50 46 47 45 48 43 39 57 56 48 56 59 54 49 44 45 55 57 60 62 47 46 50 58 53
[51] 50 62 56 53 47 54 46 49 53 45 48 62 47 59 44 51 51 52 38 51 44 53 56 47 44
[76] 53 45 49 55 54

A função replicate() é bastante útil para simular a replicação de experiências aleatórias. Pode ler mais sobre a função com ?replicate.

Para construir um histograma basta invocar a função gráfica de alto nível hist(), fornecendo o vetor de observações, tal como no código abaixo que produz a Figura 12.1.

hist(coin)
Figura 12.1: Exemplo de um histograma (sem configurações adicionais)

Como se pode verificar, a determinação do número de classes e dos respetivos limites é automática, mas havendo a possibilidade de configurar este e outros aspetos, como indicado nas restantes secções deste tutorial.

12.2 Visualização dos detalhes

A informação sobre as classes e as contagens pode ser acedida inspecionando o objeto devolvido pela função hist(), neste caso, h.

h <- hist(coin, plot = FALSE)
h
$breaks
[1] 35 40 45 50 55 60 65

$counts
[1]  2 14 29 21 11  3

$density
[1] 0.0050 0.0350 0.0725 0.0525 0.0275 0.0075

$mids
[1] 37.5 42.5 47.5 52.5 57.5 62.5

$xname
[1] "coin"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

A informação mais relevante contida no objeto é:

  • Os limites das classes, em $breaks, sendo as classes abertas à esquerda (exceto a primeira) e fechadas à direita.

  • As frequências absolutas ou contagens, \(f_k\), em $counts.

  • As densidades estimadas, \(\hat{f_k}(x)\), em $density: \(\hat{f_k}(x) = \frac{f_k}{n \times a_k}\).

  • Os pontos intermédios as classes, em $mids.

A função devolve sempre este objeto, que pode ser acedido mais tarde. Também seria possível mostrar o histograma posteriormente com plot(h).

12.3 Classes e contagens

Um dos aspetos mais importantes do histograma é a definição das classes, ou seja, quer o número de classes, quer os respetivos limites. Por omissão, o R utiliza a regra de Sturges para determinar o número aproximado de classes (aproximado apenas, pois o R tenta ajustar os limites das classes a valores redondos). Também por omissão, as classes têm todas a mesma amplitude.

Regra de Sturges

O número de classes, \(K\), é dado arredondando por excesso o seguinte cálculo:

\[K = 1+\log_2 n \approx 1+3.322\log_{10}n \approx 1+1.443\ln n\]

No exemplo acima, para \(n=80\), \(K=\lceil 7.32\rceil=8\)

Como se pode verificar, o histograma apenas tem 6 classes, em vez de 8, pois o R, por motivos estéticos e práticos, arredondou os limites das classes a múltiplos de 5 unidades.

Embora o algoritmo automático seja satisfatório na maior parte das situações, pode haver necessidade de ajustar os intervalos de cada classe. A forma de o fazer é fornecer o argumento breaks, que pode ter vários formatos.

O código que se segue produz a Figura 12.2 e ilustra as várias formas de fornecer o argumento breaks.

1hist(coin)

2hist(coin, breaks = "Scott")

3hist(coin, breaks = 9)

myRule1 <- function(x) {
  round(sqrt(length(x)))
}
4hist(coin, breaks = myRule1)

myRule2 <- function(x) {
  seq(min(coin), max(coin), by = (max(coin) - min(coin)) / 9)
}
brk <- myRule2(coin)
5hist(coin, breaks = brk)

6hist(coin, breaks = myRule2)
1
Resulta na Figura 12.2 (a) e é o mesmo que especificar breaks = "Sturges ou breaks =8.
2
Também resulta na Figura 12.2 (a) e é o mesmo que especificar breaks =6
3
Resulta na Figura 12.2 (b), tendo-se especificado o número de classes diretamente.
4
Também resulta na Figura 12.2 (b), tendo-se especificado o número de classes através de uma função, myRule1. No caso concreto, esta função devolve 9 classes, pelo que é equivalente à anterior.
5
Resulta na Figura 12.2 (c), tendo-se fornecido um vetor com os 9 intervalos desejados.
6
Também resulta na Figura 12.2 (c), mas os intervalos são indicados fornecendo o nome de uma função, myRule2, que calcula os intervalos, sendo equivalente à anterior.
(a) Sem configurações (Sturges)
(b) Uma regra
(c) Número de classes
Figura 12.2: Diferentes formas de ajustar o número de classes
Importante

Note-se que nos casos 1 a 4, o número de classes é apenas uma sugestão, podendo o R respeitar ou não, pois vai tentar ajustar os limites das classes a números redondos. Caso seja fornecido um vetor com os intervalos, quer diretamente, quer através de uma função, o histograma será produzido de acordo com as classes definidas nesse vetor.

12.4 Outros ajustes

Para lá dos ajustes que é possível fazer em qualquer gráfico (títulos, eixos, escalas, etc.), a Tabela 12.1 lista alguns argumentos que se podem passar à função hist() para ajustar outros aspetos do histograma.

Tabela 12.1: Configuração de histogramas
Argumento Elemento
freq = FALSE Para utilizar as densidades, em vez das frequências, no eixo vertical
right = TRUE Para fechar os intervalos das classes à direita, em vez de fechar à esquerda
plot = FALSE O gráfico não é desenhado e a função apenas devolve a informação sobre as classes, o que é útil caso se necessite essa informação
labels = Caso labels = TRUE, coloca o valor das contagens (ou densidades) no topo das barras. Caso se passe um vetor de texto, os elementos desse vetor serão colocados no topo das barras
col =, border = Para especificar a cor e o bordo das barras

Na Figura 12.3 exemplifica-se a utilização de alguns dos argumentos apresentados e é construída pelo código que se segue.

plot(
  h,
  main = "Histograma ajustado",
  xlab = "# caras em 100 lançamentos", ylab = "Densidade",
  ylim = c(0, 0.08),
  freq = FALSE,
  labels = TRUE,
  col = "lightblue",
  border = "blue"
)
curve(dnorm(x, mean(coin), sd(coin)), col = "red", add = TRUE)
Figura 12.3: Histograma com alguns ajustes

Note-se que foi utilizada a função plot() à qual foi passado o objeto h. Este procedimento é equivalente a invocar hist(coin) e passar os restantes argumentos. De facto, tanto a função plot(), como a função hist(), nos bastidores, vão invocar o mesmo código para desenhar o histograma.

Nota

A função curve() serve para desenhar curvas definidas por funções de \(x\), neste caso, a linha vermelha da Figura 12.3. Sem entrar em detalhes, a função dnorm() produz uma curva de densidade conhecida, a curva Normal. Como se trata de uma função gráfica de alto nível, o argumento add = TRUE especifica que a curva deve ser acrescentada ao gráfico existente, ao invés de ser criado um novo gráfico.