¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Contraste de hipótesis y valor p

Después de esta lección: Puedo contrastar una afirmación con un valor p y explicar sus límites en palabras.

Lección de 65 min2 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

Un contraste de hipótesis separa casualidad y diferencia

Un contraste de hipótesis es un método para decidir si una diferencia entre dos grupos se explica por la casualidad. El resultado se resume en un número llamado valor p.

Sirve para no creer una mejora que fue solo suerte. Por ejemplo, ¿alquila más bicis la tienda en fin de semana, o solo lo parece?

Al final de esta lección

Nota

Puedo contrastar una afirmación con un valor p y explicar sus límites en palabras.

Palabras clave

PalabraQué significaEjemplo
Hipótesis nulala idea de que no hay ninguna diferencia real
Estadístico de contrasteel número que resume la diferencia observada
Permutaciónun reparto al azar de los mismos datos en grupos
Valor pla parte de repartos con tanta diferencia o más
Nivel de significaciónel valor p por debajo del cual se rechaza la nula0,05
Falso positivover una diferencia que solo era casualidad

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Se parte de la hipótesis nula

Un contraste empieza con una afirmación: «los fines de semana se alquilan más bicis». Se compara con la hipótesis nula, que dice que no hay diferencia y que lo visto es casualidad.

Después se elige un estadístico de contraste, un número que resume la diferencia. Aquí es la media de los fines de semana menos la de los demás días.

Calcula la diferencia observada

Comando
docker exec jupyter python3 -c "import csv,statistics as s; d=list(csv.DictReader(open('hires.csv'))); a=[int(r['hires']) for r in d if r['weekday'] in ('Sat','Sun')]; b=[int(r['hires']) for r in d if r['weekday'] not in ('Sat','Sun')]; print(round(s.mean(a)-s.mean(b),1))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo resuelto: los pasos de un contraste

PasoEn el ejemplo de las bicis
1. La afirmaciónLos fines de semana se alquilan más bicis
2. La hipótesis nulaNo hay diferencia; la diferencia vista es casualidad
3. El estadísticoMedia de fin de semana menos media del resto: 55,2
4. El valor pCon qué frecuencia el azar da 55,2 o más
5. La decisiónSi el valor p es menor que 0,05, se rechaza la nula

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

El valor p cuenta repartos con tanta diferencia

Para ver qué hace el azar, mezcla los datos y repártelos en dos grupos del mismo tamaño. Calcula la diferencia de cada reparto. Es una permutación.

El valor p es la parte de repartos con una diferencia igual o mayor que la observada. Si es muy pequeña, el azar rara vez la produce.

Cuenta todos los repartos de ocho números

Comando
docker exec jupyter python3 -c "import itertools as i; a=[5,6,7,8]; b=[3,4,5,6]; t=a+b; o=sum(a)/4-sum(b)/4; c=[x for x in i.combinations(range(8),4) if abs(sum(t[j] for j in x)/4-(sum(t)-sum(t[j] for j in x))/4)>=o]; print(o, len(c), 70)"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo resuelto: ocho números, 70 repartos

DatoValor
Grupos5, 6, 7, 8 y 3, 4, 5, 6
Diferencia observada de medias6,5 - 4,5 = 2,0
Repartos posibles de 8 en 4 y 470
Repartos con diferencia 2,0 o más10
Valor p10 / 70 = 0,14

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Todos los repartos de diez números

Código: python
# Los minutos que tardan cinco personas con cada uno de dos métodos.
primero = [9, 8, 9, 7, 8]
segundo = [6, 5, 7, 6, 6]

# Diferencia de sumas observada.
observada = abs(sum(primero) - sum(segundo))
print("diferencia observada:", observada)

# Si no hubiera ninguna diferencia real, cualquier reparto valdría.
# Probamos todos los repartos de los 10 números en dos grupos de 5.
todos = primero + segundo
repartos = 0
iguales_o_mas = 0
for mascara in range(2 ** 10):
    cuantos = 0
    suma = 0
    for i in range(10):
        if mascara // 2 ** i % 2 == 1:
            cuantos = cuantos + 1
            suma = suma + todos[i]
    if cuantos == 5:
        repartos = repartos + 1
        if abs(suma - (sum(todos) - suma)) >= observada:
            iguales_o_mas = iguales_o_mas + 1
print("repartos:", repartos, "con tanta diferencia o más:", iguales_o_mas)
# Cambia el primer 9 por un 5 y vuelve a ejecutar.
# ¿Sube o baja el número de repartos con tanta diferencia?

Un error muy común

Advertencia

Mucha gente cree que un valor p de 0,03 significa un 3 % de probabilidad de que la nula sea cierta. No es así: dice qué tan raro sería ver esa diferencia si la nula fuera cierta. Tampoco dice si la diferencia es grande o importante.

Si pruebas mucho, algo saldrá significativo

Con un nivel de significación de 0,05, un contraste da un falso positivo una de cada 20 veces aunque no haya nada real. Si pruebas 20 afirmaciones, espera una «significativa» solo por suerte.

Decide la afirmación antes de mirar los datos, y di cuántas pruebas hiciste.

Para ir más lejos: ¿y el sol?

Plantea otra afirmación con el mismo archivo: «los días de sol tienen más alquileres que los de lluvia». Escribe la nula y el estadístico.

Después estima a ojo si el valor p será pequeño o grande, viendo cuánto se separan las medias. No hace falta calcularlo: explica tu razonamiento en dos frases.

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.