statistics no Python: análise de dados

Publicado em: 31/07/2026
Tempo de leitura: 8 minutos
Painel de gráficos representando análise estatística de dados no Python

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.75

A 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.6

Os 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)  # 48

Viajar 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.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Gráficos de frações representando números racionais exatos no Python
    Bibliotecas e Módulos
    Foto de perfil de Leandro Hirt da Academify

    fractions no Python: números racionais

    Aprenda fractions no Python para cálculos racionais exatos, simplificação, limit_denominator, formatação e conversões seguras.

    Ler mais

    Tempo de leitura: 7 minutos
    31/07/2026
    Calculadora e documentos representando cálculos decimais precisos no Python
    Bibliotecas e Módulos
    Foto de perfil de Leandro Hirt da Academify

    Decimal no Python: cálculos precisos

    Aprenda Decimal no Python para cálculos exatos, dinheiro, quantize, arredondamento, contextos e validação sem erros de float.

    Ler mais

    Tempo de leitura: 8 minutos
    30/07/2026
    Código digital representando identificadores UUID únicos e ordenáveis no Python
    Bibliotecas e Módulos
    Foto de perfil de Leandro Hirt da Academify

    uuid no Python: IDs únicos e ordenáveis

    Aprenda uuid no Python: versões 4, 5, 6 e 7, validação, bancos de dados, IDs ordenáveis e cuidados de segurança.

    Ler mais

    Tempo de leitura: 8 minutos
    30/07/2026
    Arquivos organizados representando armazenamento temporário seguro no Python
    Bibliotecas e Módulos
    Foto de perfil de Leandro Hirt da Academify

    tempfile no Python: arquivos temporários

    Aprenda tempfile no Python para criar arquivos e pastas temporárias com segurança, limpeza automática e suporte a Windows e Unix.

    Ler mais

    Tempo de leitura: 8 minutos
    29/07/2026
    Relógios representando fusos horários internacionais com zoneinfo no Python
    Bibliotecas e Módulos
    Foto de perfil de Leandro Hirt da Academify

    zoneinfo no Python: fusos horários

    Aprenda zoneinfo no Python para converter fusos, lidar com horário de verão, fold, UTC e tzdata sem erros de agendamento.

    Ler mais

    Tempo de leitura: 8 minutos
    29/07/2026
    Ícone de documentos duplicados representando cópia rasa e profunda no Python
    Bibliotecas e Módulos
    Foto de perfil de Leandro Hirt da Academify

    copy no Python: cópia rasa e profunda

    Aprenda copy no Python para criar cópias rasas, profundas e substituir campos sem compartilhar objetos mutáveis por engano.

    Ler mais

    Tempo de leitura: 8 minutos
    28/07/2026