Adrianistán

El blog de Adrián Arroyo


Estadística en Python: media, mediana, varianza, percentiles (Parte III)

- Adrián Arroyo Calle

Siguiendo en nuestro camino de la estadística descriptiva, hoy vamos a ver como calcular ciertas medidas relativas a una variable.


Fichero de ejemplo


alumno,nota
Araceli,9
Manuel,5
Pablo,7
Íñigo,4
Mario,3
Raúl,4
Verónica,6
Darío,10
Laura,4
Silvia,6
Eduardo,2
Susana,8
María,5

Medidas de centralización: media, mediana y moda


La media aritmética se define como la suma de N elementos dividida entre N. Se trata una medida bastante conocida entre la gente, aunque tiene el inconveniente de que es muy susceptible a valores extremos.

La mediana es el valor que dentro del conjunto de datos es menor que el 50% de los datos y mayor que el 50% restante.

La moda es el valor más repetido (solo aplicable a variables discretas).

Para calcular estas medidas, simplemente seleccionamos la variable estadística del DataFrame y usamos los métodos mean, median y mode respectivamente.

Ejemplo: Calcula la media, la mediana y la moda de las notas de los alumnos en el examen
import pandas as pd

df = pd.read_csv("notas.csv")

media = df["nota"].mean()
mediana = df["nota"].median()
moda = df["nota"].mode()
print("""
Media: %d
Mediana: %d
Moda: %d
""" % (media,mediana,moda))

Medidas de posición: cuartiles y percentiles


El concepto es igual al de mediana, salvo que aquí la división ya no es en el 50%. El 25% de las observaciones es menor que el primer cuartil. Los cuartiles abarcan el 25%, 50% y 75% de las observaciones. Los percentiles son una generalización con cualquier porcentaje.

Ejemplo: ¿Cuál es la nota que tiene como mínimo el 10% más nota de la clase?

Este enunciado nos pide calcular el percentil 90.

Usamos quantile y el porcentaje.
p90 = df["nota"].quantile(0.9)

El resultado es que el 10% con más nota de la clase ha sacado un 8,8 como mínimo. Mencionar que existen distintos tipos de interpolación para este cálculo. En la referencia podemos consultar cual nos conviene más.

Medidas de dispersión: desviación típica, rango, IQR, coeficiente de variación


La desviación típica mide la dispersión de los datos respecto a la media. Se trata de la raíz cuadrada de la varianza, que en sí misma no es una medida de dispersión. Para calcular la desviación típica usamos std y var para la varianza. (ddof=0 es necesario si quieres seguir la definición de desviación típica y varianza de algunas bibliografías, la razón es que hay un parámetro de ajuste que Pandas pone a 1, pero otras librerías ponen a 0). En Excel es la diferencia que hay entre DESVEST.M (ddof=1) y DESVEST.P (ddof=0).
std = df["nota"].std(ddof=0)
var = df["nota"].var(ddof=0)
assert(np.sqrt(var) == std)

El rango es la diferencia entre el máximo y el mínimo y el rango intercuartílico o IQR es la diferencia entre el tercer y el primer cuartil.
rango = df["nota"].max() - df["nota"].min()
iqr = df["nota"].quantile(0.75) - df["nota"].quantile(0.25)

El coeficiente de variación es una medida que sirve para comparar entre dos muestras, cuál varía más y cuál es más estable. Es una simple división, de la desviación típica sobre la media, sin embargo, SciPy nos ofrece una función ya preparada.
import pandas as pd
import scipy.stats as ss

df = pd.read_csv("notas.csv")

cv = df["nota"].std(ddof=0) / df["nota"].mean()
cv2 = ss.variation(df["nota"])
assert(cv == cv2)

Medidas de asimetría


Para saber si los datos estan repartidos de forma simétrica existen varios coeficientes: Pearson, Fisher, Bowley-Yule, etc

Para no liarnos demasiado, podemos usar la función skew de SciPy.
asimetria = ss.skew(df["nota"])

Para valores cercanos a 0, la variable es simétrica. Si es positiva tiene cola a la derecha y si es negativa tiene cola a la izquierda.

Y con esto hemos visto los datos que se pueden extraer de una sola variable.

Comentarios

[…] Estadística en Python: media, mediana, varianza, percentiles (Parte III) […]
Enrique Fueyo
Gracias Adrián por esta magnifica clase de Python y Estadística Descriptiva. Tengo un problema. Mis datos, desordenados, no se encuentran en una única columna, si no en un dataframe de 4 filas y 20 columnas. Para poder aplicar estas funcions, forzoamente tengo que convertir este df en otro con una única columna, en la que esten los datos ordenados?. Saludos cordiales
Buenos días Enrique. Me alegra que te sirva el artículo. Respecto a tu pregunta, no es necesario, aunque personalmente yo lo convertería a una única columna, por aquello de que cada columna tiene que representar una propiedad de forma única y exclusiva. Para ello tienes que usar append, lo cuál te creará un nuevo DataFrame. Por ejemplo: nuevo_df = df["a"].append(df["b"]) Un saludo

Añadir comentario

Todos los comentarios están sujetos a moderación