Nombre : Noboa Andres

El algoritmo a priori se usa para encontrar conjuntos de elementos frecuentes en un conjunto de datos para la minería de reglas de asociación. Se llama a priori porque utiliza el conocimiento previo de las propiedades frecuentes de los conjuntos de elementos. Aplicamos un enfoque iterativo o una búsqueda por niveles en la que se utilizan conjuntos de elementos k frecuentes para encontrar conjuntos de elementos k+1. Para mejorar la eficiencia de la generación nivelada de conjuntos de elementos frecuentes, se utiliza una propiedad importante llamada propiedad Apriori que ayuda a reducir el espacio de búsqueda. Es muy fácil implementar este algoritmo utilizando el lenguaje de programación R.

library(readr)
library(arules)
library(magrittr)

library(tidyverse)

datos <- read_csv (file = "./datos_groceries.csv", col_names = TRUE,show_col_types = FALSE)
head(df,5)

transacciones <- read.transactions(file = "./datos_groceries.csv",
                                   format = "single",
                                   sep = ",",
                                   header = TRUE,
                                   cols = c("id_compra", "item"),
                                   rm.duplicates = TRUE)

transacciones
transactions in sparse format with
 9835 transactions (rows) and
 169 items (columns)
colnames(transacciones)[1:5]
[1] "abrasive cleaner" "artif. sweetener" "baby cosmetics"   "baby food"        "bags"            
rownames(transacciones)[1:5]
[1] "1"    "10"   "100"  "1000" "1001"
transacciones
transactions in sparse format with
 9835 transactions (rows) and
 169 items (columns)
datos_matriz <- df %>%
                as.data.frame() %>%
                mutate(valor = 1) %>%
                spread(key = item, value = valor, fill = 0) %>%
                column_to_rownames(var = "id_compra") %>%
                as.matrix()

transacciones <- as(datos_matriz, Class = "transactions")
transacciones
transactions in sparse format with
 9835 transactions (rows) and
 169 items (columns)

CONVERSIÓN DE UNA MATRIZ A UN OBJETO TIPO TRANSACTION

inspect(transacciones[1:5])
NA
df_transacciones <- as(transacciones, Class = "data.frame")
# Para que el tamaño de la tabla se ajuste mejor, se convierte el dataframe a tibble
as.tibble(df_transacciones) %>% head()
tamanyos <- size(transacciones)
summary(tamanyos)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   3.000   4.409   6.000  32.000 
data.frame(tamanyos) %>%
  ggplot(aes(x = tamanyos)) +
  geom_histogram() +
  labs(title = "Distribución del tamaño de las transacciones",
       x = "Tamaño") +
  theme_bw()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

frecuencia_items <- itemFrequency(x = transacciones, type = "relative")
frecuencia_items %>% sort(decreasing = TRUE) %>% head(5)
      whole milk other vegetables       rolls/buns             soda           yogurt 
       0.2555160        0.1934926        0.1839349        0.1743772        0.1395018 
frecuencia_items <- itemFrequency(x = transacciones, type = "absolute")
frecuencia_items %>% sort(decreasing = TRUE) %>% head(5)
      whole milk other vegetables       rolls/buns             soda           yogurt 
            2513             1903             1809             1715             1372 

soporte <- 30 / dim(transacciones)[1]
itemsets <- apriori(data = transacciones,
                    parameter = list(support = soporte,
                                     minlen = 1,
                                     maxlen = 20,
                                     target = "frequent itemset"))
Apriori

Parameter specification:

Algorithmic control:

