You are on page 1of 59

Livia Fonseca Fracalanza

Mineração de Dados voltada para Recomendação no Âmbito de


Marketing de Relacionamento
PUC-Rio - Certificação Digital Nº 0621292/CA

Dissertação de Mestrado

Dissertação apresentada como requisito parcial para


obtenção do título de Mestre pelo Programa de Pós-
Graduação em Informática da PUC-Rio.

Orientador: Prof. Marco Antonio Casanova

Rio de Janeiro
Maio de 2009
Livia Fonseca Fracalanza

Mineração de Dados voltada para Recomendação no


Âmbito de Marketing de Relacionamento
PUC-Rio - Certificação Digital Nº 0621292/CA

Dissertação apresentada como requisito parcial para


obtenção do título de Mestre pelo Programa de Pós-
Graduação em Informática da PUC-Rio. Aprovada pela
Comissão Examinadora abaixo assinada.

Prof. Marco Antonio Casanova


Orientador
PUC-Rio

Prof Antonio Luz Furtado


PUC-Rio

Profª. Karin Koogan Breitman


PUC-Rio

Prof. José Eugenio Leal


Coordenador Setorial do Centro
Técnico Científico - PUC-Rio

Rio de Janeiro, 02 de abril de 2009.


Todos os direitos reservados. É proibida a reprodução total
ou parcial do trabalho sem autorização da universidade, da
autora e do orientador.

Livia Fonseca Fracalanza


Bacharel em Informática com ênfase em Análise de
Sistemas graduada pela Pontifícia Universidade
Católica do Rio de Janeiro em julho de 2006.
Atualmente trabalha gerenciando projetos e participa
no desenvolvimento de softwares de Business
Inteligence.

Ficha Catalográfica
PUC-Rio - Certificação Digital Nº 0621292/CA

Fracalanza, Livia Fonseca

Mineração de dados voltada para


recomendação no âmbito de marketing de
relacionamento / Livia Fonseca Fracalanza
; orientador: Marco Antonio Casanova. –
2009.
59 f. : il. (col.) ; 30 cm

Dissertação (Mestrado em
Informática)–Pontifícia Universidade
Católica do Rio de Janeiro, Rio de Janeiro,
2009.
Inclui bibliografia

1. Informática – Teses. 2. Market


basket analysis. 3. Mineração de dados. 4.
Problema do clique máximo. I. Casanova,
Marco Antonio. II. Pontifícia Universidade
Católica do Rio de Janeiro. Departamento
de Informática. III. Título.

CDD: 004
Agradecimentos

Agradeço à minha família pelo apoio de sempre, por torcerem por mim e pelo
amor incondicional.

Todos os meus amigos foram muito importantes nessa fase da minha vida, mas
em especial gostaria de agradecer ao João Rafael Peixoto Leite, amigo desde
graduação, pois sem seu incentivo, paciência e carinho, este trabalho não teria
começado e hoje o título de mestre ainda seria um sonho.

Agradeço ao meu orientador, Marco Antonio Casanova, por entender o quão


difícil é estar no mercado de trabalho louco e acelerado e ao mesmo tempo
decidir fazer mestrado. Obrigada por ter acreditado na minha capacidade, pela
paciência e pela orientação.
PUC-Rio - Certificação Digital Nº 0621292/CA

Por último, porém não menos importante, obrigada a todos os meus


companheiros da Stone Age Tech pelo apoio moral e incentivo.
Resumo
Fracalanza, Livia Fonseca; Casanova, Marco Antonio; Mineração de
Dados voltada para Recomendação no Âmbito de Marketing de
Relacionamento. Rio de Janeiro, 2009. 59p. Dissertação de Mestrado -
Departamento de Informática, Pontifícia Universidade Católica do Rio de
Janeiro.

Cross-selling é uma estratégia de vendas de produtos baseada em uma análise


das compras passadas de um cliente ou nas compras passadas de outros clientes
com o mesmo perfil. O algoritmo mais conhecido para análise da cesta de
compras de um cliente é conhecido por market basket analysis. Este trabalho
aborda a descoberta de padrões seqüenciais em grandes bases de dados e tem por
objetivo apresentar um algoritmo eficiente que transforma o problema da cesta
de compras em um problema de clique máximo. Primeiramente, os dados de
entrada são transformados em um grafo e o problema da descoberta do clique
PUC-Rio - Certificação Digital Nº 0621292/CA

máximo é resolvido revelando as relações mais recorrentes entre os itens em


questão. Os experimentos apresentados na dissertação demonstram a eficiência
do algoritmo em grandes volumes de dados.

Palavras-chave
1. Informática – Teses; 2. Market basket analysis, 3. mineração de dados 4.
problema do clique máximo
Abstract
Fracalanza, Livia Fonseca; Casanova, Marco Antonio;.
Recommendation based on Data Mining for Relationship Marketing.
Rio de Janeiro, 2009. 59p. MSc. Dissertation - Departamento de
Informática, Pontifícia Universidade Católica do Rio de Janeiro.

Cross-selling is a strategy to recommend products to customers based on their


past purchases or the purchases of other customers with the same profile. The
best known algorithm for the analysis of a client shopping basket is known in the
literature as market basket analysis. This dissertation discusses the discovery of
sequential patterns in large databases and aims at implementing an efficient
algorithm that transforms the shopping cart problem into a maximum clique
problem. First, input data is transformed into a graph and maximum cliques are
detected to discover the most frequent relationship between the items on the
PUC-Rio - Certificação Digital Nº 0621292/CA

transaction. The dissertation also includes experiments that evaluate the


efficiency of the algorithm for large data volumes.

Keywords
1. information science – thesis; 2. Market basket analysis; 3. data mining; 4.
maximum clique problem
Sumário

1 Introdução 10
1.1. Motivação 11
1.2. Objetivos 11
1.3. Trabalhos Relacionados 12
1.4. Organização do Trabalho 13

2 Mineração de Dados 15
2.1. Processo de Busca de Conhecimento 15
2.2. Tipos de Predição 17
2.2.1. Classificação 17
2.2.2. Segmentação 18
2.2.3. Regressão 18
PUC-Rio - Certificação Digital Nº 0621292/CA

2.2.4. Associação 18
2.3. Técnicas de Mineração de Dados 18
2.3.1. Algoritmo Genético 19
2.3.2. Redes Neurais 19
2.3.3. Árvores de Decisão 19
2.3.4. Regras de Associação 19
2.3.5. Análise de Vizinhança 20
2.4. Aplicações 20

3 Market Basket Analysis - MBA 21


3.1. Marketing de Relacionamento 22
3.2. Regras de Associação 23
3.3. Algoritmos de MBA 24
3.3.1. Artificial Immune System 25
3.3.2. Set-oriented Mining 25
3.3.3. Algoritmo Apriori 26
3.4. Implementação baseada em Grafo 27
3.4.1. Conceitos de Grafos 27
3.4.2. Montando a Matriz de Adjacências 29
3.4.3. Buscando a Clique de Tamanho Máximo 29

4 Testes e Resultados 31
4.1. Descrição do Ambiente de Testes – Protótipo 31
4.2. Testes 34

5 Conclusão e Trabalhos Futuros 40


5.1. Conclusões 40
5.2. Trabalhos Futuros 41

6 Referências 43

7 APÊNDICE A – Código da Implementação 45


PUC-Rio - Certificação Digital Nº 0621292/CA
Lista de figuras

Figura 1 Etapas para descoberta de conhecimento 16


Figura 2 Iteratividade entre Funcionalidades, Técnicas e Algoritmos de Mineração de
Dados 17
Figura 3 Exemplo de iteração do algoritmo AIS 25
Figura 4 Exemplo de iteração do algoritmo SETM 26
Figura 5 Exemplo de iteração do algoritmo Apriori 27
Figura 6 Exemplo de clique máxima 28
Figura 7 Protótipo: escolha do conector ODBC 32
Figura 8 Protótipo: Autenticação no ODBC 32
Figura 9 Protótipo: Escolha da base de dados 33
PUC-Rio - Certificação Digital Nº 0621292/CA

Figura 10 Protótipo: Inclusão de filtro na consulta 33


Figura 11 Protótipo: Exibição das informações relevantes 34
1 Introdução

1
Introdução

A digitalização da sociedade juntamente com a difusão da Internet e a


globalização trazem a necessidade de maior agilidade e rapidez para os processos de
negócio, principalmente no que se refere aos sistemas de tomada de decisão. Além
disso, podemos observar um aumento significante na quantidade de dados armazenados
pelas empresas, pois as informações assumiram um papel indispensável e vital para a
sobrevivência das empresas no mercado.

Entretanto, é necessária a existência de processos que possibilitem extrair destes


dados o conhecimento necessário para a gestão e a tomada de decisões, caso contrário
são apenas um conjunto de dados que não trazem nenhum benefício para a corporação.
Nesse sentido, surgem os sistemas do tipo data warehouse – ou armazém de dados –
PUC-Rio - Certificação Digital Nº 0621292/CA

para auxiliar no armazenamento dos dados e facilitar a análise para a tomada de


decisões. Estes passam a ser realidade, principalmente, nas grandes corporações.

Data warehouse é um termo amplamente utilizado nos dias de hoje para definir
um ambiente de sistemas de informação que tem por objetivo auxiliar os usuários de
níveis gerenciais. É uma “fotografia” dos dados em determinando período de tempo,
integrados por uma combinação de tecnologias e orientados a assunto. Composto por
uma coleção de tecnologias de suporte a análise de decisão, tem por responsabilidade o
armazenamento dos dados que ao longo do tempo se proliferaram. A análise dos dados
contidos em uma data warehouse é realizada por vários tipos de ferramentas, sendo
OLAP (On Line Analytical Processing) a mais simples e mais utilizada.

A tecnologia em questão compreende Sistemas Gerenciadores de Banco de


Dados com visões relacionais ou multidimensionais dos dados, facilidades para acesso
dos dados, arquitetura cliente-servidor, interfaces gráficas de usuários, dentre outras.

Com o aumento do volume de dados nas empresas e a diminuição do tempo para


resposta às mudanças, o uso da data warehouse se fez necessário para atender à
necessidade de integração dos sistemas voltados para o nível gerencial com dados que
nunca ou raramente são alterados. Os sistemas transacionais do nível operacional lidam
com os dados “ativos” espelhando as operações de negócio da empresa. Os dados
estáveis da data warehouse ajudam a compor séries históricas, apoiando o trabalho de
análise ao longo de determinado período.
1 Introdução 11

Geralmente, os dados armazenados em uma data warehouse são apenas


consultados, sendo agregados para fins de estudo e tomadas de decisão. As aplicações
que utilizam esses dados são classificadas como sistemas de informação gerencial,
sistemas de informação para executivos ou sistemas de suporte à decisão. Além disso, é
possível a manipulação de grandes quantidades de dados armazenadas a fim de
encontrar padrões implícitos entre os mesmos, possibilitando a previsão de
informações/situações futuras.

1.1.
Motivação

O mercado de business intelligence, ao qual as data warehouse pertencem, está


em grande e constante expansão fomentando a pesquisa e desenvolvimento de
ferramentas melhores e mais sofisticadas.

Cabe ressaltar que a chave do processo de busca de conhecimento é a mineração


de dados (ou data mining), entendida como tarefas e técnicas dedicadas à exploração de
grandes quantidades de dados à procura de regras de associação, relacionamentos
PUC-Rio - Certificação Digital Nº 0621292/CA

entre variáveis, classificação de itens, dentre outras atividades.

Do ponto de vista de negócio, os padrões que, eventualmente, estão escondidos


entre uma grande quantidade de dados podem ser extremamente valiosos e úteis. Nas
empresas, cada vez mais os diferentes setores procuram por ferramentas que possam
auxiliá-los a maximizar os ganhos e minimizar as perdas.

Por exemplo, a aplicação prática de mineração de dados no cenário de CRM


(Customer Relationship Management) é bastante interessante, uma vez que as
empresas estão aumentando o foco no cliente, conhecendo-o individualmente com o
intuito de oferecer-lhe mais produtos, cada vez mais adequados e até mesmo
personalizados.

Dentro deste contexto, a eficiência e eficácia da adesão de novos clientes e da


fidelidade dos antigos dependem do sucesso do processo de descobrimento de padrões,
incluindo a mineração de dados.

1.2.
Objetivos

Este trabalho tem por objetivo estudar e propor melhorias em algoritmos de


recomendação de produtos com o intuito de auxiliar na descoberta de padrões de
consumo e, assim, melhorar a relação das empresas com seus clientes.

Para atingir o objetivo central, duas etapas serão seguidas:


1 Introdução 12

 Estudar o processo de descoberta de conhecimento em data warehouses;


 Executar testes com grandes volumes de dados.

1.3.
Trabalhos Relacionados

Para encaminhar o problema de recomendação de produtos, inúmeras soluções


têm sido propostas. Esta seção apresenta brevemente alguns trabalhos relacionados
que serviram de inspiração e fontes de informação para o desenvolvimento desta e
dissertação.

Em [11] são discutidas as oportunidades de se construir um melhor


relacionamento com clientes, aumentando a frequência das compras e
consequentemente aumentando o lucro. Para que seja possível identificar padrões e
possibilitar a recomendação de produtos e serviços é de suma importância para as
operações de venda manter o histórico das transações com o máximo de detalhes
possível, como quantidade, valores, tipo de pagamento, as respostas aos estímulos de
marketing, etc. Suas análises ficam facilitadas com a utilização de técnicas de mineração
PUC-Rio - Certificação Digital Nº 0621292/CA

