O Desvio médio, desvio médio absoluto ou desvio absoluto de um elemento, de um conjunto de dados, é a diferença absoluta entre este elemento e um ponto dado. Comparado com o Desvio Padrão, o Desvio Médio é mais simples de calcular e menos influenciado por outliers, tornando-o útil em conjuntos de dados com valores extremos.


Características

  • O desvio médio representa a distância média entre os valores individuais de um conjunto e sua média.
  • É sempre não negativo.
  • Quanto menor o valor do desvio médio, mais próximos os dados estão da média. Valores maiores indicam maior dispersão.

Dados NÃO agrupados

Fórmula:
$$\large D_{m} = \frac{\sum_{i=1}^{n} | x_{i}-\bar{x} |}{n}$$

Sendo:

  • $Dm:$ desvio-médio
  • $| |:$ módulo, absoluto (transforma todos os números em positivos)
  • $x_{i}:$ cada dado da série de dados
  • $\bar{x}:$ média aritmética do conjunto de dados
  • $n:$ total de elementos da amostra ou população

Python:

# Total de elementos do conjunto de dados
n = len(lista)

# Calculando a média (m)
m = int(sum(lista)/len(lista))

# Encontrando o desvio médio (Dm)
Dm = sum(list(map(lambda x: abs(x - m), values)))/n

Julia:

# Total de elementos do conjunto de dados
n = length(valor)

# Calculando a média (m)
m = sum(valor) / n

# Encontrando o desvio médio (Dm)
Dm = sum(abs.(valor .- m)) / n

Libs:

Linguagem Biblioteca Função
Python Numpy np.mean(np.absolute(values - np.mean(values)))
Julia StatsBase mean(abs.(values .- mean(values)))
Statistics

Exemplos

Python

''' Utilizando somente o Python'''

lista = [2, 3, 6, 8, 11]

n = len(lista)
m = int(sum(lista)/len(lista))

Dm = sum(list(map(lambda x: abs(x - m) , lista)))/n

print(Dm)

''' Utilizando o Numpy'''
import numpy as np

lista = [2, 3, 6, 8, 11]

Dm = np.mean(np.absolute(lista - np.mean(lista)))

print(Dm)

''' Utilizando o Pandas'''
import pandas as pd

lista = [2, 3, 6, 8, 11]

# Descobrindo os valores da média e a quantidade de elementos total
n = len(lista)
m = int(sum(lista)/len(lista))

# Criando o dataframe
df = pd.DataFrame(lista, columns=['num'])

# Aplicando a fórmula
Dm = df.num.apply(lambda x: abs(x - m)).sum() / n 

print(Dm)

Julia

valor = [2, 3, 6, 8, 11]

n = length(valor)
m = sum(valor) / n

Dm = sum(abs.(valor .- m)) / n


Dados agrupados SEM intervalos de classe

Fórmula:
$$\large D_{m} = \frac{\sum_{i=1}^{n} (| x_{1}-\bar{x} | \cdot f_{i})}{n}$$


Sendo:

  • $D_{m}:$ desvio-médio
  • $| |:$ módulo, absoluto (transforma todos os números em positivos)
  • $x_{i}:$ cada dado da série de dados
  • $f_{i}:$ cada frequência da série de dados
  • $\bar{x}:$ média aritmética do conjunto de dados e suas frequências
  • $n:$ total de elementos da frequência

Python :

# Total de frequências
n = sum(freq)

# Calculando a média (m)
m = sum(list(map(lambda x, y: x * y, num, freq)))/n

# Encontrando o desvio médio (Dm)
Dm = sum(list(map(lambda x, y: abs(x - m)*y, num, freq)))/nv

Julia:

# Total de frequências
n = sum(freq)

# Calculando a média (m)
m = sum(valor .* freq) / n

# Encontrando o desvio médio (Dm)
Dm = sum(abs.(valor .- m) .* freq) / n


Exemplos

Calcule o desvio médio para a distribuição de frequências de idades a seguir:

Idades Frequências
24
35
49
56
Total24

Python

''' Utilizando somente o Python '''

num = [2, 3, 4, 5]
freq = [4, 5, 9, 6]

# Encontrando o número de elementos total (n) e a média (m)
n = sum(freq)
m = sum(list(map(lambda x, y: x * y, num, freq))) / n

# Encontrando o desvio médio
Dm = sum(list(map(lambda x, y: abs(x - m) * y, num, freq))) / n

''' Convertendo o resultado em um valor temporal '''
# Como o resultado foi abaixo de 1, consideremos que o tempo é menor que 1 ano

# Descobrindo os meses
meses = 12 * Dm
resto_meses = meses - int(meses)

# Descobrindo os dias
dias = 30 * resto_meses
resto_dias = dias - int(dias)

# Descobrindo as horas
horas = 24 * resto_dias

print(f'Desvio médio: {Dm}')
print(f'Resposta: {int(meses)} meses, {int(dias)} dias e {int(horas)} horas')

''' Utilizando o Pandas '''

import pandas as pd

dicio = {2: 4, 3: 5, 4: 9, 5: 6}

df = pd.DataFrame(dicio.items(), columns=['Idades', 'Frequências'])

# Encontrando o número de elementos total (n)
n = sum(df['Frequências'])

# Encontrando a média (m)
m = sum(df['Idades'] * df['Frequências']) / n

# Acrescentando as colunas com o módulo de xi - m e o módulo multiplicado pela frequência de cada valor
df['|xi - m|'] = list(abs(df['Idades'] - m))
df['|xi - m| * fi'] = df['|xi - m|'] * df['Frequências']

