2
respostas

Pandas e conjuntos amodais

Boa tarde pessoal. Uma dúvida simples: O Pandas não deveria me informar que este é um conjunto amodal? Existe alguma forma de conseguir isso sem a necessidade de uma verificação posterior?

import pandas as pd

conjunto = [4, 5, 6, 7]
s = pd.Series(conjunto)

print(s.mode())

Saída:

0    4
1    5
2    6
3    7
dtype: int64
2 respostas

Olá Paulo,

Seu raciocínio está certo. Entretanto, o que o método .mode() retorna é uma série com os valores mais frequêntes do seu conjunto de dados. (veja em pandas.DataFrame.mode)

Quando o conjunto é bímodal, multimodal ou amodal, ocorre 'empate' na contabilização dos elementos amostrais e, neste caso, o método te devolve os termos que empataram.

Como em seu conjunto de dados, houve empate de todos os elementos, ele retornou todos os elementos.

Para ter a resposta esperada, você pode usar o seguinte código:

import pandas as pd

conjunto = [4, 5, 6, 7]
s = pd.Series(conjunto)

def retorna_moda(dados):
    contagem_dos_elementos = dados.value_counts()
    if max(contagem_dos_elementos) == 1:
        return 'Conjunto Amodal'
    else:
        moda = list(dados.mode())
        return 'Moda: ' + str(moda)

retorna_moda(s)

Abs

Muito obrigado pela explicação Fábio. Eu havia desenvolvido um código (sem pandas):

def moda(conjunto: list) -> list:
    """
    Recebe como argumento uma lista de n números
    e retorna a(s) moda(s)
    """

    moda = []

    # frequencias absolutas
    f = {x: conjunto.count(x) for x in set(conjunto)}    

    # para conjuntos nao amodais
    if len(set(f.values())) > 1:

        # maior frequência
        max_f = max(f.values())

        # quando a frequência do dado (x) for igual
        # a maior frequência encontrada no conjunto,
        # então (x) é uma moda
        moda = sorted([x[0] for x in f.items() if x[1] == max_f])

    return moda


# conjunto de dados
conjunto = [8, 10, 4, 8, 6, 10, 8]

# encontrando a(s) moda(s)
print(moda(conjunto))

Nesta função, em conjuntos amodais retorna-se um list vazio.