de dados, como regras de associação, que buscam automaticamente padrões nos


dados, gerando modelos de comportamento. Neste trabalho, cada cliente é classificado
com uma pontuação (score) que representa a probabilidade de resposta positiva ao
estímulo posto no modelo, auxiliando o profissional de marketing a focar mais
precisamente no público alvo de suas campanhas.

Santos [12] descreve a aplicação das técnicas de mineração de dados na gestão


de relacionamento com clientes. Como estudo de caso, foi apresentado um sistema
desenvolvido com o intuito de apoiar as decisões na área de vendas, auxiliando na
recomendação de produtos que viessem a ser de interesse do consumidor em questão.
O usuário escolhe um ou mais produtos que serão confrontados com um ou mais
produtos também à escolha do usuário e, assim, o sistema tenta determinar regras de
associação entre os itens selecionados. Ao concluir, o autor comenta que as regras de
associação são uma técnica de mineração de dados de simples implementação, mas
fornece conhecimentos importantes sobre os hábitos dos clientes.

Adomavicius e Tuzhilin [14] fazem uma pesquisa sobre o estado da arte de


sistemas de recomendação e chegam à conclusão de que, mesmo tendo avançado
muito nessa última década, esse tipo de sistema ainda apresentam limitações que
precisam ser superadas. Dentro desse contexto, ações como melhoria na modelagem
dos itens e usuários, incorporação de informação contextual no processo de
recomendação suporte à sugestões por multicritérios e a criação de um sistema mais
flexível e menos invasivo são apontadas como sendo as principais.
1 Introdução 13

Burke [15] define três tipos de sistemas de recomendação: (i) sistemas


colaborativos são aqueles em que as recomendações são baseadas nas preferências
dos outros usuários; (ii) sistemas baseados no conteúdo são aqueles que classificam as
informações baseados em aprendizado de máquina e sugerem baseados nas escolhas
anteriores do usuário; (iii) sistemas baseados no conhecimento (knowledge-based
systems) dos usuários oferecem produtos que atendem aos requisitos do usuário, como
cidade, preferências por comida, entre outros. Além disso, é esclarecido que sistemas de
recomendação precisam ser inicializados com grandes quantidades de dados, pois caso
contrário as previsões e sugestões não serão eficientes como esperado. Com isso,
confronta-se o problema de que, quando há muitos usuários com hábitos conhecidos, o
sistema não é tão útil; mas, se estiver com uma grande quantidade de itens avaliados,
pode não ser preciso para um usuário em particular. Sistemas baseados no conteúdo
apresentam um problema parecido: bons classificadores “aprendem” depois que muitos
itens foram avaliados e alguns procuram resolver esse problema fazendo uso de
algoritmos classificadores baseados na similaridade com os dados da vizinhança,
causando a limitação de sugerir itens que sejam similares aos itens previamente
avaliados. Nessa linha, e baseado em uma série de exemplos de protótipos, o autor
PUC-Rio - Certificação Digital Nº 0621292/CA

defende os sistemas de recomendação baseados em conhecimento como sendo mais


valiosos que os outros, pois sua recomendação não depende das avaliações de usuários
e suas tomadas de decisão são independentes do gosto do mesmo. Mas, além disso,
discute em cima de um de seus exemplos (FindMe) que sistemas híbridos de
recomendação podem ser criados combinando diferentes técnicas.

Middleton et al. [16] defendem que os sistemas de recomendação podem ajudar


na melhoria das buscas na Internet, onde existe uma grande quantidade de páginas com
dados não-estruturados e onde, neste cenário, as ferramentas de busca são efetivas
apenas quando as páginas atendem às chaves das consultas explicitamente. No
decorrer do artigo, os autores descrevem o sistema Quickstep, criado utilizando
ontologias durante o processo de profiling e, baseados nos testes, concluem que os
resultados dos usuários que usaram o sistema com ontologias foram mais precisos,
recomendando itens que atendiam mais aos interesses dos usuários e que não eram
diretamente sugeridos.

1.4.
Organização do Trabalho

Este trabalho está organizado da seguinte forma. O Capitulo 2 apresenta o


conceito de Mineração de Dados, cenário no qual esta pesquisa se enquadra. O Capitulo
3 detalha melhor a técnica Market Basket Analysis, foco deste estudo. O Capitulo 4
descreve o protótipo criado para testar a técnica de Market Basket Analysis e apresenta
1 Introdução 14

os resultados dos testes. Por fim, o Capítulo 5 apresenta as conclusões e indica algumas
linhas de pesquisa a serem desenvolvidas a partir do conteúdo exposto neste trabalho.
PUC-Rio - Certificação Digital Nº 0621292/CA
2 Mineração de Dados

2
Mineração de Dados

A mineração de dados, ou data mining, é uma das principais etapas do processo


de busca de conhecimento. Este conceito é utilizado para identificar técnicas avançadas
de análise dos dados, que podem ou não utilizar a inteligência artificial, refinando os
dados em busca de padrões nos dados através de um modelo do mundo real. Essas
técnicas são apenas uma parte do processo de busca de conhecimento dentro de um
banco de dados, em que o objetivo maior é obter regras e padrões que se aplicam aos
dados.

Normalmente, as técnicas de mineração de dados são aplicadas em dados


armazenados em uma data warehouse (DW) ou em um data mart, mas também é
PUC-Rio - Certificação Digital Nº 0621292/CA

possível aplicá-las em dados operacionais. Os resultados da mineração de dados podem


ser usados em tomadas de decisão, em gerenciamento de informações, controle de
processo, dentre outros. Sua aplicação pode ser em um processo de verificação onde o
usuário tenta provar sua hipótese acerca da relação entre os dados ou como um
processo de descoberta de padrões, fazendo uso de técnicas como redes neurais,
algoritmos genéticos, regras de associação, árvores de decisão, regressão, entre outros.

2.1.
Processo de Busca de Conhecimento (KDD)

O avanço da tecnologia tanto no âmbito do hardware quanto do software permitiu


que a capacidade de armazenamento e processamento de dados crescesse em
velocidade muito grande. A análise manual ou semi-automática de grandes volumes de
dados tornou-se impraticável, prejudicando a tomada de decisão. Nesse sentido, a
aplicação de métodos que facilitem este processo se faz muito importante nos dias de
hoje.

O processo de busca de conhecimento em banco de dados também é conhecido


como KDD – Knowledge Discovery and Data Mining, cujo objetivo segundo Fayyad et. al
[4] “(...) é a extração de conhecimento de alto nível a partir de dados de baixo nível
disponíveis em grandes bancos de dados (...) processo não trivial de identificação, a
partir de dados, de padrões que sejam válidos, novos, potencialmente úteis e
compreensíveis (...)”. Em outras palavras, o KDD é o processo de extração de
conhecimento de grandes bases de dados, convencionais ou não.
2 Mineração de Dados 16

Fayyad et. al [4] divide o processo de KDD em seis passos:

i. Preparação dos Dados: consiste em incluir o conhecimento relevante para a


aplicação além de definir quais as metas que o processo precisa atingir.

ii. Limpeza dos Dados: consiste em retirar os dados que possam distorcer a
análise. Assim, utiliza estratégias para remover ruídos, tratar atributos perdidos e
até mesmo métodos de transformação para diminuir o número de variáveis
envolvidas no processo, visando com isto melhorar o desempenho do algoritmo
de análise.

iii. Seleção de Dados: consiste em escolher sobre qual conjunto ou subconjunto de


dados em que o processo será aplicado.

iv. Data Mining: consiste em decidir qual tarefa de data mining será aplicada para
atingir os objetivos do processo e qual a melhor técnica a ser utilizada (ver seção
3).

v. Incorporação do conhecimento anterior: consiste em interpretar o modelo


PUC-Rio - Certificação Digital Nº 0621292/CA

descoberto a fim de verificar sua acuracidade em busca de melhorias,


possibilitando o retorno para qualquer etapa anterior do processo, retirando
padrões redundantes ou irrelevantes.

vi. Interpretação dos resultados: neste ponto o resultado obtido é incorporado ao


sistema possibilitando a tomada de ações baseadas no conhecimento ou
documentando-os e relatando-o às partes interessadas.

Em particular, o passo da mineração de dados utiliza técnicas de inteligência


artificial que procuram relações de similaridade ou discordância entre dados com o
objetivo de encontrar, automaticamente, padrões, anomalias e regras, focando em
transformar dados, aparentemente ocultos, em informações úteis para a tomada de
decisão ou avaliação de resultados.

Figura 1 Etapas para busca de conhecimento


2 Mineração de Dados 17

2.2.
Tipos de Predição

Por tipos de predição entende-se os tipos de relacionamento que estabelecemos


entre os dados para a obtenção de conhecimento. Sabendo a que resultado se deseja
chegar, é fácil identificar a tarefa de mineração que mais auxiliará o processo de busca
de uma solução para o problema. Para atender aos objetivos e gerar resultados
esperados, há uma coleção de técnicas que podem ser utilizadas; cada técnica possui
ainda uma gama de algoritmos que irão, efetivamente, manipular os dados. A Figura 2 a
seguir, extraída de [20], ilustra a iteratividade entre funcionalidades, técnicas e
algoritmos de mineração de dados.

O resto desta seção discute tipos de predição de dados.


PUC-Rio - Certificação Digital Nº 0621292/CA

Figura 2 Iteratividade entre Funcionalidades, Técnicas e Algoritmos de


Mineração de Dados

2.2.1.
Classificação

Categorizar os clientes de acordo com seu perfil de compras é um exemplo de


tarefa de classificação. Um modelo de classificação é criado e os atributos dos registros
(no caso do exemplo acima, clientes) são analisados de acordo com as condições e
2 Mineração de Dados 18

características das classes pré-determinadas pelo modelo. Caso esses atributos casem,
o registro é então classificado na classe em que melhor se encaixa.

2.2.2.
Segmentação

Essa tarefa é mais conhecida como clustering e se diferencia da classificação


porque não pressupõe a existência de classes pré-definidas. Os registros são agrupados
de acordo com a semelhança nos seus atributos, segmentando-os em clusters
(subgrupos homogêneos) baseando-se no princípio de que os registros classificados em
um grupo devem ser homogêneos entre si, e que os grupos devem ser heterogêneos
entre si.

2.2.3.
Regressão

Estimar um acontecimento ou um padrão não é uma tarefa simples. Esse é o


objetivo da regressão: prever padrões para uma variável de valor contínuo, com base
PUC-Rio - Certificação Digital Nº 0621292/CA

nos outros atributos disponíveis e nas outras ocorrências disponíveis para análise.

2.2.4.
Associação

Através da associação é possível identificar transações que sempre ocorrem em


conjunto. Na literatura também é conhecida como grupos de afinidade ou análise de
cesta. O exemplo clássico da literatura é o MBA (Market Basket Analysis), que busca
encontrar padrões nos produtos em um carrinho de compras através de regras de
associação. Esse estudo auxilia as lojas a encontrar a melhor maneira de organizar seus
produtos, de modo que a disposição deles nas prateleiras estimule as compras dos
clientes.

2.3.
Técnicas de Mineração de Dados

As técnicas de mineração de dados são os fundamentos computacionais que


possibilitam a construção dos algoritmos que realizarão a busca por padrões nos dados.
Diversas técnicas podem ser utilizadas para atender a uma tarefa de mineração de
dados. Entretanto, cada técnica possui características específicas e é necessário ter o
conhecimento do funcionamento e do objetivo das mesmas para interpretar os
resultados obtidos.

No resto desta seção listamos algumas técnicas de mineração de dados.


2 Mineração de Dados 19

2.3.1.
Algoritmo Genético

Simulando o processo natural da evolução, os algoritmos genéticos (AG’s) têm por


objetivo realizar a busca e a otimização da descoberta de padrões. Diferentemente dos
métodos convencionais de mesmo objetivo, os AG’s trabalham simultaneamente em
conjuntos de soluções diferentes, realizando pesquisas adaptativas nos dados [20],
modelando uma solução para um problema específico em estruturas de dados que são
semelhantes a um cromossomo. Operadores são aplicados recombinando essas
estruturas, gerando assim novas combinações de regras de associação.

Essa técnica é utilizada na classificação e na segmentação de dados, formulando


hipóteses sobre a dependência dos atributos dos dados; com operadores de mutação e
cruzamento desenvolvem várias mutações para a solução do problema. Ao longo do
tempo, o algoritmo tende a “aprender” e a se aperfeiçoar, de maneira que somente as
soluções com maior poder de acerto na previsão são aceitas.

2.3.2.
PUC-Rio - Certificação Digital Nº 0621292/CA

Redes Neurais

A técnica de Redes Neurais é bastante utilizada em tarefas de classificação,


regressão e segmentação. Os dados são trabalhados com base no funcionamento do
cérebro humano, aprendendo a tomar decisões baseadas nas experiências anteriores –
nas instâncias anteriores dos dados. Os neurônios do cérebro são representados por
nodos que estão conectados em outros nodos por sinapses, formando uma rede de
processamento. Os valores das entradas são multiplicados nos neurônios pelos pesos
de suas sinapses, conforme vão caminhando na rede. Ao final, temos a classificação ou
a previsão da entrada.

2.3.3.
Árvores de Decisão

As árvores de decisão têm como objetivo principal dividir as instâncias em classes.


Cada nó da árvore testa o domínio de uma variável da entrada e o redireciona para o nó
seguinte. Cada sub-árvore representa o resultado de um teste e a folha é a classificação
que aquele registro recebeu. Ao final, cada nó terminal terá os registros da entrada que
se adéquam às regras regidas por esse nó, representando assim, uma classe.

