Que son las reglas de asociación?
Hay varias formas de ver las similitudes entre elementos. Estas son técnicas que caen dentro del paraguas de asociación. El resultado de este tipo de técnicas, en términos simples, es un conjunto de reglas que se pueden entender como “si esto, entonces aquello”.(mas información)
Aplicaciones
De que tipo de elementos hablamos entonces?Hay muchas aplicaciones para las reglas de asociacion:
- Recomendaciones de productos – como el de Amazon “Clientes que compraron esto, también compraron esto otro”
- Recomendaciones musicales – como las recomendaciones de artistas de Last FM.
- Diagnósticos médicos – ejemplos como las diabetes, hay aplicaciones increíbles.
- Optimización de contenido – como en revisas o blogs.
El dataset de compras
Imaginate 10.000 facturas arriba de tu mesa. Cada una representa una transacción con productos que se compraron. La factura es una representación de las cosas que terminaron en la canasta de un cliente – Y por ende el nombre, “Análisis de la Canasta de Mercado” o “Market Basket Analysis”. Esto es exactamente lo que el dataset de Groceries de R contiene: una colección de facturas, cada una representando los productos comprados. Cada linea se llama transacción y cada columna del registro representa un producto. Podes descargar el dataset de Groceries para darle una mirada, pero no es un paso necesario.Un poco de Matemáticas
Ya conocemos el concepto de Items y Conjuntos de Elementos. Podemos representar nuestros ítems como un conjunto así:
1 |
I = { i1,i2,…,in } |
1 |
tn = { ij,ik,…,in } |
1 |
{ i1,i2 } => { ik } |
1 |
{ cafe, azucar } => { leche } |
Confidence: Probabilidad de que una regla sea correcta para una nueva transacción con ítems del lado izquierdo.
Lift: La tasa por la cual la confidence observada de una regla supera la esperada. Atencion: Cuando el Lift es 1 quiere decir que los ítems de la derecha y de la izquierda son independientes.
Recomendación Apriori con R
Empecemos cargando nuestras librerias y el dataset
1 2 3 4 5 6 7 |
# Cargar las librerias library(arules) library(arulesViz) library(datasets) # Cargar el dataset data(Groceries) |
1 2 |
# Crear un grafico de frecuencias para los 20 elementos mas comprados. itemFrequencyPlot(Groceries,topN=20,type="absolute") |

