Prévia do material em texto
Medidas de Posição e Dispersão.
Estatística Descritiva
A Estatística Descritiva é o ramo da estatística que se ocupa em coletar, organizar, resumir e
apresentar dados de forma significativa. Seu objetivo principal é descrever as características de
um conjunto de dados por meio de tabelas, gráficos e medidas numéricas, facilitando a
compreensão e a análise inicial dos fenômenos estudados. Ela não tira conclusões sobre a
população, mas sim organiza e sumariza as informações existentes.
Base dados
import numpy as np
import math
import statistics
import pandas as pd
from scipy import stats
data = np.array([150, 151, 152, 152, 153, 154, 155, 155, 155, 155,
156, 156, 156,
157, 158, 158, 160, 160, 160, 160, 160, 161, 161,
161, 161, 162,
163, 163, 164, 164, 164, 165, 166, 167, 168, 168,
169, 170, 172,
173])
Medidas de Posição para Dados Não Agrupados
Média, Mediana e Moda
Estas são as medidas de tendência central mais comuns, que buscam representar o valor 'típico'
ou central de um conjunto de dados:
• Média: É a soma de todos os valores de um conjunto de dados dividida pelo número total
de valores. É a medida mais utilizada, mas é sensível a valores extremos (outliers).
X́=
∑ x i
n
• Mediana: É o valor central de um conjunto de dados quando os dados estão ordenados
em ordem crescente ou decrescente. Se o número de dados for ímpar, é o valor do meio.
Se for par, é a média dos dois valores centrais. É menos afetada por outliers que a média.
– Quando é par
Mediana=x
( n+12 )
– Quando é impar:
Mediana=
x
( n2 )
+x
( n2+1)
2
• Moda: É o valor que mais aparece em um conjunto de dados. Um conjunto de dados pode
ter uma moda (unimodal), várias modas (multimodal) ou nenhuma moda.
Média aritmética simples
data.sum() / len(data)
np.float64(160.375)
data.mean()
np.float64(160.375)
statistics.mean(data)
np.int64(160)
Moda
statistics.mode(data)
np.int64(160)
stats.mode(data)
ModeResult(mode=np.int64(160), count=np.int64(5))
Mediana
# Odd (Impar)
odd_data = [150, 151, 152, 152, 153, 154, 155, 155, 155]
position = len(odd_data) / 2
position
4.5
odd_position = math.ceil(position)
odd_position
5
value = odd_data[odd_position - 1]
value
153
# Even (Par)
even_position = len(data) // 2
even_position
20
data[even_position - 1], data[even_position]
(np.int64(160), np.int64(160))
median = (data[even_position - 1] + data[even_position]) / 2
median
np.float64(160.0)
# Using library
print(f"numpy.median: {np.median(data)}")
print(f"statistics.median odd: {statistics.median(odd_data)}")
print(f"statistics.median even: {statistics.median(data)}")
numpy.median: 160.0
statistics.median odd: 153
statistics.median even: 160.0
Média Aritmética Ponderada
A Média Aritmética Ponderada é um tipo de média que atribui diferentes pesos a cada valor em
um conjunto de dados, refletindo a importância relativa de cada valor. É calculada multiplicando
cada valor pelo seu peso correspondente, somando esses produtos e, em seguida, dividindo
essa soma pela soma de todos os pesos.
É amplamente utilizada em situações onde nem todos os dados têm a mesma relevância, como
no cálculo de notas em que diferentes avaliações têm pesos distintos ou na média de preços de
produtos com diferentes volumes de venda.
X́ w=
∑
i=1
n
(xi ⋅w i )
∑
i=1
n
w i
Onde:
• X́ w é a média aritmética ponderada.
• x i é o i-ésimo valor do conjunto de dados.
• w i é o peso atribuído ao i-ésésimo valor.
• n é o número total de valores.
# manual
score = np.array([9,8,7,3])
weight = np.array([1,2,3,4])
weighted_average = (score * weight).sum() / weight.sum()
weighted_average
np.float64(5.8)
# Numpy
np.average(score, weights=weight)
np.float64(5.8)
Medidas de Posição para Dados Agrupados
Criando o Dataset
Quando trabalhamos com dados agrupados em classes de frequência, as medidas de posição
(média, mediana e moda) são calculadas de maneira um pouco diferente, pois não temos acesso
aos valores individuais de cada observação, mas sim aos intervalos e suas respectivas
frequências.
data = {"inferior": [150,154,158,162,166,170],
"superior": [154,158,162,166,170,174],
"fi": [5,9,11,7,5,3]}
dataset = pd.DataFrame(data)
dataset
{"summary":"{\n \"name\": \"dataset\",\n \"rows\": 6,\n \"fields\":
[\n {\n \"column\": \"inferior\",\n \"properties\": {\n
\"dtype\": \"number\",\n \"std\": 7,\n \"min\": 150,\n
\"max\": 170,\n \"num_unique_values\": 6,\n \"samples\":
[\n 150,\n 154,\n 170\n ],\n
\"semantic_type\": \"\",\n \"description\": \"\"\n }\
n },\n {\n \"column\": \"superior\",\n \"properties\":
{\n \"dtype\": \"number\",\n \"std\": 7,\n
\"min\": 154,\n \"max\": 174,\n \"num_unique_values\":
6,\n \"samples\": [\n 154,\n 158,\n
174\n ],\n \"semantic_type\": \"\",\n
\"description\": \"\"\n }\n },\n {\n \"column\":
\"fi\",\n \"properties\": {\n \"dtype\": \"number\",\n
\"std\": 2,\n \"min\": 3,\n \"max\": 11,\n
\"num_unique_values\": 5,\n \"samples\": [\n 9,\n
3,\n 11\n ],\n \"semantic_type\": \"\",\n
\"description\": \"\"\n }\n }\n ]\
n}","type":"dataframe","variable_name":"dataset"}
dataset["xi"] = (dataset["superior"] + dataset["inferior"]) / 2
dataset
{"summary":"{\n \"name\": \"dataset\",\n \"rows\": 6,\n \"fields\":
[\n {\n \"column\": \"inferior\",\n \"properties\": {\n
\"dtype\": \"number\",\n \"std\": 7,\n \"min\": 150,\n
\"max\": 170,\n \"num_unique_values\": 6,\n \"samples\":
[\n 150,\n 154,\n 170\n ],\n
\"semantic_type\": \"\",\n \"description\": \"\"\n }\
n },\n {\n \"column\": \"superior\",\n \"properties\":
{\n \"dtype\": \"number\",\n \"std\": 7,\n
\"min\": 154,\n \"max\": 174,\n \"num_unique_values\":
6,\n \"samples\": [\n 154,\n 158,\n
174\n ],\n \"semantic_type\": \"\",\n
\"description\": \"\"\n }\n },\n {\n \"column\":
\"fi\",\n \"properties\": {\n \"dtype\": \"number\",\n
\"std\": 2,\n \"min\": 3,\n \"max\": 11,\n
\"num_unique_values\": 5,\n \"samples\": [\n 9,\n
3,\n 11\n ],\n \"semantic_type\": \"\",\n
\"description\": \"\"\n }\n },\n {\n \"column\":
\"xi\",\n \"properties\": {\n \"dtype\": \"number\",\n
\"std\": 7.483314773547883,\n \"min\": 152.0,\n \"max\":
172.0,\n \"num_unique_values\": 6,\n \"samples\": [\n
152.0,\n 156.0,\n 172.0\n ],\n
\"semantic_type\": \"\",\n \"description\": \"\"\n }\
n }\n ]\n}","type":"dataframe","variable_name":"dataset"}
dataset["fi.xi"] = dataset["fi"] * dataset["xi"]
dataset
{"summary":"{\n \"name\": \"dataset\",\n \"rows\": 6,\n \"fields\":
[\n {\n \"column\": \"inferior\",\n \"properties\": {\n
\"dtype\": \"number\",\n \"std\": 7,\n \"min\": 150,\n
\"max\": 170,\n \"num_unique_values\": 6,\n \"samples\":
[\n 150,\n 154,\n 170\n ],\n
\"semantic_type\": \"\",\n \"description\": \"\"\n }\
n },\n {\n \"column\": \"superior\",\n \"properties\":
{\n \"dtype\": \"number\",\n \"std\": 7,\n
\"min\": 154,\n \"max\": 174,\n \"num_unique_values\":
6,\n \"samples\": [\n 154,\n 158,\n
174\n ],\n \"semantic_type\": \"\",\n
\"description\": \"\"\n }\n },\n {\n \"column\":
\"fi\",\n \"properties\":{\n \"dtype\": \"number\",\n
\"std\": 2,\n \"min\": 3,\n \"max\": 11,\n
\"num_unique_values\": 5,\n \"samples\": [\n 9,\n
3,\n 11\n ],\n \"semantic_type\": \"\",\n
\"description\": \"\"\n }\n },\n {\n \"column\":
\"xi\",\n \"properties\": {\n \"dtype\": \"number\",\n
\"std\": 7.483314773547883,\n \"min\": 152.0,\n \"max\":
172.0,\n \"num_unique_values\": 6,\n \"samples\": [\n
152.0,\n 156.0,\n 172.0\n ],\n
\"semantic_type\": \"\",\n \"description\": \"\"\n }\
n },\n {\n \"column\": \"fi.xi\",\n \"properties\": {\
n \"dtype\": \"number\",\n \"std\": 458.180168347198,\n
\"min\": 516.0,\n \"max\": 1760.0,\n
\"num_unique_values\": 6,\n \"samples\": [\n 760.0,\n
1404.0,\n 516.0\n ],\n \"semantic_type\":
\"\",\n \"description\": \"\"\n }\n }\n ]\
n}","type":"dataframe","variable_name":"dataset"}
dataset["Fi"] = dataset["fi"].cumsum()
dataset
{"summary":"{\n \"name\": \"dataset\",\n \"rows\": 6,\n \"fields\":
[\n {\n \"column\": \"inferior\",\n \"properties\": {\n
\"dtype\": \"number\",\n \"std\": 7,\n \"min\": 150,\n
\"max\": 170,\n \"num_unique_values\": 6,\n \"samples\":
[\n 150,\n 154,\n 170\n ],\n
\"semantic_type\": \"\",\n \"description\": \"\"\n }\
n },\n {\n \"column\": \"superior\",\n \"properties\":
{\n \"dtype\": \"number\",\n \"std\": 7,\n
\"min\": 154,\n \"max\": 174,\n \"num_unique_values\":
6,\n \"samples\": [\n 154,\n 158,\n
174\n ],\n \"semantic_type\": \"\",\n
\"description\": \"\"\n }\n },\n {\n \"column\":
\"fi\",\n \"properties\": {\n \"dtype\": \"number\",\n
\"std\": 2,\n \"min\": 3,\n \"max\": 11,\n
\"num_unique_values\": 5,\n \"samples\": [\n 9,\n
3,\n 11\n ],\n \"semantic_type\": \"\",\n
\"description\": \"\"\n }\n },\n {\n \"column\":
\"xi\",\n \"properties\": {\n \"dtype\": \"number\",\n
\"std\": 7.483314773547883,\n \"min\": 152.0,\n \"max\":
172.0,\n \"num_unique_values\": 6,\n \"samples\": [\n
152.0,\n 156.0,\n 172.0\n ],\n
\"semantic_type\": \"\",\n \"description\": \"\"\n }\
n },\n {\n \"column\": \"fi.xi\",\n \"properties\": {\
n \"dtype\": \"number\",\n \"std\": 458.180168347198,\n
\"min\": 516.0,\n \"max\": 1760.0,\n
\"num_unique_values\": 6,\n \"samples\": [\n 760.0,\n
1404.0,\n 516.0\n ],\n \"semantic_type\":
\"\",\n \"description\": \"\"\n }\n },\n {\n
\"column\": \"Fi\",\n \"properties\": {\n \"dtype\":
\"number\",\n \"std\": 13,\n \"min\": 5,\n
\"max\": 40,\n \"num_unique_values\": 6,\n \"samples\":
[\n 5,\n 14,\n 40\n ],\n
\"semantic_type\": \"\",\n \"description\": \"\"\n }\
n }\n ]\n}","type":"dataframe","variable_name":"dataset"}
Média para Dados Agrupados
Para calcular a média de dados agrupados, utilizamos o ponto médio de cada classe como uma
estimativa dos valores dentro daquela classe. Cada ponto médio é então ponderado pela
frequência da sua classe.
X́=
∑ ( f i ⋅ x i )
N
Onde:
• X́ é a média.
• f i é a frequência da i-ésima classe.
• x i é o ponto médio da i-ésima classe.
• N é o número total de observações (soma de todas as frequências).
dataset["fi.xi"].sum() / dataset["fi"].sum()
np.float64(160.7)
# Using Numpy
np.average(dataset["xi"], weights=dataset["fi"])
np.float64(160.7)
Mediana para Dados Agrupados
A mediana para dados agrupados é encontrada primeiro identificando a classe mediana (a classe
onde a frequência acumulada atinge ou ultrapassa N /2) e, em seguida, usando uma fórmula de
interpolação:
Mediana=L+( N2 − Ff )⋅h
Onde:
• L é o limite inferior da classe mediana.
• N é a frequência total.
• F é a frequência acumulada da classe imediatamente anterior à classe mediana.
• f é a frequência da classe mediana.
• h é a amplitude da classe mediana.
# Frequancia total
N = dataset['fi'].sum()
print(f"N: {N}")
# # Encontrar a classe mediana (a primeira classe onde Fi é maior ou
igual a N/2)
median_class_index = dataset[dataset['Fi'] >= (N/2)].index[0]
median_class = dataset.loc[median_class_index]
# Limite inferior da classe mediana
L = median_class['inferior']
print(f"L: {L}")
# Frequência acumulada da classe anterior
F = dataset.loc[median_class_index - 1, 'Fi']
print(f"F: {F}")
# Frequencia da classe mediana
f = median_class['fi']
print(f"f: {f}")
# Amplitude
h = median_class['superior'] - median_class['inferior']
print(f"h: {h}")
median_result = L + ( ( ( ( N/2 ) - F ) / f ) * h )
print(f"Mediana: {median_result:.2f}")
L: 158.0
N: 40
F: 14
f: 11.0
h: 4.0
Mediana: 160.18
Moda para Dados Agrupados
A moda para dados agrupados é geralmente estimada pela classe modal (a classe com a maior
frequência). Para uma estimativa mais precisa, pode-se usar a seguinte fórmula de interpolação:
Moda=L+( Δ1
Δ1+Δ2 )⋅h
Onde:
• L é o limite inferior da classe modal.
• Δ1 (delta 1) é a diferença entre a frequência da classe modal e a frequência da classe
precedente.
• Δ2 (delta 2) é a diferença entre a frequência da classe modal e a frequência da classe
sucessora.
• h é a amplitude da classe modal.
# Encontrar a classe modal (a classe com a maior frequência 'fi')
modal_class_index = dataset['fi'].idxmax()
modal_class = dataset.loc[modal_class_index]
# L: limite inferior da classse modal
L = modal_class['inferior']
# h: Amplitude da classe modal
h = modal_class['superior'] - modal_class['inferior']
# f_modal: Frequência da classe modal
f_modal = modal_class['fi']
# Delta 1: Diferença entre a frequência da classe modal e a frequência
da classe precedente
f_preceding = dataset.loc[modal_class_index - 1, 'fi']
delta1 = f_modal - f_preceding
# Delta 2: Diferença entre a frequência da classe modal e a frequência
da classe sucessora
f_succeeding = dataset.loc[modal_class_index + 1, 'fi' ]
delta2 = f_modal - f_succeeding
# Calculando a moda agrupada
moda = L + (delta1 / (delta1 + delta2)) * h
# Resultado
print(f"Moda para Dados Agrupados: {moda:.2f}")
Moda para Dados Agrupados: 159.33
Medidas de Posição e Dispersão.
Estatística Descritiva
Base dados
Medidas de Posição para Dados Não Agrupados
Média, Mediana e Moda
Média aritmética simples
Moda
Mediana
Média Aritmética Ponderada
Medidas de Posição para Dados Agrupados
Criando o Dataset
Média para Dados Agrupados
Mediana para Dados Agrupados
Moda para Dados Agrupados