Market Basket Analysis

Introducción

En el análisis de asociación, nos interesa el número absoluto de transacciones realizadas que contienen un conjunto particular de elementos (items). Una aplicación típica del análisis de asociación es el análisis de la cesta de mercado, que se usa para observar el comportamiento de compra de los consumidores en los supermercados.

Market Basket Analysis

Al encontrar relaciones entre los artículos que la gente compra, un minorista puede usar esta información para generar estrategias de marketing para incrementar sus ingresos.

El modelo de la cesta de mercado

Este modelo se basa en la relación entre los items y las transacciones, con algunas suposiciones sobre la forma de los datos.

  • Cada transacción consta de un conjunto de items (itemset).

  • La cantidad de productos en una transacción es menor que la cantidad total de items ofrecidos por un supermercado.

El objetivo es identificar los itemsets frecuentes, es decir, los conjuntos de artículos que aparecen en muchas cestas.

Supóngase la siguiente base de datos de un supermercado

Transacción 1 manzana, cerveza, arroz, carne
Transacción 2 manzana, cerveza, arroz
Transacción 3 manzana, cerveza
Transacción 4 manzana, kiwi
Transacción 5 leche, cerveza, arroz, carne
Transacción 6 leche, cerveza, arroz
Transacción 7 leche, cerveza
Transacción 8 leche, kiwi

En nuestro ejemplo podemos ver que “manzana” se compra junto con “cerveza” en tres transacciones

Reglas de asociación

Aunque estamos interesados en extraer conjuntos frecuentes de elementos, esta información a menudo se presenta como una colección de implicaciones del tipo “si esto, entonces aquello”, denominadas reglas de asociación.

La forma de una regla de asociación se ve como \[A ~ \rightarrow ~ B\] donde \(A\) es un conjunto de elementos, también llamado antecedente o lado izquierdo (LHS), y \(B\) es solo un elemento, también llamado consecuente o lado derecho (RHS). La regla se lee de la siguiente manera si todos los elementos de \(A\) aparecen en alguna cesta, entonces es “probable” que \(B\) también aparezca en esa cesta. Hay que notar que el símbolo de implicación \(\rightarrow\) no indica una relación causal entre \(A\) & \(B\) sino que es una estimación de la probabilidad condicional de \(B\) dado \(A\).

Un ejemplo de una regla de asociación podría ser

\[\{cafe, ~azucar\} ~ \rightarrow ~ \{leche\}\]

lo que significa que si se compran café y azúcar, es probable que también se compre leche.

Medidas de Asociación

Consideremos que tenemos una tienda de comestibles con decenas de miles de productos diferentes. No sería eficiente encontrar todas las reglas de asociación para todas las posibles combinaciones de productos. En su lugar, querríamos seleccionar solamente las reglas potencialmente “relevantes”. Por lo tanto, utilizaremos medidas de asociación (soporte, confianza y elevación) para reducir el número de relaciones a analizar.

Soporte

Mide la frecuencia con la que se encuentra un itemset en todo el conjunto de transacciones. Puede calcularse como

\[ Soporte(A) = \frac{frecuencia(A)}{n}; ~~ \small{n = \mbox{número total de transacciones}} \]

Por lo general, se utiliza un umbral de soporte específico para reducir la cantidad de itemsets que necesitamos analizar. Al comienzo del análisis, podríamos establecer nuestro umbral de soporte entre el 1% y el 10%.

Volviendo a nuestro ejemplo el \(\small{Soporte(manzana) = \frac{4}{8}}\), o 50%. El \(\small{Soporte(manzana, cerveza, arroz) = \frac{2}{8}}\), o 25%.

Confianza

Nos dice la probabilidad de que se compre \(B\) dado que se compro \(A\), expresado como \(A ~ \rightarrow ~ B\). Se calcula como

\[ Confianza(A ~ \rightarrow ~ B) = \frac{Soporte(A \cup B)}{Soporte(A)} \]

Por tanto, la confianza se puede interpretar como una estimación de la probabilidad \(P(B | A)\). La confianza está dirigida, por lo que, generalmente da valores diferentes para las reglas \(A ~ \rightarrow ~ B\) & \(B ~ \rightarrow ~ A\).