2.3.4.
Regras de Associação

Basicamente, as regras de associação são definidas por uma correlação


estatística entre alguns atributos da entrada com o objetivo de descobrir relações que
2 Mineração de Dados 20

ocorrem em comum dentro de um conjunto de dados. Cada registro é visto como uma
transação e cada variável como um item dessa transação, deixando subentendido que a
presença de um item implica necessariamente na presença de outro na mesma
transação. Esse conceito será mais detalhado na Seção 3.1

2.3.5.
Análise de Vizinhança

Através de uma função definida para determinar a “distância“ entre duas


instâncias, ou seja, de uma função para identificar um conjunto de registros que estão
próximos por determinada característica, essa técnica é empregada em análise de
prognósticos e não para descoberta de conhecimento. Não é muito explorada na
literatura.

2.4.
Aplicações

Além da aplicação no campo dos profissionais de marketing, auxiliando na busca


PUC-Rio - Certificação Digital Nº 0621292/CA

de padrões para melhorar o processo de recomendação e alavancar as vendas, as


técnicas de data mining podem ser utilizadas em: (i) redes de telecomunicações, para
evitar fraudes em ligações pré- ou pós-pagas, detecção de falhas, dimensionamento de
sistemas; (ii) saneamento básico, detectando fraudes em ligações de água; (iii)
monitoramento ambiental, para prevenção de desequilíbrios; (iv) na indústria, prevendo a
demanda, planejando a produção; (v) na educação, auxiliando na identificação da
evasão escolar; (vi) na medicina, atuando no diagnóstico e prevenção de doenças,
fraudes de plano em planos de saúde; (vii) no comércio, definindo o perfil do consumidor,
segmentando o mercado, sugestão de produtos, entre vários outros campos de atuação;
(viii) no âmbito financeiro, ajudando no combate as fraudes de cartão de crédito, análise
de investimentos e de crédito.
2 Mineração de Dados

3
Market Basket Analysis - MBA

Market basket analysis (MBA) ou, em português, análise da cesta de compras, é


uma técnica de data mining que faz uso de regras de associação para identificar os
hábitos de compra dos clientes, fornecendo uma visão da combinação de produtos
dentro das cestas de compras dos clientes analisados. Conhecer o perfil de compra do
público-alvo é muito importante para aumentar o potencial de recomendação, ajudando a
melhorar as vendas.

O termo cesta, normalmente, se aplica a uma única ordem de compra. No entanto,


a análise admite outras variações como, por exemplo, todas as compras de um
determinado cliente. O caso clássico citado na literatura é o da rede de supermercados
americana, WalMart. Foi descoberta a relação de compra entre uma marca de fraudas e
PUC-Rio - Certificação Digital Nº 0621292/CA

uma marca de cerveja, quando as compras eram realizadas por homens nas sextas-
feiras ao fim do dia. A análise da relação mostrou que as esposas pediam para os
maridos trazer as fraudas para o fim-de-semana quando saíssem do trabalho e eles
aproveitavam e levavam a cerveja para relaxar durante os dois dias sem trabalho. Tendo
esse precioso conhecimento em mãos, o gerente decidiu colocar as fraudas perto das
cervejas e com isso as vendas aumentaram ainda mais, pois os homens que não
compravam cerveja passaram a comprar.

A entrada de dados para essa técnica é um conjunto de transações


correspondendo a compras de vários clientes. As transações são representadas em uma
tabela onde cada linha corresponde a uma venda e cada coluna a um produto adquirido.
A cesta de compras de um cliente é composta por itens que foram adquiridos na mesma
compra, ignorando-se a quantidade e o preço de cada item.

Apesar de a nomenclatura market basket analysis evocar uma imagem de


carrinhos de compras e supermercados, cabe mencionar que existem outras áreas em
que essa abordagem pode ser empregada como, por exemplo, análise de compras em
cartão de crédito, análise de padrões em chamadas telefônicas, análise de compra de
serviço telefônico, dentre outras aplicações.
3 Market Basket Analysis – MBA 22

3.1.
Marketing de Relacionamento

No varejo, a maior parte das compras é realizada por impulso. A técnica de Market
Basket Analysis dá pistas a cerca do que um cliente poderia ter comprado se alguma
sugestão interessante lhe fosse feita.

Em um primeiro momento, pode-se considerar que esta técnica tem aplicações na


reorganização da localização dos itens dentro de uma loja, bem como promoções para
estimular a compra. Entretanto, é possível também comparar resultados entre filiais ou
entre grupos de clientes em lugares demográficos distintos ou analisar as compras em
função da época do ano. Assim, caso se observe que uma regra vale em uma loja, mas
não prevalece em nenhuma outra, é porque há algo de interessante com esta que a
torna tão diferente das outras. Investigar essas diferenças pode render algumas
sugestões úteis para melhorar as vendas da companhia.

Marketing de relacionamento pode ser definido como “uma estratégia de


marketing que visa construir uma relação duradoura entre cliente e fornecedor, baseada
PUC-Rio - Certificação Digital Nº 0621292/CA

em confiança, colaboração, compromisso, parceria, investimentos e benefícios mútuos”


[20] onde os clientes importantes precisam receber atenção contínua. É importante ter
uma relação duradoura e de confiança com os consumidores, conhecendo-os a fim de
cativá-los ainda mais, estimulando o consumo de mais e novos produtos e serviços com
o objetivo da organização conquistar uma fatia maior do mercado.

Atualmente, as empresas estão se conscientizando da necessidade e da


importância de intensificar o foco no marketing de relacionamento para crescer e se
manter no mercado [21]. Administrar o relacionamento com o cliente ajuda a empresa a
adquirir vantagem competitiva frente à concorrência. Apesar de muito investimento ainda
ser feito na conquista de novos clientes, já existe uma percepção maior de que é
possível melhorar a rentabilidade vendendo produtos e serviços para os clientes atuais.

O termo cross-selling é traduzido na literatura como “venda casada de produtos” e


tem por definição a prática de vender produtos ou serviços adicionais para um cliente já
conquistado, objetivando o aumento das vendas. Nesse contexto, a técnica de market
basket analysis baseia-se na chave cliente-item para identificar a cesta de compras com
os N itens que aparecem juntos mais frequentemente em transações. A partir do
conhecimento das cestas mais frequentes, torna-se fácil partir para o cross-selling,
sugerindo itens que possam ser de interesse de um cliente com determinado perfil de
compra identificado.
3 Market Basket Analysis – MBA 23

Em resumo, para auxiliar nas tomadas de decisão em aplicações de marketing, o


MBA é uma técnica poderosa que suporta a implementação de estratégias de cross-
seling.

3.2.
Regras de Associação

A análise de compras e registros de produtos tipicamente usa regras de


associação representando os padrões de relacionamento encontrados entre os itens de
dados do conjunto analisado. Em bases de dados onde os registros são transações,
estas regras são conhecidas como regras de associação transacionais, enquanto no
caso de bases de dados onde os registros representam clientes, contas, produtos,
serviços e outros, as mesmas envolvem múltiplos atributos e, por isso, são chamadas de
regras de associação multidimensional.

No âmbito da venda casada de produtos, ou cross-selling, as regras de


associação permitem que uma loja possa recomendar o produto B para um cliente
comprando o produto A, uma vez que ela conhece a regra, por exemplo, de que 30%
PUC-Rio - Certificação Digital Nº 0621292/CA

dos seus clientes que compram A também compram B. Assim, o cliente é incentivado a
comprar mais produtos, que eventualmente possam interessá-lo, baseado em
características de consumo de compras anteriores no sistema,. Assim, não só a
quantidade de vendas é maximizada, mas também a quantidade de vendas de
determinado produto.

Regras de associação foram introduzidas em [25] da seguinte forma. Sejam I = {i1,

i2, ..., im} um conjunto de m itens distintos e D uma base de dados formada por um
conjunto de transações, onde cada transação T é composta por um conjunto de itens tal
que T ⊆ I. Uma regra de associação é uma expressão do tipo X → Y onde X ⊆ I, Y ⊆ I, X
≠ Ø, Y ≠ Ø e X ∩ Y = Ø, ou seja, tanto o antecedente (X), quanto o conseqüente (Y) de
uma regra de associação podem ser formados por conjuntos contendo um ou mais itens,
mas não podem ser vazios e são conjuntos independentes já que não possuem itens em
comum. Por exemplo:

{Cerveja, Faldas} → {Leite}


{Cerveja, Leite} → {Fraldas}
{Fraldas, Leite} → {Cerveja}
{Cerveja} → {Fraldas, Leite}
{Leite} → {Cerveja, Fraldas}
{Fraldas} → {Cerveja, Leite}
3 Market Basket Analysis – MBA 24

A importância de uma regra de associação pode ser medida em termos de suporte


e confiança. O suporte de uma regra determina com qual frequência uma regra é
aplicada a um conjunto de dados, ou seja, a probabilidade do primeiro termo da
implicação ser verdade. Já a confiança de uma regra determina o quão frequente os
itens em Y aparecem nas transações que contém X. No exemplo anterior, a
probabilidade de um cliente comprar cerveja e fraldas (ou seja, o termo X ser verdadeiro)
é referida como o suporte, enquanto a probabilidade condicional de um cliente comprar
leite, dado que comprou cerveja e fralda, é referida como a confiança.

O problema da mineração de regras de associação consiste em encontrar todas


as regras de associação que possuam suporte e confiança maiores ou iguais,
respectivamente, a um suporte mínimo (SupMin) e uma confiança mínima (ConfMin),
especificados pelo usuário.

De fato, por muito tempo, a busca por regras de associação foi de interesse
exclusivo de aplicações que lidassem com informação de cestos de compra (market
baskets), o que levou esta técnica a ser comumente chamada de market basket analysis
(MBA).
PUC-Rio - Certificação Digital Nº 0621292/CA

No entanto, podemos ver que regras de associação podem ser extraídas de


qualquer base de dados onde existam relacionamentos implícitos entre os diferentes
atributos. A utilidade destas regras não está somente na geração de novo conhecimento,
mas também na confirmação de regras de negócio que são utilizadas, mas que nunca
foram comprovadas. Sendo assim, regras de associação aplicam-se a diversas áreas de
negócio como, por exemplo, estudo dos acessos a computadores, busca de novos
clientes, recenseamento de população e análise de informação médica, dentre outros.

A descoberta de padrões através da análise das regras de associação é um


importante para suporte à tomada de decisão. Com essas informações, um gestor pode
identificar novas oportunidades de negócio, conhecer melhor seus clientes e seus perfis
de compra, identificar produtos que influenciam na venda de outros, além de diversas
outras informações que podem aumentar sua competitividade no mercado.

3.3.
Algoritmos de MBA

Os primeiros algoritmos a serem utilizados na descoberta de regras de associação


foram o artificial immune system (AIS) [23][24] e o set-oriented mining (SETM) [22]. Na
maioria dos estudos mais recentes o algoritmo Apriori tem sido bastante utilizado, bem
como suas variações. Nas subseções a seguir alguns desses algoritmos são explorados.
3 Market Basket Analysis – MBA 25

3.3.1.
Artificial Immune System

A técnica utilizada pelo artificial immune system (AIS) gera e conta conjuntos de
itens à medida que são lidas as transações da base de dados. Para cada transação,
determinam-se quais dos maiores conjuntos encontrados na transação anterior também
se encontram na transação corrente e novos conjuntos de itens são gerados
estendendo-se esses conjuntos com itens deste registro. A desvantagem é que este
método gera e conta desnecessariamente conjuntos de itens que são considerados
pequenos. A figura a seguir ilustra o seu funcionamento.
PUC-Rio - Certificação Digital Nº 0621292/CA

Figura 3 Exemplo de iteração do algoritmo AIS

A primeira passagem do algoritmo na base de dados faz a busca por cestas de


apenas um item contando quantas vezes estes se repetem nas transações, ignorando
aqueles que ocorrem apenas uma vez. A segunda passagem na base busca por cestas
com dois itens, contando quantas vezes estes aparecem juntos nos registros varridos.
Neste exemplo, a última passada encontra cestas de três itens, que são a maior cesta
possível com frequencia maior que um. Assim, o algoritmo tem como solução o conjunto
{2,3,5}.

3.3.2.
Set-oriented Mining

Assim como o AIS, o set-oriented mining (SETM) gera os conjuntos de itens


candidatos no momento em que está passando pelas transações da base de dados.
Entretanto, a contagem só é realizada no final da varredura da base. O identificador da
transação é guardado junto com o conjunto candidato em uma estrutura sequencial. Ao
fim da leitura de todos os registros, o tamanho do conjunto de itens mais frequente é
determinado pela agregação da estrutura sequencial. Além de ter a mesma
desvantagem do AIS, para cada conjunto candidato, existem vários valores de tamanho
calculados. A figura a seguir ilustra os passos do algoritmo.
3 Market Basket Analysis – MBA 26

Figura 4 Exemplo de iteração do algoritmo SETM

No SETM, a primeira passagem na base de dados resulta na frequencia de


ocorrência de cada item nas transações, assim como no exemplo anterior baseado no
AIS. Entretanto, a segunda varredura na base tem como resultado uma lista com as
combinações de pares de produtos onde cada combinação recebe o identificador da
transação de onde foi extraída. Assim, teremos combinações repetidas com
PUC-Rio - Certificação Digital Nº 0621292/CA

