M.F.P. II - 1998/99 - Trabalho Laboratorial | |
---|---|
[ DI/UM ] |
Não basta acumular dados. É preciso saber separar aquilo que é essencial daquilo que é acessório, extrarir as correlações permanentes das que são ocasionais, enfim, identificar o conhecimento útil que tantos dados encerram. Em suma, saber separar o «minério» da «ganga» -- que é, afinal, o que o termo 'Data mining' tão felizmente consagra.
Em cada situação concreta, tudo isto tem de poder vir a acontecer com rapidez, em qualidade e em quantidade, sob pena de se perder de todo a vantagem competitiva que hoje representa o estar-se informado . Perante este desafio tecnológico, os meios tradicionais de interrogação ('querying') e de processamento de dados esgotaram-se e deram origem a novas e mais sofisticadas tecnologias. Embora os conceitos essenciais tenham permanecido os mesmos, saber analisar passou a significar não só seleccionar e projectar mas também abstrair e classificar e, sobretudo, transformar .
Vamos supor que a tabela ao lado representa um fragmento dos dados que os gestores de uma empresa de comércio automóvel têm registados quanto ao exercício do ano corrente. (Este exemplo é adaptado do relatório Especificação Formal da Camada de Apresentação - Uma Biblioteca de Componentes de Visualização , por L.G. Ferreira, Mestrado em Informática, U.M., 1996.) |
|
Pretendendo apurar se existe alguma correlação entre os seus vendedores e os modelos vendidos, os gestores da empresa gostariam de obter, de imediato e de forma simples, qualquer dos quadros ao lado, onde a dimensão Cor é ignorada. (Repare-se que, embora a diferença entre os dois quadros seja de ordem visual, isto é «cosmética», o quadro da direita é mais agradável de consultar.) |
|
Vejamos agora como os morfismos de setcat.cam nos ajudam a especificar esta funcionalidade. O primeiro quadro é a seguinte relação em (Modelo ×Cor ×Vendedor ×Vendas)-set, onde Modelo = Cor = Vendedor = STR e Vendas = INT:
t <- { < "Austin","Azul","A",7 >, < "Austin","Preto","C",6 >, < "Austin","Preto","A",3 >, < "Ford","Branco","A",4 >, < "Ford","Azul","B",6 >, < "Nissan","Preto","A",3 >};
(Usa-se sintaxe concreta CAMILA para mais facilmente se poder animar esta exemplificação.)
Começemos por «agrupar» os atributos (dimensões) que queremos correlacionar (Modelo e Vendedor) correndo t1<- f-set(t) onde f é a função split(split(p1,p3),split(p2,p4)). Ter-se-á assim obtido:
t1 = { < < "Austin","A">,< "Azul",7 > >, < < "Austin","C">,< "Preto",6 > >, < < "Austin","A">,< "Preto",3 > >, < < "Ford","A">,< "Branco",4 > >, < < "Ford","B">,< "Azul",6 > >, < < "Nissan","A">,< "Preto",3 > >};O isolamento entre o «minério» e a «ganga» obtém-se aplicando o morfismo collect a t1, obtendo-se:
t2 = [ < "Austin","A">->{ < "Azul",7 >,< "Preto",3 >}, < "Austin","C">->{ < "Preto",6 >}, < "Ford","A">->{ < "Branco",4 >}, < "Ford","B">->{ < "Azul",6 >}, < "Nissan","A">->{ < "Preto",3 >} ];Falta apenas totalizar as vendas no codomínio. Para isso basta calcular
t3 <- (*->tot)(t2);onde tot é a função tot2(add,0), sendo tot2 o hilomorfismo de setcat.cam que totaliza a segunda projecção de uma relação binária segundo um monóide, no nosso caso a soma (add) com elemento neutro 0.
Repare-se que a função finita t3 que se obteve,
[ < "Austin","A">->10 , < "Austin","C">->6 , < "Ford","A">->4 , < "Ford","B">->6 , < "Nissan","A">->3 ];corresponde já à tabela de duas entradas que acima se apresentou.
Contudo, para termos uma análise multidimensional suficientemente genérica será conveniente ter em conta dois aspectos: (a) é mais prático trabalhar com identificadores de atributos do que com projecções matemáticas de produtos; (b) na via real podem existir tabelas com atributos omissos, o que destrói alguma da simplicidade do raciocínio que se fez.
Nesse sentido, tuplos de relações como as que acima se manipularam podem ser, com benefício, representados por estruturas atributivas, isto é, funções finitas de identificadores de atributos para valores desses atributos, existindo um módulo (ffs.cam) na biblioteca CAMILA standard dedicado a este tipo de estruturas. Por exemplo, a relação t que acima se apresentou dá lugar ao conjunto de tuplos atributivos que se segue:
t <- { [ "Modelo"->"Austin", "Cor"->"Azul", "Vendedor"->"A", "Vendas"->7 ], [ "Modelo"->"Austin", "Cor"->"Preto", "Vendedor"->"C", "Vendas"->6 ], [ "Modelo"->"Austin", "Cor"->"Preto", "Vendedor"->"A", "Vendas"->3 ], [ "Modelo"->"Ford", "Cor"->"Branco", "Vendedor"->"A", "Vendas"->4 ], [ "Modelo"->"Ford", "Cor"->"Azul", "Vendedor"->"B", "Vendas"->6 ], [ "Modelo"->"Nissan", "Cor"->"Preto", "Vendedor"->"A", "Vendas"->3 ]};que pode ser visualizada directamente usando a função ioAfsPrint da biblioteca io.cam:
?- ioAfsPrint(t); +--------+--------+----------+--------+ | Modelo | Cor | Vendedor | Vendas | +--------+--------+----------+--------+ | Austin | Azul | A | 7 | | Austin | Preto | C | 6 | | Austin | Preto | A | 3 | | Ford | Branco | A | 4 | | Ford | Azul | B | 6 | | Nissan | Preto | A | 3 | +--------+--------+----------+--------+ |
|
Carregue o ficheiro olap.cam que está disponível no material pedagógico da disciplina e corra Init(); seguido de ioAfsPrint(t); confirmando que em t está guardada a nossa tabela acima.
Vamos agora usar a função mda (acrónimo de 'multi-dimensional analysis' ) para realizar as operações acima exemplificadas. O primeiro parâmetro a passar a esta função é o conjunto de atributos (dimensões) que queremos correlacionar, eg: {"Modelo","Vendedor"}; o segundo indicará qual o atributo sobre cujos valores se vai fazer a totalização (consolidação), eg: "Vendas"; finalmente, o terceiro e o quarto indicarão o monóide que está na base da consolidação, eg: add e 0. Ter-se-á, então:
?- ioAfsPrint(mda({"Modelo","Vendedor"},"Vendas",add,0)(t)); +--------+----------+--------+ | Modelo | Vendedor | Vendas | +--------+----------+--------+ | Austin | A | 10 | | Austin | C | 6 | | Ford | A | 4 | | Ford | B | 6 | | Nissan | A | 3 | +--------+----------+--------+ou, se quisermos uma visualização em tabela de duas entradas:
?- t1 <- mda({"Modelo","Vendedor"},"Vendas",add,0)(t); t1 ?- ioAfsPrint(twodim("Modelo","Vendedor","Vendas")(t1)); +--------+----+---+---+ | Modelo | A | C | B | +--------+----+---+---+ | Austin | 10 | 6 | | | Ford | 4 | | 6 | | Nissan | 3 | | | +--------+----+---+---+onde twodim é uma função também disponível em olap.cam.
Pode testar-se o comportamento desta função com outras análises, por exemplo reduzindo os atributos a reter, eg
?- ioAfsPrint(mda({"Modelo"},"Vendas",add,0)(t)); +--------+--------+ | Modelo | Vendas | +--------+--------+ | Austin | 16 | | Ford | 10 | | Nissan | 3 | +--------+--------+ou mesmo
?- ioAfsPrint(mda({},"Vendas",add,0)(t)); +--------+ | Vendas | +--------+ | 29 | +--------+ou mudando o monóide de consolidação, eg
?- ioAfsPrint(mda({"Modelo","Vendedor"},"Vendas",mul,1)(t)); +--------+----------+--------+ | Modelo | Vendedor | Vendas | +--------+----------+--------+ | Austin | A | 21 | | Austin | C | 6 | | Ford | A | 4 | | Ford | B | 6 | | Nissan | A | 3 | +--------+----------+--------+ainda que tal não faça sentido no contexto em jogo.
Pesquisa: Compilar informação sobre OLAP, EIS e 'Data mining'. |
|
Métodos Formais: (A mais importante.) No ficheiro olap.cam apenas está especificada a funcionalidade de análise multidimensional. Após o seu estudo cuidadoso, há que especificar formalmente as outras funcionalidades típicas, por exemplo: rotação , 'ranging', hierarquização , 'roll-up', 'drill-down', 'reach-through', etc. |
|
Tecnologia: O protótipo resultante da extensão a olap.cam desenvolvida na alínea anterior deverá ser embebido numa API em C/VISUAL BASIC por forma a poder ser usado em ambiente WINDOWS . Usar-se-á troca de dados via ACTIVEX entre o protótipo e o EXCEL como técnica de visualização. |
|
Integração: (Opcional, apenas para quem estiver a realizar o trabalho da disciplina Sistemas de Dados para Suporte à Decisão .) Nesta disciplina irá ficar disponível um 'data wharehouse' cujos dados podem ser analizados via olap.cam. Nesta configuração, os dados carregados via Init(); não residem em olap.cam mas são antes extraídos do 'data wharehouse' externo, via uma adequada função de abstracção. |
Relatório: Deverá ser escrito um relatório succinto (mas cuidado) e preparada uma demonstração do protótipo do sistema especificado no trabalho. |