Descubra Média, Mediana e Moda em Python: Guia Completo com exemplos!

Média, mediana e moda constituem pilares essenciais da estatística. Em Python, é possível calcular essas medidas de forma descomplicada, tanto utilizando bibliotecas externas quanto por meio de implementações manuais.

Estas três grandezas representam as principais medidas de tendência central. A tendência central permite identificar os valores “típicos” ou “médios” em um conjunto de dados. Se você está começando na área de ciência de dados, este guia será um excelente ponto de partida.

Ao concluir este tutorial, você será capaz de:

  • Compreender os conceitos de média, mediana e moda
  • Desenvolver suas próprias funções para calcular média, mediana e moda em Python
  • Utilizar o módulo `statistics` do Python para calcular essas medidas de forma eficiente

Caso deseje ter acesso a uma versão para download dos exercícios abordados, confira o Repositório GitHub.

Vamos explorar as diferentes abordagens para calcular média, mediana e moda.

Calculando a Média em Python

A média, também conhecida como média aritmética, é a medida de tendência central mais empregada.

Lembre-se que a tendência central busca representar um valor característico de um conjunto de dados.

Um conjunto de dados é composto por uma coleção de dados, podendo ser representado em Python por meio de diversas estruturas de dados nativas, tais como:

  • Listas, tuplas e conjuntos: coleções de objetos
  • Strings: coleções de caracteres
  • Dicionários: coleções de pares chave-valor

Observação: Embora existam outras estruturas de dados em Python, como filas e pilhas, neste tutorial nos restringiremos às estruturas nativas.

O cálculo da média é realizado pela soma de todos os valores do conjunto de dados, seguida da divisão do resultado pelo número total de valores. Por exemplo, considerando a lista de números:

[1, 2, 3, 4, 5, 6]

A média seria 3.5, pois a soma dos valores é 21 e o número de elementos é 6. Vinte e um dividido por seis resulta em 3.5. O cálculo pode ser expresso da seguinte forma:

(1 + 2 + 3 + 4 + 5 + 6) / 6 = 3.5

Neste tutorial, utilizaremos as idades dos jogadores de um time de basquete como nossos dados de exemplo.

Criando uma Função de Média Personalizada

Vamos começar calculando a média das idades dos jogadores do time de basquete “Pythonic Machines”.

pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24]

def mean(dataset):
    return sum(dataset) / len(dataset)

print(mean(pythonic_machine_ages))

Analisando o código:

  • `pythonic_machine_ages` é uma lista com as idades dos jogadores de basquete.
  • Definimos uma função `mean()` que retorna a soma dos elementos do conjunto de dados dividido pelo número de elementos.
    • A função `sum()` retorna a soma total dos valores de um iterável, que neste caso é uma lista. Ao passar a lista como argumento, o resultado será 211.
    • A função `len()` retorna o número de elementos de um iterável. Ao passar a lista, o resultado será 8.
  • Passamos as idades do time de basquete para a função `mean()` e exibimos o resultado.

Ao executar o código, você obterá:

26.375
# Pois 211 / 8 = 26.375

Esse valor representa a idade média dos jogadores do time de basquete. Note que esse número não está presente no conjunto de dados original, mas ainda assim descreve de forma precisa a idade da maioria dos jogadores.

Utilizando `mean()` do Módulo `statistics` do Python

O cálculo das medidas de tendência central é uma operação comum para a maioria dos programadores. Por isso, o módulo `statistics` do Python oferece diversas funções para realizar esses cálculos, além de outras operações estatísticas básicas.

Por ser parte da biblioteca padrão do Python, não é necessário instalar pacotes externos usando o `pip`.

Veja como utilizar esse módulo:

from statistics import mean

pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24]

print(mean(pythonic_machine_ages))

No código acima, basta importar a função `mean()` do módulo `statistics` e passar o conjunto de dados como argumento. O resultado será o mesmo da função personalizada que implementamos anteriormente:

26.375

Agora que o conceito de média está claro, vamos prosseguir para o cálculo da mediana.

Encontrando a Mediana em Python

A mediana representa o valor central de um conjunto de dados ordenado. Assim como a média, ela busca fornecer um valor “típico” de uma determinada população.

Em programação, podemos definir a mediana como o valor que divide uma sequência em duas partes: a metade inferior e a metade superior.