identificadores diferentes como a cesta {1,3} que neste exemplo ocorre na transação 100
e na 300. A última passagem na base revela as cestas de três itens e a solução
encontrada é aquela que aparece em mais transações. Com isso, também temos o
conjunto de itens {2,3,5} como resultado da aplicação do SETM nesse conjunto de
registros.

3.3.3.
Algoritmo Apriori

Este algoritmo foi a primeira ferramenta para descoberta de regras de associação


em bases de dados com grandes volumes. Várias modificações foram propostas para
melhorar sua eficiência e algoritmos similares foram propostos [26][27][28], introduzindo
regras mais expressivas.

Primeiramente, o algoritmo identifica os itens que fazem parte de cada uma das
transações. Em seguida, o algoritmo determina as regras de associação entre estes
itens, selecionando as associações que ocorrem com mais frequência (ou maiores) no
conjunto de transações em questão. O maior conjunto de itens candidato da passagem
anterior é levado para próxima iteração, gerando outros conjuntos com tamanho maior
que 1. Por fim, o algoritmo elimina os conjuntos gerados que tem um subconjunto que
não é o maior.

Com base nos conjuntos de itens mais frequentes as regras de associação que
atendem aos valores mínimos de suporte e confiança são geradas. Como resultado,
3 Market Basket Analysis – MBA 27

todos os conjuntos de itens frequentes são descobertos, produzindo todas as regras de


associação que respeitam esses limites.

Figura 5 Exemplo de iteração do algoritmo Apriori

Assim como nos exemplos anteriores, a primeira passada do algoritmo Apriori na


base de dados resulta na listagem da frequencia dos itens nas transações (cestas de um
item apenas). Na passada seguinte, a lista gerada contem as cestas de dois itens com
as respectivas frequencias. Destas cestas apenas as mais freqüentes serão
PUC-Rio - Certificação Digital Nº 0621292/CA

consideradas e, assim, as cestas com três itens já são preparadas para o último passo,
que irá somente então contabilizar as cestas mais frequentes relacionadas na etapa
anterior. Com isso, o resultado obtido é a cesta de itens {2,3,5}.

3.4.
Implementação baseada em Grafo

O objetivo da abordagem baseada em grafos é possibilitar a manipulação de


informações de bases de dados de grandes volumes.

Nesta seção serão descritos os passos básicos do algoritmo baseado em grafos,


que chamaremos de Graph-based Market Basket Analysis (GMB). Inicialmente serão
introduzidos conceitos de grafos importantes para o entendimento do algoritmo. Em
seguida, será abordado o princípio da implementação do algoritmo.

3.4.1.
Conceitos de Grafos

Uma maneira de condensar as informações das relações entre itens é criar uma
estrutura de grafo que as represente. Um grafo é definido por um par G = (V,E), onde V é
um conjunto finito de vértices e E representa um conjunto de arestas que ligam os
vértices, de forma que E⊆[V]². No caso do market basket analysis, cada vértice
representa um item e a aresta representa a relação encontrada entre dois itens. A
frequência com que dois itens aparecem juntos em uma mesma transação, ou registro, é
representada por valores associados às arestas, resultando em um grafo com
3 Market Basket Analysis – MBA 28

ponderação nas arestas. O objetivo desse tipo de representação é realizar a análise do


ponto de vista das relações entre os itens e não da relação entre as transações como
alguns estudos de associação abordam [18].

Definimos como G1=(V1, E1) um subgrafo de G=(V,E) onde V1⊆V e E1⊆E. O


subgrafo G1 é considerado completo se houver uma aresta para cada par de vértices, ou
seja, cada vértice é adjacente a todos os outros vértices. Definimos como clique de G um
subgrafo completo de G. O clique máximo é o maior clique encontrado no grafo, ou seja,
nenhum outro clique o contém. Sendo assim, o problema do clique máximo consiste em
determinar o tamanho do maior clique de G. Entende-se por tamanho a cardinalidade do
conjunto de vértices do subgrafo em questão, sendo representado por ω(G).

Para exemplificar o problema do clique máximo, a figura a seguir apresenta um


grafo G, onde V={1,2,3,4,5} e E={(1,2),(1,3),(1,4),(1,5),(2,3),(3,4),(4,5)}. Os nós
destacados em vermelho são os nós que formam o clique máximo desse conjunto de
vértices, que possui tamanho 4.
PUC-Rio - Certificação Digital Nº 0621292/CA

Figura 6 Exemplo de clique máximo

Se um peso for atribuído a cada aresta, então o subgrafo é conhecido como um


subgrafo ponderado e o seu peso é definido pela soma dos pesos das arestas.

No escopo de market basket analysis, achar o clique máximo significa achar o


conjunto de itens que mais aparecem juntos nas relações analisadas. Nas bases usadas,
os registros não são transações e, por isso, o objetivo da aplicação do algoritmo é
encontrar as associações existentes entre os atributos (variáveis) de cada registro. O
3 Market Basket Analysis – MBA 29

peso das arestas do clique ponderado indica a frequência com que as variáveis
representadas pelos vértices ligados por ele aparecem juntas em um registro.

O GMB evita assim várias passadas na base de dados, típicas de algoritmos como
o Apriori

Após o término da execução do GMB, o analista de negócios pode começar a por


em prática a estratégia de cross-selling, pois tem em mãos as relações e as respectivas
frequencias entre as variáveis selecionadas para estudo.

3.4.2.
Montando a Matriz de Adjacências

O primeiro passo do algoritmo é montar a matriz de adjacências que irá


representar o grafo ponderado, considerando apenas os atributos selecionados pelo
usuário como o objetivo do estudo.

A matriz de adjacências foi implementada como uma lista encadeada de objetos


representando os produtos (atributos do registro) da transação e cada produto possui a
PUC-Rio - Certificação Digital Nº 0621292/CA

lista de relacionamentos com outros produtos e a quantidade de vezes que esses


produtos aparecem juntos nos registros. Sendo assim, os atributos são os vértices do
grafo e as relações entre os atributos são representadas pelas arestas que os ligam.

Para cada registro da base de dados, o algoritmo percorre atributo por atributo
montando as relações entre os mesmos. Sendo assim, a cada atributo ak, é feita a
verificação se este já está representado na matriz de adjacências. Se não estiver, então
uma nova entrada é criada para representá-lo. O próximo passo é então percorrer todos
os atributos ai restantes na transação, preenchendo a lista de relacionamentos entre

esses produtos e, caso uma nova relação de ak com ai seja identificada, ai é adicionado

à lista de relações de ak com contador de frequencia inicializado com 1. No caso dessa


relação ter sido identificada em uma transação anterior, o contador é acrescido de 1.

3.4.3.
Buscando a Clique de Tamanho Máximo

O grupo de interesse comum ou a cesta de produtos mais recorrente nas


transações é representada pelo clique máximo do grafo. Em francês, a expressão la
clique é definida como o grupo de indivíduos que partilham interesses em comum.
Encontrar o clique de tamanho máximo significa encontrar o maior grupo de interesses
em comum possível. Quando o grafo em questão é um grafo ponderado, o clique com
maior peso corresponde ao grupo de interesses em comum que se repete mais
frequentemente.
3 Market Basket Analysis – MBA 30

Na seção 3.4.2 foi apresentado como o conjunto de registros com seus atributos
podem ser transformados em uma matriz de adjacências representando um grafo. Neste
sentido, podemos dizer que o problema da cesta de compras pode ser transformado no
problema do clique máximo (PCM).

Convém observar que encontrar o clique máximo em um grafo é um problema NP-


dificil. A seguir descrevemos então um algoritmo simples para computar o clique máximo.

O clique máximo é inicializado como sendo o clique vazio e seu peso é definido
com valor negativo. Além disso, uma lista que representa o clique “candidato” e seu
respectivo peso também são inicializados da mesma maneira.

A cada passada n na lista de adjacências, o atributo an é adicionado ao clique

candidato e, para cada atributo ai restante, verifica-se a existência de relacionamento


com todos os atributos já adicionados ao clique candidato. Se houver relacionamento
entre os atributos, ou seja, se ai está presente na lista de relacionamentos de todos os
atributos incluídos no clique candidato, significa que são vértices ligados por uma aresta.
PUC-Rio - Certificação Digital Nº 0621292/CA

Sendo assim, ai também é adicionado ao clique candidato e o peso do mesmo é

atualizado. Caso ai não se relacione com algum dos outros nós, então ai não faz parte do
clique e o processamento passa para o próximo atributo.

Com o término do processamento do clique candidato, seu peso é comparado ao


peso do clique máximo e, se for maior, então o clique candidato passa a ser a solução
até que outro clique de maior peso seja encontrado ou até que todo vértice da lista de
adjacências tenha sido visitado. As funções FindTheMaximalClique e Find_Clique
transcritas no Apêndice A realizam esse processamento no protótipo desenvolvido.
4 Testes e Resultados

4
Testes e Resultados

Para o desenvolvimento deste trabalho, as estruturas e tecnologia das bases


utilizadas para os testes do algoritmo desenvolvido são proprietárias da Stone Age Tech.
Todos os campos da base de dados são automaticamente definidos como chaves. Uma
vez construída a base, todos os campos podem ser utilizados como chaves de consulta.
Não existem mais limitações sobre as consultas que podem ser feitas, nem a
necessidade de se pedir que sejam construídas novas agregações ou cubos de análise
dos dados.

Todo atributo (ou variável) pode ser cruzado com qualquer outro, dando assim
total liberdade para o usuário. Há a possibilidade de se extrair qualquer tipo de
PUC-Rio - Certificação Digital Nº 0621292/CA

informação dos dados disponíveis.

O gerenciador faz uso de algoritmos de compressão de dados reduzindo a


necessidade de espaço em disco em 80%. A base de dados final ocupa, em média, 20%
do espaço ocupado pelos acervos originais e, com isso, bases de dados que antes
requeriam equipamentos de armazenamento avançados e custosos podem agora ser
disponibilizadas em discos rígidos de computadores pessoais comuns. Essa
característica da base de dados facilitou o desenvolvimento deste trabalho, que investiga
mineração de dados em bases com grandes volumes de informação, tanto em relação
ao número de registros quanto à quantidade de variáveis.

Para que aplicações possam acessar sistemas gerenciadores de banco de dados


diferentes de maneira transparente, independente da linguagem e da base de dados, foi
criado um padrão de acesso a esses sistemas que define interfaces de acesso de
maneira que não seja necessária a utilização de métodos específicos de cada base,
denominado ODBC - Open Data Base Conectivity.

A utilização de um conector (driver) ODBC específico para a base de dados que


se deseja utilizar permite que as informações sejam obtidas utilizando-se a linguagem
SQL - Structured Query Language.

4.1.
Descrição do Ambiente de Testes – Protótipo

Para testar a eficiência e a eficácia do algoritmo proposto, foi desenvolvido em


Delphi um protótipo de testes que, por permitir a escolha de quaisquer conectores
4 Testes e Resultados 32

ODBC, é genérico a qualquer tipo de base e não somente às bases com a tecnologia da
Stone Age Tech.

Inicialmente, o conector ODBC desejado é escolhido dentre a lista disponibilizada


como mostra a figura a seguir.
PUC-Rio - Certificação Digital Nº 0621292/CA

Figura 7 Protótipo: escolha do conector ODBC

Para o acesso aos dados serem disponibilizados, é necessário entrar com nome
de usuário e senha válidos na tela de autenticação que será exibida logo após o clique
no botão Conectar.

Figura 8 Protótipo: Autenticação no ODBC


4 Testes e Resultados 33

Uma vez conectado, a lista de bases será exibida para o usuário, que deve
escolher com qual deseja trabalhar. Em seguida, o usuário deve solicitar a listagem das
variáveis disponíveis para cruzamento. Neste protótipo estão sendo exibidas todas as
variáveis da base. Entretanto, para os estudos contemplados neste trabalho apenas as
variáveis discretas serão utilizadas.
PUC-Rio - Certificação Digital Nº 0621292/CA

Figura 9 Protótipo: Escolha da base de dados

O usuário escolhe as variáveis sobre as quais deseja estudar as relações de


associação e solicita a execução do comando. Se desejar realizar algum filtro nos
registros da base em questão, os critérios precisam ser digitados no campo filtro antes
do comando de execução, como mostra a figura a seguir.

Figura 10 Protótipo: Inclusão de filtro na consulta


4 Testes e Resultados 34

Durante o processamento, informações como a consulta (query) definida, tempo


de execução pelo ODBC em milissegundos, total de registros considerados na consulta
e o tempo para montar a matriz de adjacências representando as relações encontradas
são exibidas.
PUC-Rio - Certificação Digital Nº 0621292/CA

Figura 11 Protótipo: Exibição das informações relevantes

4.2.
Testes

Os testes foram realizados sobre uma base, denominada Vendas, que possui
25.119.414 registros e 197 variáveis. Apenas 81 dessas variáveis foram utilizadas nos
testes, pois apenas estas são discretas, ou seja, com domínio de valores pré-definidos.
Esta base contém as informações de abordagens de marketing para pessoas que já são
clientes e para pessoas que ainda não são clientes de uma instituição financeira, como:
os produtos a que são elegíveis, as restrições de elegibilidade a campanhas (de acordo
com o CPF dos clientes), algumas informações cadastrais, dentre outros.

Para o primeiro caso de teste, foram selecionadas:

• 2 variáveis que representam produtos da empresa proprietária da base de dados

• 2 variáveis que indicam se é a primeira vez que aquele CPF foi indicado para adquirir
esses produtos, respectivamente