Volviendo a nuestro ejemplo la \(\small{Confiaza(manzana ~ \rightarrow ~ cerveza) = P(cerveza | manzana) = \frac{0.375}{0.5} = 0.75}\), o 75%. Hay que tener en cuenta que la confianza puede deformar la importancia de una asociación, debido a que solo considera la popularidad de \(A\) (en el ejemplo, manzana), pero no la de \(B\) (en en el ejemplo, cerveza).

Para tener en cuenta la popularidad individual de ambos elementos, utilizaremos una tercera medida denominada “lift”, en español elevación.

Lift

Nos dice qué tan probable es que se compre \(B\) cuando se compra \(A\) mientras se consideran ambas popularidades, es decir, mide cuántas veces más \(A\) & \(B\) ocurren juntas si fueran estadísticamente independientes. La fórmula es

\[ Lift(A ~ \rightarrow ~ B) = \frac{Confianza(A ~ \rightarrow ~ B)}{Soporte(A)} = \frac{Soporte(A \cup B)}{Soporte(A) \cdot Soporte(B)} = \]

El valor de lift se puede interpretar como

  • \(Lift = 1\): implica que no hay asociación entre \(A\) & \(B\).

  • \(Lift > 1\): implica que es probable que se compre \(B\) si se compra \(A\).

  • \(Lift < 1\): implica que es poco probable que se compre \(B\) si se compra \(A\).

Volviendo a nuestro ejemplo \(\small{Lift(manzana ~ \rightarrow ~ cerveza) = \frac{0.75}{0.75} = 1}\), lo que implica que no hay asociación entre los elementos.

Algoritmo A-Priori

Existen varios algoritmos para el análisis de las reglas de asociación (AIS, SETM, FP-Growth, Eclat), pero nosotros nos centraremos en el algoritmo A-Priori que funciona eliminando conjuntos de elementos mirando primero los conjuntos más pequeños y reconociendo que un conjunto grande no puede ser frecuente a menos que todos sus subconjuntos lo sean. En pocas palabras, el algoritmo establece que si un conjunto de elementos es poco frecuente, todos sus subconjuntos también deben serlo.

Esto significa que si se encuentra que el elemento \(\{cerveza\}\) es poco frecuente, podemos esperar que el conjunto de elementos \(\{cerveza, ~pizza\}\) sea igual o incluso menos frecuente. Por lo tanto, al consolidar la lista de conjuntos de elementos frecuentes, no necesitamos considerar \(\{cerveza, ~pizza\}\) ni ninguna otra combinación que contenga a \(\{cerveza\}\).

El algoritmo A-Priori utiliza una estrategia de búsqueda denominada en amplitud, que se puede ver en este árbol de decisiones:

Búsqueda por amplitud

Con este principio, se pueden eliminar (podar) secciones del árbol de decisiones para limitar el número de conjuntos de elementos que deben examinarse

La lista de itemsets frecuentes se puede obtener de la siguiente manera:

  • Paso 0: comience con itemsets que contengan un solo elemento

  • Paso 1: determine el umbral de soporte para los itemsets. Conserve los que cumplan con su umbral mínimo de soporte y elimine los que no lo hagan.

  • Paso 2: con los itemsets que ha guardado en el Paso 1, genere todas las combinaciones de elementos posibles.

  • Paso 3: repita los pasos 1 y 2 hasta que no haya más conjuntos de elementos nuevos.

Algoritmo A-Priori

En la animación, podemos ver que se determinó que \(\small{\{manzana\}}\) tenía un soporte menor al umbral deseado, por lo que se eliminó y no es necesario considerar todas las combinaciones que la contienen. Esto redujo el número de itemsets a considerar.

Hay que tener en cuenta que el umbral para el soporte elegido en el paso 1 puede basarse en un análisis formal o en nuestra experiencia previa. Si sabemos que las ventas de un determinado producto tienden a generar un mayor impacto en las ganancias podríamos tomar esa proporción como nuestro umbral para el soporte, de lo contrario se debe usuar 10% como valor inicial.

Hasta ahora hemos explicado como usar el algoritmo para identificar itemsets con un Soporte alto, sin embargo, el mismo principio puede aplicarse para identificar asociaciones con alto grado de confianza o de lift. Ya que, una vez que se han encontrado los itemsets con mayor Soporte detectar las reglas basándonos en la Confianza o en el Lift es computacionalmente menos costoso, puesto que estos valores se calculan a partir de los valores obtenidos en el Soporte.

