¿Quien compra pan también compra leche?
Una regla de asociación dice que, cuando una cesta tiene un producto, suele tener también otro, y se mide con la confianza y el lift. Sirve para decidir qué ofrecer a quien ya ha elegido algo.
Pero cuidado: que dos productos salgan juntos no siempre significa que haya una relación. A veces solo son productos muy comunes.
Al final de esta lección
Nota
Puedo convertir un patrón en una regla y valorarla con la confianza y el lift.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Regla | una frase «si compra A, compra B» | queso -> pan |
| Antecedente | el producto de la izquierda de la regla | |
| Consecuente | el producto de la derecha de la regla | |
| Confianza | de las cestas con A, la parte que también tiene B | |
| Lift | cuántas veces mejora la regla al simple azar |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La confianza mide cuánto se cumple
Una regla se escribe «A -> B». A es el antecedente y B el consecuente.
La confianza mira solo las cestas que tienen A. De ellas, cuenta las que tienen también B. Si el pan sale en 7 cestas y pan con leche en 5, la confianza de pan -> leche es 5 / 7 = 0,71.
Ejemplo resuelto: tres reglas de la tienda
| Regla | Cestas con A y B | Cestas con A | Confianza |
|---|---|---|---|
| pan -> leche | 5 | 7 | 0,71 |
| queso -> pan | 3 | 3 | 1,00 |
| arroz -> aceite | 1 | 2 | 0,50 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Calcula la confianza de las tres reglas
docker exec jupyter python3 -c "B=[x.split() for x in ['pan leche huevos','pan leche','leche yogur arroz','pan huevos queso','pan leche queso','arroz aceite tomate','pan leche huevos tomate','leche huevos','pan queso','pan leche aceite']]; f=lambda *x: sum(all(i in b for i in x) for b in B); print([round(f(a, b) / f(a), 2) for a, b in (('pan', 'leche'), ('queso', 'pan'), ('arroz', 'aceite'))])"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El lift compara la regla con el azar
Pan y leche son muy comunes. Es normal que salgan juntos aunque no tengan nada que ver. El lift quita ese efecto.
Se calcula dividiendo la confianza entre el soporte del consecuente. Si vale 1, la regla no aporta nada. Si es mayor que 1, B aparece más de lo normal cuando hay A. Si es menor, aparece menos.
Ejemplo resuelto: el lift de las tres reglas
| Regla | Confianza | Soporte de B | Lift |
|---|---|---|---|
| pan -> leche | 0,71 | 0,7 | 1,02 |
| queso -> pan | 1,00 | 0,7 | 1,43 |
| arroz -> aceite | 0,50 | 0,2 | 2,50 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Calcula el lift de las tres reglas
docker exec jupyter python3 -c "B=[x.split() for x in ['pan leche huevos','pan leche','leche yogur arroz','pan huevos queso','pan leche queso','arroz aceite tomate','pan leche huevos tomate','leche huevos','pan queso','pan leche aceite']]; f=lambda *x: sum(all(i in b for i in x) for b in B); print([round(f(a, b) * len(B) / (f(a) * f(b)), 2) for a, b in (('pan', 'leche'), ('queso', 'pan'), ('arroz', 'aceite'))])"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error muy común
Advertencia
Mucha gente cree que una confianza alta ya prueba que la regla es buena. La de pan -> leche es 0,71, pero su lift es 1,02: casi no mejora al azar. Mira siempre el lift junto a la confianza. Una regla útil tiene las dos cifras altas.
Mide tres reglas con un programa
# Cuatro cestas y tres reglas. Cambia las cestas y mira cómo se mueven los números.
baskets = [
["pan", "leche"], ["pan", "leche", "queso"], ["pan", "queso"], ["leche"],
]
def count(items):
total = 0
for basket in baskets:
found = True
for item in items:
if item not in basket:
found = False
if found:
total = total + 1
return total
for rule in [["pan", "leche"], ["queso", "pan"], ["leche", "pan"]]:
confidence = count(rule) / count([rule[0]])
lift = confidence / (count([rule[1]]) / len(baskets))
print(rule[0], "->", rule[1], round(confidence, 2), round(lift, 2))
El calor aumenta los días movidos
En el año de bicicletas, un día movido tiene 300 alquileres o más. Mide tres reglas: calor, finde y lluvia como antecedente.
Un lift menor que 1 también cuenta: dice que la lluvia va en contra de los días movidos.
Mide las tres reglas con los 365 días
docker exec jupyter python3 -c "import csv; d=list(csv.DictReader(open('hires.csv'))); B=[[k for k, t in (('lluvia', float(r['rain_mm'])>0), ('finde', r['weekday'] in ('Sat', 'Sun')), ('calor', float(r['temp_c'])>=15), ('movido', int(r['hires'])>=300)) if t] for r in d]; f=lambda *x: sum(all(i in b for i in x) for b in B); print([(a, round(f(a, 'movido') / f(a), 2), round(f(a, 'movido') * len(B) / (f(a) * f('movido')), 2)) for a in ('calor', 'finde', 'lluvia')])"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos: la regla al revés
Calcula movido -> calor con los días de bicicletas. ¿Es igual que calor -> movido? La confianza cambia, pero el lift no. Piensa por qué: el lift es simétrico, y la confianza no lo es.