Professional Documents
Culture Documents
Fracalanza 2009
Fracalanza 2009
Dissertação de Mestrado
Rio de Janeiro
Maio de 2009
Livia Fonseca Fracalanza
Ficha Catalográfica
PUC-Rio - Certificação Digital Nº 0621292/CA
Dissertação (Mestrado em
Informática)–Pontifícia Universidade
Católica do Rio de Janeiro, Rio de Janeiro,
2009.
Inclui bibliografia
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.
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.
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
4 Testes e Resultados 31
4.1. Descrição do Ambiente de Testes – Protótipo 31
4.2. Testes 34
6 Referências 43
1
Introdução
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.
1.1.
Motivação
1.2.
Objetivos
1.3.
Trabalhos Relacionados
1.4.
Organização do Trabalho
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
2.1.
Processo de Busca de Conhecimento (KDD)
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.
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).
2.2.
Tipos de Predição
2.2.1.
Classificação
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
2.2.3.
Regressão
nos outros atributos disponíveis e nas outras ocorrências disponíveis para análise.
2.2.4.
Associação
2.3.
Técnicas de Mineração de Dados
2.3.1.
Algoritmo Genético
2.3.2.
PUC-Rio - Certificação Digital Nº 0621292/CA
Redes Neurais
2.3.3.
Árvores de Decisão
2.3.4.
Regras de Associação
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
2.4.
Aplicações
3
Market Basket Analysis - MBA
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.
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.
3.2.
Regras de Associação
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.
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:
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
3.3.
Algoritmos de MBA
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
3.3.2.
Set-oriented Mining
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
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
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
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
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
3.4.2.
Montando a Matriz de Adjacências
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
3.4.3.
Buscando a Clique de Tamanho Máximo
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).
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.
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.
4
Testes e Resultados
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
4.1.
Descrição do Ambiente de Testes – Protótipo
ODBC, é genérico a qualquer tipo de base e não somente às bases com a tecnologia da
Stone Age Tech.
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.
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
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.
• 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
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
• sexo
• estado civil
PUC-Rio - Certificação Digital Nº 0621292/CA
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.
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
- ESTCIVIL_-_NAO
- FX_AB_-_NAO
- CITIFINANCIA_-_NAO
- IND_CPF_-_NAO
2140775
5
Conclusão e Trabalhos Futuros
5.1.
Conclusões
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.
5.2.
Trabalhos Futuros
6
Referências
[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
7
APÊNDICE A – Código da Implementação
(*******************************************************************************
* 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
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;
MBAObj := TMBAObj.Create;
// Read the Transaction File and Set the Adjacent List, constructing the Graph
ReadFile;
* 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);
PList.DelimitedText := TransactionLine;
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('}');
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
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;
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;
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;
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];
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 := ';';
MBAObj := TMBAObj.Create;
for Ix := 0 to recset.Fields.Count - 1 do
begin
auxStr := auxStr + columnsList [Ix] + '_' + trim(recset.Fields[Ix].Value) + ';';
end;
end.
(*******************************************************************************
* 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;
implementation
PUC-Rio - Certificação Digital Nº 0621292/CA
(******************************************************************************)
constructor TMBAObj.Create;
begin
// Initialize List of Adjacencies
AdjList := TStringList.Create;
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;
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;
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;
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);
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
{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