# Encontrando o desvio médio
Dm = df['|xi - m| * fi'].sum() / n

print(Dm)

''' Utilizando o Numpy '''

import numpy as np

dicio = {2: 4, 3: 5, 4: 9, 5: 6}

lista = list(k for k, v in dicio.items() for _ in range(v))

Dm = np.mean(np.absolute(lista - np.mean(lista)))

print(Dm)

Julia

valor = [2, 3, 4, 5]
freq = [4, 5, 9, 6]

# Total de frequências
n = sum(freq)

# Calculando a média (m)
m = sum(valor .* freq) / n

# Encontrando o desvio médio (Dm)
Dm = sum(abs.(valor .- m) .* freq) / n

# Descobrindo os meses
meses = 12 * Dm
resto_meses = meses - trunc(Int, meses)

# Descobrindo os dias
dias = 30 * resto_meses
resto_dias = dias - trunc(Int, dias)

# Descobrindo as horas
horas = 24 * resto_dias

println("Desvio médio: $Dm")
println("Resposta: $(trunc(Int, meses)) meses, $(trunc(Int, dias)) dias e $(trunc(Int, horas)) horas")

# RESPOSTAS:
# Desvio médio: 0.8645833333333334
# Resposta: 10 meses, 11 dias e 6 horas

Dados agrupados COM intervalos de classe

Fórmula:
$$\large D_{m} = \frac{\sum_{i=1}^{n} (| x_{i}-\bar{x} | \cdot f_{i})}{n}$$

Sendo:

  • $D_{m}:$ desvio-médio
  • $| |:$ módulo, absoluto (transforma todos os números em positivos)
  • $x_{i}:$ cada dado da série de dados
  • $f_{i}:$ cada frequência da série de dados
  • $\bar{x}:$ média aritmética do conjunto de dados e suas frequências
  • $n$: total de elementos da frequência

Python :

# Encontrando o ponto médio (a média) de cada intervalo de classe
pm = list((float(k.split( ' - ' )[0])+ float(k.split( ' - ' )[1])) / 2 for k in list(dicionario.keys()))

# Criando uma lista de frequências
freq = list(dicionario.values())

# Total de frequências
n = sum(freq)

# Calculando a média (m)
m = sum(list(map(lambda x, y: abs(x*y), pm, freq)))/n

# Encontrando o desvio médio
Dm = sum(list(map(lambda x, y: abs(x - m)*y, pm, freq)))/n

Julia:

# Encontrando o ponto médio (a média) de cada intervalo de classe
pm = [(parse(Float64, split(interval, " - ")[1]) + parse(Float64, split(interval, " - ")[2])) / 2 for (interval, freq) in dicionario]

# Encontrando as frequências
freq = values(dicionario)

# Total de frequências
n = sum(freq)

# Calculando a média (m)
m = sum(valor .* freq) / n

# Encontrando o desvio médio (Dm)
Dm = sum(abs.(valor .- m) .* freq) / n


Exemplos

 Determine o valor do desvio médio da distribuição de idades com intervalos de classe a seguir.

Idades Frequências
10 – 155
15 – 2010
20 – 2515
25 – 3015
30 – 3520
35 – 4010
Total75

Python

''' Utilizando somente o Python '''

dicio = {'10 - 15': 5, '15 - 20': 10, '20 - 25': 15, '25 - 30': 15, '30 - 35': 20, '35 - 40': 10}

# Encontrando o ponto médio
pm = list(map(lambda x: (int(x.split(' - ')[0]) + int(x.split(' - ')[1])) / 2, dicio.keys()))

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

# Total de frequências (n) e a média (m)
n = sum(freq)
m = sum(list(map(lambda x, y: abs(x*y), pm, freq)))/n

# Encontrando o desvio médio
Dm = sum(list(map(lambda x, y: abs(x - m)*y, pm, freq)))/n

''' Convertendo o resultado em um valor temporal '''
# Como o resultado foi acima de 1, sabemos que o tempo é maior que 1 ano.

# Descobrindo os anos
anos = int(Dm)
resto_a = Dm - anos

# Descobrindo os meses
meses = int(12 * resto_a)
resto_m = 12 * resto_a - meses

# Descobrindo os dias
dias = int(30 * resto_m)

print(f'Desvio médio: {Dm}')
print(f'Resposta: {int(anos)} anos, {int(meses)} mês e {int(dias)} dias')

Julia

dicionario = Dict("10 - 15"=>5, "15 - 20"=>10, "20 - 25"=>15, "25 - 30"=>15, "30 - 35"=> 20, "35 - 40"=>10)

# 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]

# Separando os pontos médios (as médias) de cada intervalo de classe
pm = [pair[1] for pair in pm_freq_pairs]

# Separando os valores das frequências
freq = [pair[2] for pair in pm_freq_pairs]

# Total de frequências (n) e a média (m)
n = sum(freq)
m = sum(pm .* freq) / n

# Encontrando o desvio médio
Dm = sum(abs.(pm .- m) .* freq) / n

# Descobrindo os meses
anos = trunc(Int, Dm)
resto_a = Dm - anos

# Descobrindo os meses
meses = trunc(Int, 12 * resto_a)
resto_m =  12 * resto_a - meses

# Descobrindo os dias
dias = trunc(Int, 30 * resto_m)

println("Desvio médio: $Dm")
println("Resposta: $(trunc(Int, anos)) anos, $(trunc(Int, meses)) mês e $(trunc(Int, dias)) dias")

# RESPOSTAS:
# Desvio médio: 6.133333333333334
# Resposta: 6 anos, 1 mês e 18 dias