¿Cómo encontrar la media, la mediana y la moda en Python?

La media, la mediana y la moda son temas fundamentales de la estadística. Puede calcularlos fácilmente en Python, con y sin el uso de bibliotecas externas.

Estas tres son las principales medidas de tendencia central. La tendencia central nos permite conocer los valores “normales” o “promedio” de un conjunto de datos. Si recién está comenzando con la ciencia de datos, este es el tutorial adecuado para usted.

Al final de este tutorial usted:

  • Comprender el concepto de media, mediana y moda.
  • Ser capaz de crear sus propias funciones de media, mediana y modo en Python
  • Utilice el módulo de estadísticas de Python para iniciar rápidamente el uso de estas medidas

Si desea una versión descargable de los siguientes ejercicios, no dude en consultar el repositorio GitHub.

Veamos las diferentes formas de calcular la media, la mediana y la moda.

Cálculo de la media en Python

los significar o media aritmética es la medida de tendencia central más utilizada.

Recuerde que la tendencia central es un valor típico de un conjunto de datos.

Un conjunto de datos es una colección de datos, por lo tanto, un conjunto de datos en Python puede ser cualquiera de las siguientes estructuras de datos integradas:

  • Listas, tuplas y conjuntos: una colección de objetos
  • Cadenas: una colección de caracteres
  • Diccionario: una colección de pares clave-valor

Nota: Aunque hay otras estructuras de datos en Python como colas o pilas, usaremos solo las integradas.

Podemos calcular la media sumando todos los valores de un conjunto de datos y dividiendo el resultado por el número de valores. Por ejemplo, si tenemos la siguiente lista de números:

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

La media o promedio sería 3,5 porque la suma de la lista es 21 y su longitud es 6. Veintiuno dividido por seis es 3,5. Puede realizar este cálculo con el siguiente cálculo:

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

En este tutorial, utilizaremos a los jugadores de un equipo de baloncesto como datos de muestra.

Creación de una función de media personalizada

Comencemos por calcular la edad promedio (media) de los jugadores en un equipo de baloncesto. El nombre del equipo será «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))

Desglosando este código:

  • El “pythonic_machine_ages” es una lista con las edades de los jugadores de baloncesto
  • Definimos una función mean() que devuelve la suma del conjunto de datos dado dividida por su longitud
    • La función sum() devuelve la suma total (irónicamente) de los valores de un iterable, en este caso, una lista. Intente pasar el conjunto de datos como argumento, devolverá 211
    • La función len() devuelve la longitud de un iterable, si le pasa el conjunto de datos obtendrá 8
  • Pasamos las edades del equipo de baloncesto a la función mean() e imprimimos el resultado.

Si comprueba la salida, obtendrá:

26.375
# Because 211 / 8 = 26.375

Esta salida representa la edad promedio de los jugadores del equipo de baloncesto. Observe cómo el número no aparece en el conjunto de datos, pero describe con precisión la edad de la mayoría de los jugadores.

Uso de mean() del módulo de estadísticas de Python

Calcular medidas de tendencia central es una operación común para la mayoría de los desarrolladores. Eso es porque Estadísticas de Python El módulo proporciona diversas funciones para calcularlos, junto con otros temas básicos de estadística.

Ya que es parte del Biblioteca estándar de Python no necesitará instalar ningún paquete externo con PIP.

Así es como se usa este módulo:

from statistics import mean

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

print(mean(pythonic_machine_ages))

En el código anterior, solo necesita importar la función mean() del módulo de estadísticas y pasarle el conjunto de datos como argumento. Esto devolverá el mismo resultado que la función personalizada que definimos en la sección anterior:

26.375

Ahora que tienes muy claro el concepto de media sigamos con la medida de la mediana.

Encontrar la mediana en Python

los mediana es el valor medio de un conjunto de datos ordenado. Se utiliza, de nuevo, para proporcionar un valor «típico» de un determinado población.

En programación, podemos definir la mediana como el valor que separa una secuencia en dos partes — La mitad inferior y la mitad superior —.

Para calcular la mediana, primero, necesitamos ordenar el conjunto de datos. Podríamos hacer esto con algoritmos de clasificación o usando la función integrada sorted(). El segundo paso es determinar si la longitud del conjunto de datos es par o impar. Dependiendo de esto algunos de los siguientes procesos:

  • Impar: la mediana es el valor medio del conjunto de datos
  • Par: La mediana es la suma de los dos valores medios dividida por dos

Continuando con nuestro conjunto de datos del equipo de baloncesto, calculemos la altura media de los jugadores en centímetros:

[181, 187, 196, 196, 198,  203, 207, 211, 215]
# Since the dataset is odd, we select the middle value
median = 198

Como puede ver, dado que la longitud del conjunto de datos es impar, podemos tomar el valor medio como la mediana. Sin embargo, ¿qué pasaría si un jugador acaba de retirarse?

Tendríamos que calcular la mediana tomando los dos valores medios del conjunto de datos

[181, 187, 196, 198, 203, 207, 211, 215] 
# We select the two middle values, and divide them by 2
median = (198 + 203) / 2
median = 200.5

Creación de una función mediana personalizada

Implementemos el concepto anterior en una función de Python.

Recuerda los tres pasos que debemos seguir para obtener la mediana de un conjunto de datos:

  • Ordenar el conjunto de datos: podemos hacer esto con la función sorted()
  • Determine si es par o impar: podemos hacer esto obteniendo la longitud del conjunto de datos y usando el operador de módulo (%)
  • Devuelve la mediana en función de cada caso:
    • Impar: Devuelve el valor medio
    • Par: Devuelve el promedio de los dos valores medios

