O desvio padrão caracteriza a dispersão entre os dados em determinada população ou amostra. Esse índice de variação mede a dispersão em torno da média.
Pode ser encontrado simplesmente tirando a raiz quadrada do valor da variância.


Dados NÃO agrupados

Fórmula para amostras:
$$
\large \begin{matrix} s = \sqrt{\dfrac{\sum_{i=1}^{n}(x_{i}-\bar{x})^2}{n-1}}\\
\small ou \\
\large s = \sqrt{\dfrac{\sum_{i=1}^{n}(x_{i}-\bar{x})^2}{\sum_{i=1}^{n}f_{i}-1}} \end{matrix}
$$
Fórmula para populações:
$$
\large \begin{matrix} \sigma = \sqrt{\dfrac{\sum_{i=1}^{N}(x_{i}-\mu)^2}{N}}\\
\small ou \\
\large \sigma = \sqrt{\dfrac{\sum_{i=1}^{N}(x_{i}-\mu)^2}{\sum_{i=1}^{N}f_{i}}} \end{matrix}
$$

Sendo:

  • $s$: desvio padrão da amostra
  • $\sigma$: desvio padrão da população
  • $x_{i}$: cada dado da série de dados
  • $\bar{x}$ ou $\mu$: média aritmética do conjunto de dados
  • $n – 1$: total de elementos da amostra (Correção de Bessel)
  • $N$: total de elementos da população

Python :

# Amostras
s = (sum(list(map(lambda x: ((x - m)**2), val))) / (len(val) - 1))**0.5

# Populações
s = (sum(list(map(lambda x: ((x - m)**2), val))) / len(val))**0.5

Julia :

# Amostras
s = sum(((val .- m).^2) / (length(val)-1))^0.5

# Populações
s = sum(((val .- m).^2) / length(val))^0.5

Libs:

Linguagem Biblioteca Função
Python Numpy np.std(values, ddof= 0 ou 1)
* ddof = 0 (default): desvio padrão populacional
* ddof = 1: desvio padrão amostral
Statistics st.stdev( values )amostras
st.pstdev( values )populações
Julia Statistics std(val, corrected=true)amostras
std(val, corrected=false)populações
StatsBase std(val, corrected=true)amostras
std(val, corrected=false)populações

Interpretação do desvio padrão ( Regra Empírica )

  • O intervalo ($\bar{x}$ ± $s$) ou ($\mu$ ± $\sigma$) contém entre 60% e 80% de todas as observações. A porcentagem aproxima de 70% para distribuições aproximadamente simétricas, chegando a 90% para distribuições fortemente simétricas.

  • O intervalo ($\bar{x}$ ± $2s$) ou ($\mu$ ± $2 \sigma$) contém aproximadamente 95% das observações para distribuições simétricas e aproximadamente 100% para distribuições com assimetria elevada.

  • O intervalo ($\bar{x}$ ± $3s$) ou ($\mu$ ± $3 \sigma$) contém aproximadamente 100% das observações, para distribuições simétricas.


Exemplo
Determine o valor do desvio padrão do conjunto de dados Z = {1, 18, 27, 35, 43, 52, 69}. Considere esse conjunto como uma população e como a amostra de uma população.

Python

''' Sem o uso de bibliotecas '''

lista = [1, 18, 27, 35, 43, 52, 69]

# encontrando a media
m = sum(lista) / len(lista)

# Calculando o desvio padrão amostral
s1 = (sum(list(map(lambda x: (x - m)**2, lista))) / (len(lista) - 1))**0.5

# Calculando o desvio padrão populacional
s2 = (sum(list(map(lambda x: (x - m)**2, lista))) / len(lista))**0.5

print(f'Desvio padrão amostral: {s1}')
print(f'Desvio padrão populacional: {s2}')

''' Usando o Numpy '''

import numpy as np

lista = [1, 18, 27, 35, 43, 52, 69]

# Calculando o desvio padrão amostral
s1 = np.std(lista, ddof=1)