Para calcular a mediana, é necessário primeiro ordenar o conjunto de dados. Isso pode ser feito utilizando algoritmos de ordenação ou a função `sorted()`. Em seguida, é preciso verificar se o número de elementos do conjunto de dados é par ou ímpar. O procedimento de cálculo varia de acordo com essa condição:

  • Ímpar: a mediana é o valor central do conjunto de dados.
  • Par: a mediana é a média dos dois valores centrais do conjunto de dados.

Continuando com nosso exemplo do time de basquete, vamos calcular a mediana da altura dos jogadores em centímetros:

[181, 187, 196, 196, 198,  203, 207, 211, 215]
# Como o número de elementos é ímpar, selecionamos o valor central
mediana = 198

Como o conjunto de dados possui um número ímpar de elementos, o valor central é a mediana. Mas o que aconteceria se um jogador se aposentasse?

Nesse caso, seria necessário calcular a mediana utilizando os dois valores centrais do conjunto de dados:

[181, 187, 196, 198, 203, 207, 211, 215]
# Selecionamos os dois valores centrais e calculamos sua média
mediana = (198 + 203) / 2
mediana = 200.5

Criando uma Função de Mediana Personalizada

Vamos implementar o conceito acima em uma função Python.

Lembre-se das três etapas necessárias para obter a mediana de um conjunto de dados:

  • Ordenar o conjunto de dados: podemos usar a função `sorted()` para isso.
  • Verificar se o número de elementos é par ou ímpar: podemos obter o tamanho do conjunto de dados e usar o operador de módulo (%) para isso.
  • Retornar a mediana de acordo com cada caso:
    • Ímpar: Retornar o valor central.
    • Par: Retornar a média dos dois valores centrais.

A implementação em código resultaria na seguinte função:

pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215]
after_retirement = [181, 187, 196, 198, 203, 207, 211, 215]

def median(dataset):
    data = sorted(dataset)
    index = len(data) // 2

    # Se o número de elementos for ímpar
    if len(dataset) % 2 != 0:
        return data[index]

    # Se o número de elementos for par
    return (data[index - 1] + data[index]) / 2

Imprimindo o resultado para nossos conjuntos de dados:

print(median(pythonic_machines_heights))
print(median(after_retirement))

Resultado:

198
200.5

Note que criamos uma variável `data` que armazena a versão ordenada do conjunto de dados no início da função. Embora as listas de exemplo já estejam ordenadas, nosso objetivo é criar uma função reutilizável, que ordenará o conjunto de dados sempre que for chamada.

A variável `index` armazena o índice do valor central — ou o índice do valor central superior — do conjunto de dados, utilizando o operador de divisão inteira. Por exemplo, ao passarmos a lista `pythonic_machine_heights`, ela terá o valor 4.

Lembre-se que, em Python, os índices de sequência começam em zero, o que permite retornar o elemento central de uma lista com a divisão inteira.

Em seguida, verificamos se o tamanho do conjunto de dados é ímpar, comparando o resultado do operador de módulo com qualquer valor diferente de zero. Caso a condição seja verdadeira, retornamos o elemento central. Por exemplo, utilizando a lista `pythonic_machine_heights`:

>>> pythonic_machine_heights[4]
# 198

Caso o conjunto de dados seja par, retornamos a média dos dois valores centrais. Note que `data[index – 1]` nos fornece o valor central inferior do conjunto de dados, enquanto `data[index]` nos fornece o valor central superior.

Utilizando `median()` do Módulo `statistics` do Python

O uso da função do módulo de estatísticas é mais simples, pois evita a necessidade de implementar o código para cálculo da mediana.

Pessoalmente, se algo já foi implementado, prefiro usá-lo, seguindo o princípio DRY (Don’t Repeat Yourself) — neste caso, não reinvente a roda.

Você pode calcular a mediana dos conjuntos de dados anteriores com o seguinte código:

from statistics import median

pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215]
after_retirement = [181, 187, 196, 198, 203, 207, 211, 215]

print(median(pythonic_machines_heights))
print(median(after_retirement))

Resultado:

198
200.5

Calculando a Moda em Python

A moda é o valor mais frequente em um conjunto de dados. Podemos interpretá-la como o grupo “popular” de uma escola, representando um padrão comum.

Um exemplo prático de moda pode ser as vendas diárias de uma loja de eletrônicos. A moda nesse conjunto de dados seria o produto mais vendido em um determinado dia.

['laptop', 'desktop', 'smartphone', 'laptop', 'laptop', 'headphones']

Nesse conjunto de dados, a moda é “laptop”, pois este é o valor mais frequente.

