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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Hipótesis nula | la idea de que no hay ninguna diferencia real | |
| Estadístico de contraste | el número que resume la diferencia observada | |
| Permutación | un reparto al azar de los mismos datos en grupos | |
| Valor p | la parte de repartos con tanta diferencia o más | |
| Nivel de significación | el valor p por debajo del cual se rechaza la nula | 0,05 |
| Falso positivo | ver 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
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
| Paso | En el ejemplo de las bicis |
|---|---|
| 1. La afirmación | Los fines de semana se alquilan más bicis |
| 2. La hipótesis nula | No hay diferencia; la diferencia vista es casualidad |
| 3. El estadístico | Media de fin de semana menos media del resto: 55,2 |
| 4. El valor p | Con qué frecuencia el azar da 55,2 o más |
| 5. La decisión | Si 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
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
| Dato | Valor |
|---|---|
| Grupos | 5, 6, 7, 8 y 3, 4, 5, 6 |
| Diferencia observada de medias | 6,5 - 4,5 = 2,0 |
| Repartos posibles de 8 en 4 y 4 | 70 |
| Repartos con diferencia 2,0 o más | 10 |
| Valor p | 10 / 70 = 0,14 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Todos los repartos de diez números
# 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.