Siempre tenes que especificar el mínimo requerido para support y confidence.
- Configuramos a support con un mínimo de 0,01
- Configuramos a confidence con un mínimo de 0,8
- Finalmente mostramos las 5 mejores reglas
1 2 3 4 5 6 |
# Obtener las reglas rules <- apriori(Groceries, parameter = list(supp = 0.001, conf = 0.8)) # Mostrar las 5 mejores reglas, pero solo mostrar dos digitos options(digits=2) inspect(rules[1:5]) |
1 2 3 4 5 6 |
lhs rhs support confidence lift {liquor,red/blush wine} => {bottled beer} 0.0019 0.90 11.2 {curd,cereals} => {whole milk} 0.0010 0.91 3.6 {yogurt,cereals} => {whole milk} 0.0017 0.81 3.2 {butter,jam} => {whole milk} 0.0010 0.83 3.3 {soups,bottled beer} => {whole milk} 0.0011 0.92 3.6 |
- La cantidad de reglas generadas: 410
- Como se distribuyen las reglas por largo: La mayoría tienen 4 ítems.
- El resumen de la calidad de las medidas: es interesante ver los rangos de support, confidence y lift.
- La informacion sobre los datos minados: cantidad de registros minados, parámetros mínimos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
set of 410 rules rule length distribution (lhs + rhs): sizes 3 4 5 6 29 229 140 12 summary of quality measures: support conf. lift Min. :0.00102 Min. :0.80 Min. : 3.1 1st Qu.:0.00102 1st Qu.:0.83 1st Qu.: 3.3 Median :0.00122 Median :0.85 Median : 3.6 Mean :0.00125 Mean :0.87 Mean : 4.0 3rd Qu.:0.00132 3rd Qu.:0.91 3rd Qu.: 4.3 Max. :0.00315 Max. :1.00 Max. :11.2 mining info: data n support confidence Groceries 9835 0.001 0.8 |
Ordenando las cosas
El primer problema que vemos aquí es que las reglas no están ordenadas. A menudo queremos ver las reglas mas relevantes primero. Digamos que queremos ver las reglas mas probables. Podemos fácilmente ordenar por confidence ejecutando el siguiente código
1 |
rules<-sort(rules, by="confidence", decreasing=TRUE) |
1 2 3 4 5 6 7 |
lhs rhs support conf. lift {rice,sugar} => {whole milk} 0.0012 1 3.9 {canned fish,hygiene articles} => {whole milk} 0.0011 1 3.9 {root vegetables,butter,rice} => {whole milk} 0.0010 1 3.9 {root vegetables,whipped/sour cream,flour} => {whole milk} 0.0017 1 3.9 {butter,soft cheese,domestic eggs} => {whole milk} 0.0010 1 3.9 |
1 |
rules <- apriori(Groceries, parameter = list(supp = 0.001, conf = 0.8,maxlen=3)) |
Redundancias
A veces las reglas se repiten. La redundancia indica que un elemento se puede llegar a descartar. Como analista podes elegir eliminar ese elemento del dataset. O en su lugar, eliminar las reglas redundantes generadas. Para eliminar esas reglas repetidas y redundantes utilizamos el siguiente código
1 2 3 4 5 |
subset.matrix <- is.subset(rules, rules) subset.matrix[lower.tri(subset.matrix, diag=T)] <- NA redundant <- colSums(subset.matrix, na.rm=T) >= 1 rules.pruned <- rules[!redundant] rules<-rules.pruned |
Seleccionando Ítems
Ahora que sabemos como generar reglas y limitar la salida, digamos que queremos enfocarnos en ciertos ítems para generar las reglas. Hay dos tipos de targets que pueden resultar interesantes y que están ilustrados en el ejemplo de la “leche entera”:- Que productos compran los clientes antes de comprar leche entera?
- Que productos compran los clientes si es que compraron leche entera?
1 2 3 4 5 |
rules<-apriori(data=Groceries, parameter=list(supp=0.001,conf = 0.08), appearance = list(default="lhs",rhs="whole milk"), control = list(verbose=F)) rules<-sort(rules, decreasing=TRUE,by="confidence") inspect(rules[1:5]) |
1 2 3 4 5 6 |
lhs rhs supp. conf. lift {rice,sugar} => {whole milk} 0.0012 1 3.9 {canned fish,hygiene articles} => {whole milk} 0.0011 1 3.9 {root vegetables,butter,rice} => {whole milk} 0.0010 1 3.9 {root vegetables,whipped/sour cream,flour} => {whole milk} 0.0017 1 3.9 {butter,soft cheese, domestic eggs} => {whole milk} 0.0010 1 3.9 |
- Configuramos la confidence en 0,15 ya que no hay reglas con 0,8
- El largo mínimo lo ponemos en 2 para evitar reglas sin elementos en el lado izquierdo.
1 2 3 4 5 |
rules<-apriori(data=Groceries, parameter=list(supp=0.001,conf = 0.15,minlen=2), appearance = list(default="rhs",lhs="whole milk"), control = list(verbose=F)) rules<-sort(rules, decreasing=TRUE,by="confidence") inspect(rules[1:5]) |
1 2 3 4 5 6 7 |
lhs rhs support confidence lift {whole milk} => {other vegetables} 0.075 0.29 1.5 {whole milk} => {rolls/buns} 0.057 0.22 1.2 {whole milk} => {yogurt} 0.056 0.22 1.6 {whole milk} => {root vegetables} 0.049 0.19 1.8 {whole milk} => {tropical fruit} 0.042 0.17 1.6 {whole milk} => {soda} 0.040 0.16 0.9 |
Visualización
El ultimo paso es la visualización. Digamos que queremos mapear las reglas en un grafo. Lo podemos hacer con una librería llamada “arulesViz”.
1 2 |
library(arulesViz) plot(rules,method="graph",interactive=TRUE,shading=NA) |
