Clase 7: Algoritmo Apriori
Gracias a los planes de fidelización (juntar puntos, dar RUT, acumular millas, etc.) las empresas son capaces de detectar
patrones:
Market Basket Analysis
Corresponde al estudio de nuestra canasta de compras. De modo que podamos entender qué cosas son las que como clientes preferimos y una empresa pueda Recomendar de manera más apropiadas.
Predicado (output True/False) para verificar si una estructura buscada ocurre o no.
Encontrar
reglas de asociaciónbasado en patrones.
patrón: si compro vino, también llevo queso).Una transacción involucra un conjunto de elementos. Una boleta de supermercado muestra el conjunto de elementos comprados por un cliente. Los productos involucrados en una transacción se denominan
items.
Objetivo
Encontrar asociaciones entre elementos u objetos de bases de datos transaccionales.
Aplicaciones
\[Supp(X) = P(X)\]
\[SuppCount(X) = Count(X)\]
\[Conf(X \implies Z) = \frac{Supp(X \cup Z)}{Supp(X)}\] \[Conf(X \implies Z) = \frac{SuppCount(X \cup Z)}{SuppCount(X)}\]
Ojo con la Notación \(\cup\). En este caso significa que tanto el producto X como el Producto Z sean parte de la transacción.
\[ Supp({Pan}) = 4/7\] \[ Supp({Leche}) = 3/7\] \[ Supp({Pan, Huevo}) = 2/7\]
\[ Conf({Pan} \implies {Huevo}) = \frac{Supp({Pan, Huevo})}{Supp(Pan)} = \frac{2/7}{4/7}\]
\[ Conf({Pan} \implies {Leche}) = \frac{Supp({Pan, Leche})}{Supp(Pan)} = \frac{1/7}{4/7}\] \[ Conf({Leche} \implies {Pan}) = \frac{Supp({Pan, Leche})}{Supp(Leche)} = \frac{1/7}{3/7}\]
En un dataset transaccional de n productos totales y \(|U_i|\) elementos para la Transacción \(i\).
Se pueden generar un total de \(N_{reglas}\) de asociación:
\[N_{reglas} = \sum_{i=1}^{2^{n}} \sum_{j=0}^{|U_i|}\binom{|U_i|}{j}\]
Es un algoritmo para aprender reglas de asociación que utiliza el principio
Aprioripara buscar de forma eficiente las reglas que satisfacen los límites de soporte y confianza.
umbral de soporte).paso a y repetir.Supongamos el siguiente dataset transaccional:
Supongamos que queremos calcular las reglas de asociación que tengan un MinSupp=40% y un MinConf=70%.
Galletas NO CUMPLE con el Soporte Mínimo solicitado. Por lo tanto, lo elimino y genero relaciones de 2 productos sin considerar Galletas.
{Pan, Mantequilla}:\(Conf(Pan \implies Mantequilla) = \frac{Supp(Pan, Mantequilla)}{Supp(Pan)} = \frac{3}{3}\)✅ \(Conf(Mantequilla \implies Pan) = \frac{Supp(Pan, Mantequilla)}{Supp(Mantequilla)} = \frac{3}{3}\)✅
{Pan, Leche}:\(Conf(Pan \implies Leche) = \frac{Supp(Pan, Leche)}{Supp(Pan)} = \frac{2}{3}\) ❌ \(Conf(Leche \implies Pan) = \frac{Supp(Pan, Leche)}{Supp(Leche)} = \frac{2}{2}\) ✅
{Mantequilla, Leche}:\(Conf(Mantequilla \implies Leche) = \frac{Supp(Mantequilla, Leche)}{Supp(Mantequilla)} = \frac{2}{3}\) ❌ \(Conf(Leche \implies Mantequilla) = \frac{Supp(Mantequilla, Leche)}{Supp(Leche)} = \frac{2}{2}\) ✅
{Pañales, Cerveza}:\(Conf(Pañales \implies Cerveza) = \frac{Supp(Pañales, Cerveza)}{Supp(Pañales)} = \frac{2}{3}\)❌ \(Conf(Cerveza \implies Pañales) = \frac{Supp(Pañales, Cerveza)}{Supp(Cerveza)} = \frac{2}{2}\)✅
{Pan, Mantequilla, Leche}:\(Conf({Pan, Mantequilla} \implies {Leche}) = \frac{Supp(Pan, Mantequilla, Leche)}{Supp(Pan, Mantequilla)} = \frac{2}{3}\)❌ \(Conf({Pan, Leche} \implies {Mantequilla}) = \frac{Supp(Pan, Mantequilla, Leche)}{Supp(Pan, Leche)} = \frac{2}{2}\)✅ \(Conf({Mantequilla, Leche} \implies {Pan}) = \frac{Supp(Pan, Mantequilla, Leche)}{Supp(Mantequilla, Leche)} = \frac{2}{2}\)✅
\(Conf({Leche} \implies {Pan, Mantequilla}) = \frac{Supp(Pan, Mantequilla, Leche)}{Supp(Leche)} = \frac{2}{2}\)✅ \(Conf({Mantequilla} \implies {Pan, Leche}) = \frac{Supp(Pan, Mantequilla, Leche)}{Supp(Mantequilla)} = \frac{2}{3}\)❌ \(Conf({Pan} \implies {Mantequilla, Leche}) = \frac{Supp(Pan, Mantequilla, Leche)}{Supp(Pan)} = \frac{2}{3}\)❌
\[Pan \implies Mantequilla\] \[Mantequilla \implies Pan\] \[Leche \implies Pan\] \[Leche \implies Mantequilla\] \[Cerveza \implies Pañales\] \[\{Pan, Leche\} \implies Mantequilla\]
\[\{Mantequilla, Leche\} \implies Pan\] \[Leche \implies \{Pan, Mantequilla\}\]
Insights:
\[Lift(X,Y) = \frac{Conf(X \implies Y)}{s(Y)}\]
\[Lift(Cerveza, Pañales) = \frac{Conf(Cerveza \implies Pañales)}{Supp(Pañales)} = \frac{1}{0.6} = 1.67\]
Una persona que compra Cerveza tiene 1.67 más chances de comprar Pañales.
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
tre = TransactionEncoder()
df = tre.fit_transform(transactions)
df_encoded = pd.DataFrame(df, columns = tre.columns_)L4: transactions debe ser una lista de listas. Cada fila, son distintas transacciones. Cada transaccion puede tener distinto número de elementos. L5: tre.columns_ extrae los nombres de los productos para que el DataFrame sea más entendible.
df_encoded es un DataFrame tipo OneHotEncoder pero con valores Booleanos (Esto es solicitado por la documentación).
from mlxtend.frequent_patterns import apriori
itemset = apriori(df_encoded, min_support=0.5, use_colnames = True)L3: df_encoded es el DataFrame preprocesado.
min_support: Corresponde al Soporte Mínimo para generar itemsets. Por defecto 0.5.
use_colnames: Permite que las reglas usen los nombres de las columnas para referirse a los productos. Por defecto es False, pero conviene usarlo como True.
itemset será un DataFrame con los itemsets generados.
from mlxtend.frequent_patterns import association_rules
rules = association_rules(itemsets, metric="confidence", min_threshold=0.8)L3: itemset es el dataframe generado en el paso anterior.
metric: Métrica para definir reglas, puede ser “confidence” y otras definidas acá
min_threshold: Corresponde al umbral de la métrica a utilizar. Por defecto 0.8.
rules corresponde a un Dataset que tiene las Reglas de Asociación detectadas y muchas métricas asociadas.
