En este tutorial de Python te mostraré cómo obtener la moda de una serie de datos. Es decir, a partir de una lista de datos, saber cuál es el elemento que más se repite (y a este valor se le dice moda).
Sé que hay varios tipos de moda pero en este caso solo vamos a obtener el elemento que más se repite usando Python.
Algoritmo para obtener moda
En este caso necesitamos la estructura de datos hashmap o diccionario para simplificar el algoritmo. Un diccionario es como un arreglo, con la diferencia de que el diccionario nos permite utilizar una cadena como índice.
De este modo, por cada número encontrado en la distribución, vamos a definir una nueva entrada en el diccionario con un valor de 1 (pues se ha encontrado una vez) y después, si volvemos a encontrar el número, vamos a aumentar éste contador.
Finalmente obtenemos el dato que más se haya repetido, usando el mismo algoritmo aplicado para obtener el mayor de 3 números.
Obtener moda en Python
Comenzamos declarando los datos y el diccionario vacío:
# Recuerda que este arreglo puede ser llenado por un usuario: https://parzibyte.me/blog/2020/10/18/python-llenar-arreglo-datos-usuario/
datos = [1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 4]
diccionario_conteo = {}
Ahora recorremos los datos y los agregamos al diccionario. Básicamente llenamos el diccionario con la frecuencia de números (algo así como cuando contamos la frecuencia de palabras) para más tarde obtener la moda, es decir, el elemento más repetido.
for numero in datos:
clave = str(numero)
# Si no existe...
if not clave in diccionario_conteo:
# lo agregamos:
diccionario_conteo[clave] = 1
# Si ya existe...
else:
# Lo aumentamos
diccionario_conteo[clave] += 1
Llegados a este punto ya tenemos un diccionario en donde la clave es el número, y el valor es la cantidad de veces que ese número se repite. Es momento de saber cuál número se repite la mayor cantidad de veces.
Declaramos la frecuencia mayor en 0, y suponemos que el número más repetido es el primero; aunque lo vamos a comprobar más tarde. En caso de que la frecuencia actual sea mayor que la frecuencia mayor, intercambiamos los valores y declaramos el número mayor como el actual.
Dentro del siguiente código vemos algunas conversiones, esto es porque las claves de diccionarios deben ser de tipo string
, pero también nos importa el número int
.
# Ahora recorremos el diccionario y obtenemos el mayor. Vamos a buscar el que tenga la mayor frecuencia
frecuencia_mayor = 0
numero_mas_repetido = datos[0]
# Imprimimos el diccionario solo para depurar
print(diccionario_conteo)
# Y sacamos el mayor
for numero in diccionario_conteo:
if diccionario_conteo[numero] > frecuencia_mayor:
numero_mas_repetido = numero
frecuencia_mayor = diccionario_conteo[numero]
# Finalmente imprimimos el más repetido, con su conteo
conteo = diccionario_conteo[str(numero_mas_repetido)]
print(
f"El número que más se repite es {numero_mas_repetido} (encontrado {conteo} ocasiones)"
)
Al terminar, se va a imprimir el número que más se repite, además de la cantidad de veces que se encontró.
Poniendo todo junto
El código completo para obtener la moda en Python queda de la siguiente manera. Recuerda que en este caso, si hay un empate, se toma al último número encontrado en el diccionario.
"""
https://parzibyte.me/blog
"""
# Recuerda que este arreglo puede ser llenado por un usuario: https://parzibyte.me/blog/2020/10/18/python-llenar-arreglo-datos-usuario/
datos = [9, 2, 3, 4, 4, 4, 5, 6, 7, 8, 4, 9, 4]
diccionario_conteo = {}
for numero in datos:
clave = str(numero)
# Si no existe...
if not clave in diccionario_conteo:
# lo agregamos:
diccionario_conteo[clave] = 1
# Si ya existe...
else:
# Lo aumentamos
diccionario_conteo[clave] += 1
# Ahora recorremos el diccionario y obtenemos el mayor. Vamos a buscar el que tenga la mayor frecuencia
frecuencia_mayor = 0
numero_mas_repetido = datos[0]
# Imprimimos el diccionario solo para depurar
print(diccionario_conteo)
# Y sacamos el mayor
for numero in diccionario_conteo:
if diccionario_conteo[numero] > frecuencia_mayor:
numero_mas_repetido = numero
frecuencia_mayor = diccionario_conteo[numero]
# Finalmente imprimimos el más repetido, con su conteo
conteo = diccionario_conteo[str(numero_mas_repetido)]
print(
f"El número que más se repite es {numero_mas_repetido} (encontrado {conteo} ocasiones)"
Puedes ver en la imagen del encabezado que el programa funciona sin importar la cantidad de datos; todo está de manera correcta.
Te dejo con más contenido de Python en mi blog.
También he grabado un vídeo explicando:
Buenas noches, compañero felicitarle por el código muy bueno, la verdad me sirvió y e aprendido sobre diccionario que no conocía sobre ello.
Ya que este código no usa tales funciones de librerías, que facilitan el trabajo, puesto que la lógica es la que mas interesa.
Tengo una consulta, existe alguna manera de llenar una Lista en python 3.x sin usar append ?
si es así me gustaría conocerla.
Muchas gracias por su aporte a las ciencias.