Desvio Padrão em Python
Aprenda a calcular o desvio padrão em Python com o módulo statistics, NumPy e pandas, incluindo casos de uso reais de ML com scikit-learn.
O desvio padrão mede o quão dispersos estão os valores em torno da média. É uma das estatísticas mais utilizadas em análise de dados e aprendizado de máquina — desde verificar se um conjunto de dados tem distribuição normal até escalar atributos antes de treinar um modelo. Este capítulo explica o que é o desvio padrão, como calculá-lo em Python com o módulo statistics, NumPy e pandas, e como ele se integra a fluxos de trabalho comuns de ML.
O que é Desvio Padrão?
O desvio padrão (σ para uma população, s para uma amostra) quantifica a distância média de cada ponto de dados em relação à média. Um desvio padrão pequeno significa que os valores se agrupam próximos à média; um valor grande indica que estão muito dispersos.
É a raiz quadrada da variância:
variance = Σ(xᵢ − x̄)² / N # population
variance = Σ(xᵢ − x̄)² / (N − 1) # sample (Bessel's correction)
std dev = √varianceDesvio padrão populacional vs. amostral
| Termo | Divisor da fórmula | Quando usar |
|---|---|---|
| Desvio padrão populacional | N | Você possui todos os pontos de dados (ex.: todas as notas de uma turma) |
| Desvio padrão amostral | N − 1 | Você possui um subconjunto e deseja estimar a população completa |
O denominador N − 1 (correção de Bessel) corrige o viés introduzido ao estimar a partir de uma amostra. Na prática, para grandes conjuntos de dados a diferença é insignificante, mas importa para amostras pequenas.
Exemplo calculado manualmente
data = [10, 20, 30, 40, 50]
mean = (10 + 20 + 30 + 40 + 50) / 5 = 30
Differences from mean: -20, -10, 0, 10, 20
Squared differences: 400, 100, 0, 100, 400
Population variance = (400 + 100 + 0 + 100 + 400) / 5 = 200
Sample variance = (400 + 100 + 0 + 100 + 400) / 4 = 250
Population std dev = √200 ≈ 14.14
Sample std dev = √250 ≈ 15.81O Módulo statistics
O módulo statistics integrado ao Python é a maneira mais simples de calcular o desvio padrão para conjuntos de dados pequenos — sem necessidade de bibliotecas de terceiros.
stdev() lança StatisticsError se você passar menos de dois valores, pois uma lista com um único elemento não possui dispersão significativa.
NumPy std()
NumPy é a escolha padrão ao trabalhar com arrays, matrizes ou grandes conjuntos de dados. Sua função np.std() usa por padrão o desvio padrão populacional (ddof=0). Passe ddof=1 para obter o desvio padrão amostral.
NumPy também permite calcular o desvio padrão ao longo de um eixo específico de um array 2D, o que é útil quando cada linha é uma observação e cada coluna é um atributo:
import numpy as np
# 3 samples, 2 features
X = np.array([[1, 10],
[2, 20],
[3, 30]])
print(np.std(X, axis=0, ddof=1)) # std per feature: [1. 10.]
print(np.std(X, axis=1, ddof=1)) # std per sample: [6.36 6.36 6.36] (approx)pandas std() e describe()
Quando seus dados estão em um DataFrame, o pandas oferece std() diretamente em qualquer coluna ou no frame inteiro. Por padrão, o pandas usa ddof=1 (desvio padrão amostral), seguindo a convenção do R.
import pandas as pd
temps = [72, 68, 75, 80, 65, 70, 78]
df = pd.DataFrame({"temperature": temps})
print(df["temperature"].std()) # 5.4116 (sample std, ddof=1)
print(df["temperature"].mean()) # 72.5714describe() fornece um resumo estatístico rápido, incluindo o desvio padrão de cada coluna numérica:
import pandas as pd
df = pd.DataFrame({
"height_cm": [165, 170, 175, 160, 180],
"weight_kg": [55, 70, 80, 50, 90],
})
print(df.describe())A linha std na saída mostra o desvio padrão amostral de cada coluna:
height_cm weight_kg
count 5.000000 5.000000
mean 170.000000 69.000000
std 7.905694 16.733201
min 160.000000 50.000000
25% 165.000000 55.000000
50% 170.000000 70.000000
75% 175.000000 80.000000
max 180.000000 90.000000Desvio Padrão em Machine Learning
Escalonamento de atributos com StandardScaler
Atributos brutos frequentemente possuem escalas muito diferentes (idade em anos vs. renda em milhares). Algoritmos como regressão linear, SVMs e k-vizinhos mais próximos são sensíveis a esse desequilíbrio. A padronização (também chamada de normalização por z-score) transforma cada atributo para que tenha média = 0 e desvio padrão = 1:
z = (x − mean) / stdO StandardScaler do scikit-learn aplica isso automaticamente:
from sklearn.preprocessing import StandardScaler
import numpy as np
# 3 samples, 2 features
features = np.array([[1, 2],
[3, 4],
[5, 6]])
scaler = StandardScaler()
scaled = scaler.fit_transform(features)
print(scaled)
# [[-1.2247 -1.2247]
# [ 0. 0. ]
# [ 1.2247 1.2247]]Após o escalonamento, cada coluna tem média 0 e desvio padrão 1. Você pode inspecionar os parâmetros aprendidos depois:
print(scaler.mean_) # [3. 4.]
print(scaler.scale_) # [1.6330 1.6330]Comparando a variabilidade entre grupos
O desvio padrão ajuda a determinar se dois grupos são realmente diferentes ou apenas ruidosos. Duas classes podem ter médias similares, mas diferir dramaticamente na dispersão:
import statistics
scores_a = [78, 80, 82, 79, 81] # consistent group
scores_b = [60, 100, 55, 95, 70] # high-variance group
print(f"Group A — mean: {statistics.mean(scores_a)}, std: {statistics.stdev(scores_a):.2f}")
# Group A — mean: 80, std: 1.58
print(f"Group B — mean: {statistics.mean(scores_b)}, std: {statistics.stdev(scores_b):.2f}")
# Group B — mean: 76, std: 20.43O Grupo A e o Grupo B têm médias similares, mas o desvio padrão do Grupo B é ~13× maior, indicando resultados muito menos previsíveis.
Detecção de anomalias com z-scores
Um z-score indica quantos desvios padrão um valor está afastado da média. Valores com |z| > 3 são candidatos convencionais a outliers:
import numpy as np
values = np.array([2.0, 2.5, 3.0, 2.8, 100.0, 2.2, 3.1])
mean = np.mean(values)
std = np.std(values, ddof=1)
z_scores = (values - mean) / std
print(z_scores.round(2))
# [-0.39 -0.38 -0.37 -0.37 2.27 -0.39 -0.36]O valor 100.0 possui um z-score de 2,27, que — dado o tamanho diminuto do conjunto de dados — já se destaca fortemente como um provável outlier.
Compreendendo a incerteza do modelo
O desvio padrão também aparece ao avaliar um modelo em múltiplos folds de validação cruzada. Um desvio padrão alto entre os folds sugere que o modelo é instável ou que os dados têm alta variância. Veja o capítulo sobre validação cruzada para um exemplo detalhado.
Escolhendo a Ferramenta Certa
| Situação | Ferramenta recomendada |
|---|---|
| Cálculo rápido, sem dependências | statistics.stdev() / statistics.pstdev() |
| Operações com arrays ou matrizes | numpy.std() |
| Estatísticas de colunas em DataFrame | pandas.DataFrame.std() |
| Pré-processamento de atributos de ML | sklearn.preprocessing.StandardScaler |
Erros Comuns
ddofincorreto: NumPy usaddof=0por padrão (população), enquanto pandas usaddof=1(amostra). Sempre verifique qual você precisa antes de comparar resultados das duas bibliotecas.- Listas com um único elemento:
statistics.stdev()lança um erro;np.std()retorna0.0silenciosamente. - Ajustar o scaler nos dados de teste: sempre chame
scaler.fit_transform()no conjunto de treinamento escaler.transform()(nãofit_transform) no conjunto de teste. Ajustar nos dados de teste vaza informações e infla as métricas de desempenho. Veja o capítulo sobre divisão treino/teste para mais detalhes. - Outliers distorcem o desvio padrão: um único valor extremo pode inflar drasticamente o desvio padrão, como demonstrado no exemplo de detecção de anomalias acima. Considere verificar a presença de outliers primeiro (veja o capítulo sobre distribuição de dados).
Capítulos Relacionados
- Média, Mediana e Moda — outras medidas de tendência central que complementam o desvio padrão
- Percentis — medidas de dispersão baseadas em posição, robustas a outliers
- Distribuição Normal de Dados — o desvio padrão é o parâmetro central da distribuição normal
- Escala — estratégias mais amplas de escalonamento de atributos além da padronização
- Distribuição de Dados — visualizando dispersão e identificando assimetria