Menu

Histograma no R: hist() Explicado com Exemplos

Como fazer um histograma no R com hist() - escolher os breaks, estilizar as barras, mudar para a escala de densidade, sobrepor uma curva normal e a versão em ggplot2.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

O Que um Histograma Mostra

Um histograma responde a uma pergunta sobre uma variável numérica: como os valores estão distribuídos? Ele corta o intervalo dos dados em intervalos consecutivos (classes, ou bins), conta quantas observações caem em cada um e desenha uma barra por classe cuja altura é essa contagem. Onde os dados são densos, as barras são altas; onde são esparsos, são baixas.

Essa única imagem revela coisas que uma média e um desvio padrão não conseguem: se os dados têm um pico ou dois, se são simétricos ou assimétricos para uma das caudas, e se há valores perdidos longe do resto. Costuma ser o primeiríssimo gráfico a fazer quando você conhece um novo conjunto de dados, lado a lado com os números da estatística descritiva.

No R a função é hist(), e é uma linha.

Seu Primeiro Histograma com hist()

Vamos simular as alturas de 200 pessoas - distribuídas normalmente em torno de 170 cm com desvio padrão de 10 (veja números aleatórios para entender o que set.seed() e rnorm() fazem):

set.seed(42)
heights <- rnorm(200, mean = 170, sd = 10)

hist(heights)

O R escolhe as classes sozinho e desenha uma pilha de barras em forma de sino: barras baixas perto de 145 cm, subindo pelos 160, com pico em torno de 170 e caindo simetricamente depois de 190. O eixo vertical é rotulado "Frequency" - contagens brutas - e o título e o rótulo do eixo vêm do nome da variável.

Os padrões são deliberadamente simples. Os argumentos usuais de acabamento funcionam todos aqui:

hist(heights,
     main   = "Distribution of heights",
     xlab   = "Height (cm)",
     col    = "steelblue",
     border = "white")

col preenche as barras, border colore os contornos - border = "white" dá o visual limpo de barras separadas que você vê na maioria das publicações. Tudo que o guia de plot() diz sobre cores e títulos se aplica sem mudanças.

Largura das Classes: o Argumento breaks

O argumento mais importante de hist() é breaks, porque a largura da classe decide qual história o gráfico conta. Mesmos dados, duas configurações:

hist(heights, breaks = 5)    # five wide bins: a crude, blocky bell
hist(heights, breaks = 30)   # thirty narrow bins: detail, plus noise

Com breaks = 5 o histograma é tão grosseiro que tudo parece uma única corcova suave - um segundo agrupamento ou uma lacuna nos dados seria invisível. Com breaks = 30 você vê estrutura fina, mas oscilações aleatórias começam a se passar por características reais. Nenhum dos dois é "correto"; a atitude honesta é experimentar algumas configurações e ver quais características sobrevivem.

breaks aceita três formas:

  • Um número - breaks = 30 - uma sugestão para a quantidade de classes. O R ajusta para cair em limites redondos, então você pode acabar com 28 ou 33 classes. Isso surpreende todo mundo uma vez.
  • Um vetor de pontos de corte - breaks = seq(140, 200, by = 5) - bordas exatas das classes, sem negociação. Use quando as classes precisam se alinhar entre vários histogramas que você está comparando.
  • O nome de uma regra - breaks = "FD" para Freedman–Diaconis, que escolhe a largura a partir da dispersão e do tamanho da amostra e se comporta bem em dados assimétricos.

Histogramas de Densidade e a Curva Normal

Por padrão as alturas das barras são contagens (freq = TRUE). Definir freq = FALSE reescala as barras para que a área total seja 1 - a escala de densidade. A forma não muda; o eixo vertical, sim. O sentido de fazer isso é que um histograma de densidade vive na mesma escala de uma função densidade de probabilidade, então você pode sobrepor uma curva teórica diretamente sobre os dados:

hist(heights,
     freq = FALSE,
     col = "gray90",
     main = "Heights vs. a normal curve",
     xlab = "Height (cm)")

curve(dnorm(x, mean = mean(heights), sd = sd(heights)),
      add = TRUE, col = "tomato", lwd = 2)