Eso daría como resultado la siguiente función:

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
    
    # If the dataset is odd  
    if len(dataset) % 2 != 0:
        return data[index]
    
    # If the dataset is even
    return (data[index - 1] + data[index]) / 2

Imprimiendo el resultado de nuestros conjuntos de datos:

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

Producción:

198
200.5

Observe cómo creamos una variable de datos que apunta a la base de datos ordenada al comienzo de la función. Aunque las listas anteriores están ordenadas, queremos crear una función reutilizable y, por lo tanto, ordenar el conjunto de datos cada vez que se invoca la función.

El índice almacena el valor medio, o el valor medio superior, del conjunto de datos, mediante el uso del operador de división de enteros. Por ejemplo, si estuviéramos pasando la lista «pythonic_machine_heights», tendría el valor de 4.

Recuerda que en Python los índices de secuencia comienzan en cero, eso se debe a que podemos devolver el índice medio de una lista, con una división entera.

Luego verificamos si la longitud del conjunto de datos es impar comparando el resultado de la operación de módulo con cualquier valor que no sea cero. Si la condición es verdadera, devolvemos el elemento central, por ejemplo, con la lista «pythonic_machine_heights»:

>>> pythonic_machine_heights[4]
# 198

Por otro lado, si el conjunto de datos es par, devolvemos la suma de los valores medios dividida por dos. Tenga en cuenta que los datos[index -1] nos da el punto medio inferior del conjunto de datos, mientras que los datos[index] nos proporciona el punto medio superior.

Usando mediana () del módulo de estadísticas de Python

De esta manera es mucho más simple porque estamos usando una función ya existente del módulo de estadísticas.

Personalmente, si hay algo ya definido para mí, lo usaría debido al principio SECO —No te repitas— (en este caso, no repitas el código de otros).

Puede calcular la mediana de los conjuntos de datos anteriores con el siguiente 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))

Producción:

198
200.5

Cálculo de la moda en Python

los modo es el valor más frecuente en el conjunto de datos. Podemos pensar en él como el grupo “popular” de una escuela, que puede representar un estándar para todos los estudiantes.

Un ejemplo de moda podría ser las ventas diarias de una tienda de tecnología. La moda de ese conjunto de datos sería el producto más vendido de un día específico.

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

Como puede apreciar, la moda del conjunto de datos anterior es “laptop” porque fue el valor más frecuente en la lista.

Lo bueno del modo es que el conjunto de datos no debe ser numérico. Por ejemplo, podemos trabajar con cadenas.

Analicemos las ventas de otro día:

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

El conjunto de datos anterior tiene dos modos: «ratón» y «auriculares» porque ambos tienen una frecuencia de dos. Esto significa que es un multimodal conjunto de datos

¿Qué sucede si no podemos encontrar la moda en un conjunto de datos, como el que se muestra a continuación?

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

Esto se llama un distribución uniformebásicamente, significa que no hay moda en el conjunto de datos.

Ahora que tiene una comprensión rápida del concepto de modo, calculémoslo en Python.

Creación de una función de modo personalizado

Podemos pensar en la frecuencia de un valor como un par clave-valor, en otras palabras, un diccionario de Python.

Recapitulando la analogía del baloncesto, podemos usar dos conjuntos de datos para trabajar: los puntos por partido y el patrocinio de zapatillas de algunos jugadores.

Para encontrar la moda primero necesitamos crear un diccionario de frecuencia con cada uno de los valores presentes en el conjunto de datos, luego obtener la frecuencia máxima y devolver todos los elementos con esa frecuencia.

Traduzcamos esto a 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

Comprobando el resultado pasando las dos listas como argumentos:

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

Producción:

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

Como puede ver, la primera declaración de impresión nos dio un solo modo, mientras que la segunda devolvió múltiples modos.

Explicando más profundamente el código anterior:

  • Declaramos un diccionario de frecuencias
  • Iteramos sobre el conjunto de datos para crear un histograma — el término estadístico para un conjunto de contadores (o frecuencias) —
    • Si la clave se encuentra en el diccionario entonces, suma uno al valor
    • Si no se encuentra, creamos un par clave-valor con un valor de uno
  • La variable most_frequent almacena, irónicamente, el valor más grande (no clave) del diccionario de frecuencia
  • Devolvemos la variable de modos que consta de todas las claves en el diccionario de frecuencia con la mayor frecuencia.

Tenga en cuenta lo importante que es la nomenclatura de variables para escribir código legible.

Uso de mode() y multimode() del módulo de estadísticas de Python

Una vez más, el módulo de estadísticas nos proporciona una forma rápida de realizar operaciones estadísticas básicas.

Podemos usar dos funciones: modo() y multimodo().

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']

El código anterior importa ambas funciones y define los conjuntos de datos con los que hemos estado trabajando.

Aquí viene la pequeña diferencia: la función mode() devuelve el primer modo que encuentra, mientras que multimode() devuelve una lista con los valores más frecuentes en el conjunto de datos.

En consecuencia, podemos decir que la función personalizada que definimos es en realidad una función multimodo().

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

Producción:

10
nike

Nota: En Python 3.8 o superior, la función mode() devuelve el primer modo que encontró. Si tiene una versión anterior obtendrá un EstadísticasError.

Usando la función multimodo():

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

Producción:

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

Para resumir

¡Felicidades! Si seguiste hasta ahora, aprendiste a calcular la media, la mediana y la moda, las principales medidas de tendencia central.

Aunque puede definir sus funciones personalizadas para encontrar la media, la mediana y la moda, se recomienda usar el módulo de estadísticas, ya que es parte de la biblioteca estándar y no necesita instalar nada para comenzar a usarlo.

A continuación, lea una introducción amigable al análisis de datos en Python.