Del mismo modo que se hizo con el Soporte, las reglas candidatas con un valor inferior a nuestro umbral, de confianza o de lift, pueden podarse utilizando el algoritmo A-Priori, así se necesitará examinar menos reglas.

En resumenm al usar el algoritmo A-Priori sobre un conjunto de transacciones nuestro objetivo es identificar todas las reglas de asociación que tengan un valor igual o mayor al umbral de Soporte y/o de Confianza

Implementación en R: El paquete arules

“El paquete arules proporciona una infraestructura para representar, manipular y analizar patrones y datos transaccionales (conjuntos de elementos frecuentes y reglas de asociación). También proporciona una implementación en C de los algoritmos Apriori y Eclat.” PDF

Ejemplo del “Análisis de la Cesta de Compra” (MBA)

Carga de las librerias

library(lubridate)  # Fechas
library(arules)     # Análsis de reglas de asociación
library(arulesViz)  # Visualizar reglas de asociación

Importación del dataset

El dataset que usaremos provie de Kaggle, contiene 38,765 filas de órdenes de compra de una tienda de comestibles. Los datos pueden ser descargados aquí.

groceries_data <- read.csv("Groceries_dataset.csv")

groceries_data$Date <- as.Date(groceries_data$Date, format = "%d-%m-%Y")

summary(groceries_data)
 Member_number       Date            itemDescription   
 Min.   :1000   Min.   :2014-01-01   Length:38765      
 1st Qu.:2002   1st Qu.:2014-07-12   Class :character  
 Median :3005   Median :2015-01-21   Mode  :character  
 Mean   :3004   Mean   :2015-01-09                     
 3rd Qu.:4007   3rd Qu.:2015-07-10                     
 Max.   :5000   Max.   :2015-12-30                     

Vamos los primeros seis renglones del dataset

Member_number Date itemDescription
1808 2015-07-21 tropical fruit
2552 2015-01-05 whole milk
2300 2015-09-19 pip fruit
1187 2015-12-12 other vegetables
3037 2015-02-01 whole milk
4941 2015-02-14 rolls/buns

Revisaremos si hay algún NA en nuestra información

Preparación de los datos

Antes de continuar revisemos si cada línea de nuestro dataset corresponde a una única transacción, es decir, que cada renglón corresponda a todos los productos comprados por un mismo cliente en un mismo día.

Member_number Date itemDescription
13332 1000 2014-06-24 whole milk
29481 1000 2014-06-24 pastry
32852 1000 2014-06-24 salty snack
4844 1000 2015-03-15 sausage
8396 1000 2015-03-15 whole milk
20993 1000 2015-03-15 semi-finished bread

Podemos ver que para el cliente 1000 las compras que realizo el día 15/03/2015 no se encuentran en un solo renglón, debemos corregir esto, de lo contrario no podremos trabajar con nuestra información.

groceries_data1 <- ddply(sorted, c("Member_number","Date"), 
                             function(df1)
                               paste(df1$itemDescription, collapse = ","))

groceries_data1 <- groceries_data1 %>% dplyr::rename("Transaccion" = V1)
Member_number Date Transacción
1000 2014-06-24 whole milk,pastry,salty snack
1000 2015-03-15 sausage,whole milk,semi-finished bread,yogurt
1000 2015-05-27 soda,pickled vegetables
1000 2015-07-24 canned beer,misc. beverages
1000 2015-11-25 sausage,hygiene articles
1001 2014-02-07 sausage,whole milk,rolls/buns

Como ya tenemos la información en el formato requerido, procedemos a seleccionar únicamente la columna Transaccion puesto que para nuestro análisis Member_number y Date no son importantes.

cestas_mercado <- groceries_data1$Transaccion %>%
  as_tibble() %>% dplyr::rename("Transaccion" = value)

# Crearemos un archivo .csv a partir del dataframe transacciones
write.csv(cestas_mercado, "cestas_mercado.csv", quote = FALSE, 
            row.names = TRUE)

Convertir un archivo CSV a formato basket

Para usar la función apriori() necesitamos que nuestro .csv sea un objeto del tipo "transactions"

