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ón
basado 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
Apriori
para 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_)
import pandas as pd from mlxtend.preprocessing import TransactionEncoder tre = TransactionEncoder() df = tre.fit_transform(transactions) df_encoded = pd.DataFrame(df, columns = tre.columns_)
import pandas as pd from mlxtend.preprocessing import TransactionEncoder tre = TransactionEncoder() df = tre.fit_transform(transactions) df_encoded = pd.DataFrame(df, columns = tre.columns_)
import pandas as pd from mlxtend.preprocessing import TransactionEncoder tre = TransactionEncoder() df = tre.fit_transform(transactions) df_encoded = pd.DataFrame(df, columns = tre.columns_)
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)
from mlxtend.frequent_patterns import apriori itemset = apriori(df_encoded, min_support=0.5, use_colnames = True)
from mlxtend.frequent_patterns import apriori itemset = apriori(df_encoded, min_support=0.5, use_colnames = True)
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)
from mlxtend.frequent_patterns import association_rules rules = association_rules(itemsets, metric="confidence", min_threshold=0.8)
from mlxtend.frequent_patterns import association_rules rules = association_rules(itemsets, metric="confidence", min_threshold=0.8)
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.