curve() com add = TRUE desenha a curva em sino sobre o histograma existente (o x dentro de dnorm(x, ...) é um marcador que curve() preenche, não uma variável sua). Se as barras abraçam a curva, um modelo normal é razoável; onde elas se afastam dela - uma cauda pesada, um segundo pico - o modelo está deixando algo de fora. Pule o freq = FALSE e a curva vai rastejar inutilmente pelo fundo do gráfico, porque contagens e densidades estão em escalas diferentes.

Os Números por Trás das Barras

hist() não apenas desenha - ele retorna a divisão em classes como uma lista. Com plot = FALSE ele pula o desenho por completo e só calcula, o que significa que você pode rodar este aqui mesmo:

h$counts é o histograma como dados: cada número é a altura de uma barra. A linha table(cut(...)) é o equivalente em modo texto - cut() divide os valores em classes, table() conta cada classe - e é uma verificação de sanidade decente para imprimir antes ou no lugar de um gráfico. Se você atribuir sem plot = FALSE (h <- hist(heights)), o R desenha e retorna a lista; a atribuição não suprime o gráfico.

Histogramas com ggplot2

A versão em ggplot2 troca breaks por binwidth, que costuma ser o controle mais natural - você diz quão larga é uma classe em unidades dos dados em vez de quantas classes você quer:

library(ggplot2)

ggplot(data.frame(heights), aes(x = heights)) +
    geom_histogram(binwidth = 5, fill = "steelblue", color = "white") +
    labs(title = "Distribution of heights", x = "Height (cm)", y = "Count")

binwidth = 5 significa que cada barra cobre 5 cm. O ggplot2 avisa se você deixar binwidth sem definir e silenciosamente usa 30 classes por padrão - dê atenção ao aviso, porque o padrão raramente é a largura certa para os seus dados. Para uma olhada rápida em uma variável, hist() exige menos digitação; o ggplot2 se paga quando o histograma precisa de facetas, grupos ou um tema consistente com o resto das suas figuras.

O Que Você Leva

  • Um histograma mostra a distribuição de uma variável numérica: hist(x) e pronto.
  • breaks é o argumento que importa - um número é apenas uma sugestão, um vetor define bordas exatas, "FD" escolhe uma largura defensável. Sempre experimente mais de uma configuração.
  • freq = FALSE muda para a escala de densidade, que é o que permite a curve(dnorm(...), add = TRUE) sobrepor uma curva normal de forma significativa.
  • hist(x, plot = FALSE) retorna as classes como dados ($breaks, $counts, $mids); table(cut(x, breaks)) é o equivalente só de texto.
  • No ggplot2, geom_histogram(binwidth = ...) - e defina o binwidth você mesmo.

A seguir: o boxplot - o gráfico de distribuição que realmente brilha quando você compara grupos lado a lado.

Perguntas frequentes

Como fazer um histograma no R?

Chame hist(x) em um vetor numérico. O R divide o intervalo de x em classes (bins) e desenha uma barra por classe, com a altura mostrando quantos valores caem dentro dela. Adicione breaks = para controlar o número de classes e col = para colorir as barras.

O que faz o argumento breaks no hist()?

Ele controla a divisão em classes. Um único número como breaks = 30 é uma sugestão de quantas classes usar (o R arredonda para limites redondos), um vetor como breaks = seq(140, 200, by = 5) define os pontos de corte exatos, e breaks = "FD" usa a regra de Freedman–Diaconis.

Como sobrepor uma curva normal a um histograma no R?

Desenhe o histograma na escala de densidade com freq = FALSE e depois adicione a curva com curve(dnorm(x, mean = mean(data), sd = sd(data)), add = TRUE). Na escala de frequência a curva ficaria inutilmente rente ao zero, então freq = FALSE é essencial.

Qual é a diferença entre um histograma e um gráfico de barras?

Um histograma agrupa uma variável numérica em classes, então o eixo horizontal é uma escala contínua e as barras se tocam. Um gráfico de barras compara categorias distintas, então as barras ficam separadas. No R isso é hist() para números e barplot() para contagens de categorias.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR