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 «medios» de un conjunto de datos. Si está empezando con la ciencia de datos, este es el tutorial adecuado para usted.

Mean, median, mode the three measurements of central tendency

Al final de este tutorial usted:

  • Entenderá el concepto de media, mediana y moda
  • Será capaz de crear sus propias funciones de media, mediana y moda en Python
  • Hará uso del módulo estadístico 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 de GitHub.

Adentrémonos en las diferentes formas de calcular la media, la mediana y la moda.

Cálculo de la media en Python

La media o promedio aritmético 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 incorporadas:

  • 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 existen otras estructuras de datos en Python como las colas o las pilas, sólo utilizaremos las incorporadas.

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 cálculo siguiente:

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

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

Creación de una función media personalizada

Empecemos calculando la edad media (promedio) de los jugadores de un equipo de baloncesto. El nombre del equipo será «Máquinas Pitónicas».

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

def media(conjunto_datos):
    return suma(conjunto_datos) / len(conjunto_datos)

print(media(edades_de_la_máquina_pitónica))

Desglosando este código

  • Las «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. Si intenta 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 de los equipos de baloncesto a la función mean () e imprimimos el resultado.

Si comprueba la salida, obtendrá

26.375
# Porque 211 / 8 = 26,375

Esta salida representa la edad media 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 estadístico de Python

Calcular medidas de tendencia central es una operación habitual para la mayoría de los desarrolladores. Esto se debe a que el módulo de estadística de Python proporciona diversas funciones para calcularlas, junto con otros temas básicos de estadística.

Dado que forma parte de la biblioteca estándar de Python, no necesitará instalar ningún paquete externo con PIP.

A continuación le explicamos cómo utilizar este módulo:

from statistics import media

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

print(media(pythonic_machine_ages))

En el código anterior, sólo tiene que importar la función mean() del módulo de estadística 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 ya tiene claro el concepto de media, continuemos con la medición de la mediana.

Encontrar la mediana en Python

La mediana es el valor medio de un conjunto de datos ordenados. Se utiliza -de nuevo- para proporcionar un valor «típico» de una población determinada.

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, en primer lugar, necesitamos ordenar el conjunto de datos. Podemos hacerlo con algoritmos de ordenación o utilizando la función incorporada sorted(). El segundo paso consiste en determinar si la longitud del conjunto de datos es par o impar. En función de esto se realiza alguno 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

Siguiendo con nuestro conjunto de datos de equipos de baloncesto, calculemos la mediana de la altura en centímetros de los jugadores:

[181, 187, 196, 196, 198, 203, 207, 211, 215]
# Como el conjunto de datos es impar, seleccionamos el valor medio
mediana = 198

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

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

[181, 187, 196, 198, 203, 207, 211, 215] 
# Seleccionamos los dos valores medios y los dividimos por 2
mediana = (198 203) / 2
mediana = 200,5

Creación de una función mediana personalizada

Implementemos el concepto anterior en una función Python.

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

  • Ordenar el conjunto de datos: Podemos hacerlo con la función sorted()
  • Determinar si es par o impar: Podemos hacerlo obteniendo la longitud del conjunto de datos y utilizando el operador módulo (%)
  • Devolver la mediana en función de cada caso
    • Impar Devuelve el valor medio
    • Par: Devuelve la media de los dos valores medios

El resultado sería la siguiente función

máquinas_pitónicas_altas = [181, 187, 196, 196, 198, 203, 207, 211, 215]
despues_jubilacion = [181, 187, 196, 198, 203, 207, 211, 215]

def mediana(conjunto_datos):
    data = sorted(conjunto_datos)
    index = len(datos) // 2
    
    # Si el conjunto de datos es impar  
    si len(conjuntodatos) % 2 != 0
        return datos[índice]
    
    # Si el conjunto de datos es par
    return (datos[índice - 1] datos[índice]) / 2

Imprimir el resultado de nuestros conjuntos de datos

print(mediana(alturas_máquinas_pitónicas))
print(mediana(despues_jubilacion))

Resultado

198
200.5

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