Uma característica interessante da moda é que o conjunto de dados não precisa ser numérico. Por exemplo, podemos trabalhar com strings.

Analisando as vendas de outro dia:

['mouse', 'camera', 'headphones', 'usb', 'headphones', 'mouse']

Nesse caso, o conjunto de dados tem duas modas: “mouse” e “headphones”, pois ambos aparecem duas vezes. Isso caracteriza um conjunto de dados multimodal.

E o que acontece se não encontrarmos uma moda em um conjunto de dados, como no exemplo abaixo?

['usb', 'camera', 'smartphone', 'laptop', 'TV']

Isso é chamado de distribuição uniforme, o que significa que não há moda no conjunto de dados.

Agora que você tem uma compreensão básica do conceito de moda, vamos calculá-la em Python.

Criando uma Função de Moda Personalizada

Podemos pensar na frequência de um valor como um par chave-valor, ou seja, um dicionário Python.

Recapitulando a analogia do basquete, podemos usar dois conjuntos de dados: os pontos por partida e o patrocínio de tênis de alguns jogadores.

Para encontrar a moda, primeiro precisamos criar um dicionário de frequência com cada valor presente no conjunto de dados. Em seguida, obtemos a frequência máxima e retornamos todos os elementos com essa frequência.

Vamos traduzir essa lógica em código:

points_per_game = [3, 15, 23, 42, 30, 10, 10, 12]
sponsorship = ['nike', 'adidas', 'nike', 'jordan',
               'jordan', 'rebook', 'under-armour', 'adidas']

def mode(dataset):
    frequency = {}

    for value in dataset:
        frequency[value] = frequency.get(value, 0) + 1

    most_frequent = max(frequency.values())

    modes = [key for key, value in frequency.items()
                      if value == most_frequent]

    return modes

Verificando o resultado, passando as duas listas como argumentos:

print(mode(points_per_game))
print(mode(sponsorship))

Resultado:

[10]
['nike', 'adidas', 'jordan']

Como podemos ver, a primeira impressão nos deu uma única moda, enquanto a segunda retornou várias modas.

Explorando o código em mais detalhes:

  • Declaramos um dicionário de frequência.
  • Iteramos sobre o conjunto de dados para criar um histograma — o termo estatístico para um conjunto de contadores (ou frequências).
    • Se a chave for encontrada no dicionário, adicionamos um ao valor.
    • Se não for encontrada, criamos um par chave-valor com valor um.
  • A variável `most_frequent` armazena — por coincidência — o maior valor (não a chave) do dicionário de frequência.
  • Retornamos a variável `modes`, que contém todas as chaves do dicionário de frequência com a maior frequência.

Note a importância da escolha de nomes de variáveis para escrever um código legível.

Utilizando `mode()` e `multimode()` do Módulo `statistics` do Python

Novamente, o módulo `statistics` oferece uma maneira rápida de executar operações estatísticas básicas.

Podemos usar duas funções: `mode()` e `multimode()`.

from statistics import mode, multimode

points_per_game = [3, 15, 23, 42, 30, 10, 10, 12]
sponsorship = ['nike', 'adidas', 'nike', 'jordan',
               'jordan', 'rebook', 'under-armour', 'adidas']

O código acima importa ambas as funções e define os conjuntos de dados com os quais vamos trabalhar.

Aqui reside a pequena diferença: a função `mode()` retorna a primeira moda que encontrar, enquanto `multimode()` retorna uma lista com todos os valores mais frequentes do conjunto de dados.

Consequentemente, podemos dizer que a função personalizada que implementamos é, na verdade, uma função `multimode()`.

print(mode(points_per_game))
print(mode(sponsorship))

Resultado:

10
nike

Observação: no Python 3.8 ou superior, a função `mode()` retorna a primeira moda encontrada. Em versões anteriores, você receberá um `StatisticsError`.

Utilizando a função `multimode()`:

print(multimode(points_per_game))
print(multimode(sponsorship))

Resultado:

[10]
['nike', 'adidas', 'jordan']

Resumindo

Parabéns! Se você chegou até aqui, aprendeu a calcular a média, a mediana e a moda, as principais medidas de tendência central.

Embora seja possível definir suas próprias funções para calcular média, mediana e moda, é recomendável usar o módulo `statistics`, pois ele faz parte da biblioteca padrão e não exige instalações adicionais.

Em seguida, leia uma introdução amigável à análise de dados em Python.