Estatística e resumos de tabelas
Contagens, média, mediana, quantis, dispersão, ordenação e unidades de análise.
Uma estatística resume observações. A escolha depende do que cada linha representa e da pergunta. A média de preços por venda não é necessariamente o preço médio por unidade vendida.
Calcular e interpretar
Para quantidades 2, 3, 5 e 4, a soma é 14 e a média é 14 / 4 = 3,5. Depois de ordenar, temos 2, 3, 4 e 5; a mediana é (3 + 4) / 2 = 3,5. Neste caso coincidem, mas um valor muito elevado afeta mais a média.
import pandas as pd
quantidades = pd.Series([2, 3, 5, 4])
print("n:", quantidades.count())
print("soma:", quantidades.sum())
print("média:", quantidades.mean())
print("mediana:", quantidades.median())
print("mínimo/máximo:", quantidades.min(), quantidades.max())
print("variância amostral:", round(quantidades.var(), 4))
print("variância populacional:", round(quantidades.var(ddof=0), 4))Dados de entrada
A variância amostral é aproximadamente 1,6667; a populacional é 1,25. Somamos os quadrados dos desvios à média: 2,25 + 0,25 + 2,25 + 0,25 = 5. A versão amostral divide por n - 1 = 3; a populacional divide por n = 4.
Em pandas, var() e std() usam ddof=1 por defeito. NumPy usa geralmente ddof=0 nestas operações. Indica a convenção quando comparares resultados. O desvio padrão é a raiz da variância e tem a mesma unidade da variável; a variância tem a unidade ao quadrado.
Quantis e describe
quantile(0.25) calcula o primeiro quartil, quantile(0.5) a mediana e quantile(0.75) o terceiro quartil. O método de interpolação afeta quantis com poucas observações. Para os quatro valores, pandas com a interpolação linear habitual dá 2,75 e 4,25 nos quartis.
describe() de uma coluna numérica mostra contagem, média, desvio padrão, mínimo, quartis e máximo. Usa describe(include="all") para incluir tipos não numéricos, mas interpreta as estatísticas conforme a coluna. Uma contagem de linhas não explica por si só o que foi medido.
Moda, desvios e forma da distribuição
mode() devolve uma Series com todas as modas. Para 2, 2, 5 e 5, devolve 2 e 5; não escolhe um único vencedor. abs() calcula o valor absoluto de cada elemento e conserva o índice.
O desvio absoluto médio é a média das distâncias à média, sem elevar ao quadrado. Para 2, 3, 5 e 4, os desvios absolutos são 1,5, 0,5, 1,5 e 0,5; a sua média é 1. Slides antigos usam mad(), removido no pandas 2.0. Usa (s - s.mean()).abs().mean(). Não confundas este cálculo com a mediana dos desvios absolutos à mediana, também abreviada MAD.
O erro padrão da média, sem(), é std() / sqrt(count()) com a mesma convenção de graus de liberdade. Nos quatro valores, dá aproximadamente 0,6455. O desvio padrão descreve a dispersão das observações; o erro padrão estima a variabilidade da média em amostras. Essa interpretação exige um modelo de amostragem adequado, por exemplo observações independentes.
skew() mede assimetria: valores positivos indicam uma cauda mais longa à direita, negativos à esquerda. kurt() usa o excesso de curtose de Fisher, cuja referência normal é zero. Estes métodos incluem correções amostrais; poucos dados, valores constantes ou insuficientes podem dar resultados pouco informativos ou em falta. O sinal da curtose, por si só, não identifica uma distribuição.
s = pd.Series([2, 3, 5, 4])
print((s - s.mean()).abs().mean()) # 1.0
print(round(s.sem(), 4)) # 0.6455
print(round(s.skew(), 4)) # 0.0
print(round(s.kurt(), 4)) # -1.2
Estas operações aplicadas a um DataFrame resumem normalmente cada coluna. Seleciona as colunas quantitativas ou usa numeric_only=True quando a tabela mistura números e texto.
Produto e operações acumuladas
prod() reduz todos os valores a um produto. cumsum(), cumprod(), cummax() e cummin() devolvem um valor por posição, usando apenas o prefixo até essa posição. A ordem das linhas faz parte do cálculo.
| Valores: 2, 3, 1 | Resultado |
|---|---|
sum() / prod() | 6 / 6 |
cumsum() | 2, 5, 6 |
cumprod() | 2, 6, 6 |
cummax() | 2, 3, 3 |
cummin() | 2, 2, 1 |
Com skipna=True, uma posição ausente continua ausente, mas o acumulado seguinte pode continuar com os valores conhecidos. skipna=False propaga a ausência a partir desse ponto. Confere a política antes de apresentar um acumulado como total completo.
Contar linhas, valores e categorias
len(df) conta linhas. serie.count() conta valores não nulos. serie.nunique() conta valores distintos, normalmente excluindo valores em falta. serie.value_counts() conta ocorrências por valor; dropna=False inclui a ausência como categoria na contagem.
frequencias = df["cidade"].value_counts()
proporcoes = df["cidade"].value_counts(normalize=True)
normalize=True divide cada contagem pelo total de valores considerados. Se excluíres nulos, a soma das proporções é relativa apenas aos valores conhecidos.
Ordenar e escolher extremos
sort_values("quantidade") ordena pelos valores da coluna. sort_index() ordena pelos rótulos do índice. Para desempatar, passa mais de uma coluna, como sort_values(["cidade", "quantidade"]). ascending=[True, False] ordena a cidade por ordem crescente e a quantidade por ordem decrescente.
idxmax() devolve o rótulo de uma ocorrência máxima, não o próprio valor. Para devolver todas as vendas empatadas no máximo, usa uma máscara com df["quantidade"] == df["quantidade"].max().
Uma média ponderada
Vendemos duas unidades a 1,50 euros e três a 1,20 euros. A média simples dos dois preços é 1,35 euros. O preço médio por unidade é (2 × 1,50 + 3 × 1,20) / (2 + 3) = 1,32 euros. As quantidades são os pesos.
Confere a unidade do numerador e do denominador. Faturação dividida por unidades dá euros por unidade; faturação dividida por vendas dá euros por venda. Nenhuma das duas substitui a outra.
Exercícios
Calcular por unidade
Vendeste 2 unidades a 1,50 euros e 3 a 1,20. Qual é o preço médio por unidade, em euros?
Primeira pista
Mais uma pista
Ver solução
6,60 / 5 = 1,32 euros por unidade. A média simples dos preços não considera quantas unidades foram vendidas a cada preço.
Erros frequentes
Responder 1,35, que é a média das duas linhas de preços.
Identificar o denominador
Os valores 2, 3, 5 e 4 têm soma dos quadrados dos desvios à média igual a 5. Qual é a variância populacional?
Primeira pista
Na variância populacional, divide pelo número de observações.
Mais uma pista
Ver solução
A variância é 5 / 4 = 1,25. A amostral dividiria por 3 e daria aproximadamente 1,6667.
Erros frequentes
Usar o valor por defeito de pandas sem conferir a convenção do enunciado.
Distinguir medidas de dispersão
Para os valores 2, 3, 5 e 4, qual é o desvio absoluto médio em relação à média?
Primeira pista
Calcula a média e as quatro distâncias absolutas a esse valor.
Mais uma pista
Ver solução
(1,5 + 0,5 + 1,5 + 0,5) / 4 = 1. Em pandas, usa (s - s.mean()).abs().mean(). Não elevas os desvios ao quadrado.
Erros frequentes
Calcular variância ou desvio padrão. O antigo método mad() já não está disponível em pandas 2.0 ou posterior.
Usar apenas o prefixo disponível
Uma Series contém 2, 5, 3 e 8, por esta ordem. Quanto vale a terceira posição do resultado de cummax()?
Primeira pista
Nessa posição, só foram considerados os três primeiros valores.
Mais uma pista
Ver solução
O máximo do prefixo é 5. O resultado completo é [2, 5, 5, 8]; o 8 só influencia a quarta posição.
Erros frequentes
Usar o máximo global, que depende de uma observação posterior.