• 1 variável que indica se o CPF é de uma pessoa que já é cliente da instituição ou que
ainda não é, e
4 Testes e Resultados 35

• 1 variável com a quantidade de vezes que esse CPF foi abordado em uma campanha
de marketing.

Analisando os padrões encontrados pelo algoritmo (ver Quadro 1), verifica-se que
as relações mais recorrentes estão entre os registros que representam pessoas que

• não são clientes ainda

• foram abordados mais de 4 vezes por uma campanha de marketing

• são elegíveis a campanhas por mala-direta e telemarketing e

• normalmente não é a primeira vez que se tornaram elegíveis aos produtos


selecionados para a análise.

Com isso, pode-se concluir que os indivíduos desta base já foram inúmeras vezes
abordados para adquirirem os produtos CITIMAX e CITICARD e, mesmo assim, não
aderiram à campanha. Tendo essas informações, os analistas perceberam que precisam
repensar o modelo de abordagens desses possíveis clientes e/ou a eficiência das
PUC-Rio - Certificação Digital Nº 0621292/CA

campanhas que estão sendo realizadas, buscando tem mais sucesso com menos
abordagens.

Query: SELECT "CITIFINANCIA", "FX AB", "CITI MAX", "CITICARD", "CITICARD N", "CITIMAX
N" FROM "CREDICARDCITI_CITI_VENDAS" WHERE SEXO = 'F' OR SEXO = 'M'
Query execution time = ms 74515
Total de registros: 318383
Lendo os registros... Por favor, aguarde...
Cálculo das relações durou 57985ms ...
************************************
Produto : CITIFINANCIA_NAO
Adjacências:
FX_AB_NAO: 286581 -> CITI_MAX_NAO: 173888 -> CITICARD_NAO: 245837 ->
CITICARD_N_NAO: 286649 -> CITIMAX_N_NAO: 250698 -> CITI_MAX_ELEG_MD_TLMK: 112761 -
> CITICARD_ELEG_MD_TLMK: 40812 -> CITIMAX_N_PRIMEIRA: 35951 -> FX_AB_4_OU_MAIS:
65 -> FX_AB_3: 1 -> FX_AB_2: 1 -> FX_AB_1: 1
************************************
Produto : FX_AB_NAO
Adjacências:
CITIFINANCIA_NAO: 1243649 -> CITI_MAX_NAO: 191441 -> CITICARD_NAO: 270110 ->
CITICARD_N_NAO: 318315 -> CITIMAX_N_NAO: 278179 -> CITI_MAX_ELEG_MD_TLMK: 126874 -
> CITICARD_ELEG_MD_TLMK: 48205 -> CITIMAX_N_PRIMEIRA: 40136 -> CITIFINANCIA_SIM:
129475
************************************
Produto : CITI_MAX_NAO
Adjacências:
CITIFINANCIA_NAO: 1243649 -> FX_AB_NAO: 1058042 -> CITICARD_NAO: 176691 ->
CITICARD_N_NAO: 191472 -> CITIMAX_N_NAO: 191472 -> CITICARD_ELEG_MD_TLMK: 14781 ->
CITIFINANCIA_SIM: 24995 -> FX_AB_4_OU_MAIS: 83 -> FX_AB_3: 1 -> FX_AB_2: 1
************************************
Produto : CITICARD_NAO
Adjacências:
CITIFINANCIA_NAO: 1243649 -> FX_AB_NAO: 1058042 -> CITI_MAX_NAO: 559633 ->
CITICARD_N_NAO: 270159 -> CITIMAX_N_NAO: 232936 -> CITI_MAX_ELEG_MD_TLMK: 307142 -
> CITIMAX_N_PRIMEIRA: 37223 -> CITIFINANCIA_SIM: 129475 -> FX_AB_4_OU_MAIS: 156 ->
FX_AB_2: 1
************************************
4 Testes e Resultados 36

Produto : CITICARD_N_NAO
Adjacências:
CITIFINANCIA_NAO: 1243649 -> FX_AB_NAO: 1058042 -> CITI_MAX_NAO: 559633 ->
CITICARD_NAO: 503094 -> CITIMAX_N_NAO: 278237 -> CITI_MAX_ELEG_MD_TLMK: 307142 ->
CITICARD_ELEG_MD_TLMK: 93524 -> CITIMAX_N_PRIMEIRA: 40146 -> CITIFINANCIA_SIM:
129475 -> FX_AB_4_OU_MAIS: 156 -> FX_AB_3: 1 -> FX_AB_2: 1 -> FX_AB_1: 1
************************************
Produto : CITIMAX_N_NAO
Adjacências:
CITIFINANCIA_NAO: 1243649 -> FX_AB_NAO: 1058042 -> CITI_MAX_NAO: 559633 ->
CITICARD_NAO: 503094 -> CITICARD_N_NAO: 278237 -> CITI_MAX_ELEG_MD_TLMK: 307142 ->
CITICARD_ELEG_MD_TLMK: 93524 -> CITIFINANCIA_SIM: 129475 -> FX_AB_4_OU_MAIS: 83 ->
FX_AB_3: 1 -> FX_AB_2: 1 -> FX_AB_1: 1
************************************
Produto : CITI_MAX_ELEG_MD_TLMK
Adjacências:
CITIFINANCIA_NAO: 112761 -> FX_AB_NAO: 126874 -> CITICARD_NAO: 93468 ->
CITICARD_N_NAO: 126911 -> CITIMAX_N_NAO: 86765 -> CITICARD_ELEG_MD_TLMK: 33443 ->
CITIMAX_N_PRIMEIRA: 40146 -> CITIFINANCIA_SIM: 129475 -> FX_AB_4_OU_MAIS: 156 ->
FX_AB_1: 1
************************************
Produto : CITICARD_ELEG_MD_TLMK
Adjacências:
CITIFINANCIA_NAO: 40812 -> FX_AB_NAO: 48205 -> CITI_MAX_ELEG_MD_TLMK: 33443 ->
CITICARD_N_NAO: 48224 -> CITIMAX_N_NAO: 45301 -> CITI_MAX_NAO: 14781 ->
CITIFINANCIA_SIM: 24995 -> CITIMAX_N_PRIMEIRA: 2923 -> FX_AB_4_OU_MAIS: 17 ->
FX_AB_3: 1 -> FX_AB_1: 1
************************************
PUC-Rio - Certificação Digital Nº 0621292/CA

Produto : CITIMAX_N_PRIMEIRA
Adjacências:
CITIFINANCIA_NAO: 35951 -> FX_AB_NAO: 40136 -> CITI_MAX_ELEG_MD_TLMK: 40146 ->
CITICARD_NAO: 37223 -> CITICARD_N_NAO: 40146 -> CITIFINANCIA_SIM: 4195 ->
CITICARD_ELEG_MD_TLMK: 2923 -> FX_AB_4_OU_MAIS: 156
************************************
Produto : CITIFINANCIA_SIM
Adjacências:
FX_AB_NAO: 31734 -> CITI_MAX_ELEG_MD_TLMK: 14150 -> CITICARD_NAO: 24322 ->
CITICARD_N_NAO: 31734 -> CITIMAX_N_NAO: 27539 -> CITIMAX_N_PRIMEIRA: 4195 ->
CITI_MAX_NAO: 17584 -> CITICARD_ELEG_MD_TLMK: 7412
************************************
Produto : FX_AB_4_OU_MAIS
Adjacências:
CITIFINANCIA_NAO: 65 -> CITI_MAX_ELEG_MD_TLMK: 36 -> CITICARD_NAO: 48 ->
CITICARD_N_NAO: 65 -> CITIMAX_N_PRIMEIRA: 10 -> CITI_MAX_NAO: 29 -> CITIMAX_N_NAO:
55 -> CITICARD_ELEG_MD_TLMK: 17
************************************
Produto : FX_AB_3
Adjacências:
CITIFINANCIA_NAO: 1 -> CITI_MAX_NAO: 1 -> CITICARD_ELEG_MD_TLMK: 1 ->
CITICARD_N_NAO: 1 -> CITIMAX_N_NAO: 1
************************************
Produto : FX_AB_2
Adjacências:
CITIFINANCIA_NAO: 1 -> CITI_MAX_NAO: 1 -> CITICARD_NAO: 1 -> CITICARD_N_NAO: 1 ->
CITIMAX_N_NAO: 1
************************************
Produto : FX_AB_1
Adjacências:
CITIFINANCIA_NAO: 1 -> CITI_MAX_ELEG_MD_TLMK: 1 -> CITICARD_ELEG_MD_TLMK: 1 ->
CITICARD_N_NAO: 1 -> CITIMAX_N_NAO: 1
Clique máxima pelo peso total:
- FX_AB_4_OU_MAIS
- CITIMAX_N_PRIMEIRA
- CITICARD_ELEG_MD_TLMK
- CITI_MAX_ELEG_MD_TLMK
- CITIMAX_N_NAO
- CITICARD_N_NAO
4 Testes e Resultados 37

- CITICARD_NAO
- CITI_MAX_NAO
- FX_AB_NAO
- CITIFINANCIA_NAO
2676826

Quadro 1 Relações encontradas para o caso de teste 1

Para o caso de teste 2, foram utilizadas as variáveis, presentes na base de


Vendas:

• sexo

• faixa de vezes que o CPF foi abordado em uma campanha

• indicador de restrição do CPF para uma campanha

• indicador se o CPF já é de um cliente e

• estado civil
PUC-Rio - Certificação Digital Nº 0621292/CA

O propósito do experimento foi descobrir as relações entre tais variáveis,


verificando quais características aparecem mais vezes nos registros da base Vendas.

A consulta ao banco de dados foi realizada em 65547ms (≈ 66 segundos) e a


