Calcular média, mediana e desvio padrão aparece em relatórios, monitoramento, pesquisas, qualidade, notas, desempenho e experimentos. Para análises pequenas e scripts sem dependências externas, o módulo statistics no Python oferece funções prontas para medidas de centro, dispersão, relações entre variáveis, distribuições normais e estimativa de densidade.
Neste guia, você aprenderá a escolher entre média e mediana, distinguir amostra de população, calcular quantis, correlação e regressão, remover NaN e usar NormalDist. O conteúdo complementa nossos artigos sobre listas em Python, collections, Decimal, fractions e módulo math.
Quando usar statistics
O módulo foi criado para análises no nível de calculadoras científicas e gráficos, não para substituir NumPy, SciPy, pandas ou pacotes estatísticos profissionais. Ele é excelente quando o conjunto cabe na memória, os cálculos são univariados ou bivariados e você deseja permanecer na biblioteca padrão.
from statistics import mean, median, stdev
dados = [12, 15, 14, 18, 20, 13]
print(mean(dados))
print(median(dados))
print(stdev(dados))As funções aceitam iteráveis e, quando indicado, trabalham com int, float, Decimal e Fraction. Evite misturar tipos no mesmo conjunto, pois o comportamento pode ser indefinido.
Média aritmética com mean()
mean() soma os valores e divide pela quantidade.
from statistics import mean
notas = [7.5, 8.0, 9.0, 6.5]
print(mean(notas)) # 7.75A média usa toda a informação, mas é sensível a valores extremos. Uma renda muito alta pode elevar a média de um grupo e deixar de representar um participante típico.
fmean() e média ponderada
fmean() converte os dados para float e costuma ser mais rápido. Desde o Python 3.11, aceita pesos.
from statistics import fmean
notas = [85, 92, 83, 91]
pesos = [0.20, 0.20, 0.30, 0.30]
print(fmean(notas, pesos)) # 87.6Os pesos devem ter o mesmo comprimento dos dados e soma positiva. Documente se os pesos representam importância, frequência ou exposição.
Média geométrica
geometric_mean() é adequada para fatores multiplicativos, crescimento composto e índices relativos.
from statistics import geometric_mean
fatores = [1.10, 0.95, 1.20]
media = geometric_mean(fatores)
print(media)Os valores precisam ser positivos. Não use a média aritmética diretamente para combinar taxas de crescimento sucessivas; converta percentuais em fatores.
Média harmônica
harmonic_mean() é útil para taxas, especialmente quando a distância ou quantidade é fixa.
from statistics import harmonic_mean
velocidade_media = harmonic_mean([40, 60])
print(velocidade_media) # 48Viajar a 40 km/h e 60 km/h em distâncias iguais não produz média de 50 km/h, porque o tempo gasto em cada trecho é diferente.
Mediana e outliers
median() retorna o centro dos dados ordenados e é menos afetada por extremos.
from statistics import mean, median
salarios = [2500, 2700, 2800, 3000, 30000]
print(mean(salarios))
print(median(salarios))Quando o número de pontos é par, a mediana comum calcula a média dos dois centrais. Para dados ordinais ou discretos, use median_low() ou median_high() para obter um valor realmente presente.
Mediana de dados agrupados
median_grouped() estima a mediana quando cada valor representa o ponto médio de uma classe de largura fixa.
from statistics import median_grouped
idades_agrupadas = [25] * 10 + [35] * 30 + [45] * 15
print(median_grouped(idades_agrupadas, interval=10))A função pressupõe que os pontos estejam separados por múltiplos exatos do intervalo; ela não valida essa condição.
Moda e multimoda
mode() retorna o primeiro valor mais frequente. multimode() retorna todos os empatados.
from statistics import mode, multimode
cores = ["azul", "verde", "azul", "vermelho", "verde"]
print(mode(cores))
print(multimode(cores))A moda também funciona com dados nominais, diferentemente da média e mediana. Os elementos precisam ser hashable.
Quantis, quartis e percentis
quantiles() divide os dados em intervalos de probabilidade igual. Com n=4, retorna três cortes para quartis; com 10, decil; com 100, percentis.
from statistics import quantiles
dados = [12, 15, 18, 20, 22, 25, 30, 35, 40, 45]
print(quantiles(dados, n=4))O método exclusive padrão trata os dados como amostra de uma população que pode ter valores mais extremos. inclusive considera mínimo e máximo como extremos da população. Escolha conforme o significado dos dados.
Variância e desvio padrão
Variância mede dispersão quadrática; desvio padrão volta à unidade original. Para uma amostra, use variance() e stdev(). Para toda a população, use pvariance() e pstdev().
from statistics import variance, stdev, pvariance, pstdev
dados = [10, 12, 13, 15, 20]
print(variance(dados))
print(stdev(dados))
print(pvariance(dados))
print(pstdev(dados))A variância amostral usa correção de Bessel, dividindo por N-1. Usar a função errada altera o resultado, principalmente em amostras pequenas.
Passando a média já calculada
Se você já calculou a média correta, pode passá-la para evitar repetição.
from statistics import mean, variance
m = mean(dados)
v = variance(dados, m)A função não verifica se o valor informado realmente é a média. Passe um valor errado e o resultado também será errado.
Removendo NaN antes da análise
NaN possui semântica incomum de comparação e pode quebrar ordenação, mediana, moda e quantis.
from itertools import filterfalse
from math import isnan
from statistics import median
dados = [20.7, float("nan"), 19.2, 18.3, float("nan"), 14.4]
limpos = list(filterfalse(isnan, dados))
print(median(limpos))A documentação oficial de statistics recomenda remover NaN antes de funções que ordenam ou contam ocorrências. Em dados reais, decida também como tratar valores ausentes: excluir, imputar ou sinalizar erro.
Tipos numéricos consistentes
mean() e funções de dispersão podem preservar Decimal ou Fraction.
from decimal import Decimal
from fractions import Fraction
from statistics import mean
print(mean([Decimal("0.5"), Decimal("0.75")]))
print(mean([Fraction(1, 3), Fraction(2, 3)]))Não misture Decimal, Fraction e float indiscriminadamente. Converta todo o conjunto para um tipo coerente antes da análise.
Covariância
covariance() mede como duas variáveis variam juntas.
from statistics import covariance
horas = [1, 2, 3, 4, 5]
notas = [55, 60, 68, 76, 85]
print(covariance(horas, notas))Valor positivo indica tendência conjunta crescente; negativo indica tendência oposta. A magnitude depende das unidades, portanto não é diretamente comparável entre conjuntos diferentes.
Correlação de Pearson
correlation() com método linear retorna o coeficiente de Pearson entre -1 e 1.
from statistics import correlation
print(correlation(horas, notas))Correlação mede força linear, não causalidade. Outliers podem alterar muito o valor, e uma relação curva pode ter correlação linear baixa mesmo sendo forte.
Correlação de Spearman
Desde o Python 3.12, method="ranked" calcula Spearman por postos.
print(correlation(horas, notas, method="ranked"))Spearman mede relação monotônica e é útil para dados ordinais ou relações que não são lineares. Empates recebem postos médios.
Regressão linear simples
linear_regression() estima inclinação e intercepto pelo método dos mínimos quadrados.
from statistics import linear_regression
modelo = linear_regression(horas, notas)
prevista = modelo.slope * 6 + modelo.intercept
print(modelo)
print(prevista)Uma regressão simples não valida causalidade, independência, normalidade dos resíduos ou homocedasticidade. Use-a como ferramenta exploratória e examine resíduos antes de decisões importantes.
Regressão proporcional
Com proportional=True, a reta é forçada a passar pela origem.
modelo = linear_regression(x, y, proportional=True)Use somente quando o domínio justificar intercepto zero. Forçar essa restrição indevidamente distorce a inclinação.
NormalDist
NormalDist agrupa média e desvio padrão de uma distribuição normal.
from statistics import NormalDist
distribuicao = NormalDist(mu=100, sigma=15)
print(distribuicao.cdf(115))
print(distribuicao.inv_cdf(0.95))
print(distribuicao.zscore(130))cdf() calcula probabilidade acumulada; inv_cdf() encontra um quantil; zscore() mede quantos desvios o valor está distante da média.
Estimando uma normal a partir de amostras
amostra = [98, 101, 99, 105, 102, 97]
dist = NormalDist.from_samples(amostra)
print(dist.mean, dist.stdev)Essa modelagem pressupõe que a normal seja apropriada. Faça histogramas, verifique assimetria e considere o processo gerador dos dados.
Gerando amostras reproduzíveis
samples() gera valores aleatórios. Passe uma seed para testes reprodutíveis.
valores = NormalDist(0, 1).samples(5, seed=42)
print(valores)Não use essa geração para segurança. A finalidade é simulação estatística.
Estimativa de densidade KDE
Desde o Python 3.13, kde() cria uma função de densidade suavizada a partir de uma amostra.
from statistics import kde
amostra = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]
densidade = kde(amostra, h=1.5)
print(densidade(0))O parâmetro h, chamado largura de banda, influencia mais o resultado que o formato do kernel. Valores pequenos preservam detalhes e ruído; valores grandes suavizam mais.
kde_random()
kde_random() retorna uma função que sorteia novos valores da densidade estimada.
from statistics import kde_random
gerador = kde_random(amostra, h=1.5, seed=123)
print([gerador() for _ in range(5)])Use para simulações exploratórias, lembrando que a qualidade depende da amostra e da largura de banda.
StatisticsError
Conjuntos vazios, variância com poucos dados e entradas incompatíveis podem gerar StatisticsError.
from statistics import StatisticsError, mean
try:
mean([])
except StatisticsError:
print("Não há dados suficientes")Valide comprimento e qualidade antes de executar, especialmente em endpoints e lotes automáticos.
statistics versus NumPy e pandas
Use statistics para listas pequenas, Decimal/Fraction e scripts sem dependências. Use NumPy para arrays grandes, operações vetorizadas e múltiplas dimensões. Use pandas para tabelas, colunas, valores ausentes e agrupamentos.
Resultados podem diferir por convenções, como graus de liberdade e métodos de quantil. Documente os parâmetros ao migrar.
Precisão numérica
Para somas float difíceis, a documentação do módulo math apresenta math.fsum(), que reduz perda de precisão acumulada. O módulo statistics já utiliza algoritmos cuidadosos, mas entradas mal condicionadas ainda merecem análise.
Erros frequentes
- Usar média em dados dominados por outliers.
- Confundir amostra e população.
- Deixar NaN no conjunto.
- Misturar tipos numéricos.
- Interpretar correlação como causalidade.
- Aplicar regressão sem verificar resíduos.
- Usar quartis sem registrar o método.
- Escolher largura de banda KDE arbitrariamente.
Boas práticas
- Defina a pergunta antes da métrica.
- Limpe e valide os dados.
- Relate tamanho da amostra e valores ausentes.
- Use mediana junto da média em dados assimétricos.
- Escolha funções de amostra ou população corretamente.
- Documente métodos de quantil e correlação.
- Visualize dados e resíduos.
- Migre para bibliotecas especializadas quando o volume crescer.
Conclusão
O módulo statistics no Python oferece uma base sólida para análise descritiva e relações simples sem dependências externas. Ele inclui médias adequadas a diferentes problemas, medidas de dispersão, quantis, correlação, regressão, distribuição normal e KDE.
A qualidade do resultado depende mais da escolha da métrica e da preparação dos dados que da chamada da função. Ao distinguir amostra de população, remover NaN, tratar outliers e documentar convenções, você transforma listas de números em análises reproduzíveis e evita conclusões estatísticas enganosas.







