Boxplot
Os códigos desta página rodam no navegador, mas não sozinhos: clique em Run Code em cada bloco, de cima para baixo.
A ideia
O boxplot apareceu na Aula 5 (renda dos clientes da Empresa de TV) e foi revisado na Aula 7. Ele é a versão desenhada das medidas de posição que o .describe() calcula. Cada parte do gráfico tem um significado:
- Caixa: vai do primeiro quartil \(Q_1\) ao terceiro quartil \(Q_3\). Dentro dela estão 50% das observações. A altura da caixa é a distância interquartil, \(Q_3 - Q_1\), uma medida de dispersão.
- Linha dentro da caixa: a mediana (\(Q_2\)).
- Limites para atípicos: \(LI = Q_1 - 1{,}5 \cdot (Q_3 - Q_1)\) e \(LS = Q_3 + 1{,}5 \cdot (Q_3 - Q_1)\). Esses limites não aparecem no gráfico; eles só decidem o que é atípico.
- Hastes: a haste inferior vai até o menor valor dos dados que ainda é maior ou igual a \(LI\); a superior, até o maior valor que ainda é menor ou igual a \(LS\).
- Pontos soltos (◦): observações abaixo de \(LI\) ou acima de \(LS\), os valores atípicos.
O grande trunfo do boxplot é comparar grupos: uma variável quantitativa (renda) separada pelas categorias de uma qualitativa (plano). Caixas lado a lado mostram na hora qual grupo tem valores maiores e qual varia mais.
No código
1. As contas por trás da caixa. Vamos calcular os limites para o plano B, em mil reais.
No plano B, \(Q_1 = 4{,}15\) e \(Q_3 = 6{,}375\), então \(LI = 0{,}8125\) e \(LS = 9{,}7125\). Cinco clientes ficam fora desses limites: 0,6 e 0,8 (abaixo de \(LI\)) e 10,2, 10,6 e 19,2 (acima de \(LS\)). As hastes param em 2,5 e 9,5, os valores mais extremos que ainda estão dentro dos limites.
2. Boxplot com plt.boxplot, como na Aula 5. Passamos uma lista com as duas séries e usamos plt.plot para marcar a média de cada grupo com um ponto vermelho ('ro').
Como ler: a caixa inteira do plano B fica abaixo da caixa do plano A. O \(Q_3\) do B (6,375) é menor que o \(Q_1\) do A (7,475): 75% dos clientes do B ganham até 6,375 mil reais, enquanto 75% dos clientes do A ganham pelo menos 7,475 mil. A caixa do A também é mais alta, então a renda varia mais nesse plano. No B, o ponto vermelho da média (5,689) fica acima da mediana (5,15), puxado pelo atípico de 19,2 mil reais.
3. Boxplot pelo pandas, com by=. O df.boxplot separa os grupos sozinho a partir de uma coluna qualitativa. Ele coloca um título automático em cima da figura, que tiramos com plt.suptitle('').
A vantagem é não precisar criar renda_a e renda_b à mão: com três, cinco ou dez categorias, o comando é o mesmo.
Armadilhas comuns
- Achar que as hastes vão do mínimo ao máximo. Só vão quando não há atípicos. No plano B, o máximo é 19,2, mas a haste superior para em 9,5.
- Achar que atípico é erro. Um cliente com renda de 19,2 mil é raro no plano B, mas pode ser real. Atípico é um aviso para investigar, não uma ordem para apagar.
- Procurar a média no boxplot. A linha da caixa é a mediana. Se quiser a média, desenhe-a, como fizemos com
plt.plot(..., 'ro'). Média longe da mediana é sinal de assimetria. - Boxplot de variável qualitativa. Não existe quartil de “estado civil”. Para qualitativas, use barras.
tick_labelsoulabels. Nas versões novas do matplotlib o argumento étick_labels; em versões antigas (antes da 3.9), élabels. Se aparecer erro de argumento, troque um pelo outro.- Esquecer o
plt.suptitle(''). Sem ele, odf.boxplot(..., by=)escreve “Boxplot grouped by PLANO” em cima do seu título.
Exercícios aqui na página
Complete os ______ e clique em Run Code: a correção aparece logo abaixo. Use Show Hint para uma dica e Show Solution para ver uma resolução. O Python roda no seu navegador; na primeira vez ele leva alguns segundos para carregar.
Exercício 1
A altura da caixa do boxplot é a amplitude interquartil, \(Q_3 - Q_1\). Calcule-a para a renda dos clientes do plano A.
Q1 deixa 25% dos valores abaixo; Q3 deixa 75%.
q1_a = renda_a.quantile(0.25)
q3_a = renda_a.quantile(0.75)
aiq_a = q3_a - q1_a
aiq_aExercício 2
No Titanic, considere a tarifa (Fare) dos passageiros da 3ª classe. Calcule o limite superior \(LS = Q_3 + 1{,}5\,(Q_3 - Q_1)\) e conte quantos passageiros ficam acima dele, ou seja, quantos pontos atípicos aparecem em cima da haste do boxplot.
Uma comparação numa coluna devolve True/False; somar conta quantos True.
tarifa_3 = titanic.loc[titanic['Pclass'] == 3, 'Fare']
q1 = tarifa_3.quantile(0.25)
q3 = tarifa_3.quantile(0.75)
ls = q3 + 1.5 * (q3 - q1)
plt.boxplot(tarifa_3, tick_labels=['3ª classe'])
plt.ylabel('Fare')
plt.show()
n_atipicos = (tarifa_3 > ls).sum()
n_atipicosExercício 3
Desenhe o boxplot da tarifa separado pela classe, com o pandas. Olhando as caixas, qual classe (1, 2 ou 3) tem a maior mediana de tarifa? Responda com o número da classe, como texto.
A coluna que separa os grupos é Pclass.
titanic.boxplot(column='Fare', by='Pclass', figsize=(8, 4))
plt.suptitle('')
plt.title('Tarifa por classe')
plt.show()
classe_maior_mediana = '1'
classe_maior_medianaComandos e documentação oficial
formulário o comando está no formulário que você pode consultar na prova.
Pratique
As listas novas de revisão abrem no Google Colab (use Arquivo → Salvar uma cópia no Drive). As listas das aulas estão no Blackboard, na pasta de cada aula.
- Aula 05 · Atividade: variáveis quantitativas e boxplot (Empresa de TV) (seção Boxplot e Exercício 7)Blackboard · notebooks da Aula 05
- Aula 07 · Exercícios: expectativa de vida e rede varejista (Exercício 5)Blackboard · notebooks da Aula 07
- Aula 05 · Exercícios: desempenho de estudantes e distúrbio do sono (Exercício 4 (idade e distúrbio do sono))Blackboard · notebooks da Aula 05