matriz de adjacência com as relações entre os valores dos atributos foi montada em
32625ms (≈ 33 segundos). Como foi realizado um filtro selecionando apenas os registros
do sexo masculino e feminino (existem registro com valor de sexo “não informado” e
“ignorado”, apenas 318.383 registros foram analisados.

O clique encontrado tem nós com valor 1 para faixa de abordagem (ou seja, o
CPF foi abordado apenas 1 vez em campanhas de marketing), sexo feminino, sem
restrições ao CPF e com indicador de que este CPF ainda não se tornou cliente da
instituição. Com essas informações o analista pode inferir que as mulheres que não
possuem restrição às campanhas para seus CPFs foram abordadas apenas uma vez e
não responderam bem à campanha realizada, já que não se tornaram clientes. Assim, foi
possível preparar mais campanhas buscando abordar novamente as pessoas que ainda
não se tornaram clientes e que foram abordados apenas uma vez.

O Quadro 2 apresenta a consulta realizada sobre a base de dados, todas as


relações encontradas entre as variáveis selecionadas pelo usuário e os valores
encontrados como pertencentes ao clique.

Query: SELECT "IND CPF", "CITIFINANCIA", "FX AB", "ESTCIVIL", "SEXO" FROM
"CREDICARDCITI_CITI_VENDAS" WHERE SEXO = 'F' OR SEXO = 'M'
Query execution time = ms 65547
Total de registros: 318383
Lendo os registros... Por favor, aguarde...
4 Testes e Resultados 38

Cálculo das relações durou 32625ms ...


************************************
Produto : IND_CPF_-_NAO
Adjacências:
CITIFINANCIA_-_NAO: 279334 -> FX_AB_-_NAO: 310155 -> ESTCIVIL_-_NAO: 310223 -> SEXO_-
_F: 170677 -> SEXO_-_M: 139546 -> CITIFINANCIA_-_SIM: 30889 -> FX_AB_-_4_OU_MAIS: 65 ->
FX_AB_-_3: 1 -> FX_AB_-_2: 1 -> FX_AB_-_1: 1
************************************
Produto : CITIFINANCIA_-_NAO
Adjacências:
IND_CPF_-_NAO: 1070386 -> FX_AB_-_NAO: 286581 -> ESTCIVIL_-_NAO: 286649 -> SEXO_-_F:
158326 -> SEXO_-_M: 128323 -> IND_CPF_-_PROP_RECENTE: 26916 -> FX_AB_-_4_OU_MAIS: 65 ->
FX_AB_-_3: 1 -> FX_AB_-_2: 1 -> FX_AB_-_1: 1
************************************
Produto : FX_AB_-_NAO
Adjacências:
IND_CPF_-_NAO: 1070386 -> CITIFINANCIA_-_NAO: 731554 -> ESTCIVIL_-_NAO: 318315 ->
SEXO_-_F: 175513 -> SEXO_-_M: 142802 -> CITIFINANCIA_-_SIM: 77973 -> IND_CPF_-
_PROP_RECENTE: 26916
************************************
Produto : ESTCIVIL_-_NAO
Adjacências:
IND_CPF_-_NAO: 1070386 -> CITIFINANCIA_-_NAO: 731554 -> FX_AB_-_NAO: 493827 -> SEXO_-
_F: 175553 -> SEXO_-_M: 142830 -> CITIFINANCIA_-_SIM: 77973 -> IND_CPF_-_PROP_RECENTE:
26916 -> FX_AB_-_4_OU_MAIS: 103 -> FX_AB_-_3: 1 -> FX_AB_-_2: 1 -> FX_AB_-_1: 1
************************************
Produto : SEXO_-_F
Adjacências:
PUC-Rio - Certificação Digital Nº 0621292/CA

IND_CPF_-_NAO: 1070386 -> CITIFINANCIA_-_NAO: 731554 -> FX_AB_-_NAO: 493827 ->


ESTCIVIL_-_NAO: 175553 -> CITIFINANCIA_-_SIM: 17227 -> IND_CPF_-_PROP_RECENTE: 5720 ->
FX_AB_-_4_OU_MAIS: 103 -> FX_AB_-_1: 1
************************************
Produto : SEXO_-_M
Adjacências:
IND_CPF_-_NAO: 139546 -> CITIFINANCIA_-_NAO: 128323 -> FX_AB_-_NAO: 142802 ->
ESTCIVIL_-_NAO: 142830 -> CITIFINANCIA_-_SIM: 77973 -> IND_CPF_-_PROP_RECENTE: 26916 -
> FX_AB_-_4_OU_MAIS: 26 -> FX_AB_-_3: 1 -> FX_AB_-_2: 1
************************************
Produto : CITIFINANCIA_-_SIM
Adjacências:
IND_CPF_-_NAO: 30889 -> FX_AB_-_NAO: 31734 -> ESTCIVIL_-_NAO: 31734 -> SEXO_-_M: 14507 -
> SEXO_-_F: 17227 -> IND_CPF_-_PROP_RECENTE: 5720
************************************
Produto : IND_CPF_-_PROP_RECENTE
Adjacências:
CITIFINANCIA_-_NAO: 7315 -> FX_AB_-_NAO: 8160 -> ESTCIVIL_-_NAO: 8160 -> SEXO_-_M: 3284
-> CITIFINANCIA_-_SIM: 845 -> SEXO_-_F: 4876
************************************
Produto : FX_AB_-_4_OU_MAIS
Adjacências:
IND_CPF_-_NAO: 65 -> CITIFINANCIA_-_NAO: 65 -> ESTCIVIL_-_NAO: 65 -> SEXO_-_F: 39 ->
SEXO_-_M: 26
************************************
Produto : FX_AB_-_3
Adjacências:
IND_CPF_-_NAO: 1 -> CITIFINANCIA_-_NAO: 1 -> ESTCIVIL_-_NAO: 1 -> SEXO_-_M: 1
************************************
Produto : FX_AB_-_2
Adjacências:
IND_CPF_-_NAO: 1 -> CITIFINANCIA_-_NAO: 1 -> ESTCIVIL_-_NAO: 1 -> SEXO_-_M: 1
************************************
Produto : FX_AB_-_1
Adjacências:
IND_CPF_-_NAO: 1 -> CITIFINANCIA_-_NAO: 1 -> ESTCIVIL_-_NAO: 1 -> SEXO_-_F: 1
Clique máxima pelo peso total:
- FX_AB_-_1
- SEXO_-_F
4 Testes e Resultados 39

- ESTCIVIL_-_NAO
- FX_AB_-_NAO
- CITIFINANCIA_-_NAO
- IND_CPF_-_NAO
2140775

Quadro 2 Relações encontradas para o caso de teste 2


PUC-Rio - Certificação Digital Nº 0621292/CA
5 Conclusão e Trabalhos Futuros 40

5
Conclusão e Trabalhos Futuros

5.1.
Conclusões

Esta dissertação abordou conceitos de data mining voltado para marketing de


relacionamento, propondo uma implementação da técnica de market basket analysis
baseada na estrutura de grafo.

Para contextualizar o problema, inicialmente foram discutidos tópicos importantes


relacionados à mineração de dados, bem como o processo de busca de conhecimento,
os tipos de predição de informação e as técnicas mais utilizadas atualmente para
descobrimento de padrões em dados armazenados em bancos de dados.
PUC-Rio - Certificação Digital Nº 0621292/CA

Maior foco foi dado à técnica de market basket analysis, pois, ao fazer uso de
regras de associação, esta técnica caracteriza-se como uma ótima escolha para
solucionar problemas no escopo de marketing de relacionamento, tais como venda
casada e up-selling. Neste cenário, foi proposto um algoritmo que encontra as relações
mais recorrentes entre os produtos (variáveis) nas compras (registros) registradas na
base de dados.

A fim de realizar testes que mensurassem o desempenho do algoritmo


desenvolvido, um protótipo de aplicação foi criado, permitindo que o usuário escolha a
base em que irá realizar os estudos e as variáveis que deseja cruzar a fim de descobrir
as relações existentes entre as variáveis. Sendo assim, este trabalho ainda apresenta
testes e resultados obtidos através da utilização do algoritmo proposto.

Como principal contribuição do trabalho, podemos apontar a implementação de


um algoritmo para data mining capaz de descobrir relações entre atributos dos registros
de uma base de dados. A principal barreira enfrentada por tais implementações está na
dificuldade de encontrar informação relevante, e em volume suficientemente grande,
para estudar a eficiência do algoritmo em descobrir regras de associação referentes aos
dados. No caso deste trabalho, as bases de dados utilizadas são reais e com qualidade
e tamanho satisfatórios para uma análise mais apurada do retorno da solução proposta.

Como segunda contribuição, podemos ressaltar a generalidade do protótipo


desenvolvido, que pode ser aplicado a qualquer estrutura e tecnologia de base de dados,
através do uso de conector ODBC para realizar as consultas aos dados disponíveis.
5 Conclusão e Trabalhos Futuros 41

5.2.
Trabalhos Futuros

Como sugestões de trabalhos futuros, podemos enumerar:

• Identificação dos atributos discretos

No processo de descoberta das relações entre os atributos de um


registro, só faz sentido trabalhar com aqueles que possuem domínio
previamente conhecido, ou seja, atributos que sejam discretos. Sendo
assim, é interessante apresentar para o usuário apenas as variáveis que
sejam desse tipo, o que não foi realizado neste trabalho devido à uma
limitação do conector ODBC utilizado.

• Investir na visualização gráfica das informações descobertas

A visualização do relacionamento entre os atributos em termos de


imagens facilita a compreensão por parte do usuário e permite análises
mais rápidas e intuitivas que o estudo das regras de associação
PUC-Rio - Certificação Digital Nº 0621292/CA

descobertas. É interessante que um trabalho futuro explore a parte de


visualização, buscando outros componentes que permitam a visualização
do grafo de maneira mais limpa e que suporte grafos com grandes
quantidades de nós e relações.

• Trabalhar com outras estruturas de dados

Este trabalho fez uso apenas de bases de dados de propriedade da Stone


Age Tech, que não trabalha com tabelas como os bancos de dados
convencionais, mas com uma estrutura colunar. Ao trabalhar com uma
base de dados convencional, seria possível identificar se a estrutura da
base influencia o desempenho final do algoritmo.

• Estudo comparativo entre algoritmos

A proposta dessa dissertação foi uma implementação da técnica de


market basket analysis, utilizando-se os conceitos de grafos ponderados a
fim de encontrar as relações mais frequentes, ou seja, o clique máximo do
grafo. Como trabalho futuro complementar a este, pode-se sugerir a
construção de outros algoritmos que tenham o mesmo princípio de regras
de associação, como por exemplo, o Apriori, com o objetivo de realizar
comparações de tempo de resposta e de acuracidade das informações
sobre as relações.

• Incluir medidas de interesse como suporte e confiança


5 Conclusão e Trabalhos Futuros 42

A introdução de medidas, como suporte e confiança, permite que os


padrões descobertos sejam ordenados ou classificados de acordo com o
grau de interesse associado aos mesmos. Além disso, essas medidas
podem ser usadas para guiar ou restringir o espaço de busca, melhorando
a eficiência da mesma ao eliminar conjuntos de regras de associação que
não satisfaçam as condições predeterminadas.

• Acrescentar outras abordagens para descoberta do clique máximo

Na literatura existem algumas abordagens diferentes para a solução


problema do clique máximo. A título experimental, o estudo e a
implementação de novas técnicas é sugerido como trabalho futuro
complementar ao proposto por esta dissertação.
PUC-Rio - Certificação Digital Nº 0621292/CA
43
6 Referências

6
Referências

[1] SANDRI. A.; Detecção e Prevenção de Fraudes utilizando Inteligência


Artificial. 2006. Disponível em
<http://br.geocities.com/andresandri/artigos/IA/Deteccao_Prevencao_Fr
aude_IA.doc> Acesso em Junho de 2008.
[2] PASSINI, S.R.R; TOLEDO, C.M.T; Mineração de Dados para Detecção
de Fraudes em Ligações de Água. 2002. Disponível em
<http://www.inf.furb.br/seminco/2002/artigos/Passini-seminco2002-
6.pdf> Acesso em Junho de 2008.
[3] RABELO, E;. Avaliação de Técnicas de Visualização para Mineração de
Dados, 2007. Dissertação de Pós-Graduação, Universidade Federal de
Maringá. Disponível em <http://www.din.uem.br/pos-
graduacao/mestrado-em-ciencia-da-computacao/dissertacoes> Acesso
em Junho 2008.
PUC-Rio - Certificação Digital Nº 0621292/CA

[4] Fayyad, U.; Shapiro, P. G.; Smyth, P.; Knowledge Discovery and Data
Mining: Towards a Unifying Framework. Menlo Park, Calif.: AAAI Press;
Cambridge, Mass.: MIT Press, 1996. 611p.
[5] FERRO, M., LEE, H. D.; O Processo de KDD – Knowledge Discovery in
Database para Aplicações na Medicina, 2001.
[6] ROMÃO, W.; Descoberta de Conhecimento Relevante em Banco de
Dados sobre Ciência e Tecnologia. Dissertação de Pós-Graduação,
Universidade Federal de Santa Catarina, 2002.
[7] Information Drivers Company, Inglaterra. Disponível em
<http://www.information-drivers.com/market_basket_analysis.php>.
Acesso em julho 2008.
[8] Direct Magazine, “Match 'Em Up” Outubro 2006. Disponível em
<http://directmag.com/disciplines/crm/marketing_match_em>, Acesso
em julho 2008.
[9] VELOSO, M. S. A. Regras De Associação Aplicadas A Um Método De
Apoio Ao Planejamento De Recursos Humanos. Dissertação de
Mestrado, Universidade do Porto.
[10] TAN, P., STEINBACH, M., KUMAR, V., Introduction to Data Mining.
Person Addison Wesley Education Press Inc. Boston, 2005.
[11] AZEVEDO, L. V. Maximizando o valor do relacionamento com o cliente:
Data Mining e CRM. 2003.
[12] SANTOS, J. G.; Mineração De Dados Aplicada à Gestão De
Relacionamento com Clientes. Espaço Científico, Santarém V.6, n.1/2,
p.29-36, 2005.
[13] NOGUEIRA, C. F.; Metodologia de Valorização de Clientes, utilizando
Mineração de Dados. Dissertação de Pós-graduação em Engenharia
Civil da Universidade Federal do Rio de Janeiro, 2004.
44
6 Referências

[14] ADOMAVICIUS, G., TUZHILIN, A.; Toward the Next Generation of


Recommender Systems: A Survey of the State-of-the-Art and Possible
Extensions. IEEE Transactions On Knowledge And Data Engineering,
VOL. 17, No. 6, Junho 2005.
[15] BURKE, R; Knowledge-based Recommender Systems. University of
California, Irvine.
[16] MIDDLETON, S. E., ROURE, D., SHADBOLT, N.; Captuiring knowledge
of User Preferences: Ontologies in Recommender Systems. University
of Southampton. October 22-23, 2001, Victoria, British Columbia,
Canada.
[17] TAN, P.; STEINBACH, M.; KUMAR, V.; Introduction to Data Mining.
Pearson Addison Wesley 2006.
[18] LIU, F.; LU, Z; LU, S., Mining Association Rules Using Clustering,
Intelligent Data Analysis,5, 2001, pp.309-326.
[19] CAVIQUE, L. Graph-based structures for the Market Baskets Analysis.
24 2004, pp.233-246.
[20] LIMEIRA, Tânia m. V. Administração das comunicações em Marketing.
In: DIAS, S. R. Gestão de marketing. São Paulo: Saraiva, 2003. p. 301.
[21] Bretze Marketing de Relacionamento 2004, Aumentando a
Rentabilidade do Cliente com Database Marketing. Disponível em
PUC-Rio - Certificação Digital Nº 0621292/CA

www.bretzke-marketing.com.br/textos/artigos01.htm. Acesso em janeiro


de 2009.
[22] HOUTSMA, M., SWAMI, A. Set-oriented mining for association rules in
relational databases. Twente Univ., Enschede; Data Engineering, 1995.
Proceedings of the Eleventh International Conference on p. 25-33.
[23] DIPANKAR, D., Artificial Immune System and Their Aplications.
Springer-Verlag 1999.
[24] DASGUPTA, D., Ji, Z., González, F., Artificial Immune System (AIS)
Research in the Last Five Years. IEEE 2003.
[25] AGRAWAL, R., IMIELINSKI, T., SRIKANT, R., Mining Association Rules
between Sets of Items in Large Databases, Proc. of the ACM SIGMOD
Intl. Conf. on Management of Data, Washington, Estados Unidos, 1993,
207–216.
[26] C. Borgelt, An Implementation of the FP-growth Algorithm, Workshop
Open Source Data Mining Software, OSDM'05, Chicago, IL, 1-5.ACM
Press, USA, 2005.
[27] S. Brin, R. Motwani, J.D. Ullman and S.Tsur, Dynamic Itemset Counting
and Implication Rules for Market Basket Data, in Proceedings of the
1997 ACM SIGMOD Conference, Tucson, Arizona, 1997, pp.255-264.
[28] J. Han, J. Pei, Y. Yin, “Mining frequent patterns without candidate
generation”, Proceedings of the 2000 ACM SIGMOD International
Conference on Management of Data, Dallas, Texas, United States, 1-
12, 2000
7 APÊNDICE A – Código da Implementação
45

7
APÊNDICE A – Código da Implementação

Unit Main – Main.pas

(*******************************************************************************
* PONTIFICIA UNIVERSIDADE CATÓLICA DO RIO DE JANEIRO - PUC-RIO
*
* Programa de Pós-Graduação em Informática - Mestrado
*
* Programa apresentado como requisito parcial para o cumprimento dos créditos da
* cadeira de Projeto Final de Programação (INF 2102).
*
* Aluna: Livia Fonseca Fracalanza
* Matricula : 0621292
* Orientador: Prof. Marco Antonio Casanova
*******************************************************************************)
unit Main;
PUC-Rio - Certificação Digital Nº 0621292/CA

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, RzGrids, RzShellDialogs, StdCtrls, RzLabel, Mask, RzEdit,
RzBtnEdt, ExtCtrls, LogView, OleCtrls, SHDocVw,
MBAObject, DB, ADODB, CheckLst, RzLstBox, RzChkLst;

type
TFMain = class(TForm)
Panel3: TPanel;
Splitter1: TSplitter;
WebBrowser1: TWebBrowser;
Panel1: TPanel;
Panel2: TPanel;
Panel4: TPanel;
BtnMaximalCliqueByWeight: TButton;
RzOpenDialog1: TRzOpenDialog;
BtnGraphGenerator: TButton;
BtnMaximalCliqueByAverage: TButton;
RzLabel1: TRzLabel;
BtnConnect: TButton;
BtnDisconnect: TButton;
cbDriversList: TComboBox;
RzLabel2: TRzLabel;
cbBases: TComboBox;
RzLabel3: TRzLabel;
ODBCConnect: TADOConnection;
Button1: TButton;
edtFilter: TEdit;
Filtro: TLabel;
Button2: TButton;
Memo1: TMemo;
Label1: TLabel;
7 APÊNDICE A – Código da Implementação
46

VarListBox: TRzCheckList;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnPrintClick(Sender: TObject);
procedure FileEdtButtonClick(Sender: TObject);
procedure BtnMaximalCliqueByWeightClick(Sender: TObject);
procedure BtnGraphGeneratorClick(Sender: TObject);
procedure BtnMaximalCliqueByAverageClick(Sender: TObject);
procedure BtnConnectClick(Sender: TObject);
procedure BtnDisconnectClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
MBAObj : TMBAObj;
FFilePath : string;
recset : _Recordset;

procedure ReadFile;
procedure GetDriversList;
procedure PrintRelations;
procedure PrintMaximalClique;
procedure DisconnectODBC;
public
// FLogViewer : TLogViewer; // Main log info
end;
PUC-Rio - Certificação Digital Nº 0621292/CA

var
FMain: TFMain;

implementation
{$R *.dfm}

uses
// StrUtils, // for AnsiStr functions
Registry,
LoginForm,
WINGRAPHVIZLib_TLB; // to use GraphViz to draw Graph gif

(******************************************************************************)
procedure TFMain.FormCreate(Sender: TObject);
begin
//Create Log Object
CreateLogObject;
FLogViewer.LogUpdate (' *** Início da execução do programa *** ');

GetDriversList;

VarListBox.MultiSelect := TRUE;
end;
(******************************************************************************)
procedure TFMain.FormDestroy(Sender: TObject);
begin

// Destroy Log Object


FLogViewer.LogUpdate (' *** Encerrando a execução do programa *** ');
If Assigned (FLogViewer) then
FreeAndNil (FLogViewer);
end;
(******************************************************************************)
procedure TFMain.GetDriversList;
7 APÊNDICE A – Código da Implementação
47

var
reg : TRegistry;
List : TStrings;
begin
reg := TRegistry.Create;
List := TStringList.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey ('SOFTWARE\ODBC\ODBC.INI', False);
reg.GetKeyNames (List);

cbDriversList.Items.Assign (List);
finally
reg.Free;
List.Free;
end;
end;
(******************************************************************************)
(******************************************************************************)
procedure TFMain.btnPrintClick(Sender: TObject);
begin
PrintRelations;
end;
(******************************************************************************)
(*******************************************************************************
PUC-Rio - Certificação Digital Nº 0621292/CA

* Procedure: PrintRelations
* Descrição: Procedure passa pelos nós da lista de adjacência imprimindo a rela-
ção existente entre os mesmos e a quantidade de vezes em que essa
relação acontece.
*
*******************************************************************************)
procedure TFMain.PrintRelations;
var
i, j : Integer;
Produto : TProduct;
PAdj : TProduct;
ws : string;
begin
// Memo1.Lines.Clear;

for i := 0 to MBAObj.FAdjList.Count-1 do
begin
ws := '';

Produto := TProduct(MBAObj.FAdjList.Objects[i]);
Memo1.Lines.Add(' ************************************ ');
Memo1.Lines.Add('Produto : ' + MBAObj.FAdjList.Strings[i]);
Memo1.Lines.Add('Adjacências: ');

for j := 0 to Produto.List.Count-1 do
begin
PAdj := TProduct(Produto.List.Objects[j]);
ws := ws + PAdj.ID + ': ' + IntToStr(PAdj.Qtd) + ' -> ';
end;
Memo1.Lines.Add(Copy(ws,0, length(ws)-3));
end;
end;
(******************************************************************************)
procedure TFMain.FileEdtButtonClick(Sender: TObject);
begin
7 APÊNDICE A – Código da Implementação
48

if RzOpenDialog1.Execute then
FFilePath:= RzOpenDialog1.FileName;

// FileEdt.Text:= FFilePath;

//Create MBA Object


if Assigned (MBAObj) then
MBAObj.Destroy;

MBAObj := TMBAObj.Create;

// Read the Transaction File and Set the Adjacent List, constructing the Graph
ReadFile;

//Print the relations at the list of adjacencies


PrintRelations;
end;
(******************************************************************************)
(*******************************************************************************
* Procedure: ReadFile
* Descrição: Lê cada linha do arquivo texto, representando uma transação e chama
* a função FillAdjList para computar a relação de adjacência dos
* ítens da transação.
*
* AE : -
PUC-Rio - Certificação Digital Nº 0621292/CA

* AS : -
*******************************************************************************)
procedure TFMain.ReadFile;
var
MatrixFile : TextFile;
TransactionLine: string;
PList : TStringList;
i : integer;
begin
if not FileExists(FFilePath) then
begin
ShowMessage ('O Arquivo informado não existe.');
FLogViewer.LogUpdate ('Erro: O Arquivo informado não existe.');
exit;
end;

Memo1.Lines.Clear;
i := 0;
try
AssignFile(MatrixFile, FFilePath);
Reset(MatrixFile);

Plist := TStringList.Create;
PList.Delimiter := ';';
while not Eof(MatrixFile) do
begin
Readln(MatrixFile, TransactionLine);

Memo1.Lines.Add('Lendo Transação ' + IntTOStr(i+1));


Memo1.Lines.Add(TransactionLine);
Memo1.Lines.Add(' ----------------- ');

PList.DelimitedText := TransactionLine;

MBAObj.FillAdjList (PList, 0);


7 APÊNDICE A – Código da Implementação
49

inc(i);
end;
FLogViewer.LogUpdate (IntToStr(i) + ' transações lidas.');
finally
CloseFile(MatrixFile);
// FreeAndNil (MatrixFile);
end;
end;
(******************************************************************************)
(*******************************************************************************
* Procedure: BtnGraphGeneratorClick
* Descrição: Procedure que implementa o clique do botão de criação da imagem do
* grafo de acordo com as informações da lista de adjacências.
*
*******************************************************************************)
procedure TFMain.BtnGraphGeneratorClick(Sender: TObject);
var
Dot: IDot;
Image: IBinaryImage;
ImageFileName: string;
Path : string;
Data : widestring;
i, j : Integer;
Vertex, Adjc : TProduct;
PUC-Rio - Certificação Digital Nº 0621292/CA

begin
Memo1.Lines.Clear;
Memo1.Lines.Add('graph G');
Memo1.Lines.Add('{');
Memo1.Lines.Add('label=" Grafo de Transações "');
Memo1.Lines.Add('node [color=pink, style=filled]');

for i := 0 to MBAObj.FAdjList.Count-1 do
begin
Vertex := TProduct(MBAObj.FAdjList.Objects[i]);
if MBAObj.FMaximumCliqueList.IndexOf(Vertex.ID) >= 0 then // Node is a part of the
Maximal Clique
begin
Memo1.Lines.Add(Vertex.ID + ' [color=yellow]');
end;

for j := 0 to Vertex.List.Count-1 do
begin
Adjc := TProduct(Vertex.List.Objects[j]);
if Vertex.ID < Adjc.ID then
begin
Memo1.Lines.Add(Vertex.ID + ' -- ' + Adjc.ID + ' [label = ' + IntToStr(Adjc.Qtd) +
', color=green]');
end;
end;
end;
Memo1.Lines.Add('}');

// Print the Graph


Data := Memo1.text;
Path := ExtractFilePath(paramStr(0));
ImageFileName := Path + 'Graph_image.gif';

Dot := CoDOT.Create;
Image := Dot.ToGIF(Data);
7 APÊNDICE A – Código da Implementação
50

Image.Save(ImageFileName);
WebBrowser1.Navigate('file:///' + Path + 'Graph_image.gif');
end;
(******************************************************************************)
procedure TFMain.BtnMaximalCliqueByWeightClick(Sender: TObject);
begin
MBAObj.FindTheMaximalClique (M_WEIGHT);

PrintMaximalClique;
end;
(******************************************************************************)
procedure TFMain.BtnMaximalCliqueByAverageClick(Sender: TObject);
begin
MBAObj.FindTheMaximalClique (AVERAGE);

PrintMaximalClique;
end;
(******************************************************************************)
procedure TFMain.PrintMaximalClique;
var
i : Integer;
begin
// Se foram identificados nós que formam uma clique máxima, imprime a mesma
if MBAObj.FMaximumCliqueList.Count > 0 then
begin
PUC-Rio - Certificação Digital Nº 0621292/CA

Memo1.Lines.Add (' Clique máxima pelo peso total: ');


for i := 0 to MBAObj.FMaximumCliqueList.Count -1 do
begin
Memo1.Lines.Add(' - '+ MBAObj.FMaximumCliqueList[i]);
end;
Memo1.Lines.Add(FloatToStr(MBAObj.FMaxCliqueWeight));
end
else
Memo1.Lines.Add(' -> Não existe uma Clique.');
end;
(******************************************************************************)
procedure TFMain.BtnConnectClick(Sender: TObject);
var
ConnectStr,
DriverName : string;
List : TStrings;
begin
if cbDriversList.ItemIndex < 0 then
begin
ShowMessage ('Por favor, selecione um Driver ODBC!');
exit;
end;

if FrmLogin.ShowModal <> mrOK then


exit;

DriverName := cbDriversList.Text;
ConnectStr := 'Provider=MSDASQL.1;Persist Security Info=False;Data Source='
+ DriverName;
(* connect *)
try
ODBCConnect.ConnectionString := ConnectStr;
ODBCConnect.Open (FrmLogin.UserName, FrmLogin.Password); // ('ADMCAMP',
'THORAN'); //
7 APÊNDICE A – Código da Implementação
51