Absolute minimum support count: 30 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [136 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 done [0.00s].
sorting transactions ... done [0.00s].
writing ... [2226 set(s)] done [0.00s].
creating S4 object  ... done [0.00s].
summary(itemsets)
set of 2226 itemsets

most frequent items:
      whole milk other vegetables           yogurt  root vegetables       rolls/buns          (Other) 
             556              468              316              251              241             3536 

element (itemset/transaction) length distribution:sizes
   1    2    3    4    5 
 136 1140  850   98    2 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   2.000   2.412   3.000   5.000 

summary of quality measures:
    support             count        
 Min.   :0.003050   Min.   :  30.00  
 1st Qu.:0.003660   1st Qu.:  36.00  
 Median :0.004779   Median :  47.00  
 Mean   :0.007879   Mean   :  77.49  
 3rd Qu.:0.007219   3rd Qu.:  71.00  
 Max.   :0.255516   Max.   :2513.00  

includes transaction ID lists: FALSE 

mining info:
# Se muestran los top 20 itemsets de mayor a menor soporte
top_20_itemsets <- sort(itemsets, by = "support", decreasing = TRUE)[1:20]
inspect(top_20_itemsets)


#Reglas de asociación
soporte <- 30 / dim(transacciones)[1]
reglas <- apriori(data = transacciones,
                  parameter = list(support = soporte,
                                   confidence = 0.70,
                                   # Se especifica que se creen reglas
                                   target = "rules"))
Apriori

Parameter specification:

Algorithmic control:

Absolute minimum support count: 30 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [136 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 done [0.00s].
writing ... [19 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].

inspect(sort(x = reglas, decreasing = TRUE, by = "confidence"))

Confidencia Mayor e inferior

Para una confidencia mayor a 0.80


soporte <- 30 / dim(transacciones)[1]
reglas <- apriori(data = transacciones,
                  parameter = list(support = soporte,
                                   confidence = 0.80,
                                   # Se especifica que se creen reglas
                                   target = "rules"))
Apriori

Parameter specification:

Algorithmic control:

Absolute minimum support count: 30 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [136 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 done [0.00s].
writing ... [1 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
inspect(sort(x = reglas, decreasing = TRUE, by = "confidence"))

Para una confidencia menor a 0.30


soporte <- 30 / dim(transacciones)[1]
reglas <- apriori(data = transacciones,
                  parameter = list(support = soporte,
                                   confidence = 0.30,
                                   # Se especifica que se creen reglas
                                   target = "rules"))
Apriori

Parameter specification:

Algorithmic control:

Absolute minimum support count: 30 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [136 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 done [0.01s].
writing ... [1361 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
inspect(sort(x = reglas, decreasing = FALSE, by = "confidence"))
LS0tCnRpdGxlOiAiRWplbXBsbyBjZXN0YSBkZSBsYSBjb21wcmEiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCgoKIyMgTm9tYnJlIDogTm9ib2EgQW5kcmVzCgpFbCBhbGdvcml0bW8gYSBwcmlvcmkgc2UgdXNhIHBhcmEgZW5jb250cmFyIGNvbmp1bnRvcyBkZSBlbGVtZW50b3MgZnJlY3VlbnRlcyBlbiB1biBjb25qdW50byBkZSBkYXRvcyBwYXJhIGxhIG1pbmVyw61hIGRlIHJlZ2xhcyBkZSBhc29jaWFjacOzbi4gU2UgbGxhbWEgYSBwcmlvcmkgcG9ycXVlIHV0aWxpemEgZWwgY29ub2NpbWllbnRvIHByZXZpbyBkZSBsYXMgcHJvcGllZGFkZXMgZnJlY3VlbnRlcyBkZSBsb3MgY29uanVudG9zIGRlIGVsZW1lbnRvcy4gQXBsaWNhbW9zIHVuIGVuZm9xdWUgaXRlcmF0aXZvIG8gdW5hIGLDunNxdWVkYSBwb3Igbml2ZWxlcyBlbiBsYSBxdWUgc2UgdXRpbGl6YW4gY29uanVudG9zIGRlIGVsZW1lbnRvcyBrIGZyZWN1ZW50ZXMgcGFyYSBlbmNvbnRyYXIgY29uanVudG9zIGRlIGVsZW1lbnRvcyBrKzEuIFBhcmEgbWVqb3JhciBsYSBlZmljaWVuY2lhIGRlIGxhIGdlbmVyYWNpw7NuIG5pdmVsYWRhIGRlIGNvbmp1bnRvcyBkZSBlbGVtZW50b3MgZnJlY3VlbnRlcywgc2UgdXRpbGl6YSB1bmEgcHJvcGllZGFkIGltcG9ydGFudGUgbGxhbWFkYSBwcm9waWVkYWQgQXByaW9yaSBxdWUgYXl1ZGEgYSByZWR1Y2lyIGVsIGVzcGFjaW8gZGUgYsO6c3F1ZWRhLiBFcyBtdXkgZsOhY2lsIGltcGxlbWVudGFyIGVzdGUgYWxnb3JpdG1vIHV0aWxpemFuZG8gZWwgbGVuZ3VhamUgZGUgcHJvZ3JhbWFjacOzbiBSLgoKCmBgYHtyfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGFydWxlcykKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeSh0aWR5dmVyc2UpCgpkYXRvcyA8LSByZWFkX2NzdiAoZmlsZSA9ICIuL2RhdG9zX2dyb2Nlcmllcy5jc3YiLCBjb2xfbmFtZXMgPSBUUlVFLHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmhlYWQoZGYsNSkKCnRyYW5zYWNjaW9uZXMgPC0gcmVhZC50cmFuc2FjdGlvbnMoZmlsZSA9ICIuL2RhdG9zX2dyb2Nlcmllcy5jc3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJzaW5nbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJpZF9jb21wcmEiLCAiaXRlbSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtLmR1cGxpY2F0ZXMgPSBUUlVFKQoKdHJhbnNhY2Npb25lcwpjb2xuYW1lcyh0cmFuc2FjY2lvbmVzKVsxOjVdCnJvd25hbWVzKHRyYW5zYWNjaW9uZXMpWzE6NV0KYGBgCgpgYGB7cn0KZGF0b3Nfc3BsaXQgPC0gc3BsaXQoeCA9IGRmJGl0ZW0sIGYgPSBkZiRpZF9jb21wcmEpCnRyYW5zYWNjaW9uZXMgPC0gYXMoZGF0b3Nfc3BsaXQsIENsYXNzID0gInRyYW5zYWN0aW9ucyIpCnRyYW5zYWNjaW9uZXMKYGBgCgoKYGBge3J9CmRhdG9zX21hdHJpeiA8LSBkZiAlPiUKICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZSh2YWxvciA9IDEpICU+JQogICAgICAgICAgICAgICAgc3ByZWFkKGtleSA9IGl0ZW0sIHZhbHVlID0gdmFsb3IsIGZpbGwgPSAwKSAlPiUKICAgICAgICAgICAgICAgIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiaWRfY29tcHJhIikgJT4lCiAgICAgICAgICAgICAgICBhcy5tYXRyaXgoKQoKdHJhbnNhY2Npb25lcyA8LSBhcyhkYXRvc19tYXRyaXosIENsYXNzID0gInRyYW5zYWN0aW9ucyIpCnRyYW5zYWNjaW9uZXMKCgpgYGAKCkNPTlZFUlNJw5NOIERFIFVOQSBNQVRSSVogQSBVTiBPQkpFVE8gVElQTyBUUkFOU0FDVElPTgoKCmBgYHtyfQppbnNwZWN0KHRyYW5zYWNjaW9uZXNbMTo1XSkKCmBgYAoKYGBge3J9CmRmX3RyYW5zYWNjaW9uZXMgPC0gYXModHJhbnNhY2Npb25lcywgQ2xhc3MgPSAiZGF0YS5mcmFtZSIpCiMgUGFyYSBxdWUgZWwgdGFtYcOxbyBkZSBsYSB0YWJsYSBzZSBhanVzdGUgbWVqb3IsIHNlIGNvbnZpZXJ0ZSBlbCBkYXRhZnJhbWUgYSB0aWJibGUKYXMudGliYmxlKGRmX3RyYW5zYWNjaW9uZXMpICU+JSBoZWFkKCkKYGBgCgpgYGB7cn0KdGFtYW55b3MgPC0gc2l6ZSh0cmFuc2FjY2lvbmVzKQpzdW1tYXJ5KHRhbWFueW9zKQpgYGAKCgpgYGB7cn0KZGF0YS5mcmFtZSh0YW1hbnlvcykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGFtYW55b3MpKSArCiAgZ2VvbV9oaXN0b2dyYW0oKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGRlbCB0YW1hw7FvIGRlIGxhcyB0cmFuc2FjY2lvbmVzIiwKICAgICAgIHggPSAiVGFtYcOxbyIpICsKICB0aGVtZV9idygpCgpgYGAKCgpgYGB7cn0KZnJlY3VlbmNpYV9pdGVtcyA8LSBpdGVtRnJlcXVlbmN5KHggPSB0cmFuc2FjY2lvbmVzLCB0eXBlID0gInJlbGF0aXZlIikKZnJlY3VlbmNpYV9pdGVtcyAlPiUgc29ydChkZWNyZWFzaW5nID0gVFJVRSkgJT4lIGhlYWQoNSkKYGBgCgoKCmBgYHtyfQpmcmVjdWVuY2lhX2l0ZW1zIDwtIGl0ZW1GcmVxdWVuY3koeCA9IHRyYW5zYWNjaW9uZXMsIHR5cGUgPSAiYWJzb2x1dGUiKQpmcmVjdWVuY2lhX2l0ZW1zICU+JSBzb3J0KGRlY3JlYXNpbmcgPSBUUlVFKSAlPiUgaGVhZCg1KQoKYGBgCgoKCmBgYHtyfQoKc29wb3J0ZSA8LSAzMCAvIGRpbSh0cmFuc2FjY2lvbmVzKVsxXQppdGVtc2V0cyA8LSBhcHJpb3JpKGRhdGEgPSB0cmFuc2FjY2lvbmVzLAogICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciA9IGxpc3Qoc3VwcG9ydCA9IHNvcG9ydGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5sZW4gPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuID0gMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAiZnJlcXVlbnQgaXRlbXNldCIpKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGl0ZW1zZXRzKQoKCmBgYApgYGB7cn0KIyBTZSBtdWVzdHJhbiBsb3MgdG9wIDIwIGl0ZW1zZXRzIGRlIG1heW9yIGEgbWVub3Igc29wb3J0ZQp0b3BfMjBfaXRlbXNldHMgPC0gc29ydChpdGVtc2V0cywgYnkgPSAic3VwcG9ydCIsIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjIwXQppbnNwZWN0KHRvcF8yMF9pdGVtc2V0cykKYGBgCgoKYGBge3J9CiMgUGFyYSByZXByZXNlbnRhcmxvcyBjb24gZ2dwbG90IHNlIGNvbnZpZXJ0ZSBhIGRhdGFmcmFtZSAKYXModG9wXzIwX2l0ZW1zZXRzLCBDbGFzcyA9ICJkYXRhLmZyYW1lIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihpdGVtcywgc3VwcG9ydCksIHkgPSBzdXBwb3J0KSkgKwogIGdlb21fY29sKCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgbGFicyh0aXRsZSA9ICJJdGVtc2V0cyBtw6FzIGZyZWN1ZW50ZXMiLCB4ID0gIml0ZW1zZXRzIikgKwogIHRoZW1lX2J3KCkKYGBgCgoKYGBge3J9CgppbnNwZWN0KHNvcnQoaXRlbXNldHNbc2l6ZShpdGVtc2V0cykgPiAxXSwgZGVjcmVhc2luZyA9IFRSVUUpWzE6MjBdKQpgYGAKCmBgYHtyfQoKI1JlZ2xhcyBkZSBhc29jaWFjacOzbgpzb3BvcnRlIDwtIDMwIC8gZGltKHRyYW5zYWNjaW9uZXMpWzFdCnJlZ2xhcyA8LSBhcHJpb3JpKGRhdGEgPSB0cmFuc2FjY2lvbmVzLAogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgPSBsaXN0KHN1cHBvcnQgPSBzb3BvcnRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAwLjcwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2UgZXNwZWNpZmljYSBxdWUgc2UgY3JlZW4gcmVnbGFzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gInJ1bGVzIikpCgpgYGAKCgpgYGB7cn0KCmluc3BlY3Qoc29ydCh4ID0gcmVnbGFzLCBkZWNyZWFzaW5nID0gVFJVRSwgYnkgPSAiY29uZmlkZW5jZSIpKQpgYGAKCiMjIyBDb25maWRlbmNpYSBNYXlvciBlIGluZmVyaW9yCgoKUGFyYSB1bmEgY29uZmlkZW5jaWEgbWF5b3IgYSAwLjgwCgpgYGB7cn0KCnNvcG9ydGUgPC0gMzAgLyBkaW0odHJhbnNhY2Npb25lcylbMV0KcmVnbGFzIDwtIGFwcmlvcmkoZGF0YSA9IHRyYW5zYWNjaW9uZXMsCiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciA9IGxpc3Qoc3VwcG9ydCA9IHNvcG9ydGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSA9IDAuODAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTZSBlc3BlY2lmaWNhIHF1ZSBzZSBjcmVlbiByZWdsYXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAicnVsZXMiKSkKYGBgCgpgYGB7cn0KaW5zcGVjdChzb3J0KHggPSByZWdsYXMsIGRlY3JlYXNpbmcgPSBUUlVFLCBieSA9ICJjb25maWRlbmNlIikpCmBgYAoKClBhcmEgdW5hIGNvbmZpZGVuY2lhIG1lbm9yIGEgMC4zMAoKCmBgYHtyfQoKc29wb3J0ZSA8LSAzMCAvIGRpbSh0cmFuc2FjY2lvbmVzKVsxXQpyZWdsYXMgPC0gYXByaW9yaShkYXRhID0gdHJhbnNhY2Npb25lcywKICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyID0gbGlzdChzdXBwb3J0ID0gc29wb3J0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlID0gMC4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNlIGVzcGVjaWZpY2EgcXVlIHNlIGNyZWVuIHJlZ2xhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9ICJydWxlcyIpKQpgYGAKCmBgYHtyfQppbnNwZWN0KHNvcnQoeCA9IHJlZ2xhcywgZGVjcmVhc2luZyA9IEZBTFNFLCBieSA9ICJjb25maWRlbmNlIikpCmBgYAoK