I am doing data mining with rules asociation using a priori (library arules) in r.
I want to convert a factor in dummy variables, e. g., color = {red, blue, green} I'll do three new variables that for each instance will be like (red= Yes, blue=No, green=No).
When I do a priori I have the problem of redundant rules like red=Yes => green=No or {red=Yes, green=No} => {one arbitrary irrelevant thing}.
How can I prune the rules to not obtain these redundancies? The dataset is pima indians diabetes (a quite famous and typical dataset).
library(arules)
pima<-read.csv("pima.dat",header=F,comment.char = "@")
names(pima)<-names(pima) <-c("Preg", "Plas", "Pres", "Skin", "Insu", "Mass", "Pedi", "Age", "Class")
pima$Plas<-ifelse(pima$Plas==0&pima$Class=="tested_negative",floor(mean(pima$Plas[pima$Plas!=0&pima$Class=="tested_negative"])),floor(pima$Plas))
pima$Plas<-ifelse(pima$Plas==0&pima$Class=="tested_positive",floor(mean(pima$Plas[pima$Plas!=0&pima$Class=="tested_positive"])),floor(pima$Plas))
pima$Pres<-ifelse(pima$Pres==0&pima$Class=="tested_negative",floor(mean(pima$Pres[pima$Pres!=0&pima$Class=="tested_negative"])),floor(pima$Pres))
pima$Pres<-ifelse(pima$Pres==0&pima$Class=="tested_positive",floor(mean(pima$Pres[pima$Pres!=0&pima$Class=="tested_positive"])),floor(pima$Pres))
pima$Skin<-ifelse(pima$Skin==0&pima$Class=="tested_negative",floor(mean(pima$Skin[pima$Skin!=0&pima$Class=="tested_negative"])),floor(pima$Skin))
pima$Skin<-ifelse(pima$Skin==0&pima$Class=="tested_positive",floor(mean(pima$Skin[pima$Skin!=0&pima$Class=="tested_positive"])),floor(pima$Skin))
pima$Insu<-ifelse(pima$Insu==0&pima$Class=="tested_negative",floor(mean(pima$Insu[pima$Insu!=0&pima$Class=="tested_negative"])),floor(pima$Insu))
pima$Insu<-ifelse(pima$Insu==0&pima$Class=="tested_positive",floor(mean(pima$Insu[pima$Insu!=0&pima$Class=="tested_positive"])),floor(pima$Insu))
pima$Mass<-ifelse(pima$Mass==0&pima$Class=="tested_negative",floor(mean(pima$Mass[pima$Mass!=0&pima$Class=="tested_negative"])),floor(pima$Mass))
pima$Mass<-ifelse(pima$Mass==0&pima$Class=="tested_positive",floor(mean(pima$Mass[pima$Mass!=0&pima$Class=="tested_positive"])),floor(pima$Mass))
#Discretización de las variables
pima[[ "Age"]] = ordered( cut ( pima[[ "Age"]], c(21,30,45,65,100) ) ,
labels = c ("Joven", "Mediana edad", "Mayor", "Viejo"))
pima[[ "Preg"]] = ordered( cut ( pima[[ "Preg"]], c(0,0.9,4,8,20),right=FALSE, include.lowest = TRUE ) ,
labels = c ("Ningún embarazo", "Pocos embarazos", "Bastantes embarazos", "Muchos embarazos"))
pima[[ "Pres"]] = ordered( cut ( pima[[ "Pres"]], c(0,70,92,102,110,Inf),right=FALSE, include.lowest = TRUE ) ,
labels = c ("hipotensión", "tensión normal", "hipertensión leve", "hipertensión media-grave", "hipertensión grave"))
pima[[ "Insu"]] = ordered( cut ( pima[[ "Insu"]], c(0,16,166,Inf),right=FALSE, include.lowest = TRUE ) ,
labels = c ("Insulina baja", "Insulina normal", "Insulina alta"))
pima[[ "Mass"]] = ordered( cut ( pima[[ "Mass"]], c(0,18.5,25,30,Inf),right=FALSE, include.lowest = TRUE ) ,
labels = c ("Bajo peso", "Peso normal", "Sobrepeso","Obesidad"))
pima[[ "Plas"]] = ordered( cut ( pima[[ "Plas"]], c(0,140,192,Inf),right=FALSE, include.lowest = TRUE ) ,
labels = c ("Glucosa normal", "Glucosa alta", "Glucosa muy alta"))
pima[[ "Pedi"]] = ordered( cut ( pima[[ "Pedi"]], c(0,0.37,0.6,Inf),right=FALSE, include.lowest = TRUE ) ,
labels = c ("Función pedigree baja", "Función pedigree normal", "Función pedigree alta"))
pima[[ "Skin"]] = ordered( cut ( pima[[ "Skin"]], c(0,15,40,Inf),right=FALSE, include.lowest = TRUE ) ,
labels = c ("Bajo espesor de piel", "Espesor de piel normal", "Espesor de piel alto"))
pima$Class = factor(ifelse(pima$Class=="tested_positive","Diabético","No diabético"))
library(psych)
new <- dummy.code(pima_df$Preg)
pima_df <- data.frame(new,pima_df)
pima_df<-pima_df[,-5]
pima_df[,1] <- factor(ifelse(pima_df[,1]==0, 'No', 'Sí'))
pima_df[,2] <- factor(ifelse(pima_df[,2]==0, 'No', 'Sí'))
pima_df[,3] <- factor(ifelse(pima_df[,3]==0, 'No', 'Sí'))
pima_df[,4] <- factor(ifelse(pima_df[,4]==0, 'No', 'Sí'))
pima2 <- as(pima_df, "transactions")
rules_negadas <- apriori(pima2, parameter = list(support = 0.1, confidence = 0.8, minlen = 2))
summary(rules_negadas)
inspect(head(rules_negadas))
quality(head(rules_negadas))
#Ordenar las reglas por el campo que más nos interese por ejemplo confianza
rulesSorted_negadas = sort(rules_negadas, by = "confidence")
inspect(head(rulesSorted_negadas,20))
Do not create dummy variables. Leave color as a factor and the conversion into transactions will create the appropriate items (color=red
, color=blue
and color=green
).
If you already have dummy variables, but you don't want the negative values to become items then convert them into logical. Example :pima_df[,1] <- pima_df[,1] == 'Si'
Have a look at the examples in ?transactions
and at https://rawgit.com/mhahsler/Introduction_to_Data_Mining_R_Examples/master/chap6.html#create-transactions to learn more about this.
If you want green=yes
and red=no
, just not in the same rule, then you are in trouble because that is not something you can easily enforce in association rule mining.