domingo, 15 de fevereiro de 2015

A mineração de padrões é um dos mais importantes conceitos em data mining. Ela é a base para muitos os princípios e tarefas amplamente utilizados, por isso frequentemente é o tema abordado no início dos estudos em mineração de dados. Antes da programação propriamente dita, é interessante entendermos alguns conceitos que nos ajudarão a desenvolver melhor a tarefa de mineração.

Um padrão pode ser entendido como um comportamento particular dos dados, uma forma específica que possa ser de interesse do negócio, embora em um primeiro momento isto ainda não seja conhecido. Para começarmos, imagine que você possua uma base de dados contendo informações sobre transações de um e-commerce (cada transação pode ser uma nota fiscal) onde os clientes compram DVD, GELADEIRA, LIVRO e CELULAR. Utilizando a terminologia mais comum, vamos chamar cada conjunto de items de itemset.

Com o R, vamos criar nosso conjunto de transações. Teremos um data frame com 100 transações de cada compra no e-commerce, onde a função rbinom() para gerar aleatoriamente os itemsets.

 #Para criar um dataset de teste  
 t= 100  
 set.seed(2015)  
 transacoes <- data.frame(DVD = rbinom(t, 1, .7)  
            , GELADEIRA = rbinom(t, 1, .3)  
            , LIVRO = rbinom(t, 1, .9)  
            , CELULAR = rbinom(t, 1, .6)  
            )  

Dentro de todas estas 100 transações, como podemos definir quais são os itemsets mais frequentes? Antes de fazer esta pergunta, precisamos de uma outra: qual é o critério para dizer que um itemset é frequente? É justamente neste ponto que precisamos entender o conceito de suporte.

O suporte pode ser relativo ou absoluto, e nada mais é o que a quantidade de vezes que um item apareceu em cada uma das transações. Assim, um item ou itemset será frequente (frequent itemset) quando seu suporte foi superior ao que estabelecemos. Assim, um suporte de 50% nos dirá que um item será frequente se, ao menos, 50% de todas as transações contiverem este item. Entendo este conceito de suporte, podemos ir além e entender duas importantes propriedades.

- Todo subconjunto de um itemset que seja frequente também é frequente - também conhecida como propriedade apriori.
- Se dividirmos toda a base em diferentes partes, um itemset somente será frequente se ele for frequente em ao menos uma outra partição.

Agora, suponha que você tenha milhões de transações (que é o mais comum). Imagine o custo computacional que existe em explorar todas as combinações possíveis para descobrir qual é o itemset que contém todas as transações? Deste problema surgiu o conceito de maximal frequent itemsets, que nada mais é do que o itemset que contém o maior número de items possíveis.

Porém, ao definir um maximal frequent itemset, você sabe que todos os subconjuntos são frequentes, mas não tem como conhecer o suporte de cada um. Disto, surge o conceito de closed frequent itemset, com definição de que um itemset é considerado um closed itemset se não existe nenhum próximo conjunto de items máximo com o mesmo suporte.

Toda esta teoria é útil para reduzir o custo computacional para encontrar as regras de associação que nos sejam relevantes. Para ilustrá-la, vamos considerar 10 das 100 transações que geramos no R com o código acima.



Supondo que esta seja nossa base de dados inteira, na figura abaixo mostramos a construção dos conceitos que definimos a pouco, considerando que o suporte seja igual a 2.





Voltando ao R, vamos instalar e carregar a biblioteca arules para criamos nossas regras de associação.

 install.packages("arules")  
 library(arules)  

Agora, a função apriori() tem como parâmetros de entrada a matriz de transações e os parâmetros de suporte e confiança. Já definimos o conceito de suporte. A confiança nada mais é do que a frequência em que a ocorrência de um conjunto de item X implica na ocorrência do conjunto Y. Ou seja, suponhamos que o suporte de DVD seja 4. Se em 2 das 4 vezes que o DVD foi comprado o CELULAR também foi, dizemos que a confiança da regra DVD então CELULAR é de 50%.

 regras <- apriori(as.matrix(transacoes)  
          ,parameter=list(confidence=0.5,support=0.5))  
 # Para ordenar as regras  
 regras <- sort(regras,by="support")  
 # O inspect exibe as regras, neste caso ordenando pela confiança  
 inspect(sort(head(regras,10),decreasing=T, by="confidence") )  

Escolhemos um suporte e confiança de 50%. Para facilitar a visualização, podemos ordenar o conjunto de regras pelo suporte e utilizar o a função inspect() para visualizar as regras.

Para exportar os dados, é mais fácil trabalhar com um data frame. O trecho a seguir cria a variáveis regras_df com as regras, suporte, confiança e o lift.


 #Para converter o conjunto de regras em um dataframe  
 regras_df = data.frame(  
  lhs = labels(lhs(regras))$elements, #lhs -> antecedente  
  rhs = labels(rhs(regras))$elements, #rhs -> consequente  
  regras@quality) 
 
 head(regras_df,10)  
     lhs    rhs support confidence   lift  
 3    {}  {LIVRO}  0.93 0.9300000 1.0000000  
 2    {}   {DVD}  0.74 0.7400000 1.0000000  
 6   {DVD}  {LIVRO}  0.67 0.9054054 0.9735542  
 7  {LIVRO}   {DVD}  0.67 0.7204301 0.9735542  
 1    {} {CELULAR}  0.65 0.6500000 1.0000000  
 4 {CELULAR}  {LIVRO}  0.58 0.8923077 0.9594706  
 5  {LIVRO} {CELULAR}  0.58 0.6236559 0.9594706  


O código está disponível em nosso repositório no GitHub.

Um abraço e até o próximo post!


0 comentários:

Postar um comentário