M.F.P. II - 1998/99 - Trabalho Laboratorial
[ DI/UM ]

Introdução

O técnico de informática dos dias de hoje confronta-se com uma vasta terminologia referente às infraestruturas de apoio à chamada sociedade da informação . Acrónimos como DM (= 'Data mining'), DW (= 'Data wharehousing'), OLAP (= 'On-line analytical processing'), EIS (= 'Executive information system') etc misturam-se uns com os outros para qualificar, afinal, toda e uma mesma coisa: a necessidade de dotar os executivos, os estrategas e os analistas (sejam estes sociais, empresariais, políticos etc) de técnicas efectivas para extracção de conhecimento oportuno e perspicaz a partir da vastíssima quantidade de informação que os sistemas de informação (tanto públicos como privados) acumulam diariamente.

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 .

Objectivo

A transformação dos dados no sentido em que acima se referiu torna-se um exercício gratificante se fôr realizada com bases em relações matemáticas permanentes entre estruturas de informação, tais como as que são estudadas nesta disciplina (por exemplo, a de isomorfismo ). A biblioteca de morfismos setcat.cam , escrita em CAMILA e disponível no material pedagógico desta disciplina, pode ser utilizada para, de forma económica, especificar formalmente as principais operações que estão subjacentes ao OLAP, por exemplo. É o que a seguir se ilustra.

Um Exemplo

Vejamos um exemplo da chamada análise multidimensional , uma das principais funcionalidades presentes em sistemas de OLAP.

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.)

ModeloCorVendedorVendas
Austin Azul A 7
Austin Preto C 6
Austin Preto A 3
Ford Branco A 4
Ford Azul B 6
Nissan Preto A 3

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.)

ModeloVendedorVendas
Austin A 10
Austin C 6
Ford A 4
Ford B 6
Nissan A 3
ModeloACB
Austin 10 6
Ford 4 6
Nissan 3

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.

Extensão

Repare-se antes de mais na simplicidade da especificação da análise acima descrita, obtida por composição de alguns morfismos 'standard'. É a escolha das projecções da função f por onde se começou que determina quais as dimensões do problema que vão ver mantidas e quais aquelas que vão ser ignoradas, ou consolidadas.

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    |
+--------+--------+----------+--------+


NB:
O quadro tal como se apresentou no início pode ser obtido correndo as seguintes funções dos módulos ffs.cam e io.cam:
?- ioTxt2File("x.html",ffs2HTMLtxt(t));
onde x.html é um identificador de ficheiro à escolha. Este ficheiro contém código HTML que pode ser visualizado externamente.

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.

O que é pedido, afinal?

Os requisitos deste trabalho são os seguintes:
1.
Pesquisa: Compilar informação sobre OLAP, EIS e 'Data mining'.

Sugestão: Esta informação pode ser obtida de outras disciplinas, na INTERNET, etc.

2.

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.

NB: Exercícios da sebenta como, por exemplo, o 2.56 ajudam a ver como abordar formalmente a funcionalidade de 'drill-down', por exemplo. A formalização de hierarquias pode ser adaptada do Exercício 2.64.

3.

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.

Importante: o material pedagógico incluirá muito brevemente um pacote adicional que ilustrará como é realizada a ligação CAMILA -WINDOWS .

4.

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.

5.

Relatório: Deverá ser escrito um relatório succinto (mas cuidado) e preparada uma demonstração do protótipo do sistema especificado no trabalho.

Quaisquer dificuldades na utilização do material pedagógico devem ser comunicadas à equipa docente por e-mail.


Voltar à página principal de MFP-II .
Outras disciplinas leccionadas pelo DIUM

4/29/1999
Jose Nuno Oliveira