TID | Items |
---|---|
1 | pão, leite |
2 | pão, fralda, cerveja, ovos |
3 | leite, fralda, cerveja, coca |
4 | pão, leite, fralda, cerveja |
5 | pão, leite, fralda, coca |
ID | Regras | Suporte & Confiança |
---|---|---|
1 | {leite,fralda} →{cerveja} | (s=0.4, c=0.67) |
2 | {leite,cerveja} →{fralda} | (s=0.4, c=1.0) |
3 | {fralda,cerveja} →{leite} | (s=0.4, c=0.67) |
4 | {cerveja} →{leite,fralda} | (s=0.4, c=0.67) |
5 | {fralda} →{leite,cerveja} | (s=0.4, c=0.5) |
6 | {leite} →{fralda,cerveja} | (s=0.4, c=0.5 |
Regras de associação – Uma expressão da forma X->Y, onde X e Y são conjuntos de itens
Exemplo: {Milk, Diaper} →{Beer}
Suporte (X->Y) = número de registros contendo X e Y / Total de registros
O cálculo da taxa de confiança é calculada como a razão entre o número de registros contendo X e Y e o número de registros contendo X:
Confiança (X->Y) = Número de registros contendo X e Y / Número de registros contendo X
Regra 1:
Regra 2:
install.packages('arules', repos='http://cran.us.r-project.org')
Caso o pacote acima já esteja instalado basta carrega-lo
library(arules)
df <- read.table(header=T, text="ID milk bread butter beer diapers
1 T T F F F
2 F F T F F
3 F F F T T
4 T T T F F
5 F T F F F")
df
trans <- as(df[, -1], "transactions")
regras <- apriori(trans, list(supp = 0.01, conf = 0.5, minlen = 2))
Número de regras obtidas durabte a operação anterior
regras
inspect(head(regras, n = 3, by = "support")) #apresentando 3 regras filtradas pela coluna "support"
Ampliando a lista de regras
print(cbind(as(regras, "data.frame")), digits=2)
Perceba que todos que compram cerveja compram fraldas. Todos que compram fraldas compram cervejas. E 50% dos que compram manteiga compram leite.
O conjunto de dados Adult contém os dados preparados como transações para uso com o pacote arules.
data("Adult")
data set contains a data frame with 48842 observations on the following 15 variables.
age a numeric vector.
workclass a factor with levels Federal-gov, Local-gov, Never-worked, Private, Self-emp-inc, Self-emp-not-inc, State-gov, and Without-pay.
education an ordered factor with levels Preschool < 1st-4th < 5th-6th < 7th-8th < 9th < 10th < 11th < 12th < HS-grad < Prof-school < Assoc-acdm < Assoc-voc < Some-college < Bachelors < Masters < Doctorate.
education-num a numeric vector.
marital-status a factor with levels Divorced, Married-AF-spouse, Married-civ-spouse, Married-spouse-absent, Never-married, Separated, and Widowed.
occupation a factor with levels Adm-clerical, Armed-Forces, Craft-repair, Exec-managerial, Farming-fishing, Handlers-cleaners, Machine-op-inspct, Other-service, Priv-house-serv, Prof-specialty, Protective-serv, Sales, Tech-support, and Transport-moving.
relationship a factor with levels Husband, Not-in-family, Other-relative, Own-child, Unmarried, and Wife.
race a factor with levels Amer-Indian-Eskimo, Asian-Pac-Islander, Black, Other, and White.
sex a factor with levels Female and Male.
capital-gain a numeric vector.
capital-loss a numeric vector.
fnlwgt a numeric vector.
hours-per-week a numeric vector.
native-country a factor with levels Cambodia, Canada, China, Columbia, Cuba, Dominican-Republic, Ecuador, El-Salvador, England, France, Germany, Greece, Guatemala, Haiti, Holand-Netherlands, Honduras, Hong, Hungary, India, Iran, Ireland, Italy, Jamaica, Japan, Laos, Mexico, Nicaragua, Outlying-US(Guam-USVI-etc), Peru, Philippines, Poland, Portugal, Puerto-Rico, Scotland, South, Taiwan, Thailand, Trinadad&Tobago, United-States, Vietnam, and Yugoslavia.
income an ordered factor with levels small < large.
Podemos agora produzir as regras de associação com o uso da função apriori.
Apriori emprega pesquisa para conjuntos de níveis freqüentes.Passamos como argumento apenas o objeto de transações, com suporte e confiança definidos em 0.5
regras <- apriori(Adult, parameter = list(support = 0.4, conf=0.5))
regras
Lista de 3 primeiras regras
inspect(regras[1:3])
A partir deste momento, regras tem o conjunto de regras de associação produzidas pelo função apriori.
Selecionamos um subconjunto de regras usando correspondência parcial ("sex") nos itens no lado direito e uma medida de qualidade
regras.sub <- subset(regras, subset = rhs %pin% "sex" & lift > 1.3)
Exibir as 3 principais regras de suporte
regras.sub
Usamos a função inspect para visualizar as regras criadas
inspect(head(regras.sub, n = 3, by = "support"))
Os parâmetros:
#Lista os labels das primeiras 3 regras
labels(regras.sub[1:3])
labels(regras.sub[1:3], itemSep = " + ", setStart = "", setEnd="", ruleSep = " ---> ")
Instalando o Pacote aruleViz para visualização das regras
install.packages("arulesViz", repos="http://cran.us.r-project.org")
Caso o pacote já esteja instalado, basta carregar a biblioteca como desmonstrado abaixo:
library("arulesViz")
Carregando a base de transações Groceries (Mercearia)
data("Groceries")
Lista as dimensões dos dados
Groceries
regras <- apriori(Groceries, parameter = list(supp = 0.001, conf = 0.8))
regras
plot(regras, control=list(jitter=2))
regras_high_lift <- head(sort(regras, by="lift"), 3)
inspect(regras_high_lift)
Podemos concluir que 90% dos que levaram {liquor,red/blush wine} também levaram {bottled beer}
plot(regras_high_lift, method="graph", control=list(type="items"))
Este estudo de caso é uma adaptação do excelente trabalho realizado por Flávio Clésio a respeito do uso de Regras de Associação aplicadas na área de Segurança Pública.
Carregando a Biblioteca "arules"
library(arules)
Carregando o conjunto de dados. Estes dados por serem sintéticos, podem ter inconsistências
crimes <- read.csv("https://raw.githubusercontent.com/flaviobrito/dataudit/master/dados/Crimes.csv")
Descrevendo as variáveis
Temos uma base de dados com 780 crimes com 16 variáveis que são:
Examinando a estrutura do conjunto de dados
str(crimes)
Resumo estatístico
summary(crimes)
No mundo real nem sempre torna-se fácil aumentar o valor de confiança e ter também um bom valor de suporte. Este é o desejável. Nosso primeiro movimento é trabalhar para conseguir regras com algum senso próximo a realidade. Descartaremos as regras furadas.
crimes_rulez <- apriori(crimes, parameter = list(minlen=4,maxlen=10, supp=0.55, conf=0.80))
Reduzindo o número de dígitos nas medidas de qualidade do modelo.
quality(crimes_rulez) <- round(quality(crimes_rulez), digits=2)
Ordenando pela Confiança, Suporte e Lift
model_srt_confidence <- sort(crimes_rulez, by="confidence")
model_srt_support <- sort(crimes_rulez, by="support")
model_srt_lift <- sort(crimes_rulez, by="lift")
Verificando o Modelo
inspect(model_srt_confidence[1:4])
inspect(model_srt_support[1:4])
inspect(model_srt_lift[1:4])
Listando as 10 regras no topo para cada modelo
inspect(crimes_rulez[1:4])
inspect(model_srt_confidence[1:4])
inspect(model_srt_support[1:10])
inspect(model_srt_lift[1:10])
Criando regras específicas mineradas.
Zona_Sul <- subset(crimes_rulez, subset = rhs %pin% "Zona=Zona_Sul")
Iluminacao_Sim <- subset(crimes_rulez, subset = rhs %pin% "Iluminacao=Sim")
Ocorrencia_Atendida_15_Minutos_Sim <- subset(crimes_rulez, subset = rhs %pin% "Ocorrencia_Atendida_15_Minutos=Sim")
Policiamento_Ostensivo <- subset(crimes_rulez, subset = rhs %pin% "Policiamento_Ostensivo=Sim")
Regras Específicas
inspect(Zona_Sul[1:4])
inspect(Iluminacao_Sim[1:4])
inspect(Ocorrencia_Atendida_15_Minutos_Sim[1:4])
inspect(Policiamento_Ostensivo[1:4])
Mais regras para exportação
crimes_rulez_2 <- apriori(crimes, parameter = list(minlen=4,maxlen=20, supp=0.4, conf=0.90))
Criando um objeto para dar saída nas informações
out <- capture.output(inspect(crimes_rulez_2))
Arquivo de saída para as regras
cat("Regras", out, file="regras.txt", sep="n", append=TRUE)
library(arulesViz)
options(repr.plot.width=10, repr.plot.height=6)
plot(Zona_Sul, method="graph", control=list(type="items"))