Aprende el análisis de la cesta de la compra y el algoritmo APRIORI que lo hace posible. Verás cómo ayuda a los retailers a impulsar el negocio prediciendo qué artículos se compran juntos.
Eres científico de datos (¡o estás en ello!) y te llega un cliente que gestiona una tienda minorista. Te entrega los datos de todas las transacciones —los artículos que varios clientes compraron en la tienda durante un periodo— y te pide usarlos para impulsar su negocio. Tu cliente utilizará tus conclusiones no solo para cambiar/actualizar/añadir artículos en el inventario, sino también para modificar la disposición de la tienda física o de la tienda online. Para encontrar resultados útiles, usarás el análisis de la cesta de la compra (MBA), que aplica minería de reglas de asociación sobre los datos de transacciones.
En este tutorial aprenderás:
Qué es la minería de reglas de asociación y sus aplicaciones
Qué es el algoritmo APRIORI
Cómo implementar MBA/minería de reglas de asociación en R con visualizaciones
Minería de reglas de asociación
La minería de reglas de asociación se utiliza cuando quieres encontrar asociaciones entre distintos objetos de un conjunto, descubrir patrones frecuentes en una base de datos de transacciones, bases de datos relacionales u otros repositorios de información. Sus aplicaciones aparecen en marketing, análisis de cestas (Market Basket Analysis) en retail, clustering y clasificación. Permite identificar qué artículos compran los clientes con más frecuencia juntos generando un conjunto de reglas llamadas reglas de asociación. En pocas palabras, te devuelve reglas del tipo si pasa esto, entonces aquello. Los clientes pueden usar esas reglas en numerosas estrategias de marketing:
Cambiar la distribución de la tienda según las tendencias
Análisis del comportamiento del cliente
Diseño de catálogos
Venta cruzada en tiendas online
Qué artículos están de tendencia entre los clientes
Emails personalizados con ventas adicionales
Considera el siguiente ejemplo:
Se da un conjunto de datos de transacciones. Ves transacciones numeradas del 1 al 5. Cada transacción muestra los artículos comprados en esa operación. Puedes ver que diapers se compra con beer en tres transacciones. Del mismo modo, bread se compra con milk en tres transacciones, por lo que ambos forman conjuntos de artículos frecuentes. Las reglas de asociación se dan así:
$A=>B[Support,Confidence]$
La parte anterior a $=>$ es el si (antecedente) y la posterior a $=>$ es el entonces (consecuente).
Donde A y B son conjuntos de artículos en los datos de transacciones. A y B son conjuntos disjuntos.
Es el número de transacciones con A y B dividido por el total de transacciones que contienen A.
$Confidence(Bread=>Milk)=\frac{3}{4}=0.75=75\%$
Ahora calcula la confianza de Milk=>Diaper.
Nota: El soporte y la confianza miden lo interesante que es la regla. Se fijan con umbrales mínimos de soporte y confianza. Estos umbrales, definidos por el cliente, ayudan a comparar la fuerza de la regla según tus propios criterios o los del cliente. Cuanto más cerca estén del umbral (o por encima), más útil será la regla para el cliente.
Conjuntos frecuentes: Conjuntos de artículos cuyo soporte es mayor o igual que el soporte mínimo (min_sup). En el ejemplo anterior min_sup=3. Lo define el usuario.
Reglas fuertes: Si una regla A=>B[Support, Confidence] cumple min_sup y min_confidence, entonces es una regla fuerte.
Lift: El lift indica la correlación entre A y B en la regla A=>B. La correlación muestra cómo un conjunto A afecta al conjunto B.
$Lift(A=>B)=\frac{Support}{Supp(A)Supp(B)}$
Por ejemplo, para la regla {Bread}=>{Milk}, el lift se calcula así:
$support(Bread)=\frac{4}{5}=0.8$
$support(Milk)=\frac{4}{5}=0.8$
$Lift(Bread=>Milk)=\frac{0.6}{0.8*0.8}=0.9$
Si la regla tuviera un lift de 1, entonces A y B son independientes y no se puede derivar ninguna regla útil.
Si el lift es > 1, entonces A y B dependen entre sí, y el grado lo indica el valor de lift.
Si el lift es < 1, entonces la presencia de A tiene un efecto negativo sobre B.
Objetivo de la minería de reglas de asociación
Al aplicar minería de reglas de asociación sobre un conjunto de transacciones T, tu objetivo es encontrar todas las reglas con:
Soporte mayor o igual que min_support
Confianza mayor o igual que min_confidence
Algoritmo APRIORI
En esta parte del tutorial conocerás el algoritmo que ejecutan las librerías de R para el análisis de la cesta. Esto te ayudará a entender mejor a tus clientes y a analizar con más criterio. Si ya conoces el algoritmo APRIORI y cómo funciona, puedes ir directamente a la parte de código.
La minería de reglas de asociación se aborda en dos pasos:
Generación de conjuntos frecuentes: Encontrar todos los conjuntos frecuentes con soporte >= min_support predefinido
Generación de reglas: Listar todas las reglas de asociación a partir de los conjuntos frecuentes. Calcular soporte y confianza para todas. Podar las reglas que no superen los umbrales de min_support y min_confidence.
La generación de conjuntos frecuentes es el paso computacionalmente más costoso porque requiere escanear toda la base de datos.
Arriba viste un ejemplo con solo 5 transacciones, pero en el mundo real los datos de retail pueden llegar a GB y TB, por lo que se necesita un algoritmo optimizado que descarte conjuntos de artículos que no servirán en pasos posteriores. Para esto se usa el algoritmo APRIORI. Establece que:
Todo subconjunto de un conjunto frecuente también debe ser frecuente. En otras palabras, no se deben generar ni probar superconjuntos de un conjunto infrecuente.
Se representa mediante el retículo de conjuntos (Itemset Lattice), una representación gráfica del principio de APRIORI. Consta de nodos k-ítems y las relaciones de sus subconjuntos.
En la figura anterior, abajo están todos los artículos de los datos de transacciones y vas subiendo creando subconjuntos hasta el conjunto vacío. Para d artículos, el tamaño del retículo es $2^d$. Esto muestra lo difícil que sería generar los conjuntos frecuentes calculando el soporte de cada combinación. La siguiente figura muestra cuánto ayuda APRIORI a reducir el número de conjuntos a generar:
Si el conjunto {a,b} no es frecuente, no necesitamos considerar ninguno de sus superconjuntos.
Vamos a entenderlo con un ejemplo. A continuación verás por qué APRIORI es efectivo y cómo generar reglas de asociación fuertes paso a paso. ¡Sigue el proceso con tu cuaderno y bolígrafo!
Como ves, empiezas creando la lista de candidatos para el conjunto de 1 ítem, que incluirá todos los artículos presentes en los datos de transacciones, de forma individual. Si piensas en datos reales de retail, puedes imaginar lo costosa que es esta generación de candidatos. Aquí APRIORI entra en juego y ayuda a reducir el tamaño de la lista de candidatos, de modo que al final se generan reglas útiles. En los siguientes pasos verás cómo llegamos al final de la generación de conjuntos frecuentes, el primer paso de la minería de reglas.
Tu siguiente paso será listar todos los conjuntos frecuentes. Tomarás el último conjunto frecuente no vacío, que en este ejemplo es L2={I1, I2},{I2, I3}. Luego crearás todos los subconjuntos no vacíos de los conjuntos presentes en esa lista de conjuntos frecuentes. Sigue el proceso como se ilustra a continuación:
Arriba puedes ver cuatro reglas fuertes. Por ejemplo, toma ${I2}=>I3$ con una confianza del 75%: indica que el 75% de quienes compraron I2 también compraron I3.
Ya has aprendido el algoritmo APRIORI completo, uno de los más utilizados en minería de datos. ¡Vamos con el código, uf!
Implementación de MBA/minería de reglas de asociación en R
En este tutorial, usarás un dataset del UCI Machine Learning Repository. El dataset se llama Online-Retail y puedes descargarlo aquí. Contiene datos de transacciones desde el 01/12/2010 hasta el 09/12/2011 de un comercio electrónico sin tienda física registrado en Reino Unido. Usamos este y no un dataset de R porque es más probable que recibas datos de retail en este formato y tendrás que aplicar preprocesado.
Descripción del dataset
Número de filas: 541909
Número de atributos: 08
Información de atributos
InvoiceNo: número de factura. Nominal, entero de 6 dígitos asignado de forma única a cada transacción. Si empieza por la letra 'c', indica cancelación. +StockCode: código de producto (artículo). Nominal, entero de 5 dígitos asignado de forma única a cada producto.
Description: nombre del producto (artículo). Nominal.
Quantity: cantidades de cada producto (artículo) por transacción. Numérico.
InvoiceDate: fecha y hora de la factura. Numérico, el día y la hora en que se generó cada transacción. Ejemplo del dataset: 12/1/2010 8:26
UnitPrice: precio unitario. Numérico, precio por unidad en libras esterlinas.
CustomerID: número de cliente. Nominal, entero de 5 dígitos asignado de forma única a cada cliente.
Country: país. Nominal, el país de residencia de cada cliente.
Cargando librerías
Primero, carga las librerías necesarias. Una breve descripción (tomada de aquí) se muestra en la siguiente tabla para que sepas qué hace cada librería:
Package
Descripción
arules
Proporciona la infraestructura para representar, manipular y analizar datos de transacciones y patrones (conjuntos frecuentes y reglas de asociación).
arulesViz
Amplía el paquete 'arules' con diversas técnicas de visualización para reglas de asociación y conjuntos de artículos. Incluye varias visualizaciones interactivas para explorar reglas.
tidyverse
Colección de paquetes de R pensados para ciencia de datos.
readxl
Leer archivos de Excel en R.
plyr
Herramientas para dividir, aplicar y combinar datos.
ggplot2
Crear gráficos y visualizaciones.
knitr
Generación de informes dinámicos en R.
lubridate
Paquete de R que facilita trabajar con fechas y horas.
#install and load package arules#install.packages("arules")
library(arules)#install and load arulesViz#install.packages("arulesViz")
library(arulesViz)#install and load tidyverse#install.packages("tidyverse")
library(tidyverse)#install and load readxml#install.packages("readxml")
library(readxl)#install and load knitr#install.packages("knitr")
library(knitr)#load ggplot2 as it comes in tidyverse
library(ggplot2)#install and load lubridate#install.packages("lubridate")
library(lubridate)#install and load plyr#install.packages("plyr")
library(plyr)
library(dplyr)Con la tecnología de
Preprocesado de datos
Usa read_excel(path to file) para leer el dataset del archivo descargado en R. Indica la ruta completa al archivo, incluido el nombre, en read_excel(path-to-file-with-filename)
#read excel into R dataframe
retail <- read_excel('D:/Documents/Online_Retail.xlsx')#complete.cases(data) will return a logical vector indicating which rows have no missing values. Then use the vector to get only rows that are complete using retail[,].
retail <- retail[complete.cases(retail),]#mutate function is from dplyr package. It is used to edit or add new columns to dataframe. Here Description column is being converted to factor column. as.factor converts column to factor column. %>% is an operator with which you may pipe values to another function or expression
retail %>% mutate(Description = as.factor(Description))Con la tecnología de
#Converts character data to date. Store InvoiceDate as date in new variable
retail$Date <- as.Date(retail$InvoiceDate)#Extract time from InvoiceDate and store in another variable
TransTime<- format(retail$InvoiceDate,"%H:%M:%S")#Convert and edit InvoiceNo into numeric
InvoiceNo <- as.numeric(as.character(retail$InvoiceNo))Con la tecnología de
Observations:406,829
Variables:9$ InvoiceNo <chr>"536365","536365","536365","536365","536365","536365", "53...$ StockCode <chr>"85123A","71053","84406B","84029G","84029E","22752", "2173...$ Description <chr>"WHITE HANGING HEART T-LIGHT HOLDER","WHITE METAL LANTERN", "C...$ Quantity <dbl>6,6,8,6,6,2,6,6,6,32,6,6,8,6,6,3,2,3,3,4,4,...$ InvoiceDate <dttm>2010-12-0108:26:00,2010-12-0108:26:00,2010-12-0108:26:00,...$ UnitPrice <dbl>2.55,3.39,2.75,3.39,3.39,7.65,4.25,1.85,1.85,1.69,2.1...$ CustomerID <dbl>17850,17850,17850,17850,17850,17850,17850,17850,17850,...$ Country <chr>"United Kingdom","United Kingdom","United Kingdom", "United K...$ Date <date>2010-12-01,2010-12-01,2010-12-01,2010-12-01,2010-12-01,20...Con la tecnología de
Ahora, el dataframe retail contendrá 10 atributos, con dos adicionales: Date y Time.
Antes de aplicar MBA/minería de reglas de asociación, necesitamos convertir el dataframe en datos de transacciones, de modo que todos los artículos comprados juntos en una factura queden en una sola fila. En la salida de glimpse ves que cada transacción está en forma atómica, es decir, todos los productos de una factura aparecen de forma atómica como en bases de datos relacionales. A este formato también se le llama formato singles.
Lo que debes hacer es agrupar los datos del dataframe retail por CustomerID, CustomerID y Date, o también puedes agrupar usando InvoiceNo y Date. Necesitamos este agrupamiento para aplicar una función y guardar la salida en otro dataframe. Esto puede hacerse con ddply.
Las siguientes líneas combinarán todos los productos de un InvoiceNo y Date y los unirán en una sola fila, con cada artículo separado por ,
library(plyr)#ddply(dataframe, variables_to_be_used_to_split_data_frame, function_to_be_applied)
transactionData <- ddply(retail,c("InvoiceNo","Date"),function(df1)paste(df1$Description,
collapse =","))#The R function paste() concatenates vectors to character and separated results using collapse=[any optional charcater string ]. Here ',' is usedCon la tecnología de
Después, como InvoiceNo y Date no aportarán al minado de reglas, puedes ponerlos a NULL.
#set column InvoiceNo of dataframe transactionData
transactionData$InvoiceNo <-NULL#set column Date of dataframe transactionData
transactionData$Date <-NULL#Rename column to items
colnames(transactionData)<- c("items")#Show Dataframe transactionData
transactionDataCon la tecnología de
Nota: página 1 de 100.
A este formato de datos de transacción se le llama formato basket. Ahora debes guardar estos datos en un archivo .csv (valores separados por comas). Para ello, write.csv()
write.csv(transactionData,"D:/Documents/market_basket_transactions.csv", quote =FALSE, row.names =FALSE)#transactionData: Data to be written#"D:/Documents/market_basket.csv": location of file with file name to be written to#quote: If TRUE it will surround character or factor column with double quotes. If FALSE nothing will be quoted#row.names: either a logical value indicating whether the row names of x are to be written along with x, or a character vector of row names to be written.Con la tecnología de
Comprueba que tus datos de transacciones tienen el formato correcto:
A continuación, debes cargar estos datos en un objeto de la clase transacción. Esto se hace con la función de R read.transactions del paquete arules.
La siguiente línea tomará el archivo D:/Documents/market_basket_transactions.csv en formato basket y lo convertirá en un objeto de clase transacción.
tr <- read.transactions('D:/Documents/market_basket_transactions.csv', format ='basket', sep=',')#sep tell how items are separated. In this case you have separated using ','Con la tecnología de
Al ejecutar las líneas anteriores puedes ver muchos EOF within quoted string en la salida; no te preocupes.
Si ya tienes los datos de transacciones en un dataframe, usa esta línea para convertirlo en objeto transacción:
transactions in sparse format with
22191 transactions (rows) and
7876 items (columns)
transactions as itemMatrix in sparse format with
22191 rows (elements/itemsets/transactions) and
7876 columns (items) and a density of 0.001930725
most frequent items:
WHITE HANGING HEART T-LIGHT HOLDER REGENCY CAKESTAND 3 TIER
18031709
JUMBO BAG RED RETROSPOT PARTY BUNTING
14601285
ASSORTED COLOUR BIRD ORNAMENT (Other)1250329938
element (itemset/transaction) length distribution:
sizes
12345678910111213141516173598159411419088617586966766635936245375165315515224641819202122232425262728293031323334441483419395315306272238253229213222215170159138142353637383940414243444546474849505113410911190113949387886563676360594964525354555657585960616263646566676840414943362939302728172525202724226970717273747576777879808182838485152019131616111512791415128911868788899091929394959697989910010110211148656116443652424103104105106107108109110111112113114116117118120121432263432131333121221231251261271311321331341401411421431451461471502132211211221121115415716817117717818020220422823624925028532040041932221111111111111
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.003.0010.0015.2121.00419.00
includes extended item information - examples:
labels
11 HANGER
210 COLOUR SPACEBOY PEN
312 COLOURED PARTY BALLOONSCon la tecnología de
summary(tr) es un comando muy útil que da información sobre nuestro objeto transacción. Observa lo que dice la salida anterior:
Hay 22191 transacciones (filas) y 7876 artículos (columnas). Ten en cuenta que 7876 son las descripciones de producto del dataset y 22191 transacciones son combinaciones de esos artículos.
La densidad indica el porcentaje de celdas no nulas en una matriz dispersa. Puedes verla como el total de artículos comprados dividido por el número posible de artículos en esa matriz. Puedes calcular cuántos artículos se compraron usando la densidad: 22191x7876x0.001930725=337445
Información: Matriz dispersa (sparse matrix): es una matriz en la que la mayoría de elementos son cero. En contraste, si la mayoría son no cero, se considera densa. El número de elementos cero dividido por el total se llama dispersidad de la matriz (igual a 1 menos la densidad).
Summary también puede mostrarte los artículos más frecuentes.
Distribución de longitud de elementos (itemset/transacción): Indica cuántas transacciones hay de 1 ítem, de 2 ítems, etc. La primera fila muestra el número de ítems y la segunda, el número de transacciones.
Por ejemplo, hay solo 3598 transacciones de un único artículo, 1594 transacciones con 2 artículos, y hay 419 artículos en una transacción, que es la más larga.
Puedes generar un itemFrequencyPlot para crear un diagrama de barras de frecuencias de ítems y ver la distribución de objetos basada en itemMatrix (p. ej., >transactions o ítems en >itemsets y >rules), que es nuestro caso.
# Create an item frequency plot for the top 20 itemsif(!require("RColorBrewer")){# install color package of R
install.packages("RColorBrewer")#include library RColorBrewer
library(RColorBrewer)}
itemFrequencyPlot(tr,topN=20,type="absolute",col=brewer.pal(8,'Pastel2'), main="Absolute Item Frequency Plot")Con la tecnología de
el primer argumento es el objeto transacción a representar, tr. topN permite representar los N artículos con mayor frecuencia. type puede ser type="absolute" o type="relative". Si es absoluto, dibuja las frecuencias numéricas de cada artículo independientemente. Si es relativo, representa cuántas veces aparecen respecto al resto.
itemFrequencyPlot(tr,topN=20,type="relative",col=brewer.pal(8,'Pastel2'),main="Relative Item Frequency Plot")Con la tecnología de
Este gráfico muestra que 'WHITE HANGING HEART T-LIGHT HOLDER' y 'REGENCY CAKESTAND 3 TIER' tienen más ventas. Así que, para aumentar las ventas de 'SET OF 3 CAKE TINS PANTRY DESIGN', el minorista puede colocarlo cerca de 'REGENCY CAKESTAND 3 TIER'.
Puedes explorar más opciones de itemFrequencyPlotaquí.
¡Generando reglas!
El siguiente paso es extraer las reglas usando el algoritmo APRIORI. La función apriori() es del paquete arules.
# Min Support as 0.001, confidence as 0.8.
association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=10))Con la tecnología de
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target
0.80.11 none FALSETRUE50.001110 rules
ext
FALSE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1TRUETRUEFALSETRUE2TRUE
Absolute minimum support count:22
set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[30066 item(s),22191 transaction(s)] done [0.11s].
sorting and recoding items ...[2324 item(s)] done [0.02s].
creating transaction tree ... done [0.02s].
checking subsets of size 12345678910Con la tecnología de
Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!Con la tecnología de
done [0.70s].
writing ...[49122 rule(s)] done [0.06s].
creating S4 object ... done [0.06s]. Con la tecnología de
set of 49122 rules
rule length distribution (lhs + rhs):sizes
234567891010521116854164241485561021937613121
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.0005.0005.0005.4996.00010.000
summary of quality measures:
support confidence lift count
Min. :0.001036 Min. :0.8000 Min. :9.846 Min. :23.001st Qu.:0.0010821st Qu.:0.83331st Qu.:22.2371st Qu.:24.00
Median :0.001262 Median :0.8788 Median :28.760 Median :28.00
Mean :0.001417 Mean :0.8849 Mean :64.589 Mean :31.453rd Qu.:0.0015323rd Qu.:0.92593rd Qu.:69.2003rd Qu.:34.00
Max. :0.015997 Max. :1.0000 Max. :715.839 Max. :355.00
mining info:
data ntransactions support confidence
tr 221910.0010.8Con la tecnología de
apriori tomará tr como objeto de transacciones sobre el que minar. parameter te permite fijar min_sup y min_confidence. Los valores por defecto son soporte mínimo 0.1, confianza mínima 0.8 y máximo de 10 ítems (maxlen).
summary(association.rules) muestra lo siguiente:
Especificación de parámetros: min_sup=0.001 y min_confidence=0.8 con 10 ítems como máximo por regla.
Número total de reglas: Conjunto de 49122 reglas
Distribución de longitudes de regla: Las reglas de longitud 5 son las más numerosas: 16424, y de longitud 2, las menos: 105
Resumen de medidas de calidad: Valores mínimos y máximos de soporte, confianza y lift.
Información usada para crear reglas: Los datos, soporte y confianza proporcionados al algoritmo.
Como hay 49122 reglas, imprimamos solo las 10 primeras:
lhs rhs support confidence lift count
[1]{WOBBLY CHICKEN}=>{METAL}0.0012617731443.8200028[2]{WOBBLY CHICKEN}=>{DECORATION}0.0012617731443.8200028[3]{DECOUPAGE}=>{GREETING CARD}0.0010364561389.3157923[4]{BILLBOARD FONTS DESIGN}=>{WRAP}0.0013068361715.8387129[5]{WOBBLY RABBIT}=>{METAL}0.0015321531443.8200034[6]{WOBBLY RABBIT}=>{DECORATION}0.0015321531443.8200034[7]{FUNK MONKEY}=>{ART LIGHTS}0.0017124061583.9736838[8]{ART LIGHTS}=>{FUNK MONKEY}0.0017124061583.9736838[9]{BLACK TEA}=>{SUGAR JARS}0.0020729121238.6129046[10]{BLACK TEA}=>{COFFEE}0.002072912169.3468746Con la tecnología de
Con la salida anterior, puedes hacer análisis como:
El 100% de los clientes que compraron 'WOBBLY CHICKEN' también compraron 'METAL'.
El 100% de los clientes que compraron 'BLACK TEA' también compraron 'SUGAR JARS'.
Limitar el número y el tamaño de las reglas
¿Cómo puedes limitar el tamaño y la cantidad de reglas generadas? Ajustando los parameters en apriori. Si quieres reglas más fuertes, aumenta el valor de conf y, para reglas más largas, incrementa maxlen.
shorter.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=3))Con la tecnología de
Eliminar reglas redundantes
Puedes eliminar reglas que son subconjuntos de reglas más grandes. Usa el siguiente código para quitarlas:
subset.rules <- which(colSums(is.subset(association.rules, association.rules))>1)# get subset rules in vector
length(subset.rules)#> 3913Con la tecnología de
subset.association.rules.<- association.rules[-subset.rules] # remove subset rules.Con la tecnología de
which(): devuelve la posición de los elementos del vector cuyo valor es TRUE.
colSums(): suma por columnas para dataframes y arrays numéricos.
is.subset(): determina si los elementos de un vector contienen todos los de otro.
Encontrar reglas relacionadas con artículos concretos
A veces quieres centrarte en un producto específico. Si quieres averiguar qué influye en la compra del artículo X, puedes usar la opción appearance en apriori. appearance nos permite fijar la LHS (parte IF) y la RHS (parte THEN) de la regla.
Por ejemplo, para saber qué compran los clientes antes de comprar 'METAL', ejecuta:
metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(default="lhs",rhs="METAL"))Con la tecnología de
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target
0.80.11 none FALSETRUE50.001110 rules
ext
FALSE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1TRUETRUEFALSETRUE2TRUE
Absolute minimum support count:22
set item appearances ...[1 item(s)] done [0.00s].
set transactions ...[30066 item(s),22191 transaction(s)] done [0.21s].
sorting and recoding items ...[2324 item(s)] done [0.02s].
creating transaction tree ... done [0.02s].
checking subsets of size 12345678910Con la tecnología de
Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!Con la tecnología de
done [0.63s].
writing ...[5 rule(s)] done [0.07s].
creating S4 object ... done [0.02s]. Con la tecnología de
# Here lhs=METAL because you want to find out the probability of that in how many customers buy METAL along with other items
inspect(head(metal.association.rules))Con la tecnología de
lhs rhs support confidence lift count
[1]{WOBBLY CHICKEN}=>{METAL}0.0012617731443.8228[2]{WOBBLY RABBIT}=>{METAL}0.0015321531443.8234[3]{DECORATION}=>{METAL}0.0022531661443.8250[4]{DECORATION,WOBBLY CHICKEN}=>{METAL}0.0012617731443.8228[5]{DECORATION,WOBBLY RABBIT}=>{METAL}0.0015321531443.8234Con la tecnología de
De forma similar, para responder a Quienes compraron METAL también compraron... pondrás METAL en lhs:
metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(lhs="METAL",default="rhs"))Con la tecnología de
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target
0.80.11 none FALSETRUE50.001110 rules
ext
FALSE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1TRUETRUEFALSETRUE2TRUE
Absolute minimum support count:22
set item appearances ...[1 item(s)] done [0.00s].
set transactions ...[30066 item(s),22191 transaction(s)] done [0.10s].
sorting and recoding items ...[2324 item(s)] done [0.02s].
creating transaction tree ... done [0.02s].
checking subsets of size 12 done [0.01s].
writing ...[1 rule(s)] done [0.00s].
creating S4 object ... done [0.01s].Con la tecnología de
# Here lhs=METAL because you want to find out the probability of that in how many customers buy METAL along with other items
inspect(head(metal.association.rules))Con la tecnología de
lhs rhs support confidence lift count
[1]{METAL}=>{DECORATION}0.0022531661443.8250Con la tecnología de
Visualización de reglas de asociación
Como se generarán cientos o miles de reglas, necesitas varias formas de presentar tus hallazgos. Ya vimos ItemFrequencyPlot, que también es útil para ver los artículos más vendidos.
Aquí veremos estas visualizaciones:
Diagrama de dispersión
Diagrama de dispersión interactivo
Representación individual de reglas
Diagrama de dispersión
Una visualización directa de las reglas de asociación es un scatter plot usando plot() del paquete arulesViz. Usa soporte y confianza en los ejes. Además, por defecto usa el lift para colorear (niveles de gris) los puntos.
# Filter rules with confidence greater than 0.4 or 40%
subRules<-association.rules[quality(association.rules)$confidence>0.4]#Plot SubRules
plot(subRules)Con la tecnología de
El gráfico muestra que las reglas con lift alto suelen tener soporte bajo. Puedes usar las siguientes opciones para el plot:
El two-key plot usa soporte y confianza en los ejes x e y, respectivamente. Utiliza order para colorear, que es el número de ítems en la regla.
Diagrama de dispersión interactivo
Un gráfico interactivo excelente para presentar reglas usa arulesViz y plotly. Puedes pasar el ratón sobre cada regla y ver todas las medidas de calidad (soporte, confianza y lift).
'plotly_arules' is deprecated.
Use 'plot' instead.
See help("Deprecated")plot: Too many rules supplied. Only plotting the best 1000 rules using measure lift (change parameter max if needed)To reduce overplotting, jitter is added! Use jitter =0 to prevent jitter.Con la tecnología de
Visualizaciones basadas en grafos
Las técnicas basadas en grafos visualizan reglas de asociación con vértices y aristas, donde los vértices están etiquetados con nombres de artículos y los conjuntos/reglas se representan como un segundo conjunto de vértices. Los ítems se conectan con los conjuntos/reglas mediante flechas dirigidas. Las flechas desde ítems a vértices de reglas indican la LHS y una flecha desde una regla a un ítem indica la RHS. El tamaño y el color de los vértices suelen representar medidas de interés.
Los grafos son una forma estupenda de visualizar reglas pero tienden a congestionarse cuando hay muchas. Es mejor mostrar pocas reglas con este tipo de visualización.
Seleccionemos 10 reglas de subRules con la mayor confianza.
Desde arulesViz, los grafos de conjuntos de reglas de asociación pueden exportarse en formato GraphML o como dot-file de Graphviz para analizarlos en herramientas como Gephi. Por ejemplo, las 1000 reglas con mayor lift se exportan con:
saveAsGraph(head(subRules, n =1000, by ="lift"), file ="rules.graphml")Con la tecnología de
Representación individual de reglas
Esta representación también se llama Parallel Coordinates Plot. Es útil para visualizar qué productos, junto con qué artículos, provocan cierto tipo de ventas.
Como se mencionó arriba, la RHS es el consecuente o el artículo que proponemos que el cliente comprará; las posiciones en la LHS indican que 2 es la adición más reciente a nuestra cesta y 1 el artículo previo.
# Filter top 20 rules with highest lift
subRules2<-head(subRules, n=20, by="lift")
plot(subRules2, method="paracoord")Con la tecnología de
Fíjate en la flecha superior. Muestra que cuando tengo 'CHILDS GARDEN SPADE PINK' y 'CHILDS GARDEN RAKE PINK' en mi cesta, es probable que también compre 'CHILDS GARDEN RAKE BLUE'.
Conclusión
¡Enhorabuena! Has aprendido APRIORI, uno de los algoritmos más usados en minería de datos. Has visto qué es la minería de reglas de asociación, sus aplicaciones y su aplicación en retail como Market Basket Analysis. Ahora también eres capaz de implementar Market Basket Analysis en R y presentar tus reglas con gráficos potentes. ¡A seguir aprendiendo!
En este tutorial, aprenderás a utilizar el PCA (análisis de componentes principales) de R para extraer datos con muchas variables y crear visualizaciones para mostrar esos datos.
Eres científico de datos (¡o estás en ello!) y te llega un cliente que gestiona una tienda minorista. Te entrega los datos de todas las transacciones —los artículos que varios clientes compraron en la tienda durante un periodo— y te pide usarlos para impulsar su negocio. Tu cliente utilizará tus conclusiones no solo para cambiar/actualizar/añadir artículos en el inventario, sino también para modificar la disposición de la tienda física o de la tienda online. Para encontrar resultados útiles, usarás el análisis de la cesta de la compra (MBA), que aplica minería de reglas de asociación sobre los datos de transacciones.
En este tutorial aprenderás:
Minería de reglas de asociación
La minería de reglas de asociación se utiliza cuando quieres encontrar asociaciones entre distintos objetos de un conjunto, descubrir patrones frecuentes en una base de datos de transacciones, bases de datos relacionales u otros repositorios de información. Sus aplicaciones aparecen en marketing, análisis de cestas (Market Basket Analysis) en retail, clustering y clasificación. Permite identificar qué artículos compran los clientes con más frecuencia juntos generando un conjunto de reglas llamadas reglas de asociación. En pocas palabras, te devuelve reglas del tipo si pasa esto, entonces aquello. Los clientes pueden usar esas reglas en numerosas estrategias de marketing:
Considera el siguiente ejemplo:
Se da un conjunto de datos de transacciones. Ves transacciones numeradas del 1 al 5. Cada transacción muestra los artículos comprados en esa operación. Puedes ver que diapers se compra con beer en tres transacciones. Del mismo modo, bread se compra con milk en tres transacciones, por lo que ambos forman conjuntos de artículos frecuentes. Las reglas de asociación se dan así:
$A=>B[Support,Confidence]$
La parte anterior a $=>$ es el si (antecedente) y la posterior a $=>$ es el entonces (consecuente).
Donde A y B son conjuntos de artículos en los datos de transacciones. A y B son conjuntos disjuntos.
$Computer=>Anti-virus Software[Support=20\%,confidence=60\%]$
La regla anterior dice:
En la siguiente sección verás los conceptos básicos de la minería de reglas de asociación:
Conceptos básicos de la minería de reglas de asociación
Itemset (conjunto de artículos): Colección de uno o más artículos. Un conjunto k-ítems contiene k artículos.
Support count (frecuencia): Número de ocurrencias de un conjunto de artículos.
Soporte (s): Fracción de transacciones que contienen el conjunto de artículos "X"
$Support(X)=\frac{frequency(X)}{N}$
Para una regla A=>B, el soporte es:
$Support(A=>B)=\frac{frequency(A,B)}{N}$
Nota: P(A∪B) es la probabilidad de que A y B ocurran juntos. P denota probabilidad.
Adelante, intenta calcular el soporte para Milk=>Diaper como ejercicio.
$Confidence(A=>B)=\frac{P(A\cap B)}{P(A)}=\frac{frequency(A,B)}{frequency(A)}$
Es el número de transacciones con A y B dividido por el total de transacciones que contienen A.
$Confidence(Bread=>Milk)=\frac{3}{4}=0.75=75\%$
Ahora calcula la confianza de Milk=>Diaper.
Nota: El soporte y la confianza miden lo interesante que es la regla. Se fijan con umbrales mínimos de soporte y confianza. Estos umbrales, definidos por el cliente, ayudan a comparar la fuerza de la regla según tus propios criterios o los del cliente. Cuanto más cerca estén del umbral (o por encima), más útil será la regla para el cliente.
Conjuntos frecuentes: Conjuntos de artículos cuyo soporte es mayor o igual que el soporte mínimo (min_sup). En el ejemplo anterior min_sup=3. Lo define el usuario.
Reglas fuertes: Si una regla A=>B[Support, Confidence] cumple min_sup y min_confidence, entonces es una regla fuerte.
Lift: El lift indica la correlación entre A y B en la regla A=>B. La correlación muestra cómo un conjunto A afecta al conjunto B.
$Lift(A=>B)=\frac{Support}{Supp(A)Supp(B)}$
Por ejemplo, para la regla
{Bread}=>{Milk}, el lift se calcula así:$support(Bread)=\frac{4}{5}=0.8$
$support(Milk)=\frac{4}{5}=0.8$
$Lift(Bread=>Milk)=\frac{0.6}{0.8*0.8}=0.9$
Si la regla tuviera un lift de 1, entonces A y B son independientes y no se puede derivar ninguna regla útil.
Si el lift es > 1, entonces A y B dependen entre sí, y el grado lo indica el valor de lift.
Si el lift es < 1, entonces la presencia de A tiene un efecto negativo sobre B.
Objetivo de la minería de reglas de asociación
Al aplicar minería de reglas de asociación sobre un conjunto de transacciones T, tu objetivo es encontrar todas las reglas con:
Algoritmo APRIORI
En esta parte del tutorial conocerás el algoritmo que ejecutan las librerías de R para el análisis de la cesta. Esto te ayudará a entender mejor a tus clientes y a analizar con más criterio. Si ya conoces el algoritmo APRIORI y cómo funciona, puedes ir directamente a la parte de código.
La minería de reglas de asociación se aborda en dos pasos:
Generación de conjuntos frecuentes: Encontrar todos los conjuntos frecuentes con soporte >= min_support predefinido
Generación de reglas: Listar todas las reglas de asociación a partir de los conjuntos frecuentes. Calcular soporte y confianza para todas. Podar las reglas que no superen los umbrales de min_support y min_confidence.
La generación de conjuntos frecuentes es el paso computacionalmente más costoso porque requiere escanear toda la base de datos.
Arriba viste un ejemplo con solo 5 transacciones, pero en el mundo real los datos de retail pueden llegar a GB y TB, por lo que se necesita un algoritmo optimizado que descarte conjuntos de artículos que no servirán en pasos posteriores. Para esto se usa el algoritmo APRIORI. Establece que:
Se representa mediante el retículo de conjuntos (Itemset Lattice), una representación gráfica del principio de APRIORI. Consta de nodos k-ítems y las relaciones de sus subconjuntos.
En la figura anterior, abajo están todos los artículos de los datos de transacciones y vas subiendo creando subconjuntos hasta el conjunto vacío. Para d artículos, el tamaño del retículo es $2^d$. Esto muestra lo difícil que sería generar los conjuntos frecuentes calculando el soporte de cada combinación. La siguiente figura muestra cuánto ayuda APRIORI a reducir el número de conjuntos a generar:
Si el conjunto {a,b} no es frecuente, no necesitamos considerar ninguno de sus superconjuntos.
Vamos a entenderlo con un ejemplo. A continuación verás por qué APRIORI es efectivo y cómo generar reglas de asociación fuertes paso a paso. ¡Sigue el proceso con tu cuaderno y bolígrafo!
Como ves, empiezas creando la lista de candidatos para el conjunto de 1 ítem, que incluirá todos los artículos presentes en los datos de transacciones, de forma individual. Si piensas en datos reales de retail, puedes imaginar lo costosa que es esta generación de candidatos. Aquí APRIORI entra en juego y ayuda a reducir el tamaño de la lista de candidatos, de modo que al final se generan reglas útiles. En los siguientes pasos verás cómo llegamos al final de la generación de conjuntos frecuentes, el primer paso de la minería de reglas.
Tu siguiente paso será listar todos los conjuntos frecuentes. Tomarás el último conjunto frecuente no vacío, que en este ejemplo es L2={I1, I2},{I2, I3}. Luego crearás todos los subconjuntos no vacíos de los conjuntos presentes en esa lista de conjuntos frecuentes. Sigue el proceso como se ilustra a continuación:
Arriba puedes ver cuatro reglas fuertes. Por ejemplo, toma ${I2}=>I3$ con una confianza del 75%: indica que el 75% de quienes compraron I2 también compraron I3.
Ya has aprendido el algoritmo APRIORI completo, uno de los más utilizados en minería de datos. ¡Vamos con el código, uf!
Implementación de MBA/minería de reglas de asociación en R
En este tutorial, usarás un dataset del UCI Machine Learning Repository. El dataset se llama Online-Retail y puedes descargarlo aquí. Contiene datos de transacciones desde el 01/12/2010 hasta el 09/12/2011 de un comercio electrónico sin tienda física registrado en Reino Unido. Usamos este y no un dataset de R porque es más probable que recibas datos de retail en este formato y tendrás que aplicar preprocesado.
Descripción del dataset
Información de atributos
Cargando librerías
Primero, carga las librerías necesarias. Una breve descripción (tomada de aquí) se muestra en la siguiente tabla para que sepas qué hace cada librería:
arulesarulesViztidyversereadxlplyrggplot2knitrlubridatePreprocesado de datos
Usa
read_excel(path to file)para leer el dataset del archivo descargado en R. Indica la ruta completa al archivo, incluido el nombre, enread_excel(path-to-file-with-filename)Ahora, el dataframe retail contendrá 10 atributos, con dos adicionales:
DateyTime.Antes de aplicar MBA/minería de reglas de asociación, necesitamos convertir el dataframe en datos de transacciones, de modo que todos los artículos comprados juntos en una factura queden en una sola fila. En la salida de
glimpseves que cada transacción está en forma atómica, es decir, todos los productos de una factura aparecen de forma atómica como en bases de datos relacionales. A este formato también se le llama formato singles.Lo que debes hacer es agrupar los datos del dataframe
retailporCustomerID,CustomerIDyDate, o también puedes agrupar usandoInvoiceNoyDate. Necesitamos este agrupamiento para aplicar una función y guardar la salida en otro dataframe. Esto puede hacerse conddply.Las siguientes líneas combinarán todos los productos de un
InvoiceNoyDatey los unirán en una sola fila, con cada artículo separado por,Después, como InvoiceNo y Date no aportarán al minado de reglas, puedes ponerlos a
NULL.A este formato de datos de transacción se le llama formato basket. Ahora debes guardar estos datos en un archivo .csv (valores separados por comas). Para ello,
write.csv()Comprueba que tus datos de transacciones tienen el formato correcto:
A continuación, debes cargar estos datos en un objeto de la clase transacción. Esto se hace con la función de R
read.transactionsdel paquetearules.La siguiente línea tomará el archivo
D:/Documents/market_basket_transactions.csven formato basket y lo convertirá en un objeto de clase transacción.Al ejecutar las líneas anteriores puedes ver muchos
EOF within quoted stringen la salida; no te preocupes.Si ya tienes los datos de transacciones en un dataframe, usa esta línea para convertirlo en objeto transacción:
Visualiza el objeto de transacción
tr:summary(tr)es un comando muy útil que da información sobre nuestro objeto transacción. Observa lo que dice la salida anterior:Hay 22191 transacciones (filas) y 7876 artículos (columnas). Ten en cuenta que 7876 son las descripciones de producto del dataset y 22191 transacciones son combinaciones de esos artículos.
La densidad indica el porcentaje de celdas no nulas en una matriz dispersa. Puedes verla como el total de artículos comprados dividido por el número posible de artículos en esa matriz. Puedes calcular cuántos artículos se compraron usando la densidad: 22191x7876x0.001930725=337445
Summary también puede mostrarte los artículos más frecuentes.
Distribución de longitud de elementos (itemset/transacción): Indica cuántas transacciones hay de 1 ítem, de 2 ítems, etc. La primera fila muestra el número de ítems y la segunda, el número de transacciones.
Por ejemplo, hay solo 3598 transacciones de un único artículo, 1594 transacciones con 2 artículos, y hay 419 artículos en una transacción, que es la más larga.
Puedes generar un
itemFrequencyPlotpara crear un diagrama de barras de frecuencias de ítems y ver la distribución de objetos basada enitemMatrix(p. ej.,>transactionso ítems en>itemsetsy>rules), que es nuestro caso.En
el primer argumento es el objeto transacción a representar,
tr.topNpermite representar los N artículos con mayor frecuencia.typepuede sertype="absolute"otype="relative". Si es absoluto, dibuja las frecuencias numéricas de cada artículo independientemente. Si es relativo, representa cuántas veces aparecen respecto al resto.Este gráfico muestra que 'WHITE HANGING HEART T-LIGHT HOLDER' y 'REGENCY CAKESTAND 3 TIER' tienen más ventas. Así que, para aumentar las ventas de 'SET OF 3 CAKE TINS PANTRY DESIGN', el minorista puede colocarlo cerca de 'REGENCY CAKESTAND 3 TIER'.
Puedes explorar más opciones de
itemFrequencyPlotaquí.¡Generando reglas!
El siguiente paso es extraer las reglas usando el algoritmo APRIORI. La función
apriori()es del paquetearules.aprioritomarátrcomo objeto de transacciones sobre el que minar.parameterte permite fijar min_sup y min_confidence. Los valores por defecto son soporte mínimo 0.1, confianza mínima 0.8 y máximo de 10 ítems (maxlen).summary(association.rules)muestra lo siguiente:Especificación de parámetros: min_sup=0.001 y min_confidence=0.8 con 10 ítems como máximo por regla.
Número total de reglas: Conjunto de 49122 reglas
Distribución de longitudes de regla: Las reglas de longitud 5 son las más numerosas: 16424, y de longitud 2, las menos: 105
Resumen de medidas de calidad: Valores mínimos y máximos de soporte, confianza y lift.
Información usada para crear reglas: Los datos, soporte y confianza proporcionados al algoritmo.
Como hay 49122 reglas, imprimamos solo las 10 primeras:
Con la salida anterior, puedes hacer análisis como:
El 100% de los clientes que compraron 'WOBBLY CHICKEN' también compraron 'METAL'.
El 100% de los clientes que compraron 'BLACK TEA' también compraron 'SUGAR JARS'.
Limitar el número y el tamaño de las reglas
¿Cómo puedes limitar el tamaño y la cantidad de reglas generadas? Ajustando los
parametersenapriori. Si quieres reglas más fuertes, aumenta el valor deconfy, para reglas más largas, incrementamaxlen.Eliminar reglas redundantes
Puedes eliminar reglas que son subconjuntos de reglas más grandes. Usa el siguiente código para quitarlas:
which(): devuelve la posición de los elementos del vector cuyo valor es TRUE.colSums(): suma por columnas para dataframes y arrays numéricos.is.subset(): determina si los elementos de un vector contienen todos los de otro.Encontrar reglas relacionadas con artículos concretos
A veces quieres centrarte en un producto específico. Si quieres averiguar qué influye en la compra del artículo X, puedes usar la opción
appearanceenapriori.appearancenos permite fijar la LHS (parte IF) y la RHS (parte THEN) de la regla.Por ejemplo, para saber qué compran los clientes antes de comprar 'METAL', ejecuta:
De forma similar, para responder a Quienes compraron METAL también compraron... pondrás METAL en lhs:
Visualización de reglas de asociación
Como se generarán cientos o miles de reglas, necesitas varias formas de presentar tus hallazgos. Ya vimos
ItemFrequencyPlot, que también es útil para ver los artículos más vendidos.Aquí veremos estas visualizaciones:
Diagrama de dispersión
Una visualización directa de las reglas de asociación es un scatter plot usando
plot()del paquetearulesViz. Usa soporte y confianza en los ejes. Además, por defecto usa el lift para colorear (niveles de gris) los puntos.El gráfico muestra que las reglas con lift alto suelen tener soporte bajo. Puedes usar las siguientes opciones para el plot:
rulesObject: el objeto de reglas a representarmeasure: medidas de interés de las reglas. Puede ser Support, Confidence, lift o una combinación, según elmethod.shading: medida usada para el color (Support, Confidence, lift). Por defecto es Lift.method: método de visualización (scatterplot, two-key plot, matrix3D).El two-key plot usa soporte y confianza en los ejes x e y, respectivamente. Utiliza order para colorear, que es el número de ítems en la regla.
Diagrama de dispersión interactivo
Un gráfico interactivo excelente para presentar reglas usa
arulesVizyplotly. Puedes pasar el ratón sobre cada regla y ver todas las medidas de calidad (soporte, confianza y lift).Visualizaciones basadas en grafos
Las técnicas basadas en grafos visualizan reglas de asociación con vértices y aristas, donde los vértices están etiquetados con nombres de artículos y los conjuntos/reglas se representan como un segundo conjunto de vértices. Los ítems se conectan con los conjuntos/reglas mediante flechas dirigidas. Las flechas desde ítems a vértices de reglas indican la LHS y una flecha desde una regla a un ítem indica la RHS. El tamaño y el color de los vértices suelen representar medidas de interés.
Los grafos son una forma estupenda de visualizar reglas pero tienden a congestionarse cuando hay muchas. Es mejor mostrar pocas reglas con este tipo de visualización.
Seleccionemos 10 reglas de
subRulescon la mayor confianza.Ahora, dibuja un grafo interactivo:
Nota: Puedes hacer interactivos todos tus plots usando el parámetro
engine=htmlwidgetenplotDesde
arulesViz, los grafos de conjuntos de reglas de asociación pueden exportarse en formato GraphML o como dot-file de Graphviz para analizarlos en herramientas como Gephi. Por ejemplo, las 1000 reglas con mayor lift se exportan con:Representación individual de reglas
Esta representación también se llama Parallel Coordinates Plot. Es útil para visualizar qué productos, junto con qué artículos, provocan cierto tipo de ventas.
Como se mencionó arriba, la RHS es el consecuente o el artículo que proponemos que el cliente comprará; las posiciones en la LHS indican que 2 es la adición más reciente a nuestra cesta y 1 el artículo previo.
Fíjate en la flecha superior. Muestra que cuando tengo 'CHILDS GARDEN SPADE PINK' y 'CHILDS GARDEN RAKE PINK' en mi cesta, es probable que también compre 'CHILDS GARDEN RAKE BLUE'.
Conclusión
¡Enhorabuena! Has aprendido APRIORI, uno de los algoritmos más usados en minería de datos. Has visto qué es la minería de reglas de asociación, sus aplicaciones y su aplicación en retail como Market Basket Analysis. Ahora también eres capaz de implementar Market Basket Analysis en R y presentar tus reglas con gráficos potentes. ¡A seguir aprendiendo!
Referencias:
https://datascienceplus.com/a-gentle-introduction-on-market-basket-analysis%E2%80%8A-%E2%80%8Aassociation-rules/
https://en.wikipedia.org/wiki/Sparse_matrix
https://cran.r-project.org/web/packages/arulesViz/vignettes/arulesViz.pdf
Si quieres aprender más sobre R, haz el curso de DataCamp Importing and Managing Financial Data in R.