Como Ler um Boxplot
Um boxplot comprime uma distribuição inteira em cinco números e os desenha como um único glifo compacto. Aprender a lê-lo leva trinta segundos, então vamos fazer isso primeiro - cada peça tem um significado preciso:
- A linha grossa dentro da caixa é a mediana: metade dos dados fica abaixo dela, metade acima.
- A caixa em si cobre o intervalo interquartil (IQR) - do primeiro quartil (25% dos dados abaixo) ao terceiro quartil (75% abaixo). A metade central dos seus dados vive dentro da caixa.
- Os bigodes são as linhas que se estendem a partir da caixa. Cada um alcança o ponto de dados mais extremo que ainda está dentro de 1,5 × IQR da borda da caixa - então eles cobrem "o intervalo comum" dos dados, não o intervalo completo.
- Pontos individuais além dos bigodes são valores a mais de 1,5 × IQR da caixa: marcados como outliers suspeitos, desenhados um a um para você poder contá-los.
Uma caixa alta significa dados espalhados; uma linha de mediana descentralizada dentro da caixa significa assimetria; um rastro de pontos depois de um bigode significa uma cauda pesada daquele lado. Um histograma mostra a mesma distribuição com mais detalhe - mas o superpoder do boxplot é que uma dúzia deles cabe lado a lado, o que faz dele o gráfico para comparar grupos.
Um Boxplot de Uma Variável
A função é boxplot(), e para um único vetor numérico é uma chamada:
scores <- c(52, 55, 58, 60, 61, 63, 64, 66, 68, 70, 72, 95)
boxplot(scores,
main = "Test scores",
ylab = "Score")
A imagem que isso desenha: uma caixa de 59 a 69 com a linha da mediana em 63,5, bigodes descendo até 52 e subindo até 72, e um ponto solitário flutuando em 95 - o outlier que um resumo de média-e-desvio-padrão teria absorvido em silêncio. Esse instantâneo "um valor não é como os outros" é para isso que boxplots servem.
(Como em todas as páginas deste capítulo, as chamadas de plotagem são trechos estáticos - o executor abaixo mostra apenas saída de texto. Rode-as localmente para ver o desenho.)
Comparando Grupos: a Interface de Fórmula
O uso real do dia a dia é uma caixa por grupo, e para isso boxplot() aceita uma fórmula: y ~ group, lida como "y quebrado por grupo". O dataset embutido do R ToothGrowth - comprimento de dentes em 60 porquinhos-da-índia que receberam vitamina C via suco de laranja (OJ) ou ácido ascórbico (VC) - é a demonstração clássica:
boxplot(len ~ supp,
data = ToothGrowth,
main = "Tooth growth by supplement",
xlab = "Supplement",
ylab = "Tooth length")
Duas caixas aparecem em uma escala vertical compartilhada: a caixa OJ fica visivelmente mais alta que a caixa VC, com sua mediana em torno de 22 contra cerca de 19. Como as duas caixas compartilham um eixo, a comparação é honesta por construção - sem chance de dois gráficos com escalas diferentes favorecerem um grupo. A coluna de agrupamento deve ser um fator (ou vetor de caracteres); cada nível vira uma caixa.
Fórmulas também se combinam: boxplot(len ~ supp * dose, data = ToothGrowth) desenha seis caixas, uma por combinação de suplemento e dose. Quando uma diferença entre grupos parece real nas caixas, a próxima pergunta natural - é mais do que ruído? - é o que um teste t responde.
Rótulos, Cores e Boxplots Horizontais
Os argumentos de estilização seguem as convenções da plotagem base. names rotula as caixas, col as preenche - passe um vetor para colorir cada grupo de forma diferente:
boxplot(len ~ supp,
data = ToothGrowth,
names = c("Orange juice", "Ascorbic acid"),
col = c("orange", "lightblue"),
main = "Tooth growth by supplement",
ylab = "Tooth length")
Duas outras opções valem seu lugar:
horizontal = TRUErotaciona o gráfico inteiro para que as caixas corram ao longo do eixo horizontal. Faça isso sempre que os nomes dos grupos forem longos - rótulos horizontais permanecem legíveis onde os verticais colidem.notch = TRUEentalha cada mediana; quando os entalhes de dois grupos não se sobrepõem, suas medianas plausivelmente diferem. Trate como uma pista visual, não como um teste.
Os Números por Trás da Caixa
Tudo que o gráfico desenha vem de números que você pode imprimir. quantile() dá o resumo de cinco números, e boxplot.stats() dá exatamente o que o gráfico usa - incluindo os outliers. Este você pode rodar aqui mesmo:
Note que os dois são primos, não gêmeos: quantile() reporta o mínimo e o máximo verdadeiros, enquanto s$stats termina nos bigodes - os pontos mais extremos dentro da cerca de 1,5 × IQR. A diferença entre eles é precisamente s$out, aqui o 95 solitário. Quando alguém pergunta "quais linhas são aqueles pontos de outlier?", x[x %in% boxplot.stats(x)$out] - ou um filtro pelos valores da cerca - responde.
Boxplots com ggplot2
No ggplot2 o agrupamento entra no mapeamento estético em vez de uma fórmula:
library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len, fill = supp)) +
geom_boxplot() +
labs(title = "Tooth growth by supplement",
x = "Supplement", y = "Tooth length")
As mesmas duas caixas, com legenda e tema de brinde. A versão do ggplot2 escala melhor quando o gráfico cresce - faça facetas por dose, sobreponha os pontos brutos com geom_jitter(width = 0.1), e o código continua declarativo. Para uma comparação pontual durante a análise, boxplot(y ~ g, data = df) continua sendo a coisa mais rápida que você pode digitar.
O Que Você Leva
- Anatomia da caixa: linha da mediana, caixa = IQR, bigodes = pontos mais extremos dentro de 1,5 × IQR, pontos além = outliers suspeitos.
boxplot(x)para uma variável;boxplot(y ~ group, data = df)para comparação de grupos lado a lado em uma escala compartilhada e honesta.- Estilize com
names, um vetor decolpor grupo ehorizontal = TRUEquando os rótulos forem longos. boxplot.stats(x)$statse$outsão o gráfico em números - use-os para extrair os outliers que o gráfico aponta.- ggplot2:
geom_boxplot()com o grupo mapeado paraxoufill.
A seguir: o gráfico de dispersão - da distribuição de uma variável para a relação entre duas.
Perguntas frequentes
Como fazer um boxplot no R?
Chame boxplot(x) em um vetor numérico para uma única caixa, ou use a interface de fórmula boxplot(y ~ group, data = df) para obter uma caixa por grupo, lado a lado. Ambas vêm com o R base - nenhum pacote é necessário.
O que significam as partes de um boxplot?
A linha grossa dentro da caixa é a mediana. A caixa cobre o intervalo interquartil, do primeiro quartil ao terceiro. Os bigodes alcançam os pontos de dados mais extremos dentro de 1,5 vez o IQR a partir da caixa, e qualquer coisa além dos bigodes é desenhada como um ponto individual - um outlier suspeito.
Como fazer um boxplot por grupo no R?
Use uma fórmula: boxplot(len ~ supp, data = ToothGrowth) desenha uma caixa por nível de supp. A variável de agrupamento deve ser um fator ou coluna de caracteres; cada nível vira uma caixa em uma escala compartilhada.
Como encontrar os outliers que um boxplot mostra?
boxplot.stats(x)$out retorna exatamente os valores que o gráfico desenharia como pontos além dos bigodes, e boxplot.stats(x)$stats dá os cinco números por trás da caixa - extremos dos bigodes, quartis e mediana.