# Calculando o desvio padrão populacional
s2 = np.std(lista)

print(f'Desvio padrão amostral: {s1}')
print(f'Desvio padrão populacional: {s2}')

Julia

" Sem o uso de bibliotecas "

val = [1, 18, 27, 35, 43, 52, 69]

# encontrando a media
m = sum(val) / length(val)

# Calculando o desvio padrão amostral
s1 = sum((val .- m).^2 / (length(val)-1))^0.5

# Calculando o desvio padrão populacional
s2 = sum((val .- m).^2 / length(val))^0.5


Dados agrupados SEM intervalos de classe

Fórmula para amostras:
$$
\large \begin{matrix} s = \sqrt{\dfrac{\sum_{i=1}^{n}(x_{i}-\bar{x})^2 \cdot f_{i}}{n-1}}\\
\small ou \\
\large s = \sqrt{\dfrac{\sum_{i=1}^{n}(x_{i}-\bar{x})^2 \cdot f_{i}}{\sum_{i=1}^{n}f_{i}-1}} \end{matrix}
$$
Fórmula para populações:
$$
\large \begin{matrix} \sigma = \sqrt{\dfrac{\sum_{i=1}^{N}(x_{i}-\mu)^2 \cdot f_{i}}{N}}\\
\small ou \\
\large \sigma = \sqrt{\dfrac{\sum_{i=1}^{N}(x_{i}-\mu)^2 \cdot f_{i}}{\sum_{i=1}^{N}f_{i}}} \end{matrix}
$$

Sendo:

  • $s$: desvio padrão da amostra
  • $\sigma$: desvio padrão da população
  • $x_{i}$: cada dado da série de dados
  • $\bar{x}$ ou $\mu$: média aritmética do conjunto de dados
  • $f_{i}$: frequência simples da classe do dado da série
  • $n – 1$: total de elementos da amostra (Correção de Bessel)
  • $N$: total de elementos da população

Python :

''' Amostras '''

# Encontrando a media
m = sum(list(map(lambda x, f: (x * f), val, freq))) / sum(freq)
# Calculando o desvio padrão amostral
s = (sum(list(map(lambda x, f: ((x - m)**2) * f, val, freq))) / (sum(freq) - 1))**0.5

''' Populações '''

# Encontrando a media
m = sum(list(map(lambda x, f: (x * f), val, freq))) / sum(freq)
# Calculando o desvio padrão populacional
s = (sum(list(map(lambda x, f: ((x - m)**2) * f, val, freq))) / sum(freq))**0.5

Julia :

""" Amostras """

# Encontrando a media
m = sum(val .* freq) / sum(freq)
# Calculando o desvio padrão amostral
s = sum(((val .- m).^2) .*freq / (sum(freq)-1))^0.5

""" Populações """

# Encontrando a media
m = sum(val .* freq) / sum(freq)
# Calculando o desvio padrão populacional
s = sum(((val .- m).^2) .*freq / sum(freq))^0.5

Libs:

Linguagem Biblioteca Função
Julia StatsBase Amostras

std(val, FrequencyWeights(freq), corrected=true)

Populações

std(val, FrequencyWeights(freq), corrected=false)


Exemplo
A tabela a seguir se refere à distribuição de frequências das notas dos alunos da turma “A” da disciplina de Estatística e Probabilidade, já trabalhada anteriormente.
Considerando esses dados como uma amostra e como uma população, calcule o desvio padrão.

Notas 345678910
Frequências146910956

 

Python

val = [3, 4, 5, 6, 7, 8, 9, 10]
freq = [1, 4, 6, 9, 10, 9, 5, 6]

m = sum(list(map(lambda x, f: (x * f), val, freq))) / sum(freq)
s1 = (sum(list(map(lambda x, f: ((x - m)**2) * f, val, freq))) / (sum(freq)-1))**0.5
s2 = (sum(list(map(lambda x, f: ((x - m)**2) * f, val, freq))) / sum(freq))**0.5