lista_transacciones <- read.transactions("cestas_mercado.csv", 
                                         format = 'basket',
                                         rm.duplicates = TRUE,
                                         sep = ',',
                                         cols = 1)
distribution of transactions with duplicates:
items
  1   2   3   4 
662  39   5   1 
summary(lista_transacciones)
transactions as itemMatrix in sparse format with
 14964 rows (elements/itemsets/transactions) and
 168 columns (items) and a density of 0.01511843 

most frequent items:
      whole milk other vegetables       rolls/buns             soda 
            2363             1827             1646             1453 
          yogurt          (Other) 
            1285            29433 

element (itemset/transaction) length distribution:
sizes
    1     2     3     4     5     6     7     8     9    10 
  206 10012  2727  1273   338   179   113    96    19     1 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    2.00    2.00    2.54    3.00   10.00 

includes extended item information - examples:
            labels
1 abrasive cleaner
2 artif. sweetener
3   baby cosmetics

includes extended transaction information - examples:
  transactionID
1              
2             1
3             2

Vemos que hay 14,964 transacciones y 168 artículos. Las transacciones aquí son las colecciones o subconjuntos de estos 168 artículos.

El resumen nos proporciona otra información útil:

  • density: porcentaje de celdas no vacías en la matriz. Es decir, el número total de artículos que se compraron dividido por el número total de artículos posibles en esa matriz.

  • Artículos más frecuentes: los articulos que más se compraron son: leche entera, otras verduras, panecillos/bollos, refresco y yogur

  • Tamaño de las transacciones: 206 transacciones fueron de un solo artículo, 10012 transacciones para fueron de 2 artículos, hasta llegar a la transacción más grande: 1 transacción de 10 artículos. Esto indica que la mayoría de los clientes compran de 2 a 5 artículos en cada transacción.

Veamos de manera grafica cuales son los 10 articulos más comprados

itemFrequencyPlot(lista_transacciones, topN = 10, type = 'absolute', 
                  col = "indian red", ylab = "frecuencia", 
                  main = "Los 10 productos más comprados")

Reglas de asociación con la función apriori()

El algoritmo emplea la búsqueda por niveles para encontrar los itemsets frecuentes.

Como carecemos de conocimiento previo usaremos un soporte de, al menos, 0.01% y un nivel de confianza de, al menos, 5%.

reglas_asociacion <- apriori(lista_transacciones, 
                                  parameter = list(minlen = 2, 
                                                   supp = 0.001, 
                                                   conf = 0.05))
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
       0.05    0.1    1 none FALSE            TRUE       5   0.001      2
 maxlen target  ext
     10  rules TRUE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 14 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[168 item(s), 14964 transaction(s)] done [0.01s].
