A mediana é uma medida de tendência que representa o valor central de um conjunto de dados ordenados. Em outras palavras, é o valor que divide o conjunto ao meio, de forma que metade dos dados é menor que ele e a outra metade é maior.
A mediana é muito usada quando os dados têm distribuição assimétrica, pois descreve melhor o centro da distribuição em casos como rendas, tempos de espera, e pesos. Em ciências sociais e economia, é frequentemente usada para evitar que extremos distorçam os resultados, como no cálculo da renda mediana de uma população.
Exemplos
- Conjunto de dados ordenados com o total de elementos sendo um número ímpar:
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
$$\large \to A\ mediana\ é\ \color{deepskyblue}{6}$$
- Conjunto de dados ordenados com o total de elementos sendo um número par:
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
$$\large \to A\ mediana\ é\ {\color{deepskyblue}{6,5}}$$
Fórmula para encontrar a posição da mediana no conjunto de dados:
$$\large \tilde{x}_{posicao} = \dfrac{n+1}{2}$$
Sendo:
- $\tilde{x}_{posicao}:$ Posição da mediana no conjunto de dados.
- $n:$ número de elementos da amostra. Se for população será N.
Python :
# Ordenando a lista com os valores ( rol )
lista = sorted(lista)
# Descobrindo o índice de posição média
p = int(len(lista)/2)
# Encontrando a mediana
Med = lista[p] if len(lista) % 2 != 0 else ((lista[p] + lista[p-1]) / 2)
Julia :
# Ordenando um vetor com os valores ( rol )
valor = sort(valor)
# Descobrindo o índice de posição média
p = floor(Int, round(length(valor)/2))
# Encontrando a mediana
Med = if length(valor) % 2 != 0 valor[p] else ((valor[p] + valor[p+1]) / 2) end
Libs:
Dados NÃO agrupados
Exemplos
Determine o valor da mediana do conjunto de dados:
$$\color{orange} 5\ -\ 8\ -\ 4\ -\ 6\ -\ 7\ -\ 3\ -\ 4$$
Python
''' Sem o uso de bibliotecas '''
lista = ['5 - 8 - 4 - 6 - 7 - 3 - 4']
lista1 = []
for n in lista[0].split(' - '):
lista1.append(int(n))
lista1 = sorted(lista1)
p = int(len(lista1)/2)
Med = lista1[p] if len(lista1) % 2 != 0 else ((lista1[p] + lista1[p-1]) / 2)
# RESPOSTA => Med: 5
''' Utilizando o Numpy '''
import numpy as np
lista = ['5 - 8 - 4 - 6 - 7 - 3 - 4']
lista1 = []
for n in lista[0].split(' - '):
lista1.append(int(n))
lista1 = sorted(lista1)
Med = np.median(lista1)
''' Utilizando o Statistics '''
import statistics as st
lista = ['5 - 8 - 4 - 6 - 7 - 3 - 4']
lista1 = []
for n in lista[0].split(' - '):
lista1.append(int(n))
lista1 = sorted(lista1)
Med = st.median(lista1)
# RESPOSTA => Med: 5
Julia
" Sem o uso de bibliotecas "
valor = ["5 - 8 - 4 - 6 - 7 - 3 - 4"]
valor = sort(parse.(Int, split(valor[1], " - ")))
p = floor(Int, round(length(valor)/2))
Med1 = if length(valor) % 2 != 0 valor[p] else ((valor[p] + valor[p+1]) / 2) end
Calcule a mediana dos valores:
$$\color{orange} 8\ -\ 0\ -\ 7\ -\ 4\ -\ 7\ -\ 10\ -\ 6\ -\ 5$$
Python
lista1 = ['8 - 0 - 7 - 4 - 7 - 10 - 6 - 5']
lista = sorted(list(map(int, (list(map(lambda x: x.split(' - '), lista1))[0]))))
''' Sem o uso de bibliotecas '''
p = int(len(lista)/2)
Med1 = lista[p] if len(lista) % 2 != 0 else ((lista[p] + lista[p-1]) / 2)
''' Utilizando o Numpy '''
import numpy as np
Med2 = np.median(lista)
''' Utilizando o Statistics '''
import statistics as st
Med3 = st.median(lista)
RES = 'RESULTADOS'
print(RES.center(34, '*'))
print(f'nUtilizando somente o Python: {Med1}')
print(f'Utilizando o Numpy: {Med2}')
print(f'Utilizando o Statistics: {Med3}')
# ************RESULTADOS************
# Utilizando somente o Python: 6.5
# Utilizando o Numpy: 6.5
# Utilizando o Statistics: 6.5
Julia
" Sem o uso de bibliotecas "
valor = ["8 - 0 - 7 - 4 - 7 - 10 - 6 - 5"]
valor = sort(parse.(Int, split(valor[1], " - ")))
p = floor(Int, round(length(valor)/2))
Med1 = if length(valor) % 2 != 0 valor[p] else ((valor[p] + valor[p+1]) / 2) end
" Utilizando Statistics ou StatsBase "
using Statistics
valor = ["8 - 0 - 7 - 4 - 7 - 10 - 6 - 5"]
valor = sort(parse.(Int, split(valor[1], " - ")))
median(valor)
Dados agrupados SEM intervalos de classe
Python :
# Transformando os dados de dicionário contendo os elementos e suas frequências, em uma lista com a totalidade dos dados
lista = list(k for k, v in dict.items( ) for _ in range(v))
# Ordenando a lista com os valores (rol)
lista = sorted(lista)
# Descobrindo o índice de posição média
p = int(len(lista)/2)
# Encontrando a mediana
Med = lista[p] if len(lista) % 2 != 0 else ((lista[p] + lista[p-1])/2)
Julia :
" A partir de um dicionário com valores e frequências "
# Convertendo os items do dicionário em um vetor com todos os valores ordenados
valor = sort([k for (k, v) in dicio for _ in 1:v])
# Descobrindo o índice de posição média
p = floor(Int, round(length(valor)/2))
# Encontrando a mediana
Med = if length(valor) % 2 != 0 valor[p] else ((valor[p] + valor[p+1]) / 2) end
" A partir de dois vetores contendo, respectivamente, valores e frequências "
# Agrupando os vetores em um único vetor com todos os valores ordenados
valor = sort([k for (k, v) in zip(valor, freq) for i in 1:v])
# Descobrindo o índice de posição média
p = floor(Int, round(length(valor)/2))
# Encontrando a mediana
Med = if length(valor) % 2 != 0 valor[p] else ((valor[p] + valor[p+1]) / 2) end
Libs:
Exemplos
Python
''' Sem o uso de bibliotecas '''
dicio = {3:1, 4:4, 5:6, 6:9, 7:10, 8:9, 9:5, 10:6}
# Convertendo os items do dicionário em uma lista com todos os valores
lista = [k for k, v in dicio.items() for _ in range(v)]
# Descobrindo a posição da mediana
p = int(len(lista) / 2)
# Descobrindo a mediana
Med = lista[p] if len(lista) % 2 != 0 else ((lista[p] + lista[p-1])/2)
''' Utilizando o Pandas '''
import pandas as pd
dicio = {3:1, 4:4, 5:6, 6:9, 7:10, 8:9, 9:5, 10:6}
# Criando o dataframe
df = pd.DataFrame(dicio.items(), columns=['Notas(xi)', 'Frequências(fi)'])
# Criando uma coluna com a frequência acumulada
df['fa'] = df['Frequências(fi)'].cumsum().values
# Descobrindo a posição da mediana
p = (sum(df['Frequências(fi)'])) / 2
num = list(s for s in df.fa if s == p or s > p)[0]
# Descobrindo a mediana
Med = list(df['Notas(xi)'][df.fa == num])[0]
''' Utilizando Numpy, Statistics e Scipy '''
import numpy as np
import statistics as st
import scipy.ndimage as sc
dicio = {3:1, 4:4, 5:6, 6:9, 7:10, 8:9, 9:5, 10:6}
lista = [k for k, v in dicio.items() for _ in range(v)]
''' Utilizando o Numpy '''
Med1 = np.median(lista)
''' Utilizando o Statistics '''
Med2 = st.median(lista)
''' Utilizando o Scipy.ndimage '''
Med3 = sc.median(lista)
RES = 'RESULTADOS'
print(RES.center(32, '*'))
print(f'Utilizando o Numpy: {Med1}')
print(f'Utilizando o Statistics: {Med2}')
print(f'Utilizando o Scipy.ndimage: {Med3}')
# ***********RESULTADOS***********
# Utilizando o Numpy: 7.0
# Utilizando o Statistics: 7.0
# Utilizando o Scipy.ndimage: 7.0
Julia
" A partir de um dicionário "
dicio = Dict(3 => 1, 4 => 4, 5 => 6, 6 => 9, 7 => 10, 8 => 9, 9 => 5, 10 => 6)
# Convertendo os items do dicionário em uma lista com todos os valores
valor = sort([k for (k, v) in dicio for _ in 1:v])
p = floor(Int, round(length(valor)/2))
Med = if length(valor) % 2 != 0 valor[p] else ((valor[p] + valor[p+1]) / 2) end
# RESPOSTA => Med: 7.0
" Utilizando Statistics ou StatsBase "
using Statistics
dicio = Dict(3 => 1, 4 => 4, 5 => 6, 6 => 9, 7 => 10, 8 => 9, 9 => 5, 10 => 6)
# Convertendo os items do dicionário em uma lista com todos os valores
valor = sort([k for (k, v) in dicio for _ in 1:v])
median(valor)
# RESPOSTA => 7.0
" A partir de dois vetores "
valor = [1.05, 1.07, 1.11, 1.23, 1.03, 1.04]
freq = [2, 3, 1, 7, 2, 1]
# Agrupando os vetores em um único vetor com todos os valores ordenados
valor = sort([x for (x, y) in zip(valor, freq) for i in 1:y])
# Descobrindo o índice de posição média
p = floor(Int, round(length(valor)/2))
# Encontrando a mediana
Med = if length(valor) % 2 != 0 valor[p] else ((valor[p] + valor[p+1]) / 2) end
# RESPOSTA => Med: 1.09
Dados agrupados COM intervalos de classe
Fórmula:
$$\large \tilde{x} = l_i + \frac{h \cdot (p-m)}{f_m}$$
Sendo:
- $\tilde{x}$: Mediana
- $l_{i}$: limite inferior da classe mediana
- $h$: Amplitude de classe
- $p$: n/2, a classe mediana
- $m$: frequência acumulada imediatamente anterior a p
- $f_{m}$: frequência simples (ou absoluta) da classe mediana
Python :
# Criando uma lista com a frequência acumulada
lista = list(dicio.values())
fa = list(map(lambda x: sum(lista[:x+1]), range(len(lista))))
# Número de frequẽncias dividido por 2 (p)
n = sum(dicio.values())
p = n / 2
# Intervalo de classe a qual pertence a mediana a partir do p
num_fa = list(s for s in fa if s == p or s > p)[0]
interval = list(dicio.keys())[fa.index(num_fa)].split(' - ')
# Limite inferior da classe mediana (li)
li = float(interval[0])
# Amplitude de classe (h)
h = float(interval[1]) - float(interval[0])
# Frequência acumulada imediatamente anterior a x (m)
m = [s for s in fa if s < p][-1]
# Número de intervalos de classe
fm = len(dicio.keys())
# Utilizando a fórmula para encontrar a mediana
Med = li + ((h * (p - m)) / fm)
Julia :
# Criando um vetor com as frequências acumuladas
fa = cumsum(frequencias)
# Metade das frequências
p = sum(frequencias)/2
# Intervalo de classe a qual pertence a mediana a partir do p
num_fa = [s for s in fa if s == p || s > p][1]
interval = split(intervalos[findfirst(x -> x == num_fa, fa)], " - ")
# Limite inferior da classe mediana (li)
li = parse(Float64, interval[1])
# Amplitude de classe (h)
h = parse(Float64, interval[2]) - li
# Frequência acumulada imediatamente anterior a x (m)
m = [s for s in fa if s < p][end]
# Número de intervalos de classe
fm = length(intervalos)
# Utilizando a fórmula para encontrar a mediana
Med = li + ((h * (p - m)) / fm)
Exemplos
De acordo com a tabela abaixo, determine o peso mediano das 70 pessoas adultas que se pesaram no mesmo dia na balança de uma farmácia.
Notas | Frequências |
---|---|
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 |
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 = list(dicio.values())
fa = list(map(lambda x: sum(lista[:x+1]), range(len(lista))))
n = sum(dicio.values())
p = n / 2
num_fa = list(s for s in fa if s == p or s > p)[0]
interval = list(dicio.keys())[fa.index(num_fa)].split(' - ')
li = float(interval[0])
h = float(interval[1]) - float(interval[0])
m = [s for s in fa if s < p][-1]
fm = len(dicio.keys())
Med = li + ((h * (p - m)) / fm)
Julia
intervalos = ["59.0 - 61.5","61.5 - 64.0","64.0 - 66.5","66.5 - 69.0","69.0 - 71.5","71.5 - 74.0","74.0 - 76.5","76.5 - 79.0","79.0 - 81.5","81.5 - 84.0","84.0 - 86.5"]
frequencias = [3, 5, 5, 7, 9, 11, 8, 7, 5, 6, 4]
fa = cumsum(frequencias)
p = sum(frequencias)/2
num_fa = [s for s in fa if s == p || s > p][1]
interval = split(intervalos[findfirst(x -> x == num_fa, fa)], " - ")
li = parse(Float64, interval[1])
h = parse(Float64, interval[2]) - li
m = [s for s in fa if s < p][end]
fm = length(intervalos)
Med = li + ((h * (p - m)) / fm)
Deixe um comentário