print(f'Desvio padrão amostral: {s1}')
print(f'Desvio padrão populacional: {s2}')

''' Usando o Numpy '''

import numpy as np

dicio = {3: 1, 4: 4, 5: 6, 6: 9, 7: 10, 8: 9, 9: 5, 10: 6}

# Convertendo os valores do dicionário em uma lista com todos os valores
lista = [k for k, v in dicio.items() for _ in range(v)]

s1 = np.std(lista, ddof=1) # desvio padrão amostral
s2 = np.std(lista) # desvio padrão populacional

print(f'Desvio padrão amostral: {s1}')
print(f'Desvio padrão populacional: {s2}')

Julia

val = [3, 4, 5, 6, 7, 8, 9, 10]
freq = [1, 4, 6, 9, 10, 9, 5, 6]

m = sum(val .* freq) / sum(freq)
s1 = sum(((val .-m).^2) .*freq / (sum(freq)-1))^0.5
s2 = sum(((val .-m).^2) .*freq / sum(freq))^0.5

Dados agrupados COM intervalos de classe

Fórmula para amostras:
$$
\large \begin{matrix} s = \sqrt{\dfrac{\sum_{i=1}^{n}(pm_{i}-\bar{x})^2 \cdot f_{i}}{n-1}}
\small ou \\
\large s = \sqrt{\dfrac{\sum_{i=1}^{n}(pm_{i}-\bar{x})^2 \cdot f_{i}}{\sum_{i=1}^{n}f_{i}-1}} \end{matrix}
$$
Fórmula para populações:
$$
\large \begin{matrix} \sigma = \sqrt{\dfrac{\sum_{i=1}^{N}(pm_{i}-\mu)^2 \cdot f_{i}}{N}}
\small ou \\
\large \sigma = \sqrt{\dfrac{\sum_{i=1}^{N}(pm_{i}-\mu)^2 \cdot f_{i}}{\sum_{i=1}^{N}f_{i}}} \end{matrix}
$$

Sendo:

  • $s$: desvio padrão da amostra
  • $\sigma$: desvio padrão da população
  • $pm_{i}$: valor médio de cada intervalo de classe, da série de dados
  • $\bar{x}$ ou $\mu$: média aritmética do conjunto de valores médios
  • $f_{i}$: frequência de cada intervalo de classe
  • $n – 1$: total de elementos da amostra (Correção de Bessel)
  • $N$: total de elementos da população

Python :

''' Amostras '''

# Lista de valores com valor médio de cada dado dos intervalos de classe
pm = list(map(lambda x: (float(x.split(' - ')[0]) + float(x.split(' - ')[1])) / 2, dicio.keys()))

# Encontrando a media
m = sum(list(map(lambda x, f: (x * f), pm, freq))) / sum(freq)
# Calculando o desvio padrão amostral
s = (sum(list(map(lambda x, f: ((x - m)**2) * f, pm, freq))) / (sum(freq) - 1))**0.5

''' Populações '''

# Lista de valores com valor médio de cada dado dos intervalos de classe
pm = list(map(lambda x: (float(x.split(' - ')[0]) + float(x.split(' - ')[1])) / 2, dicio.keys()))

# Encontrando a media
m = sum(list(map(lambda x, f: (x * f), pm, freq))) / sum(freq)
# Calculando o desvio padrão populacional
s = (sum(list(map(lambda x, f: ((x - m)**2) * f, pm, freq))) / sum(freq))**0.5

Julia :

""" Amostras """

# Ponto médio de cada intervalo (mantendo a correspondência com a ordem das frequências)
pm_freq_pairs = [(parse(Float64, split(interval, " - ")[1]) + parse(Float64, split(interval, " - ")[2])) / 2 => freq for (interval, freq) in dicionario]

# Separar pontos médios (pm) e frequências (freq) em vetores alinhados
pm = [pair[1] for pair in pm_freq_pairs]
freq = [pair[2] for pair in pm_freq_pairs]