List := TStringList.Create;
try
if ODBCConnect.Connected then
ShowMessage ('Conectado!')
else
begin
ShowMessage ('Conexão falhou!');
Exit;
end;

ODBCConnect.GetTableNames (List, False);


cbBases.Items.Assign (List);
finally
List.Free;
end;

BtnConnect.Enabled := false;
// Button1.Enabled := true;
BtnDisconnect.Enabled := true;
except
on E : EADOError do
begin
ShowMessage (E.Message);
DisconnectODBC;
end;
PUC-Rio - Certificação Digital Nº 0621292/CA

on E : Exception do
begin
ShowMessage ('Conexão Simba falhou : ' + E.Message);
DisconnectODBC;
end;
end;
end;
(******************************************************************************)
procedure TFMain.BtnDisconnectClick(Sender: TObject);
begin
DisconnectODBC;
end;
(******************************************************************************)
procedure TFMain.DisconnectODBC;
begin
ODBCConnect.Close;
BtnConnect.Enabled := true;
// Button1.Enabled := false;
BtnDisconnect.Enabled := false;
VarListBox.Clear;
end;
(******************************************************************************)
procedure TFMain.Button1Click(Sender: TObject);
var
List : TStrings;
begin
if not ODBCConnect.Connected
then
begin
ShowMessage ('Dataset desconectado!');
Exit;
end;

if cbBases.ItemIndex < 0
then
7 APÊNDICE A – Código da Implementação
52

begin
ShowMessage ('Por favor, selecione um dataset!');
Exit;
end;

List := TStringList.Create;
VarListBox.Clear;

try
ODBCConnect.GetFieldNames (cbBases.Text, List);
VarListBox.Items.Assign (List);
finally
List.Free;
end;
end;

procedure TFMain.Button2Click(Sender: TObject);


var
queryStr,
DataSetName,
VarListStr : String;
Ix, Jx : Integer;
SelList : Array of String;
SelCount : Integer;
timestep : DWORD;
PUC-Rio - Certificação Digital Nº 0621292/CA

FilterStr : String;
FullRecovery : boolean;
columnsList : array of string;
RecLine : TStringList;
auxStr : String;
begin
if cbBases.ItemIndex < 0 then
begin
ShowMessage ('Por favor, selecione um dataset!');
Exit;
end;

SelCount := VarListBox.ItemsChecked;
if SelCount = 0 then
begin
ShowMessage ('Por favor, selecione pelo menos uma variável!');
Exit;
end;

