A variância é uma medida estatística que quantifica o grau de dispersão ou variação dos dados em relação à média, indicando o nível de heterogeneidade no conjunto. Se os dados estiverem muito próximos à média, a variância será baixa, se estiverem espalhados, será alta. Em termos simples, a variância nos diz o quanto os valores de um conjunto de dados estão espalhados.



Propriedades da Variância:

  • Sempre positiva: Como os desvios são elevados ao quadrado, a variância não pode ser negativa.
  • Unidade ao quadrado: A unidade da variância é o quadrado da unidade dos dados. Por exemplo, se os dados estão em metros, a variância será $large m^{2}$.
  • Dependência do desvio da média: Um conjunto de dados mais espalhado terá maior variância.

Dados NÃO agrupados

Fórmulas:

$$Amostras: \large s^2= \frac{\sum_{i=1}^{n}(x_{i}- \bar{x})^2}{n-1}$$

$$Populações: \large \sigma^2= \frac{\sum_{i=1}^{n}(x_{i}- \mu)^2}{N}$$

Sendo:

  • $s^{2}:$ variância da amostra
  • $\sigma^{2}:$ variância da população
  • $x_{i}:$ cada dado da série de dados
  • $\bar{x}:$ média aritmética da amostra
  • $\mu:$ média aritmética da população
  • $n – 1:$ total de elementos da amostra (Correção de Bessel)
  • $N:$ total de elementos da população

Python:

''' Amostras '''
s2_a = sum(list(map(lambda x: (x - m)**2 , values))) / (len(values) - 1)

''' Populações '''
s2_p = sum(list(map(lambda x: (x - m)**2 , values))) / len(values)

Julia:

""" Amostras """
s2_a = sum((valor .- m).^2) / (n - 1)

""" Populações """
s2_p = sum((valor .- m).^2) / n

Libs:

Linguagem Biblioteca Função
Python Numpy np.var( values, ddof = 0 ou 1 )

* ddof = 0 (default): desvio padrão populacional
* ddof = 1: desvio padrão amostral
Statistics amostras
st.variance( values )

populações
st.pvariance( values )
Julia StatsBase var(values)
Statistics
Distributions
OnlineStats o = Variance()
fit!(o, values)
value(o)

Exemplos

Determinar a variância do conjunto de dados Z = {1, 18, 27, 35, 43, 52, 69}, considerando-o como sendo uma população e como sendo uma amostra de uma população.

Python

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

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

# Calculando a variância amostral
s2_a = sum(list(map(lambda x: (x - m)**2, lista))) / (len(lista) - 1)

# Calculando a variância populacional
s2_p = sum(list(map(lambda x: (x - m)**2, lista))) / len(lista)

print(f'Variância amostral: {s2_a}')
print(f'Variância populacional: {s2_p}')

''' Usando o Numpy '''

# Calculando a variância amostral
s2_a = np.var(lista, ddof=1)

# Calculando a variância populacional
s2_p = np.var(lista)

print(f'Variância amostral: {s2_a}')
print(f'Variância populacional: {s2_p}')

Julia

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

# encontrando o número de elementos do conjunto de dados e a média
n = length(valor)
m = sum(valor) / length(valor)

# Calculando a variância amostral
s2_a = sum((valor .- m).^2) / (n - 1)

# Calculando a variância populacional
s2_p = sum((valor .- m).^2) / n


Dados agrupados SEM intervalos de classe

Fórmulas:

$$Amostras: \large s^2= \frac{\sum_{i=1}^{n}(x_{i}- \bar{x})^2 \cdot f_{i}}{n-1}$$

$$Populações: \large \sigma^2= \frac{\sum_{i=1}^{n}(x_{i}- \mu)^2 \cdot f_{i}}{N}$$

Sendo:

  • $s^{2}:$ variância da amostra
  • $\sigma^{2}:$ variância da população
  • $x_{i}:$ cada dado da série de dados
  • $\bar{x}:$ média aritmética da amostra
  • $\mu:$ média aritmética da população
  • $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 '''
s2_a = sum(list(map(lambda x, f: ((x - m)**2) * f, val, freq))) / (sum(freq) - 1)

''' Populações '''
s2_p = sum(list(map(lambda x, f: ((x - m)**2) * f, val, freq))) / sum(freq)

Julia:

""" Amostras """
s2_a = sum(((pm .- m).^2) .*freq) / (n - 1)

""" Populações """
s2_p = sum(((pm .- m).^2) .*freq) / n

Exemplos

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.

Notas Frequências
31
44
56
69
710
89
95
106

Considerando esses dados como uma amostra e como uma população, calcule a variância.

Python

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

# Encontrando a media
m = sum(list(map(lambda x, f: (x * f), val, freq))) / sum(freq)

# Calculando a variância amostral
s2_a = sum(list(map(lambda x, f: ((x - m)**2) * f, val, freq))) / (sum(freq)-1)

# Calculando a variância populacional
s2_p = sum(list(map(lambda x, f: ((x - m)**2) * f, val, freq))) / sum(freq)

print(f'Variância amostral: {s2_a}')
print(f'Variância populacional: {s2_p}')

''' Usando o Numpy '''

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

# Calculando a variância amostral
s2_a = np.var(lista, ddof=1)

# Calculando a variância populacional
s2_p = np.var(lista)

print(f'Variância amostral: {s2_a}')
print(f'Variância populacional: {s2_p}')

Julia

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

# Encontrando o número de elementos do conjunto de dados
n = sum(freq)

# Encontrando a media
m = sum(val .* freq) / sum(freq)

# Calculando a variância amostral
s2_a = sum(((val .- m).^2) .*freq) / (n - 1)

# Calculando a variância populacional
s2_p = sum(((val .- m).^2) .*freq) / n

Dados agrupados COM intervalos de classe

Exemplos

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

Peso (em Kg) Quantidade de pessoas
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

Determinar a variância e realizar 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}

# Para calcular a variância de um conjunto de dados com intervalos de classe, primeiro é necessário encontrar o ponto médio de cada intervalo 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())

# Encontrando a media
m = sum(list(map(lambda x, f: (x * f), pm, freq))) / sum(freq)

# Calculando a variância amostral
s2_a = sum(list(map(lambda x, f: ((x - m)**2) * f, pm, freq))) / (sum(freq)-1)

# Calculando a variância populacional
s2_p = sum(list(map(lambda x, f: ((x - m)**2) * f, pm, freq))) / sum(freq)

print(f'Variância amostral: {s2_a}')
print(f'Variância populacional: {s2_p}')

Julia

dicio = 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)

# Para calcular a variância de um conjunto de dados com intervalos de classe, primeiro é necessário encontrar o ponto médio de cada intervalo de classe.

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

# Vetor de valores com o ponto médio dos intervalos de classe
pm_freq_pairs = [(parse(Float64, split(interval, " - ")[1]) + parse(Float64, split(interval, " - ")[2])) / 2 => freq for (interval, freq) in dicio]

# vetor com os pontos médios
pm = [pair[1] for pair in pm_freq_pairs]

# vetor com as frequências
freq = [pair[2] for pair in pm_freq_pairs]

n = sum(freq)
m = sum(pm .* freq) / sum(freq)

s2_a = sum(((pm .- m).^2) .*freq) / (n - 1)
s2_p = sum(((pm .- m).^2) .*freq) / n