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:
2345678910

$$\large \to A\ mediana\ é\ \color{deepskyblue}{6}$$


  • Conjunto de dados ordenados com o total de elementos sendo um número par:
345678910

$$\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:

Linguagem Biblioteca Função
Python Numpy np.median(values)
Statistics st.median(values)
Scipy.ndimage scn.median(values)
Julia Statistics median(values)
StatsBase

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:

Linguagem Biblioteca Função
Python Scify.ndimage
1º passo: A partir de um dicionário que contenha os elementos e suas frequências, crie uma lista com os elementos e suas repetições.
lista = list(k for k, v in dict.items( ) for _ in range(v))

2º passo: Utilize a fórmula para descobrir a mediana
scn.median(lista)

Julia Statistics
1º passo: A partir de um dicionário que contenha os elementos e suas frequências, crie uma lista com os elementos e suas repetições.
valor = sort([k for (k, v) in dicio for _ in 1:v])

2º passo: Utilize a fórmula para descobrir a mediana
median(valor)

StatsBase

 

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.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

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)