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 = FALSEmuda para a escala de densidade, que é o que permite acurve(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 obinwidthvocê 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.