SetLength (SelList, SelCount);


SetLength (columnsList, SelCount);
Jx := 0;

DataSetName := cbBases.Text;
with VarListBox do
begin
for Ix := 0 to Count - 1 do
begin
if ItemChecked[Ix] then
begin
SelList[Jx] := Items.Strings[Ix];

if VarListStr <> '' then


VarListStr := VarListStr + ', ';
7 APÊNDICE A – Código da Implementação
53

VarListStr := VarListStr + #34 + SelList[Jx] + #34;


Inc (Jx);
end;
end;
end;
FilterStr := '';

if edtFilter.Text <> '' then


FilterStr := ' WHERE ' + edtFilter.Text;

queryStr := 'SELECT ' + VarListStr + ' FROM "' + DataSetName + '"' + FilterStr;
Memo1.Lines.Add('Query: ' + queryStr);
try
timestep := GetTickCount();
recset := ODBCConnect.Execute (queryStr);
timestep := GetTickCount() - timestep;
Memo1.Lines.Add('Query execution time = ms ' + IntToStr (timestep)
+ #13 + #10
+ 'Total de registros: ' + IntToStr(RECSET.RecordCount));
except
on E : EADOError do
begin
ShowMessage (E.Message);
Exit;
end;
PUC-Rio - Certificação Digital Nº 0621292/CA

on E2 : Exception do
begin
ShowMessage ('Query failed : ' + E2.Message);
Exit;
end;
end;

try
for Jx := 0 to SelCount - 1 do
columnsList [Jx] := SelList[Jx];

Jx := 0;

RecLine := TStringList.Create;
RecLine.Delimiter := ';';

// Create MBA Object


if Assigned (MBAObj) then
MBAObj.Destroy;

MBAObj := TMBAObj.Create;

Memo1.Lines.add ('Lendo os registros... Por favor, aguarde...');


timestep := GetTickCount();
repeat
Inc (Jx);
auxStr := '';

for Ix := 0 to recset.Fields.Count - 1 do
begin
auxStr := auxStr + columnsList [Ix] + '_' + trim(recset.Fields[Ix].Value) + ';';
end;

RecLine.DelimitedText := Copy(auxStr, 1, length(auxStr)-1);


7 APÊNDICE A – Código da Implementação
54

MBAObj.FillAdjList (RecLine, 0);

recset.Move (1, EmptyParam);


until recset.EOF;
except
on E : Exception do
begin
ShowMessage ('Load result exception : ' + E.Message);
end;
end;
timestep := GetTickCount() - timestep;
Memo1.Lines.add ('Cálculo das relações durou ' + IntToStr (timestep) + 'ms ...');
// ShowMessage ('Result Count = ' + inttostr(Jx));
PrintRelations;
end;

end.

Unit MBAObject – MBAObject.pas

(*******************************************************************************
* PONTIFICIA UNIVERSIDADE CATÓLICA DO RIO DE JANEIRO - PUC-RIO
*
* Programa de Pós-Graduação em Informática - Mestrado
PUC-Rio - Certificação Digital Nº 0621292/CA

*
* Programa apresentado como requisito parcial para o cumprimento dos créditos da
* cadeira de Projeto Final de Programação (INF 2102).
*
* Aluna: Livia Fonseca Fracalanza
* Matricula : 0621292
* Orientador: Prof. Marco Antonio Casanova
*******************************************************************************)
unit MBAObject;

interface

uses
SysUtils, Variants, Classes;

const
M_WEIGHT = 1;
AVERAGE = 2;

const
INITIALWEIGHT = -999999999;

type
TProduct = class(TObject)
ID : string;
Qtd : Integer;
List : TStringList;
private
//
public
constructor Create;
destructor Destroy;
end;

type
7 APÊNDICE A – Código da Implementação
55

TMBAObj = class
private
AdjList : TStringList; // Has the relations between the elements of all the
transactions
MaximumCliqueList : TStringList; // Represent the Maximum Clique found
MaxCWt : Double;

function DestroyAdjList : Integer;


function getResultAdjList: TStringList;
function getMaximumCliqueList: TStringList;
public
constructor Create;
destructor Destroy;

procedure FillAdjList (Line : TStringList; Start : Integer);


function Find_Clique(var Clique: TStringList; var Weight: Double; Criteria: Integer):
boolean;
function FindTheMaximalClique(Criteria: Integer): boolean;

property FAdjList : TStringList read getResultAdjList;


property FMaximumCliqueList : TStringList read getMaximumCliqueList;
property FMaxCliqueWeight : double read MaxCWt;
end;

implementation
PUC-Rio - Certificação Digital Nº 0621292/CA

(******************************************************************************)
constructor TMBAObj.Create;
begin
// Initialize List of Adjacencies
AdjList := TStringList.Create;

//Initialize the List that will have the Maximal Clique


MaximumCliqueList := TStringList.Create;
end;
(******************************************************************************)
destructor TMBAObj.Destroy;
begin
if Assigned(AdjList) then
DestroyAdjList;

if Assigned(MaximumCliqueList) then
FreeAndNil (MaximumCliqueList);
end;
(******************************************************************************)
function TMBAObj.DestroyAdjList : Integer;
var
i : Integer;
prod : TProduct;
begin
if Assigned (AdjList) then
begin
for i := AdjList.Count-1 downto 0 do
begin
if Assigned (AdjList.Objects[i]) then
begin
prod := TProduct(AdjList.Objects[i]);
FreeAndNil(prod);
end;
end;
FreeAndNil (AdjList);
7 APÊNDICE A – Código da Implementação
56

end;
end;
(******************************************************************************)
(*******************************************************************************
* Procedure: FillAdjList
* Descrição: É responsável pelo preenchimento da lista global de adjacências,
* fazendo as combinações de relacionamento entre os elementos de uma
* mesma transação.
* Parâmetros:
* Line - StringList com cada produto lido na linha da transação em uma posição
* Start - Inteiro que indica a posição de início da leitura da lista.
* Importante para a recursão.
*
* AE : Line.Count <> 0
* AS : AdjProd.Count > 0
*******************************************************************************)
procedure TMBAObj.FillAdjList (Line : TStringList; Start : Integer);
var
i : integer;
Pix, AIx : integer;
Produto1, Produto2 : TProduct;
AdjProd : TProduct;
begin
if (Line.Count -1) = Start then
exit;
PUC-Rio - Certificação Digital Nº 0621292/CA

Produto1 := TProduct.Create;
Produto1.ID := Line[Start];
Produto1.Qtd := 1;

// Do the items combinations


for i := Start+1 to Line.Count-1 do
begin
Produto2 := TProduct.Create;
Produto2.ID := Line[i];
Produto2.Qtd := 1;

// Add the product 1 to the Transactions Adj. List


PIx := AdjList.IndexOf(Produto1.ID);
if PIx < 0 then // is not at the adj. list
begin
//Memo1.Lines.ADD(' -> Adicionando à adj. List ' + Produto1.ID);
PIx := AdjList.AddObject(Produto1.ID, Produto1);
end;

AdjProd := TProduct(AdjList.Objects[PIx]);

AIx := AdjProd.List.IndexOf(Produto2.ID);
if AIx < 0 then
begin
//Memo1.Lines.ADD(' --> Adicionando à Lista de ' + Produto1.ID + ' o produto ' +
Produto2.ID);
AdjProd.List.AddObject(Produto2.ID, Produto2);
end
else
TProduct(AdjProd.List.Objects[AIx]).Qtd := TProduct(AdjProd.List.Objects[AIx]).Qtd
+ 1;

// Add the product 2 to the Transactions Adj. List


PIx := AdjList.IndexOf(Produto2.ID);
7 APÊNDICE A – Código da Implementação
57

if PIx < 0 then // is not at the adj. list


begin
//Memo1.Lines.ADD(' -> Adicionando à adj. List ' + Produto2.ID);
PIx := AdjList.AddObject(Produto2.ID, Produto2);
end;

AdjProd := TProduct(AdjList.Objects[PIx]);

AIx := AdjProd.List.IndexOf(Produto1.ID);
if AIx < 0 then
begin
//Memo1.Lines.ADD(' --> Adicionando à Lista de ' + Produto2.ID + ' o produto ' +
Produto1.ID);
AdjProd.List.AddObject(Produto1.ID, Produto1);
end
else
TProduct(AdjProd.List.Objects[AIx]).Qtd := TProduct(AdjProd.List.Objects[AIx]).Qtd
+ 1;
end;

FillAdjList (Line, Start+1);


end;
(******************************************************************************)
(*******************************************************************************
* Função: FindTheMaximalClique
PUC-Rio - Certificação Digital Nº 0621292/CA

* Descrição: Função faz chamadas a função Find_clique para cada nó da lista de


* adjacências. A clique representada pela variável LocalClique, começa
* com um elemento da lista de adjacências (elemento da vez na iteração)
* e com peso negativo (representado pela variável CliqueWeight). A
* variável MaxCliqueWeight guardará o valor da clique mais pesada de
* acordo com o critário escolhido, sendo inicializado, também, com va-
* lor negativo.
* Ao final do processamento, a clique encontrada é impressa, caso con-
* trário uma mensagem de que não foi possível encontrar uma clique é
* exibida.
*
* Parâmetros:
* Criteria - Inteiro que identifica qual critério será utilizado para o cálculo
da clique máxima. Assume os seguintes valores:
- M_WEIGHT = 1; Clique máxima pelo maior peso de relações
- AVERAGE = 2; Clique máxima pelo peso das relações dividido
pelo número de nós pertencentes a clique
*
* AE : -
* AS : -
*******************************************************************************)
function TMBAObj.FindTheMaximalClique (Criteria : Integer) : boolean;
var
i : Integer;
MaxCliqueWeight : Double;
LocalClique : TStringList;
CliqueWeight : Double;
begin
MaximumCliqueList.Clear;

try
LocalClique := TStringList.Create;
MaxCliqueWeight := INITIALWEIGHT;

for i := 0 to AdjList.Count-1 do
7 APÊNDICE A – Código da Implementação
58

begin
LocalClique.Clear;
CliqueWeight := INITIALWEIGHT;

LocalClique.Add(TProduct(AdjList.Objects[i]).ID);

if Find_Clique (LocalClique, CliqueWeight, Criteria) then


begin
if CliqueWeight >= MaxCliqueWeight then
begin
MaximumCliqueList.Assign(LocalClique);
MaxCliqueWeight := CliqueWeight;
end;
end;
end;

MaxCWt := MaxCliqueWeight;
finally
FreeAndNil(LocalClique);
end;
end;
(******************************************************************************)
(*******************************************************************************
* Função: Find_Clique
* Descrição: Função responsável por encontrar a clique máxima do grafo represen-
PUC-Rio - Certificação Digital Nº 0621292/CA

* tado pela lista de adjacências. O cálculo depende do critério esco-


* lhido. Se for máximo peso (M_WEIGHT) então o peso da clique é o so-
* matório dos pesos das relações entre os elementos. No caso do crité-
* rio de média (AVERAGE), o peso da clique é determinado pelo somatório
* dos pesos das relações entre os elementos dividido pelo número de
* nós adicionados na clique.
*
* Parâmetros:
* Clique - TStringList
* Weight - Valor Double
* Criteria - Inteiro que identifica qual critério será utilizado para o cálculo
* da clique máxima. Assume os seguintes valores:
* - M_WEIGHT = 1; Clique máxima pelo maior peso de relações
* - AVERAGE = 2; Clique máxima pelo peso das relações dividido
* pelo número de nós pertencentes a clique
*
* AE : -
* AS : -
*******************************************************************************)
function TMBAObj.Find_Clique (var Clique : TStringList; var Weight : Double; Criteria :
Integer) : boolean;
var
i, j : Integer;
Vertex : TProduct;
VIx : Integer;
FirstName : string;
begin
FirstName := Clique.Strings[0];

for i := AdjList.Count-1 downto 0 do


begin
if TProduct (AdjList.Objects[i]).ID = FirstName then
continue;

Vertex := TProduct (AdjList.Objects[i]);


7 APÊNDICE A – Código da Implementação
59

for j := Clique.Count-1 downto 0 do


begin
VIx := Vertex.List.IndexOf(Clique[j]);

{Se não é vizinho de algum dos nós já existentes na clique, então esta
não pode ser uma clique. A iteração é interrompida. }
if VIx < 0 then
begin
Result := FALSE; //Não encontrou uma clique
break;
end
else
begin
if Clique.IndexOf(Vertex.ID) < 0 then
begin
Result := TRUE;

Clique.Add(Vertex.ID);
if Weight = INITIALWEIGHT then //primeiro nó a entrar na lista
Weight := Vertex.Qtd
else
begin
if Criteria = M_WEIGHT then
Weight := Weight + Vertex.Qtd
else
PUC-Rio - Certificação Digital Nº 0621292/CA

Weight := (Weight + Vertex.Qtd)/Clique.Count;


end;
end;
end;
end;
end;
end;
(******************************************************************************)
function TMBAObj.getResultAdjList: TStringList;
begin
Result:= AdjList;
end;
(******************************************************************************)
function TMBAObj.getMaximumCliqueList: TStringList;
begin
Result:= MaximumCliqueList;
end;
(******************************************************************************)
(************************* Methods of TProduct Object *************************)
constructor TProduct.Create;
begin
List := TStringList.Create;
end;
(******************************************************************************)
destructor TProduct.Destroy;
begin
If Assigned(List) then
FreeAndNil (List);
end;
(******************************************************************************)
end.

You might also like