# Cálculos do desvio padrão amostral (s1) e populacional (s2)

# Calculando a Média ponderada
m = sum(pm .* freq) / sum(freq)
# Calculando o Desvio padrão amostral
s = sqrt(sum(((pm .- m) .^ 2) .* freq) / (sum(freq) - 1))  

""" Populações """

# Ponto médio de cada intervalo (mantendo a correspondência com a ordem das frequências)
pm_freq_pairs = [(parse(Float64, split(interval, " - ")[1]) + parse(Float64, split(interval, " - ")[2])) / 2 => freq for (interval, freq) in dicionario]

# Separar pontos médios (pm) e frequências (freq) em vetores alinhados
pm = [pair[1] for pair in pm_freq_pairs]
freq = [pair[2] for pair in pm_freq_pairs]

# Cálculos do desvio padrão amostral (s1) e populacional (s2)

# Calculando a Média ponderada
m = sum(pm .* freq) / sum(freq)
# Calculando o Desvio padrão populacional
s = sqrt(sum(((pm .- m) .^ 2) .* freq) / sum(freq))

Exemplo

Notas Frequências
59.0 – 61.53
61.5 – 64.05
64.0 – 66.55
66.5 – 69.07
69.0 – 71.59
71.5 – 74.011
74.0 – 76.58
76.5 – 79.07
79.0 – 81.55
81.5 – 84.06
84.0 – 86.54

A tabela ao lado mostra o resultado da pesagem de 70 pessoas adultas que utilizaram em um mesmo dia a balança de uma farmácia.


Determine o valor do desvio padrão e realize os cálculos considerando a distribuição de frequências como uma amostra e como uma população.

Python

dicio = {'59.0 - 61.5':3,'61.5 - 64.0':5,'64.0 - 66.5':5,'66.5 - 69.0':7,
       '69.0 - 71.5':9,'71.5 - 74.0':11,'74.0 - 76.5':8,'76.5 - 79.0':7,
       '79.0 - 81.5':5,'81.5 - 84.0':6,'84.0 - 86.5':4}

# lista de valores com ponto média dos intervalos de classe
pm = list(map(lambda x: (float(x.split(' - ')[0]) + float(x.split(' - ')[1])) / 2, dicio.keys()))

# lista de frequências
freq = list(dicio.values())

m = sum(list(map(lambda x, f: (x * f), pm, freq))) / sum(freq)
s1 = (sum(list(map(lambda x, f: ((x - m)**2) * f, pm, freq))) / (sum(freq)-1))**0.5
s2 = (sum(list(map(lambda x, f: ((x - m)**2) * f, pm, freq))) / sum(freq))**0.5

print(f'Desvio padrão amostral: {s1}')
print(f'Desvio padrão populacional: {s2}')

Julia

dicionario = Dict("59.0 - 61.5"=>3,"61.5 - 64.0"=>5,"64.0 - 66.5"=>5,"66.5 - 69.0"=>7,"69.0 - 71.5"=>9,"71.5 - 74.0"=>11, "74.0 - 76.5"=>8,"76.5 - 79.0"=>7,"79.0 - 81.5"=>5,"81.5 - 84.0"=>6,"84.0 - 86.5"=>4)

# Ponto médio de cada intervalo (mantendo a correspondência com a ordem das frequências)
pm_freq_pairs = [(parse(Float64, split(interval, " - ")[1]) + parse(Float64, split(interval, " - ")[2])) / 2 => freq for (interval, freq) in dicionario]

pm = [pair[1] for pair in pm_freq_pairs]
freq = [pair[2] for pair in pm_freq_pairs]

m = sum(pm .* freq) / sum(freq)
s1 = sqrt(sum(((pm .- m) .^ 2) .* freq) / (sum(freq) - 1))
s2 = sqrt(sum(((pm .- m) .^ 2) .* freq) / sum(freq))  

println("Desvio padrão amostral: $(s1)")
println("Desvio padrão populacional: $(s2)")