Documento 9 Soporte y confianza de reglas

9.1 Objetivo y ejemplo de ejecución

library(arules)
data(Adult)
reglas <- apriori(Adult, parameter = list(supp=0.1,conf=1))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##           1    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target   ext
##      10  rules FALSE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 4884 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[115 item(s), 48842 transaction(s)] done [0.08s].
## sorting and recoding items ... [31 item(s)] done [0.01s].
## creating transaction tree ... done [0.06s].
## checking subsets of size 1 2 3 4 5 6 7 8 9 done [0.20s].
## writing ... [72 rule(s)] done [0.00s].
## creating S4 object  ... done [0.01s].
reg1 <- reglas[10]
reg1
## set of 1 rules
  • Dado el dataset Adult del que se han generado reglas de asociación,

  • A reg1 por error le hemos borrado el soporte y la confianza

reg1@quality$support <- 0
reg1@quality$confidence <- 0
reg1@quality
##    support confidence     lift count
## 10       0          0 1.495926  6674

Escribir una función computer_suppport_confidence que dado un dataset y una regla de asociación obtenida a partir del dataset con el comando apriori, obtenga:

  • soporte(\(X \cup Y\)) (soporte de la unión de X e Y)
  • confianza(X -> Y)

Y estos valores calculados visto en en clase se almacenen en la regla.

La función tendría el siguiente formato:

computer_suppport_confidence <- function(Dataset, Rule1){
....
return(list( my.soporte=....., my.confidence=.....   ))

}

Un ejemmplo de uso, por ejemplo con el dataset Adult:

# esta sería la ejecución de vuestra rutina:
computer_suppport_confidence(Adult,rules[5])
# y esto es lo que devuelve  y podéis ver que coincide
## $my.soporte
## [1] 0.1366447
## 
## $my.confidence
## [1] 1

9.2 Mi solución:

computer_suppport_confidence <- function(Dataset, Rule1){
  soporte <- Rule1@quality$count/nrow(Dataset)
  sopY <- itemFrequency(Dataset)[Dataset@itemInfo$variables=="sex"][[2]]
  confianza <- Rule1@quality$lift*sopY
  return(list(my.soporte = soporte, my.confidence = confianza))
}

computer_suppport_confidence(Adult, reglas[10])
## $my.soporte
## [1] 0.1366447
## 
## $my.confidence
## [1] 1
#La comparamos
inspect(reglas[10])
##     lhs                               rhs          support confidence     lift count
## [1] {relationship=Husband,                                                          
##      hours-per-week=Over-time,                                                      
##      native-country=United-States} => {sex=Male} 0.1366447          1 1.495926  6674

9.3 Solución profesor:

9.3.1 1ª FORMA

computer_suppport_confidence <- function(ds, R1){
  
  nr <- dim(ds)[1] # 48842
  
  # Convertimos el dataframe en una matriz booleana
  
  if(class(ds) == "data.frame"){
    ds <- as.matrix(ds)
  }else if(class(Adult)[[1]] == "transactions"){
    ds <-as(ds,"matrix")
  }
  
  #Regla R1: X -> Y
  
  lt <- t(as(lhs(R1),"matrix")) # Parte izquierda de la regla (X) como una matriz lógica (columna)
  
  # Sacas todos los levels de todos los factors
 
  lhs <- ds%*%lt == sum(lt)         # La multiplicación de la matriz lógica del dataset
                                    # por la parte izquierda de la regla nos da como
                                    # resultado un vector columna de tantas filas(f) como tenga
                                    # el dataset, en cada f del vector el resultado indica cu?ntos
                                    # elementos de la regla(rt) aparecen en cada fila, por lo que
                                    # si coincide con la suma de elementos TRUE de la parte derecha,
                                    # significa que todos los elementos de la regla aparecen en dicha regla
                                    
  n.lhs <- sum(lhs) # n.rhs es el numero de filas del ds que aparece la parte izda 
  
  sop.x <- n.lhs/nr # numero de filas con X / numero de filas tabla -> SOPORTE
  
  # Para calcular confianza:
  
  r.lhs <- which(lhs) # indices de las filas del ds que contienen X, necesario para sop(X U Y)
  
  rt <- t(as(rhs(R1),"matrix")) #parte DCHA de la regla X como una matriz l?gica(columna)
  
  lhs.rhs <- ds[r.lhs,]%*%rt == sum(rt) #al igual que antes, con la excepci?n de que
                                        # ahora s?lo se toman las reglas que contienen
                                        # parte derecha, se obtienen las reglas que 
                                        #tambi?n contienen la parte derecha
  
  n.lhs.rhs <- sum(lhs.rhs) #numero de filas con X e Y
  
  sop.x <- n.lhs/nr # numero de filas con X / numero de filas tabla
  sop.xy <- n.lhs.rhs/nr # Sop(X U Y)
  
  conf <- sop.xy/sop.x
  
  return(list( my.soporte= sop.xy, my.confidence=conf ))
  
}
library(arules)
data("Adult")

r <- apriori(Adult)
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.8    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target   ext
##      10  rules FALSE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 4884 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[115 item(s), 48842 transaction(s)] done [0.08s].
## sorting and recoding items ... [31 item(s)] done [0.01s].
## creating transaction tree ... done [0.06s].
## checking subsets of size 1 2 3 4 5 6 7 8 9 done [0.21s].
## writing ... [6137 rule(s)] done [0.00s].
## creating S4 object  ... done [0.02s].
computer_suppport_confidence(Adult, r[85])
## $my.soporte
## [1] 0.3656279
## 
## $my.confidence
## [1] 0.9057618
# Comparación
inspect(r[85])
##     lhs                       rhs          support   confidence lift     count
## [1] {relationship=Husband} => {race=White} 0.3656279 0.9057618  1.059318 17858

Coinciden.

9.3.2 2ª FORMA

computer_support_confidence <- function(Dataset, Rule1){
  
  vector_items <- unlist(as(items(Rule1), "list")) # Sacamos los items de la regla: tipo (c())
  vector_izq <- unlist(as(lhs(Rule1), "list"))     # Antecedentes de la regla
  
  filtrado_transacciones_soporte <- subset(x = Dataset, 
                                    subset = items %ain% vector_items)
  
  # %ain% : returns a logical vector indicating if a row (itemset) in x contains all of the items specified in table
  
  soporteXUY <- length(filtrado_transacciones_soporte)/length(Dataset)
  
  filtrado_transacciones_confidence <- subset(x = Dataset, 
                                   subset = items %ain% vector_izq)
  
  soporteX <- length(filtrado_transacciones_confidence)/length(Dataset)
  confidence <- soporteXUY/soporteX
  
  return(list( my.soporte=soporteXUY, 
               my.confidence=confidence))
  
} #end of computer_support_confidence
library(arules)
data("Adult")

reglas <- apriori(Adult,  parameter = list(supp = 0.7, conf = 0.9,   
                                          target = "rules"))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.9    0.1    1 none FALSE            TRUE       5     0.7      1
##  maxlen target   ext
##      10  rules FALSE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 34189 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[115 item(s), 48842 transaction(s)] done [0.08s].
## sorting and recoding items ... [4 item(s)] done [0.01s].
## 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].
inspect(reglas[15])
##     lhs                               rhs                 support   confidence
## [1] {race=White,capital-loss=None} => {capital-gain=None} 0.7404283 0.9099693 
##     lift      count
## [1] 0.9919147 36164
computer_support_confidence(Adult, reglas[15])
## $my.soporte
## [1] 0.7404283
## 
## $my.confidence
## [1] 0.9099693