¿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

Reglas de asociación: confianza y lift

Después de esta lección: Puedo convertir un patrón en una regla y valorarla con la confianza y el lift.

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

¿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

PalabraQué significaEjemplo
Reglauna frase «si compra A, compra B»queso -> pan
Antecedenteel producto de la izquierda de la regla
Consecuenteel producto de la derecha de la regla
Confianzade las cestas con A, la parte que también tiene B
Liftcuá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

ReglaCestas con A y BCestas con AConfianza
pan -> leche570,71
queso -> pan331,00
arroz -> aceite120,50

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

Calcula la confianza de las tres reglas

Comando
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

ReglaConfianzaSoporte de BLift
pan -> leche0,710,71,02
queso -> pan1,000,71,43
arroz -> aceite0,500,22,50

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

Calcula el lift de las tres reglas

Comando
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

Código: python
# 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

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

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.