sorting and recoding items ... [149 item(s)] done [0.00s].
creating transaction tree ... done [0.01s].
checking subsets of size 1 2 3 4 done [0.02s].
writing ... [450 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
summary(reglas_asociacion)
set of 450 rules

rule length distribution (lhs + rhs):sizes
  2   3 
423  27 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2.00    2.00    2.00    2.06    2.00    3.00 

summary of quality measures:
    support           confidence         coverage             lift       
 Min.   :0.001002   Min.   :0.05000   Min.   :0.005346   Min.   :0.5195  
 1st Qu.:0.001270   1st Qu.:0.06397   1st Qu.:0.015972   1st Qu.:0.7673  
 Median :0.001938   Median :0.08108   Median :0.023590   Median :0.8350  
 Mean   :0.002760   Mean   :0.08759   Mean   :0.033723   Mean   :0.8859  
 3rd Qu.:0.003341   3rd Qu.:0.10482   3rd Qu.:0.043705   3rd Qu.:0.9601  
 Max.   :0.014836   Max.   :0.25581   Max.   :0.157912   Max.   :2.1831  
     count      
 Min.   : 15.0  
 1st Qu.: 19.0  
 Median : 29.0  
 Mean   : 41.3  
 3rd Qu.: 50.0  
 Max.   :222.0  

mining info:
                data ntransactions support confidence
 lista_transacciones         14964   0.001       0.05

El resumen nos dice lo siguiente:

  • Número de reglas: 450.

  • Distribución de las reglas por longitud: las reglas basadas en un itemset de dos elementos son las más numerosas.

  • Estadísticas básicas para las medidas de asociación

Tenemos 450 reglas, no mostraré todas ellas, inspeccionaremos las primeras 10.

reglas_asociacion <- sort(reglas_asociacion, 
                          by = c('confidence', 'lift'), 
                          decreasing = TRUE)

top10_reglas <- inspect(reglas_asociacion[1:10]) 
top10_reglas %>% kbl(align = c('l', 'c', 'l', rep('c', times = 5))) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
lhs rhs support confidence coverage lift count
[1] {sausage,yogurt} => {whole milk} 0.0014702 0.2558140 0.0057471 1.6199746 22
[2] {rolls/buns,sausage} => {whole milk} 0.0011361 0.2125000 0.0053462 1.3456835 17
[3] {sausage,soda} => {whole milk} 0.0010692 0.1797753 0.0059476 1.1384500 16
[4] {semi-finished bread} => {whole milk} 0.0016707 0.1760563 0.0094894 1.1148993 25
[5] {rolls/buns,yogurt} => {whole milk} 0.0013365 0.1709402 0.0078188 1.0825005 20
[6] {sausage,whole milk} => {yogurt} 0.0014702 0.1641791 0.0089548 1.9118880 22
[7] {detergent} => {whole milk} 0.0014034 0.1627907 0.0086207 1.0308929 21
[8] {ham} => {whole milk} 0.0027399 0.1601562 0.0171077 1.0142100 41
[9] {bottled beer} => {whole milk} 0.0071505 0.1578171 0.0453087 0.9993970 107
[10] {frozen fish} => {whole milk} 0.0010692 0.1568627 0.0068164 0.9933534 16

La interpretación sería:

  • El 25% de los clientes que compraron “salchichas, yogurt” también compraron “leche entera”

  • El 21% de los clientes que compraron “panecillos/bollos, salchichas” también compraron “leche entera”

Visualizaciones graficas para las 10 mejores reglas

plot(reglas_asociacion[1:10], method = "grouped")

plot(reglas_asociacion[1:10], jitter = 0, engine = "plotly")
plot(reglas_asociacion[1:10], method = "graph", engine = "html")

Modificando los parámetros del algoritmo

reglas_asociacion2 <- apriori(lista_transacciones, 
                                  parameter = list(minlen = 3, 
                                                   supp = 0.001, 
                                                   conf = 0.1))
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
        0.1    0.1    1 none FALSE            TRUE       5   0.001      3
 maxlen target  ext
     10  rules TRUE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 14 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[168 item(s), 14964 transaction(s)] done [0.01s].
sorting and recoding items ... [149 item(s)] done [0.00s].
creating transaction tree ... done [0.01s].
checking subsets of size 1 2 3 4 done [0.00s].
writing ... [17 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
summary(reglas_asociacion2)
set of 17 rules

rule length distribution (lhs + rhs):sizes
 3 
17 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      3       3       3       3       3       3 

summary of quality measures:
    support           confidence        coverage             lift       
 Min.   :0.001002   Min.   :0.1018   Min.   :0.005346   Min.   :0.7214  
 1st Qu.:0.001136   1st Qu.:0.1172   1st Qu.:0.008086   1st Qu.:0.8897  
 Median :0.001136   Median :0.1269   Median :0.008955   Median :1.1081  
 Mean   :0.001207   Mean   :0.1437   Mean   :0.008821   Mean   :1.1794  
 3rd Qu.:0.001337   3rd Qu.:0.1642   3rd Qu.:0.010559   3rd Qu.:1.2297  
 Max.   :0.001470   Max.   :0.2558   Max.   :0.011160   Max.   :2.1831  
     count      
 Min.   :15.00  
 1st Qu.:17.00  
 Median :17.00  
 Mean   :18.06  
 3rd Qu.:20.00  
 Max.   :22.00  

mining info:
                data ntransactions support confidence
 lista_transacciones         14964   0.001        0.1

El resumen nos dice lo siguiente:

  • Número de reglas: 17.

  • Distribución de las reglas por longitud: solo se basa en tres items

  • Estadísticas básicas para las medidas de asociación

reglas_asociacion2 <- sort(reglas_asociacion2, 
                          by = c('confidence', 'lift'), 
                          decreasing = TRUE)

reglas2 <- inspect(reglas_asociacion2) 
reglas2 %>% kbl(align = c('l', 'c', 'l', rep('c', times = 5))) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
lhs rhs support confidence coverage lift count
[1] {sausage,yogurt} => {whole milk} 0.0014702 0.2558140 0.0057471 1.6199746 22
[2] {rolls/buns,sausage} => {whole milk} 0.0011361 0.2125000 0.0053462 1.3456835 17
[3] {sausage,soda} => {whole milk} 0.0010692 0.1797753 0.0059476 1.1384500 16
[4] {rolls/buns,yogurt} => {whole milk} 0.0013365 0.1709402 0.0078188 1.0825005 20
[5] {sausage,whole milk} => {yogurt} 0.0014702 0.1641791 0.0089548 1.9118880 22
[6] {rolls/buns,soda} => {other vegetables} 0.0011361 0.1404959 0.0080861 1.1507281 17
[7] {other vegetables,yogurt} => {whole milk} 0.0011361 0.1404959 0.0080861 0.8897081 17
[8] {whole milk,yogurt} => {sausage} 0.0014702 0.1317365 0.0111601 2.1830624 22
[9] {sausage,whole milk} => {rolls/buns} 0.0011361 0.1268657 0.0089548 1.1533523 17
[10] {rolls/buns,soda} => {whole milk} 0.0010024 0.1239669 0.0080861 0.7850365 15
[11] {whole milk,yogurt} => {rolls/buns} 0.0013365 0.1197605 0.0111601 1.0887581 20
[12] {sausage,whole milk} => {soda} 0.0010692 0.1194030 0.0089548 1.2296946 16
[13] {other vegetables,soda} => {rolls/buns} 0.0011361 0.1172414 0.0096899 1.0658566 17
[14] {other vegetables,soda} => {whole milk} 0.0011361 0.1172414 0.0096899 0.7424460 17
[15] {other vegetables,rolls/buns} => {whole milk} 0.0012029 0.1139241 0.0105587 0.7214386 18
[16] {other vegetables,rolls/buns} => {soda} 0.0011361 0.1075949 0.0105587 1.1080872 17
[17] {whole milk,yogurt} => {other vegetables} 0.0011361 0.1017964 0.0111601 0.8337610 17

Visualizaciones graficas para las nuevas reglas

plot(reglas_asociacion2, method = "grouped")

plot(reglas_asociacion2, jitter = 0, engine = "plotly")
plot(reglas_asociacion2, method = "graph", engine = "html")

Conclusión

En la vida real, los datos transaccionales a menudo pueden ser complejos y tener un volumen enorme, tanto en el número de transacciones como en la cantidad de elementos (items) monitoreados. Si se tienen \(k\) items que podrían o no estar en una transacción, hay \(2^k\) posibles conjuntos en los que se deben buscar reglas.

Si bien el algoritmo A-Priori es uno de los más usados, no es de los más eficietes para la construcción de los itemsets frecuentes ya que escanea todas las transacciones un total de \(k_{max}+1\), donde \(k_{max}\) es el tamaño máximo de itemset permitido. Una alternativa sería usar los algoritmos FP-growth, implementado en el paquete rCBA, o Eclat, implementado en el paquete arules mediante la función eclat()

Si buscamos que nuestras reglas de asociación se apliquen a una fracción razonable de las transacciones, entonces el soporte de \(A\) debe ser suficientemente alto. En la práctica, “suficientemente alto” suele ser entre el 1% y el 10% de las transacciones. También queremos que la confianza de la regla sea suficientemente alta, aproximadamente 50%, de lo contrario la regla tiene poco efecto práctico.

Además, se debe suponer que no hay demasiados conjuntos de elementos frecuentes y, por lo tanto, no hay demasiados candidatos para convertirse en reglas de alto apoyo y alta confianza. La razón de esto es que si les damos a las empresas muchas reglas de asociación que cumplen con nuestros umbrales de apoyo y confianza, no podrán leerlas, y mucho menos actuar en consecuencia. Por lo tanto, es normal ajustar los umbrales de soporte y confianza para que no obtengamos demasiados itemsets frecuentes.

Referencias