W3docs

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   = √variance

Desvio padrão populacional vs. amostral

TermoDivisor da fórmulaQuando usar
Desvio padrão populacionalNVocê possui todos os pontos de dados (ex.: todas as notas de uma turma)
Desvio padrão amostralN − 1Você 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.81

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

python— editable, runs on the server

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.

python— editable, runs on the server

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

describe() 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.000000

Desvio 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) / std

O 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.43

O 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çãoFerramenta recomendada
Cálculo rápido, sem dependênciasstatistics.stdev() / statistics.pstdev()
Operações com arrays ou matrizesnumpy.std()
Estatísticas de colunas em DataFramepandas.DataFrame.std()
Pré-processamento de atributos de MLsklearn.preprocessing.StandardScaler

Erros Comuns

  • ddof incorreto: NumPy usa ddof=0 por padrão (população), enquanto pandas usa ddof=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() retorna 0.0 silenciosamente.
  • Ajustar o scaler nos dados de teste: sempre chame scaler.fit_transform() no conjunto de treinamento e scaler.transform() (não fit_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

Was this page helpful?