El índice almacena el valor medio -o el valor medio-superior- del conjunto de datos, utilizando el operador de división de enteros. Por ejemplo, si pasáramos la lista «pythonic_machine_heights» tendría el valor 4.

Recuerde que en Python los índices de secuencia empiezan en cero, eso es porque podemos devolver el índice medio de una lista, con una división entera.

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

>>> pythonic_machine_heights[4]
# 198

En cambio, si el conjunto de datos es par, devolvemos la suma de los valores medios dividida por dos. Observe que datos [índice -1 ] nos da el punto medio inferior del conjunto de datos, mientras que datos[índice] nos proporciona el punto medio superior.

Uso de median() del módulo estadístico de Python

Esta forma es mucho más sencilla porque estamos utilizando una función ya existente del módulo estadístico.

Personalmente, si hay algo ya definido para mí, lo utilizaría por el principio DRY -Don’t repeat yourself- (en este caso, no repetir el código de otros).

Puede calcular la mediana de los conjuntos de datos anteriores con el siguiente código:

from statistics import mediana

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

print(mediana(alturas_máquinas_pitónicas))
print(mediana(despues_jubilacion))

Salida:

198
200.5

Cálculo de la moda en Python

La moda es el valor más frecuente del conjunto de datos. Podemos pensar en ella como el grupo «popular» de una escuela, que puede representar un estándar para todos los estudiantes.

Un ejemplo de modo podrían ser las ventas diarias de una tienda de tecnología. El modo de ese conjunto de datos sería el producto más vendido de un día concreto.

['ordenador portátil', 'ordenador de sobremesa', 'smartphone', 'ordenador portátil', 'ordenador portátil', 'auriculares']

Como puede apreciar, el modo del conjunto de datos anterior es «portátil» porque era el valor más frecuente de 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:

['ratón', 'cámara', 'auriculares', 'usb', 'auriculares', 'ratón']

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

¿Qué ocurre si no podemos encontrar el modo en un conjunto de datos, como el siguiente?

['usb', 'cámara', 'smartphone', 'portátil', 'televisor']

Esto se llama una distribución uniforme, básicamente, significa que no hay modo en el conjunto de datos.

Ahora que ya conoce el concepto de moda, vamos a calcularlo en Python.

Creación de una función de modo personalizada

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

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

Para encontrar el modo primero tenemos que crear un diccionario de frecuencias 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:

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

def modo(conjunto de datos):
    frecuencia = {}

    para valor en conjunto de datos:
        frecuencia[valor] = frecuencia.get(valor, 0) 1

    más_frecuente = max(frecuencia.valores())

    modos = [clave para clave, valor en frecuencia.elementos()
                      if valor == más_frecuente]

    return modos

Comprobación del resultado pasando las dos listas como argumentos

print(modo(puntos_por_partido))
print(modo(patrocinio))

Salida:

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

Como puede ver, la primera sentencia print nos dio un único 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, añade uno al valor
    • Si no se encuentra creamos un par clave-valor con un valor de uno
  • La variable más_frecuente almacena -irónicamente- el mayor valor (no clave) del diccionario de frecuencias
  • Devolvemos la variable modos que consiste en todas las claves del diccionario de frecuencias con la mayor frecuencia.

Observe lo importante que es la denominación de las variables para escribir código legible.

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

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

Podemos utilizar dos funciones: mode( ) y multimode( ).

from statistics import modo, multimodo

puntos_por_partido = [3, 15, 23, 42, 30, 10, 10, 12]
patrocinio = ['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 del conjunto de datos.

En consecuencia, podemos decir que la función personalizada que hemos definido es en realidad una función multimodo( ).
print(modo(puntos_por_partido))
print(modo(patrocinio))

Salida:

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

Utilizando la función multimode( )

print(multimodo(puntos_por_partido))
print(multimodo(patrocinio))

Salida:

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

En resumen

¡Enhorabuena! Si ha seguido hasta aquí, ha aprendido a calcular la media, la mediana y la moda, las principales medidas de tendencia central.

Aunque puede definir sus propias funciones para hallar la media, la mediana y la moda, se recomienda utilizar el módulo estadístico, ya que forma parte de la biblioteca estándar y no necesita instalar nada para empezar a utilizarlo.

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