Untitled - aplicação prática de um ambiente simulacional e análise

Propaganda
ii
Relatório de Projecto
Data Mining associado ao Diagnóstico Médico
José Miguel Bernardo Cordeiro
20186
Instituto Politécnico de Bragança
Escola Superior de Tecnologia e Gestão
Bragança
Engenharia Informática
3o Ano
[email protected]
Setembro 2011
A Escola Superior de Tecnologia e Gestão não se responsabiliza pelas opiniões expressas neste
relatório.
ii
Aprovações
Certifico que li este relatório e que na minha opinião, é adequado no seu conteúdo e forma como
demonstrador do trabalho desenvolvido no âmbito da disciplina de Projecto.
_____________________________________
Prof. Doutor Paulo Matos – Orientador
Certifico que li este relatório e que na minha opinião, é adequado no seu conteúdo e forma
como demonstrador do trabalho desenvolvido no âmbito da disciplina de Projecto.
_____________________________________
Prof. Arguente
Aceite para avaliação da unidade curricular de Projecto
iii
iv
Abstract
Having access to accurate and organized is an asset for any decision process.
This project stems from a concern shown by the stakeholders of the problem domain, healthcare professionals, to achieve greater efficiency in the use of antibiotics. It is thought that the
medic history of the patients can be used to help choose the more appropriate antibiotic to
prescribe in each case.
This project is therefore to explore the existing data, including using Data-Mining techniques to extract hidden or not easily identifiable information from the data, in order to ascertain
the feasibility and usefulness of such data for the problem at hand.
vi
Resumo
Ter a informação correcta e organizada é uma mais-valia para qualquer processo de decisão.
Este projecto resulta de uma preocupação demonstrada por parte dos próprios intervenientes
do domínio do problema, os profissionais de saúde, no sentido de obter uma maior eficácia na
utilização de antibióticos. Pensa-se que a informação existente sobre o histórico dos vários
utentes possa ser utilizada para identificar o antibiótico a receitar mais adequado a cada caso.
Este projecto tem assim por objectivo explorar os dados existentes, nomeadamente com recurso a técnicas de Data-Mining no sentido de extrair informação que à partida não é facilmente
identificável, no sentido de averiguar a viabilidade e utilidade desses dados para o problema em
questão.
Palavras-chave: Data-Mining, Extracção de conhecimento.
viii
Agradecimentos
Durante o último ano em que estive envolvido neste projecto de investigação e análise desta
tecnologia, tive a oportunidade de contar com o apoio de várias pessoas que contribuíram para
a realização deste projecto.
Em primeiro lugar, quero agradecer ao meu orientador, Professor Paulo Matos, pela ajuda e
pela sua visão simples e crítica de ver os problemas para a realização deste projecto.
Também quero agradecer à minha família e amigos que estiveram sempre perto de mim e
que me apoiaram durante o difícil e duro percurso que é a licenciatura.
Também quero agradecer à comunidade que contribuiu para a criação do LATEX que é uma
ferramenta espantosa de criar texto saindo este relatório através dessa ferramenta.
E por fim, quero agradecer ao Instituto Politécnico de Bragança por me ter acolhido e me
ter proporcionado dos 3 melhores anos da minha vida.
A todos, os meus maiores agradecimentos!
x
Lista de abreviaturas
• BD – Base de Dados
• BIDS – Business Intelligence Development Studio
• CSV – Comma separated value
• DM – Data-Mining
• GUI – Graphical User Interface
• IDE – Integrated Development Environment
• JDBC – Java Database Connectivity
• MD – Mineração de Dados
• SGBD – Sistema de Gestão de Base de Dados
• SQL - Structured Query Language
• YACC – Yet Another Compiler Compiler
xii
Índice
1
2
3
4
Introdução e Objectivos
1
1.1
Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2
Objectivo do projecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3
Estrutura do documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
Conceitos
5
2.1
Data-Mining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.2
Tipos de abordagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.2.1
Classificação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.2.2
Clustering (ou Segmentação) . . . . . . . . . . . . . . . . . . . . . . .
8
2.2.3
Associação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.2.4
Regressão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.2.5
Previsão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2.6
Análise Sequencial . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2.7
Análise de desvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
Ferramentas utilizadas
11
3.1
Weka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.2
MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
3.3
NetBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.4
Outras ferramentas Data Mining existentes . . . . . . . . . . . . . . . . . . . .
14
3.4.1
BIDS (comercial) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.4.2
Tanagra (gratuíto e de código aberto) . . . . . . . . . . . . . . . . . .
15
Implementação
17
4.1
Descrição do Dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
4.2
Análise do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
4.3
Formulação do processo de mineração . . . . . . . . . . . . . . . . . . . . . .
21
4.3.1
Problemas resultantes do modelo de mineração . . . . . . . . . . . . .
22
4.3.2
Decisões para a resolução dos problemas . . . . . . . . . . . . . . . .
22
Aplicação do Algoritmo de Data Mining . . . . . . . . . . . . . . . . . . . . .
27
4.4
xiii
4.5
4.6
4.7
Como gerar resultados através do Weka . . . . . . . . . . . . . . . . . . . . .
Síntese dos resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Análise crítica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
30
33
Conclusões
5.1 Análise crítica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Trabalho Futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
35
36
A Código
A.1 SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.2 Rotina para geração dos ficheiros CSV . . . . . . . . . . . . . . . . . . . . . .
39
39
45
5
xiv
Lista de Figuras
2.1
Àrvore de decisão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1
3.2
3.3
3.4
3.5
3.6
GUI do Weka. . . . . . . . . . . . . . . .
Ave Weka inspirada no programa de MD.
Logo MySQL. . . . . . . . . . . . . . . .
Logo do IDE NetBeans. . . . . . . . . . .
Logo do BIDS. . . . . . . . . . . . . . .
Logo Tanagra. . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
11
12
13
14
15
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
4.15
Imagem do dataset original montada numa BD. . . . . . . . . . . .
Exemplo do dataset a criar para o modelo de mineração. . . . . . .
Ligações da tabela da BD. . . . . . . . . . . . . . . . . . . . . . .
Resultado da simplificação da tabela principal. . . . . . . . . . . . .
Resultados do valor da Sensibilidade. . . . . . . . . . . . . . . . .
Resultado da combinação antibiótico/microorganismo e vice-versa. .
Resultado de combinações repetidas. . . . . . . . . . . . . . . . . .
Representação do algoritmo k-means. . . . . . . . . . . . . . . . .
Escolha do método clustering e do algoritmo. . . . . . . . . . . . .
Escolha dos parâmetros do algoritmo k-means. . . . . . . . . . . .
Começar a gerar resultados . . . . . . . . . . . . . . . . . . . . . .
Resultados Exemplo 1. . . . . . . . . . . . . . . . . . . . . . . . .
Resultados Exemplo 2. . . . . . . . . . . . . . . . . . . . . . . . .
Resultados Exemplo 3. . . . . . . . . . . . . . . . . . . . . . . . .
Resultados Exemplo 4. . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
21
23
23
24
25
26
27
28
28
29
30
31
32
32
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
xv
xvi
Capítulo 1
Introdução e Objectivos
1.1
Introdução
O evoluir da informática e dos meios de comunicação potenciou o crescimento da sociedade da
informação. O que era outrora desprezado pelo facto de ser inconsistente, redundante, disperso,
de pouca utilidade, deu origem a informação estruturada, classificada e de uma enorme utilidade
e influência para a sociedade em geral. Hoje em dia sabe-se o valor real dessa informação, que
condiciona tudo e todos, desde a economia à política. Ter informação é um trunfo, uma mais
valia, uma vantagem concorrencial.
É assim natural o aparecimento exponencial de fontes de informação, cada vez com dados
de maior qualidade e em maior quantidade. Percebeu-se inclusive que a prospecção dessas
fontes de dados permitia obter informação, e até mesmo conhecimento, que à partida não seria
previsível obter. É nesta realidade que surge este trabalho de projecto, que pretende tirar partido
das tecnologias emergentes desta realidade, para aferir novas informações e mais conhecimento,
neste caso, aplicado à área da saúde.
Este projecto resulta de uma preocupação manifestada pelos próprios intervenientes do
domínio do problema: os profissionais da saúde. Segundo estes, determinados microorganismos (vírus e bactérias) têm demonstrado uma enorme capacidade de adaptação que lhes permite
ser imunes aos novos antibióticos, reduzindo o efeito destes ou chegando mesmo a torná-los obsoletos. O caso é de maior gravidade nos espaços de saúde pública, que são sistematicamente
expostos a novas estirpes trazidas pelos utentes. Estes locais acabam por funcionar eles próprios
como incubadoras e fontes indesejáveis de propagação desses mesmos vírus e bactérias.
Ter informação actualizada sobre a manifestação destas estripes ou variantes, ou simplesmente identificar casos problemáticos de utentes que de alguma forma carregam consigo estes
microorganismos, é fundamental para despoletar acções que permitam controlar a sua propagação. Trata-se de uma questão de saúde pública, merecedora da nossa maior atenção, pois
como se diz na gíria "com a saúde não se brinca!".
Um dos grandes desafios da medicina actual é garantir um controlo mais afinado da apli1
cação dos antibióticos. A sua utilização de forma desmedida como recurso para todos os males,
que muitas vezes nem sequer tem em conta um diagnóstico preciso e o historial clínico do paciente, levou a que as bactérias e vírus se fossem adaptando, tornando-se mais resistentes ou
mesmo imunes a esses antibióticos. Casos há, que já só com as soluções mais agressivas é que
se consegue tratar os pacientes.
Ter presente o historial clínico do paciente é muito importante para se receitar o antibiótico
adequado, aquele que vai permitir curar o paciente sem no entanto recorrer a soluções mais
agressivas, ou que devem ser salvaguardadas para casos mais graves, ou para outro tipo de
diagnósticos.
É também sabido que mesmo perante o mesmo diagnóstico, a reacção dos pacientes a um
determinado antibiótico, nem sempre é igual. Novamente, o historial clínico tem um peso
importante na compreensão deste fenómeno, mas também a própria fisionomia do paciente,
entre outros elementos.
1.2
Objectivo do projecto
O objectivo deste projecto é desenvolver um modelo de mineração de dados (MD) que permita
caracterizar e agrupar os utentes segundo o seu historial de análises e a sua fisionomia. Esperase que este modelo possa posteriormente ser utilizado num sistema de apoio à decisão que
permita identificar os antibióticos mais adequados a receitar para cada tipo de caso.
2
1.3
Estrutura do documento
A estrutura deste relatório foi criada com o objectivo de que o leitor perceba o que se pretende,
o que contém e o que se realizou ao longo projecto.
O primeiro capítulo pretende enquadrar o leitor para o tema do projecto, mostrando a motivação deste, os objectivos e também a forma como o relatório de final de curso está estruturado.
O segundo capítulo mostra os conceitos de MD e as abordagens genéricas deste tema.
O terceiro capítulo fala das ferramentas utilizadas na elaboração deste projecto e de outras
ferramentas que se poderiam utilizar.
O quarto capítulo é sobre a implementação, onde está presente, a descrição do dataset; uma
análise do problema; formulação do modelo de mineração; problemas resultantes do modelo de
mineração; decisões para a resolução dos problemas, aplicação do algoritmo utilizado; síntese
dos resultados e, por fim, uma análise crítica dos resultados obtidos.
O quinto e último capítulo encontram-se as conclusões com uma análise crítica e possíveis
trabalhos futuros.
3
4
Capítulo 2
Conceitos
2.1
Data-Mining
Data-mining (DM) [11, 9, 23, 4, 13, 24], ou Mineração de Dados (MD), é o processo de explorar
grandes quantidades de dados à procura de padrões e relações entre dados. “Este processo
permite encontrar informação valiosa só pelo facto de analisar dados”. [1]
O ser humano aprendeu com a observação de padrões, com a formulação de hipóteses e com
a realização de testes para descobrir novas regras. Mas quando a quantidade de informação é de
tal forma gigantesca um ser humano não consegue assimilar tantos conteúdos, pois a solução
encontrada foi usar o computador para detectar relações novas e úteis.
A ideia é contruir um programa que passe por bases de dados e procure padrões ou informação semelhante, para depois prever, classificar ou associar acertadamente dados que se
poderão adicionar posteriormente. Poderá surgir dificuldades porque muitos padrões são banais, outros poderão ser coincidentes e os dados reais sejam imperfeitos, porque há sempre
dados ilegíveis e falta dados, por isso, tudo que poderá ser descoberto, poderá não ser exacto.
Os algoritmos precisam de ser capazes de lidar com os dados e extrair regularidades que não
são exactas mas que poderão ser úteis mais tarde.
Hoje em dia, a MD surge para ser aplicada para a pesquisa científica ou até para estimular
os lucros de empresas.
Um dos exemplos que se destaca, é o de uma empresa de seguros, que experimentou esta
tecnologia e obteve resultados interessantes, em que os clientes que cancelavam os seus seguros
de saúde eram aqueles que menos o usavam. Para não estarem a perder clientes iniciaram uma
nova campanha, porque conquistar um novo cliente pode custar sete vezes mais do que manter um cliente antigo. Com outro cruzamento de dados, puderam verificar quais os clientes
com maior hipótese de comprar um seguro para os carros, então fizeram novos contratos com
clientes para ter ambos os seguros a um preço reduzido. Contudo, apesar da empresa ganhar
menos com este novo método, o facto é que resultou, obtendo mais lucros graças a esta tecnologia. Outro exemplo a ter em conta e que ficou para a história, é o de uma empresa que pegou
5
na sua Data-Warehouse1 e descobriu que às sextas-feiras, homens entre os 20 e 35 anos que
compravam fraldas descartáveis, também compravam cerveja. A partir desta constatação, e por
experiência, puseram os produtos lado a lado, sendo o resultado o previsto, ou seja, a venda de
cerveja e fraldas descartáveis disparou.
_________
1 - Uma Data-Warehouse é uma base dados construída com o propósito de integrar grandes
quantidades de dados e facultar um acesso mais rápido e eficiente para efeitos de análise.
6
2.2
2.2.1
Tipos de abordagem
Classificação
Uma das abordagens mais utilizadas na resolução de problemas de MD, é a classificação [12,
17, 3]. Como o próprio nome deixa antever, a ideia é classificar elementos segundo métricas
discretas que são previamente definidas. É o tipo de solução cuja aprendizagem é normalmente
supervisionada, o que significa que, com base em exemplos, tenta-se construir um modelo que
permita posteriormente efectuar a classificação dos elementos de entrada.
Os modelos criados são normalmente do tipo árvores (de decisão) ou conjunto de regras.
O algoritmo J48 (ou C4.5) permite obter uma árvore de decisão com base em informação
previamente obtida (dataset, ou dados de uma base de dados, etc.).
Temos como exemplo, a decisão de uma criança ir para a rua brincar. Aplicando o algoritmo,
obtém-se a árvore de decisão na figura 2.1.
Figura 2.1: Àrvore de decisão.
Então a figura 2.1 mostra que:
• quando está nublado vai brincar.
• quando está sol e a humidade estiver:
alta, não vai brincar.
normal, vai brincar.
• quando está a chover:
se houver vento, não vai brincar.
se não houver vento, vai brincar.
7
2.2.2
Clustering (ou Segmentação)
O método de clustering [7], com base num conjunto de objectos de dados, tenta identificar
grupos onde os elementos sejam similares entre si. Os não similares ficam fora do cluster
ou dentro de outro(s) cluster(s), porque um elemento pode ter várias afinidades com outros
elementos de outros grupos. É um tipo de classificação não supervisionada, ou seja, o algoritmo
tenta segmentar os elementos agrupando-os com a afinidade que têm.
Para esta abordagem existem algoritmos como EM, K-means, etc.
2.2.3
Associação
A associação [12, 22, 8] identifica e caracteriza ligações naturais que podem existir entre classes,
com o objectivo de identificar associações relevantes entre elementos e definir regras que caracterizam essas associações para obter melhor informação.
Esta técnica é umas das melhores técnicas de MD para descobrir informação ignorada. A
ideia é identificar itens consistentes e verificar a sua ocorrência relativamente a outros itens.
2.2.4
Regressão
A regressão [12] é semelhante à classificação mas aplicada a um domínio continuo, ou seja,
não se pretende classificar segundo uma escala discreta, mas sobre uma escala contínua. Então,
para um conjunto de entradas, pretende-se saber qual o valor que deverá corresponder ao valor
de saída segundo uma abordagem genérica onde é possível utilizar técnicas de regressão linear,
árvores de regressão ou redes neuronais.
8
2.2.5
Previsão
A previsão [17, 12] visa identificar efeitos sazonais e tendências em séries de dados temporais.
O que permite prever a evolução futura dessas séries, com base nos valores passados. É útil
para identificar fenómenos tendenciais como estimar a evolução dos mercados financeiros, ou
mesmo prever a evolução do consumo de um determinado bem ou serviço.
2.2.6
Análise Sequencial
A análise sequêncial [12] é uma técnica que pretende identificar padrões comportamentais em
séries de eventos designados por sequências. Esta, consegue perceber o percurso de ligações,
operações que executa, que páginas consulta, entre outros, dos utilizadores num determinado
site. Com base nesses padrões consegue determinar os percursos mais utilizados. É semelhante
à previsão em que aqui entram valores discretos ou estados.
2.2.7
Análise de desvio
A análise de desvio [12] identifica padrões comportamentais que raramente surgem, como por
exemplo, identificar acessos ilegais ou não desejados a sites ou também o uso de determinados serviços que alguém não subscreveu. Podem ser aplicadas às árvores de decisão, redes
neuronais ou mesmo técnicas de clustering.
9
10
Capítulo 3
Ferramentas utilizadas
3.1
Weka
Weka [26, 15] é um software, feito em Java e livre, que agrega algoritmos que provém da área
da inteligência artificial. Assim, faz com que o computador aprenda através do uso de um
algoritmo dessa área. Este procede à análise dos dados fornecidos, recorrendo à técnica de MD
tentanto encontrar padrões para gerar hipóteses e soluções.
Figura 3.1: GUI do Weka.
O Weka é uma boa ferramenta, mas tem um grande
defeito, é que existe pouca documentação e o interface
é bastante confuso e difícil de manusear. A título de curiosidade, o weka é uma ave neozelandesa que está em
perigo de extinção (figura 3.2). É conhecida pela sua
curiosidade e agressividade. Esta ave dá nome a uma
vasta colecção de algoritmos de máquinas de conhecimento.
O Weka contém as ferramentas necessárias para re- Figura 3.2: Ave Weka inspirada no
alizar transformações sobre os dados, tarefas de clas- programa de MD.
sificação, regressão, clustering, associação e visualização. Podendo também adicionar novas funcionalidades.
11
3.2
MySQL
MySQL [19, 21, 20] é um sistema de gestão de BD, que usa a linguagem SQL. Foi escrito em C
e C++, para fazer o parser das queries usa o YACC. Este SGBD tem um grande sucesso pelo seu
desempenho, estabilidade, por ser fácil de instalar e configurar, por não exigir grandes recursos,
por existirem drivers para as principais plataformas de desenvolvimento (Java, PHP, .NET, etc),
por haver versões para os principais sistemas operativos UNIX, Windows e Macintosh, mas
principalmente porque é livre (baseado em GPL). É usado muitas vezes para suportar portais
e aplicações web e, também, para aplicações locais. É neste momento proprietário da Oracle,
mas antes passou pela Sun Microsystems.
Figura 3.3: Logo MySQL.
12
3.3
NetBeans
O NetBeans [25] é um IDE – Integrated Development Environment - gratuito e de código aberto
para programadores nas linguagens Java, C, C++, PHP, Groovy, Ruby, entre outras. Dado
ser implementado em Java pode ser utilizado em qualquer sistema operativo para o qual já
exista a Máquina Virtual do Java (JVM - Java Virtual Machine), o que actualmente abrange
praticamente todas as plataformas computacionais.
Pelo facto de ser uma aplicação de código aberto e por facultar soluções que permitem facilmente expandir as suas funcionalidades, o Netbeans disponibiliza um vasto conjunto de recursos para os programadores, capaz de suportar o desenvolvimento das mais diversas aplicações,
como web sites, web services, aplicações para dispositivos móveis, aplicações stand-alone, aplicações distribuídas, etc.
Como é comum nos IDE’s mais evoluídos, o Netbeans faculta um editor com tecnologia intellisense e highlight, compiladores e interpretadores, depuradores de código para as linguagens
já citadas, e muitos outros recursos que potenciam a produtividade de quem o utiliza.
Figura 3.4: Logo do IDE NetBeans.
13
3.4
3.4.1
Outras ferramentas Data Mining existentes
BIDS (comercial)
Business Intelligence Development Studio (BIDS) [27, 5, 14] é um IDE da Microsoft que é
parte integrante do SQL Server 2008 e que tem por base o Visual Studio 2008, parametrizado
para facultar recursos especializados para o desenvolvimento de soluções de análise de dados e
business intelligence1 .
O SQL Server é um servidor de base de dados relacionais, mas não só, é também capaz de
albergar Data-Warehouses, processos de integração de dados, processos de geração automática
de relatórios, entre outros. Faculta directamente ou através do BIDS vários recursos para a
análise de dados, designadamente por OLAP (On-line Analytical Processing) e por MD.
Figura 3.5: Logo do BIDS.
_________
1 - O business inteligence é o processo de organizar, analisar, partilhar e monitorizar as informações mais importantes para o trabalho final.
14
3.4.2
Tanagra (gratuíto e de código aberto)
Tal como o Weka, o Tanagra [18, 28] é um software livre e de código aberto, para análise de
dados, que inclui muitas soluções de MD, mas também de análise estatística. Este projecto vem
suceder a outro (SIPINA) que implementa vários algoritmos de aprendizagem com interacção
visual para construções de árvores de decisão. Este programa contém vários algoritmos de
aprendizagem supervisionada, bem como algoritmos de aprendizagem não supervisionada para
clustering, análise de desvio, etc.
O principal objectivo do Tanagra é facultar aos investigadores e estudantes uma framework
de suporte à investigação, que lhes permita testar os seus próprios algoritmos e compará-los com
os já existentes. É também um software fácil de usar, dado que, permite descrever os modelos
de mineração de forma gráfica e com recurso a uma interface desenvolvida propositadamente
para este efeito.
Figura 3.6: Logo Tanagra.
15
16
Capítulo 4
Implementação
É importante compreender que este é um trabalho de investigação aplicada, que parte de uma
hipótese e que essencialmente visa averiguar a viabilidade dessa hipótese, o que por si só se
mostrou uma tarefa muito complexa. Mesmo a formulação dessa hipótese não foi um trabalho
trivial. Pelas informações facultadas pelos profissionais da saúde era de acreditar haver um
enorme potencial nos dados existentes nas unidades de saúde.
Infelizmente, e apesar de haver muitos dados, a grande maioria são inacessíveis. Existe uma
clara falta de abertura das entidades responsáveis pelos sistemas de informação instalados nas
unidades de saúde. Acresce a isto, as normais preocupações sobre a privacidade dos dados. Mas
talvez o pior seja mesmo o facto de não haver uma integração e total cobertura dos sistemas
de informação. Do que resulta um conjunto de bases de dados independentes, redundantes,
incoerentes e pouco úteis para efectivamente rastrear o percurso dos utentes em termos clínicos.
Para complicar, uma parte significativa dos procedimentos clínicos não estão suportados pelos
sistemas de informação (diagnóstico médico, confirmação dos efeitos dos tratamentos, etc).
Pelo que foi muito moroso conseguir elementos concretos sobre os dados existentes. Quando se
refere isto, não se está a falar de dados concretos e reais, mas apenas do tipo de dados existentes
e do seu significado e utilidade.
Só quando se teve acesso a esta informação, é que foi possível efectuar uma análise desses
dados (entenda-se tipo de dados), para perceber o que se poderia fazer, nomeadamente no âmbito das preocupações manifestadas pelos profissionais de saúde. Contudo, a hipótese formulada foi aquela que se entendeu ser viável e de maior interesse para o domínio do problema.
Mesmo sabendo de antemão que a obtenção de resultados concretos seria uma tarefa muito
complexa.
17
4.1
Descrição do Dataset
Na impossibilidade de se fazer uso de dados reais, criou-se um dataset que tem por base os campos existentes no laboratório de análises clínicas, mas com dados que apesar de representativos
dessa realidade são fictícios.
O dataset utilizado representa assim uma hipotética realidade dos registos existentes sobre
as análises clínicas realizadas numa unidade hospitalar. Tentou-se dentro dos possíveis utilizar
a mesma terminologia e os mesmos conceitos que são utilizados no mundo real. Cada registo do
dataset representa a realização de uma análise de imunidade de um microorganismo a um antibiótico. Análise essa, que corresponde a uma de muitas que normalmente são solicitadas para
um utente num dado momento da sua vida. Cada lote de análises requisitadas está associado a
uma requisição. O microorganismo advém de uma amostra (sangue, urina, fezes, expectoração,
etc.) recolhida do utente.
Segunda a informação prestada, os dados existentes possuem os seguintes campos:
• NSF – é o código de identificação do utente, neste caso é um código fictício;
• Data_Nasc – representa a data de nascimento do utente;
• Data_Req – representa a data solicitada da análise;
• Proveniencia – identifica o local de onde foi efectuado o pedido da análise;
• Tipo_Exame – identifica o tipo de exame solicitado;
• Microorganismos – identifica o microorganismo para qual se vai verificar a imunidade;
• Antibiotico – identifica o antibiótico utilizado na análise;
• Sensibilidade – é o resultado da análise de imunidade do microorganismo ao antibiótico.
O resultado poderá ser sensível, significa que o microorganismo é afectado pelo antibiótico,
isto é, este faz efeito. Pode ser resistente, significa que para o utente e microorganismo em
questão, o antibiótico já não faz efeito, isto é, na amostra em causa o microorganismo é imune
ao antibiótico. E pode ser é indeterminado, o que significa que funcionou parcialmente, isto é,
afectou parte da amostra mas não toda a amostra (sinal de que já há alguma imunidade por parte
do microorganismo).
Como era possível, o conceito de Data_Req foi substituído por um outro, o de Episodio,
também utilizado neste contexto, mas mais útil para os objectivos deste projecto. Enquanto
a data de requisição é uma representação de uma data, o conceito de episódio aqui utilizado
funciona como um identificador relativo ao utente que faculta uma sequência temporal dos
vários episódios de um utente. Normalmente, são solicitadas várias análises de cada vez, isto é,
se o utente for hospitalizado o médico pode solicitar a realização de um conjunto de análises.
18
Cada conjunto de análises tem um número de episódio, que é sequencial para cada utente. A
primeira vez que são solicitadas análises para um utente corresponde ao episódio um.
Há ainda um segundo campo introduzido que é o ID e que serve para atribuir uma chave
única a cada registo, mas que não tem qualquer significado especial para lá disto. Isto porque,
com os campos base não é possível formar uma chave, mesmo que composta, que garanta a
unicidade dos registos.
Figura 4.1: Imagem do dataset original montada numa BD.
19
4.2
Análise do problema
Com o modelo de dados disponibilizado, o passo seguinte foi perceber o que é que se poderia
fazer com ele. Segundo este modelo, há um registo do histórico de análises efectuadas por
cada paciente. Análises essas, que de alguma forma descrevem a sensibilidade do utente (mais
concretamente dos microorganismos do utente) aos antibióticos.
Sabe-se também que os resultados das análises são utilizados pelos médicos para decidirem
que antibiótico receitar ao utente. Não foi possível obter dados que permitissem confirmar
concretamente qual o antibiótico efectivamente receitado. Informação que teria certamente sido
uma enorme mais-valia para os objectivos deste projecto. Também não há qualquer controlo
directo sobre a eficácia da medicação receitada e muito menos registos informáticos.
Os dados das análises clínicas, podem dar alguma informação sobre a eficácia dos antibióticos, isto porque, se resultar, o utente não volta tão cedo à unidade de saúde. Mas se a medicação
falhar, o utente regressa e, o normal é, que sejam solicitadas novas análises. Assim, o facto de
essas análises existirem, pode ser significativo da ineficácia da medicação.
Partindo deste pressuposto e sabendo de antemão das potencialidades das tecnologias de
mineração de dados, tentou-se dar alguma utilidade prática a estes dados. A hipótese formulada foi de que o registo das análises dos utentes poderia ser útil para averiguar a eficácia dos
antibióticos. Se tal hipótese fosse verdade, a informação daí resultante seria certamente muito
valiosa na escolha dos antibióticos a receitar. A prova desta hipótese passou por tentar obter grupos de utentes com um histórico semelhante. Cada grupo seria representativo de uma parte da
realidade no que diz respeito à evolução de determinados microorganismos e da sua imunidade
aos antibióticos, considerando nesta equação elementos característicos dos próprios utentes (por
exemplo: idade e sexo).
Rapidamente se percebeu que a solução a utilizar para fazer prova da hipótese formulada,
passava por utilizar soluções de clustering/segmentação, o que permitiria criar os tais grupos de
utentes.
20
4.3
Formulação do processo de mineração
Para representar o historial de análises clínicas de cada utente, havia que sintetizar toda a informação do utente num único registo. Esse registo deveria conter informação da fisionomia
do utente e do dito histórico de análises, reflectindo o número, sequência e tipo das análises
realizadas, bem como os respectivos resultados.
Ou seja, cada registo para além da dita informação fisionómica do utente deve conter a descrição dos vários episódios, em que para cada episódio se identificam as várias triplas formadas
por microorganismo versus antibiótico versus resultado (sensibilidade).
A ideia de vectorizar vem na utilização da abordagem clustering em que se pretende criar
grupos. Para criar esses grupos é preciso ter o historial completo do utente num único registo. Assim o algoritmo (de clustering) vai comparar os campos das combinações possíveis
e comparar resultados. Aqueles que tenham resultados semelhantes da combinação episódio,
microorganismo e antibiótico, irão para o mesmo cluster.
A figura 4.2 mostra um exemplo do dataset construído para o modelo de mineração. Para
além do número de identificação do utente (NSF), se existisse no dataset original 2 episódios,
2 microorganismos e 3 antibióicos, neste novo dataset haveria 12 combinações possíveis entre
episódio, microorganismo e antibiótico.
Figura 4.2: Exemplo do dataset a criar para o modelo de mineração.
21
4.3.1
Problemas resultantes do modelo de mineração
Para ter a tabela 4.2 como na figura é preciso reduzir bastante os dados de maneira a que no fim
a BD tenha a combinação episódio, microorganismo e antibiótico que resulte em poucas colunas. Segundo apurado, haveria utentes com 33 episódios (número que poderia naturalmente
aumentar, o número de microorganismos era de 116 e o número de antibióticos de 87, logo, o
resultado das combinações possíveis destes números é 307824 (este seria o número de colunas
de um novo dataset). Como se pode verificar o número é demasiado elevado, o que levaria
muito tempo de processamento e memória para gerar uma tabela deste tipo, para mais tarde
aplicar o algoritmo de MD, para posteriormente verificar os resultados obtidos. Convém acrescentar que a grande maioria das BD existentes no mercado dificilmente comporta mais do que
alguns poucos milhares de campo (<4000). Foi assim imprescindível tentar reduzir o numero
de combinações, tarefa que se mostrou muito complexa e que requereu uma análise bem mais
detalhada dos dados e muito bom senso.
Foi também logisticamente complexo, pois requereu solicitar a execução de muitas queries
sobre a BD original (uma vez que não se tinha acesso directo aos dados).
4.3.2
Decisões para a resolução dos problemas
Antes de começar a redução de antibióticos, episódios ou microorganismos deve-se simplificar o
mais possível a BD. O campo NSF e data de nascimento pertencem sempre a um mesmo utente,
como tal, esses dois campos passaram para uma outra tabela e na tabela original retirou-se a
Data de Nascimento mantendo o campo NSF como chave estrangeira ligada à nova tabela onde
NSF é a chave primária. O mesmo, também deve ser aplicado para os campos Microorganismo
e Antibiotico, para facilitar a criação de resultados e obter uma melhor eficiência. Criou-se um
ID (identificador) para cada microorganismo e para cada antibiótico, e na tabela principal em
vez do nome passou a ter o número do seu ID (de Microorganismo e Antibiótico) como chave
estrangeira das tabelas antibiotico e microorganismo onde contêm o ID e o respectivo Nome.
Ao ter feito esta uniformização permitiu que, mais tarde, a aplicação dos algoritmos de
MD seja mais rápida e eficiente, porque um computador consegue processar mais facilmente
números do que strings (identificadores iniciais dos microorganismos e antibióticos). Caso seja
necessário verificar o nome do antibiótico ou microorganismo que o número representa, basta
fazer um inner join entre a tabela principal e a tabela microorganismo ou antibiotico. Assim
sendo, obtém-se a tabela final com o aspecto da figura 4.4, ficando assim, concluído o processo
que contém apenas os dados necessários.
A partir deste momento, começa a redução de dados desnecessários ou menos relevantes
para a construção de um novo dataset para aplicar um dos algoritmos de segmentação.
Com a seguinte query:
select t0.cnt, COUNT(*) from
22
Figura 4.3: Ligações da tabela da BD.
Figura 4.4: Resultado da simplificação da tabela principal.
(select NSF, MAX(EPISODIO) as cnt from dbo.analisesKF2 group by nsf) as t0
group by t0.cnt
order by t0.cnt
como se pode verificar a partir do episódio 9 existem poucos resultados, isto porque, existe na
BD poucos utentes com os números de episódios superior a esse número.
Tendo em conta esta informação, analisou-se o que aconteceria caso se desprezassem os
utentes com mais do que 9 episódios. Ao passar de um máximo de 33 episódios para 9, permitiu reduzir significativamente o número de combinações entre episódios, microorganismos e
antibióticos.
Uma vez que interessavam apenas as situações em que efectivamente havia um historial,
entendeu-se também desprezar todos os utentes com 2 ou menos episódios. Isto não permite
reduzir directamente o número de combinações, dado que quem tem mais do que 2 episódios
também tem que ter no seu registo, informação respeitante aos dois primeiros episódios. Mas
permitiu reduzir efectivamente, eliminando microorganismos e antibióticos que apenas ocorriam em utentes com um ou dois episódios.
23
Com estas simplificações, conseguiu-se reduzir o número de episódios para 9, o número de
microorganismos para 85 e o número de antibiótico para 75. Do que resultam 57375 combinações, em oposição às mais de 300 mil iniciais.
Após algum tempo a verificar a BD, foi possível perceber que havia registos com outros
valores possíveis para a sensibilidade para lá dos inicialmente previstos. Ao fazer
select distinct(Sensibilidade) from analises
apresenta os resultados, como está presente na figura 4.5, ‘S’, ‘R’, ‘I’, ‘N’, ‘P’, ‘ ‘ e segundo
informações obtidas por parte de entidades ligadas a este ramo os resultados que interessam são
os ‘S’, ‘R’ e ‘I’. Pelo que se descartam os outros resultados de modo a que a BD fique mais
leve.
Figura 4.5: Resultados do valor da Sensibilidade.
Ao apagar os resultados da Sensibilidade verificou-se que diminuiu o número de microorganismos e o número de antibióticos descendo estes para 57 e 68 unidades, respectivamente.
Assim sendo neste momento o número de campos possíveis é de 34884.
O próximo passo foi apagar combinações de microorganismos/antibióticos e vice-versa, que
sejam muito pouco representativos com objectivo de reduzir ainda mais o número de microorganismos e antibióticos, de modo a que, também se possa reduzir o número de campos do novo
dataset. Para tal usou-se as queries que estão abaixo da figura 4.6, e verificou-se possíveis
combinações a apagar a fim de reduzir o número de antibióticos e de microorganismos.
SELECT COD_ANTIBIO , t1.COD_MICRO , count( * ) , t1.tm
FROM dbo.analisesKF3 AS t2
INNER JOIN (
SELECT COD_MICRO , count( COD_MICRO ) AS tm
FROM dbo.analisesKF3
GROUP BY COD_MICRO
) AS t1
ON t1.COD_MICRO = t2.COD_MICRO
GROUP BY COD_ANTIBIO , t1.COD_MICRO , t1.tm
order by t1.tm,t1.COD_MICRO
24
Figura 4.6: Resultado da combinação antibiótico/microorganismo e vice-versa.
SELECT COD_MICRO , t1.COD_ANTIBIO , count( * ) , t1.ta
FROM dbo.analisesKF3 AS t2
INNER JOIN (
SELECT COD_ANTIBIO , count( COD_ANTIBIO) AS ta
FROM dbo.analisesKF3
GROUP BY COD_ANTIBIO
) AS t1
ON t1.COD_ANTIBIO = t2.COD_ANTIBIO
GROUP BY COD_MICRO , t1.COD_ANTIBIO , t1.ta
order by t1.ta, t1.COD_ANTIBIO
Então relativamente à figura 4.6 está ordenada pelo ‘tm’, que significa total de microorganismos e pelo ‘COD_MICRO’ que é o código do microorganismo. Então o resultado desta
query significa que a combinação de um antibiótico para um dado microorganismo aparece o
número de vezes que está representado na terceira coluna. A última coluna representa o total de
microorganismos. Como a tarefa é eliminar o número máximo de microorganismos e antibióticos possível, o ideal é pegar nestas duas colunas e verificar se realmente se pode eliminar. Por
exemplo, relativamente à primeira linha podemos verificar que o resultado da query obteve-se o
antibiótico 139 combinado com o microorganismo 203, a combinação de ambos aparece na BD
apenas uma vez e o total de registos em que o microorganismo aparece é de 5, por isso, aqui
está um dos potenciais microorganismos que pode desaparecer.
Na mesma figura está presente o oposto, ou seja, em vez de ser a combinação antibiótico
/microorganismo é a combinação microorganismo/antibiótico, em que na primeira e segunda
colunas está representado o código do microorganismo e o código do antibiótico, respectiva25
mente. A 3a coluna é o número de vezes que a combinação aparece na BD e a última coluna
representa o número de vezes que o antibiótico aparece. Na primeira linha aparece um potencial
antibiótico a eliminar, visto que na BD inteira apenas é utilizado uma única vez.
Depois de definir um número mínimo de antibióticos e microorganismos (pelos menos 10)
optou-se por apagar todos aqueles inferiores a esse número. Com esta simplificação ficou-se
reduzido a 55 microorganismos, 60 Antibióticos e 9 episódios o que dá um total de 29700
campos.
Numa fase avançada deste processo de redução, e como mostra a figura 4.7 constatou-se que
para uma combinação utente, episódio, microorganismo e antibiótico poderia haver mais do que
um resultado. Isto significaria voltar a duplicar o número de combinações (considerando que
no máximo poderia haver dois resultados), pelo que se entendeu considerar o primeiro registo
e desprezar os restante. Opção esta também sustentada pelo facto de que quando havia mais do
que um resultado, o valor era na maioria das situações igual (segundo os entendidos, servia de
confirmação de resultados).
Figura 4.7: Resultado de combinações repetidas.
Detectou-se também combinações que não continham resultados. Pelo que ao subtrair estes
registos foi possível reduzir o número de combinações para um pouco mais de 6000.
Como mesmo assim, não era possível tratar estes resultados a partir de uma BD (limite
do MySQL é de pouco mais de 1000 colunas), optou-se por utilizar um formato textual para
representar os dados. Optou-se por gerar um ficheiro csv com os resultados da sensibilidade
vectorizados, no anexo A.2 está o código que gerou o ficheiro. Foi escolhido este formato por
ser o mais simples de construir, pois o Weka é capaz de converter um ficheiro csv para um
ficheiro com a extensão que o programa normalmente usa (arff ).
Finalmente o último passo é correr no Weka e verificar os resultados.
26
4.4
Aplicação do Algoritmo de Data Mining
O algoritmo k-means [6, 2, 16] usa um método de agrupamento não-supervisionado, consiste
num procedimento em que um dado número de clusters, previamente determinado, calcula os
pontos que representam os centros destes clusters sendo espalhados no conjunto de respostas
e movidos até alcançar um equilíbrio estático. Em seguida, procede a uma divisão de todos os
casos obtidos pelos ‘k’ grupos estabelecidos previamente e a melhor partição de ‘n’ casos será
aquela que optimize o critério escolhido. Este procedimento inicia-se ao usar os valores dos
primeiros ‘k’ casos como estimativas. Os casos iniciais são formados através da designação de
cada caso ao cluster mais próximo. Sempre que se incluir um ou mais casos é preciso recalcular
as médias e alterar as posições do cluster até que não haja mais alterações nos cálculos das
médias.
Figura 4.8: Representação do algoritmo k-means.
Este é um dos algoritmos mais simples para o método de clustering, um dos mais avançados foi feito com base no k-means que é o EM (Expected Maximization). Pontos fracos deste
algoritmo:
• Quando o número de dados é pequeno, o grupo inicial determina o cluster;
• O número de clusters tem que ser previamente definido;
• Sensível aos dados iniciais, mesmo se trocar a ordem dos atributos poderá definir um
cluster diferente.
[10]
27
4.5
Como gerar resultados através do Weka
Ao ter o dataset carregado no Weka pode-se escolher tratar os dados ou usar uma das abordagens. Como os dados já estão tratados, escolhe-se o separador cluster e de imediato escolhe-se
o algoritmo que se pretende usar (através do botão choose, como mostra a figura 4.9).
Figura 4.9: Escolha do método clustering e do algoritmo.
O algoritmo escolhido foi o k-means, como tal é preciso clicar nesse algoritmo para ficar
seleccionado.
Para aceder às opções deste algoritmo, é necessário clicar na caixa de texto onde tem o seu
nome, aparecendo assim, um menu com opções, nas quais é possível escolher quantos clusters
se pretendem criar, o número de seeds, entre outros (tal como mostra a figura 4.10).
Figura 4.10: Escolha dos parâmetros do algoritmo k-means.
Escolhido o número de clusters é necessário escolher o tipo de acção:
• treino;
• usar um ficheiro de treino sendo que os dados do dataset ficam a ser avaliados;
28
• divisão de uma percentagem do dataset para treino e para avaliação.
Para começar clica-se em Start (como é visível na figura 4.11) e na caixa de texto ao lado
aparecerão os resultados momentos depois.
Figura 4.11: Começar a gerar resultados
29
4.6
Síntese dos resultados
Exemplo 1 Na figura 4.12 estão representados 10 clusters (definido nos parâmetros) e a quantidade de utentes que foi atribuída a cada grupo, num universo de 269 utentes. No primeiro
cluster (cluster 0) apenas foi atribuído um utente o que corresponde a aproximadamente 0%,
o mesmo acontece com os clusters 4 e 6; quanto ao cluster 1 foram-lhe atribuídos 22 utentes
que em termos percentuais corresponde a 8%; em relação ao cluster 2 foram-lhe atribuídos 34
utentes o que corresponde a 13%; o cluster 3 apenas foi-lhe atribuído 4 utentes, o que equivale
a 1% ; o cluster 5 obteve 10 utentes que corresponde a 4%; já o cluster 7 obteve 183 utentes
que corresponde a 68%; por fim, os clusters 8 e 9 obtiveram 2 e 11 utentes o que corresponde a
1% e 4%, respectivamente.
Figura 4.12: Resultados Exemplo 1.
Exemplo 2 Este exemplo foi elaborado de uma maneira diferente do exemplo anterior, desta
vez em vez de apenas treinar, também se atribuíu uma percentagem a casos “reais”, como
apresenta a figura 4.13. Portanto, 66% do dataset foi usado para treino e os restantes 34%
(91 utentes) foram usados para serem atribuídos a clusters. Em termos de resultados podemos
verificar quantos utentes foram atribuídas a cada um dos grupos (clusters). Aos clusters 0,
1, 3, 6 e 8 não foram atribuídos utentes. Para o cluster 2 foram atribuídos 14 utentes o que
corresponde a 15%; para o cluster 4 foram atribuídos 6 utentes que equivale a 7%; nos clusters
5 e 7 foram atribuídos 3 e 1 utentes o que corresponde a 3 e 1%, respectivamente; por fim, no
cluster 9 foram atribuídos 60 utentes, ou seja, 74%.
30
Figura 4.13: Resultados Exemplo 2.
Exemplo 3 Na figura 4.14 estão representados 20 clusters. Nos clusters 0, 4, 15 e 19 contém
apenas 1 utente o que corresponde a aproximadamente a 0%; no cluster 1 existem 16 utentes que
em termos percentuais corresponde a 6%; no cluster 2, 31 utentes equivale a 12%; os clusters 3
e 9 contêm 9 utentes e que corresponde a 3%; o cluster 5 possui 25 utentes que equivale a 9%;
os clusters 6 e 17 contêm apenas 2 utentes que corresponde a 1%; ao cluster 7 foi atribuído 20
utentes que equivale a 7%; no cluster 8 existem 6 utentes que corresponde a 2%; os clusters 10
e 11 possuem 3 utentes que equivale a 3%; o cluster 12 é o que possui maior número de utentes
com 102 que corresponde a 38%; nos clusters 14 e 16 contêm 7 utentes que equivale a 3%;
finalmente, o cluster 18 com 4 utentes que corresponde a 1%.
31
Figura 4.14: Resultados Exemplo 3.
Exemplo 4 Tal como no Exemplo 3, a figura 4.15 contém 66% para treino e 34% para serem
atribuídos a clusters. Para o cluster 2 foram associados 15 utentes que corresponde a 16%; no
cluster 5 vieram 10 utentes que equivale a 11%; o cluster 9 obteve a maior atribuíção com 45
utentes que corresponde a 49%; para o cluster 10 apenas 1 utente que em termos percentuais
equivale a 1%; o cluster 12 apenas lhe foi atribuído 2 utentes, ou seja, 2%; os clusters 17 e 18,
obtiveram 7 e 12 utentes, que corresponde a 8% e 13%, respectivamente; por fim, os restantes
clusters não obtiveram nenhuma atribuíção.
Figura 4.15: Resultados Exemplo 4.
32
4.7
Análise crítica
Na análise dos resultados foi possível verificar que nos exemplos 1 e 3, houve alguns casos em
que num cluster ficava apenas um utente, isto possivelmente quer dizer que são casos especiais,
ou seja, é preciso ter um cuidado especial com estes casos vistos serem casos raros (neste universo de 269 utentes) e analisá-los ao pormenor. Em relação aos outros casos dos outros clusters
pode-se concluir que são casos em que possivelmente, uma medicação semelhante poderá resolver o mesmo problema (para aqueles que pertencem ao mesmo clusters). Em comparação
com os dois exemplos, é que quanto maior for o número de clusters, mais distribuído será a
colocação dos utentes porque o grupo onde se posiciona contém um tratamento mais específico,
podendo ter melhor soluções de tratamento. Ao mesmo tempo também também pode significar
que o tratamento poderia não resultar porque com um menor número de clusters menos específico é o problema e mais geral é o tratamento.
Infelizmente, e dado ter sido despendido muito tempo nos testes de aprendizagem, nomeadamente antes da redução do dataset, não foi possível efectuar mais testes que permitissem validar
consistentemente a hipótese formulada.
33
34
Capítulo 5
Conclusões
5.1
Análise crítica
O processo de MD analisa grandes quantidades de dados à procura de padrões e relações escondidas que é (quase) impossível para um ser humano encontrar.
A parte de analisar dados, tem muito que se lhe diga, se o dataset for na ordem das centenas
de Megabytes (MB) ou mesmo Gigabytes (GB), quase que é preciso ter um supercomputador
para tratar os seus dados. Este projecto foi feito num computador com 2GB de RAM e muitas
vezes ao gerar o dataset, dava excepção com o erro de “out of memory” a solução foi reduzir
drasticamente o dataset que continha inicialmente mais de 300 mil registos e passou para pouco
mais de 20 mil, o que condicionou muito estes resultados. Com um dataset real (em termos de
resultados de um país), provavelmente só com um supercomputador é que se poderia chegar a
resultados. No caso do Weka, a preparar os clusters para 20 clusters ocupava a volta de 900MB
de memória o que é muito.
O objectivo proposto do projecto, que pretendia agrupar utentes mediante o seu historial
clinico foi cumprido, conseguiu-se agrupar 269 utentes e conhecer casos simples, em que o
tratamento deveria ser quase igual para todos, e casos que apenas um utente se inseria num
cluster, o que leva a crer que seja uma situação mais complicada e necessitava de cuidados
especiais por parte dos profissionais de saúde.
Por fim, o DM, é uma tecnologia que está cada vez a ganhar mais adeptos e são as empresas
que recorrem a esta solução a fim de perceber o que pode ser melhorado, aumentar os lucros,
aumentar produtividade, melhor gestão das despesas, entre outros. Contudo, posso concluir que
é uma área que se pode e se deve investir.
35
5.2
Trabalho Futuro
Um possível trabalho futuro era a criação de uma aplicação que comparasse resultados de um
sistema maior para um sistema único, ou seja, o sistema era treinado com o dataset, que ao
serem inseridos novos dados de um utente é verificado o clusters a que pertence. O sistema
produz uma resposta de qual o melhor tratamento, comparando com casos semelhantes, a fim
de tratar o problema do paciente.
Outra proposta possível, é a criação de um modelo que permita verificar surtos de microorganismos, para poder determinar a altura do ano que um microorganismo seja mais resistente e
verificar qual seria a solução em antibiótico mais eficaz para realizar os tratamentos. Este resultado era possível visto que, no dataset utilizado existe a informação do local onde foi efectuada
a análise, o resultado das análises, os microorganismos encontrados, os antibióticos usados para
combater os microorganismos e, também, a data do exame.
36
Bibliografia
[1] Satnam Alag. Collective Intelligence in Action. Data acesso: 16/06/2011.
[2] anpcont. http://www.anpcont.com.br/site/docs/congressoii/01/ccg223.pdf, Data acesso:
07/09/2011.
[3] databasesabout.
http://databases.about.com/od/datamining/g/classification.htm, Data
acesso: 05/09/2011.
[4] datawarehouse.inf. http://www.datawarehouse.inf.br/artigos/cervejaefraldas.pdf, Data
acesso: 16/06/2011.
[5] dreamspark. https://www.dreamspark.com/products/product.aspx?productid=37, Data
acesso: 22/06/2011.
[6] dtreg. http://www.dtreg.com/kmeans.htm, Data acesso: 07/09/2011.
[7] Ian Witten & Eibe Frank. Data Mining : practical machine learning tools and techniques.
Data acesso: 05/09/2011.
[8] Ian Witten & Eibe Frank. Data Mining : practical machine learning tools and techniques.
Data acesso: 05/09/2011.
[9] Ian Witten & Eibe Frank. Data Mining : practical machine learning tools and techniques.
Data acesso: 16/06/2011.
[10] gmu.edu.
http://cs.gmu.edu/cne/modules/dau/stat/clustgalgs/clust5_bdy.html,
acesso: 07/09/2011.
Data
[11] ieee. http://www.ieee.org.ar/downloads/2007-markel-ruz-datamining.pdf, Data acesso:
16/06/2011.
[12] Paulo Matos. Data-Mining. Data acesso: 05/09/2011.
[13] Paulo Matos. Data-Warehouses. Data acesso: 16/06/2011.
[14] msdn. http://msdn.microsoft.com/en-us/library/ms173767.aspx, Data acesso: 22/06/2011.
37
[15] Mark Hall Richard Kirkby Peter Reutemann Alex Seewald David Scuse Remco R. Bouckaert, Eibe Frank. Weka Manual 3-6-2. Data acesso: 20/06/2011.
[16] revoledu. http://people.revoledu.com/kardi/tutorial/kmean/, Data acesso: 07/09/2011.
[17] shvoong. http://pt.shvoong.com/books/1778553-t%c3%a9cnicas-data-mining-dataminigminera%c3%a7%c3%a3o/#ixzz1tjmuq82l, Data acesso: 05/09/2011.
[18] univ lyon2.
31/08/2011.
http://eric.univ-lyon2.fr/ ricco/tanagra/en/tanagra.html, Data acesso:
[19] w3schools.
04/09/2011.
http://www.w3schools.com/php/php_mysql_intro.asp,
Data acesso:
[20] wikipedia. http://en.wikipedia.org/wiki/mysql, Data acesso: 04/09/2011.
[21] wikipedia. http://pt.wikipedia.org/wiki/mysql, Data acesso: 04/09/2011.
[22] wikipedia.
05/09/2011.
http://en.wikipedia.org/wiki/association_rule_learning,
Data acesso:
[23] wikipedia. http://en.wikipedia.org/wiki/data_mining, Data acesso: 16/06/2011.
[24] wikipedia. http://pt.wikipedia.org/wiki/minera%c3%a7%c3%a3o_de_dados, Data acesso:
16/06/2011.
[25] wikipedia. http://pt.wikipedia.org/wiki/netbeans, Data acesso: 20/06/2011.
[26] wikipedia. http://pt.wikipedia.org/wiki/weka, Data acesso: 20/06/2011.
[27] wikipedia. http://pt.wikipedia.org/wiki/intelig%c3%aancia_empresarial, Data acesso:
22/06/2011.
[28] wikipedia. http://en.wikipedia.org/wiki/tanagra_(software), Data acesso: 31/08/2011.
38
Anexo A
Código
A.1
SQL
/*
select t3.nsf, t3.cod_episodio, t3.microorganismo, t3.antibiotico, t3.sensibilidade
from (
select distinct t2.NSF from (
select * from (
select NSF, cod_episodio, antibiotico, microorganismo, COUNT(sensibilidade) as cnt
from analises
group by NSF, cod_episodio, antibiotico, microorganismo) as t1
where t1.cnt>1) as t2) as t4
inner join chne as t3 on t4.NSF=t3.NSF
order by t3.nsf, t3.cod_episodio, t3.microorganismo, t3.antibiotico;
*/
--select count(*) from (select distinct(NSF), DATA_NASC from analises) as t1;-- 6944
--select count(*) from (select distinct NSF, DATA_NASC from analises) as t1;-- 6944
--delete from utentes;
--insert into utentes (NSF, DATA_NASC) (select NSF, min(DATA_NASC) as DN from chne
--group by NSF);
--insert into exames (exame) (select distinct exame from chne);
--delete analises;
/*
insert into analises (NSF,EPISODIO, DATA_REQ, COD_PROV, COD_EXAME, COD_ANTIBIO,
COD_MICRO, SENSIBILIDADE)
(select t0.NSF, t0.COD_EPISODIO, t0.DATA_REQ, t1.COD_PROV, t2.cod_exame,
39
t3.cod_antibio, t4.cod_micro, t0.sensibilidade from chne as t0
inner join proveniencias as t1 on t0.proveniencia = t1.proveniencia
inner join exames as t2 on t0.exame = t2.exame
inner join antibioticos as t3 on t0.antibiotico = t3.antibiotico
inner join microorganismos as t4 on t0.microorganismo = t4.microorganismo)
*/
--select count(*) from (select NSF, cod_episodio, antibiotico, microorganismo from
chne) as t0; --87193
--select count(*) from (select distinct NSF, cod_episodio, antibiotico, microorganismo
from chne) as t0; --79624
--select NSF, MAX(episodio) as cnt from analises group by nsf) as t0
--select * from analises where episodio=33;
--select COUNT(*) from microorganismos; --116
--select COUNT(*) from antibioticos; --87
--insert into analisesKF1 (nsf, episodio, data_req, cod_prov, cod_exame, cod_antibio,
cod_micro, sensibilidade) select * from analises order by NSF, episodio, cod_micro,
cod_antibio;
--select t0.ne, COUNT(T0.NE) from (select nsf, max(episodio) as ne from analisesKF1
group by nsf) as t0 GROUP BY t0.NE ORDER BY t0.NE;
--DELETE FROM UTENTESf1 WHERE NOT EXISTS(SELECT NSF FROM ANALISESkf1
WHERE UTENTESf1.NSF = ANALISESkf1.NSF);
--select * FROM UTENTESf1 WHERE NOT EXISTS(SELECT * FROM ANALISESkf1
WHERE UTENTESf1.NSF = ANALISESkf1.NSF);
--SELECT * FROM ANALISESKF1 WHERE NSF=’20822’
--delete microorganismosf1;
--insert into microorganismosf1 select distinct cod_micro from microorganismos;
--DELETE FROM microorganismosf1 WHERE NOT EXISTS(SELECT cod_micro FROM ANALISESkf1
WHERE microorganismosf1.cod_micro = ANALISESkf1.cod_micro);
--delete antibioticosf1 ;
--insert into antibioticosf1 select distinct cod_antibio from antibioticos;
--DELETE FROM antibioticosf1 WHERE NOT EXISTS(SELECT cod_antibio FROM ANALISESkf1
WHERE antibioticosf1.cod_antibio = ANALISESkf1.cod_antibio);
--insert into examesf1 select distinct cod_exame from exames;
40
--DELETE FROM examesf1 WHERE NOT EXISTS(SELECT cod_exame FROM ANALISESkf1
WHERE examesf1.cod_exame = ANALISESkf1.cod_exame);
--insert into provenienciasf1 select distinct cod_prov from proveniencias;
--DELETE FROM provenienciasf1 WHERE NOT EXISTS(SELECT cod_prov FROM ANALISESkf1
WHERE provenienciasf1.cod_prov = ANALISESkf1.cod_prov);
--select COUNT(*) from antibioticos f1; --75
--select COUNT(*) from microorganismosf1; --85
--select COUNT(*) from analisesk --87193
--select COUNT(*) from analiseskf1 --45271
--select COUNT(*) from Microorganismos; --116
--select COUNT(*) from Microorganismosf1; --85
--select COUNT(*) from Microorganismosf2; --62
--select COUNT(distinct(dbo.analisesKF3.COD_MICRO)) from analisesKF3 -- 57
--select COUNT(*) from antibioticos; --87
--select COUNT(*) from antibioticosf1; --75
--select COUNT(*) from antibioticosf2; --71
--select COUNT(distinct(dbo.analisesKF3.COD_ANTIBIO)) from analisesKF3 -- 68
/*
select t0.cnt, COUNT(*) from
(select NSF, MAX(EPISODIO) as cnt from dbo.analisesKF2 group by nsf) as t0
group by t0.cnt
order by t0.cnt
*/
/*insert into analiseskf2 (nsf, EPISODIO,DATA_REQ,COD_PROV,COD_EXAME,COD_ANTIBIO,
COD_MICRO,SENSIBILIDADE)
select nsf, EPISODIO,DATA_REQ,COD_PROV,COD_EXAME,COD_ANTIBIO,COD_MICRO,
SENSIBILIDADE from analisesK;
*/
--delete from analiseskf2 where exists(
--select * from (select NSF, MAX(EPISODIO) as cnt from analisesk group by nsf) as t0
where t0.cnt>9 and analiseskf2.nsf=t0.nsf)
41
--delete antibioticosf2;
--insert into antibioticosf2 select distinct cod_antibio from antibioticos;
--DELETE FROM antibioticosf2 WHERE NOT EXISTS(SELECT cod_antibio FROM ANALISESkf2
WHERE antibioticosf2.cod_antibio = ANALISESkf2.cod_antibio);
--delete microorganismosf2;
--insert into microorganismosf2 select distinct cod_micro from microorganismos;
--DELETE FROM microorganismosf2 WHERE NOT EXISTS(SELECT cod_micro FROM ANALISESkf2
WHERE microorganismosf2.cod_micro = ANALISESkf2.cod_micro);
/*
insert into dbo.analisesKF3(nsf, EPISODIO,DATA_REQ,COD_PROV,COD_EXAME,COD_ANTIBIO,
COD_MICRO,SENSIBILIDADE)
select nsf, EPISODIO,DATA_REQ,COD_PROV,COD_EXAME,COD_ANTIBIO,COD_MICRO,SENSIBILIDADE
from dbo.analisesKF2;
*/
-- _____________________________________________________________________________
/*
select t0.cnt, COUNT(*) from
(select NSF, MAX(EPISODIO) as cnt from dbo.analisesKF2 group by nsf) as t0
group by t0.cnt
order by t0.cnt
*/
--delete from analiseskf3 where exists(
--select * from (select NSF, MAX(EPISODIO) as cnt from analisesk group by nsf) as
t0 where t0.cnt>9 and analiseskf3.nsf=t0.nsf)
-- select COUNT(distinct(dbo.analisesKF2.COD_ANTIBIO)) from analisesKF2
--insert into dbo.analisesKF2(nsf, EPISODIO,DATA_REQ,COD_PROV,COD_EXAME,COD_ANTIBIO,
COD_MICRO,SENSIBILIDADE)
--select nsf, EPISODIO,DATA_REQ,COD_PROV,COD_EXAME,COD_ANTIBIO,COD_MICRO,SENSIBILIDADE
from dbo.analisesKF3;
/*
SELECT COD_ANTIBIO , t1.COD_MICRO , count( * ) , t1.tm
42
FROM dbo.analisesKF3 AS t2
INNER JOIN
(
SELECT COD_MICRO , count( COD_MICRO ) AS tm -- quantas vezs aparece os microorganismos
FROM dbo.analisesKF3
GROUP BY COD_MICRO
)
AS t1 ON t1.COD_MICRO = t2.COD_MICRO
GROUP BY COD_ANTIBIO , tm.COD_MICRO
*/
--delete
-- N
--
from dbo.analisesKF3 where SENSIBILIDADE = ’P’
--insert into dbo.antibioticosF4
--select distinct(dbo.analisesKF3.COD_ANTIBIO) from analisesKF3
--insert into dbo.MicroorganismosF4
--select distinct(dbo.analisesKF3.COD_MICRO) from analisesKF3
/*
SELECT COD_ANTIBIO , t1.COD_MICRO ,
FROM dbo.analisesKF3 AS t2
INNER JOIN
(
SELECT COD_MICRO , count( COD_MICRO
FROM dbo.analisesKF3
GROUP BY COD_MICRO
) AS t1
ON t1.COD_MICRO = t2.COD_MICRO
GROUP BY COD_ANTIBIO , t1.COD_MICRO
order by t1.tm,t1.COD_MICRO
*/
/*
SELECT COD_MICRO , t1.COD_ANTIBIO ,
FROM dbo.analisesKF3 AS t2
INNER JOIN
(
count( * ) , t1.tm
) AS tm
, t1.tm
count( * ) , t1.ta
43
SELECT COD_ANTIBIO , count( COD_ANTIBIO) AS ta -- quantas vezs aparece os microorganism
FROM dbo.analisesKF3
GROUP BY COD_ANTIBIO
) AS t1
ON t1.COD_ANTIBIO = t2.COD_ANTIBIO
GROUP BY COD_MICRO , t1.COD_ANTIBIO , t1.ta
order by t1.ta, t1.COD_ANTIBIO
*/
--insert into dbo.analisesKF4(nsf, EPISODIO,DATA_REQ,COD_PROV,COD_EXAME,COD_ANTIBIO,
COD_MICRO,SENSIBILIDADE)
--select nsf, EPISODIO,DATA_REQ,COD_PROV,COD_EXAME,COD_ANTIBIO,COD_MICRO,SENSIBILIDADE
from dbo.analisesKF3;
/*
delete from [AlertN].[dbo].[analisesKF4] where COD_MICRO=203 or COD_MICRO=228
delete
FROM [AlertN].[dbo].[analisesKF4] where COD_ANTIBIO=99 or COD_ANTIBIO=93 or
COD_ANTIBIO=127 or COD_ANTIBIO=166 or
COD_ANTIBIO=101 or COD_ANTIBIO=170 or COD_ANTIBIO=145 or COD_ANTIBIO=167
*/
/*
SELECT COD_ANTIBIO , t1.COD_MICRO , count( * ) , t1.tm
FROM [AlertN].[dbo].[analisesKF4] AS t2
INNER JOIN
(
SELECT COD_MICRO , count( COD_MICRO ) AS tm
FROM [AlertN].[dbo].[analisesKF4]
GROUP BY COD_MICRO
) AS t1
ON t1.COD_MICRO = t2.COD_MICRO
GROUP BY COD_ANTIBIO , t1.COD_MICRO , t1.tm
order by t1.tm,t1.COD_MICRO
SELECT COD_MICRO , t1.COD_ANTIBIO , count( * ) , t1.ta
FROM [AlertN].[dbo].[analisesKF4] AS t2
INNER JOIN
44
(
SELECT COD_ANTIBIO , count( COD_ANTIBIO) AS ta -- quantas vezs aparece os microorganism
FROM [AlertN].[dbo].[analisesKF4]
GROUP BY COD_ANTIBIO
) AS t1
ON t1.COD_ANTIBIO = t2.COD_ANTIBIO
GROUP BY COD_MICRO , t1.COD_ANTIBIO , t1.ta
order by t1.ta, t1.COD_ANTIBIO
*/
--select COUNT(distinct(AlertN.dbo.analisesKF4.COD_MICRO)) from AlertN.dbo.analisesKF4-
--select COUNT(distinct(AlertN.dbo.analisesKF4.COD_ANTIBIO)) from AlertN.dbo.analisesKF
A.2
using
using
using
using
using
using
Rotina para geração dos ficheiros CSV
System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Data.SqlClient;
System.IO;
namespace test_projecto
{
class Program
{
static void Main(string[] args)
{
SqlConnection sql = new SqlConnection();
sql.ConnectionString = "Data Source=(local);Initial Catalog=AlertN;
Integrated Security=True; MultipleActiveResultSets=True";
string fich = @"c:\asd2.txt";
StreamWriter w = File.AppendText(fich);
try
{
sql.Open();
45
Console.WriteLine("Entrou");
using (SqlCommand com = new SqlCommand("select distinct(NSF) from
analisesKF4;", sql))
{
SqlDataReader dr = com.ExecuteReader();
while (dr.Read())
{
string nsf = dr[0].ToString();
using (SqlCommand com2 = new SqlCommand(
"SELECT distinct EPISODIO, COD_ANTIBIO, COD_MICRO FROM
[AlertN].[dbo].[analisesKF4] group by EPISODIO, COD_ANTIBIO,
COD_MICRO order by EPISODIO, COD_ANTIBIO, COD_MICRO "
, sql))
{
SqlDataReader dr2 = com2.ExecuteReader();
while (dr2.Read())
{
string epi = dr2[0].ToString();
string anti = dr2[1].ToString();
string micro = dr2[2].ToString();
using (SqlCommand com3 = new SqlCommand("select Sensibilidade from
analisesKF4 where NSF = " + nsf + " and EPISODIO = " + epi + " and
COD_ANTIBIO = " + anti + " and COD_MICRO=" + micro, sql))
{
SqlDataReader dr3= com3.ExecuteReader();
while (dr3.Read())
{
w.Write(dr3[0].ToString());
break;
}
com3.Dispose();
dr3.Dispose();
dr3.Close();
}
w.Write(",");
}
com2.Dispose();
dr2.Dispose();
46
dr2.Close();
}
w.WriteLine("");
}
com.Dispose();
dr.Dispose();
dr.Close();
}
w.Close();
openfile string fich2 = @"c:\dsa.txt";
StreamWriter wr = File.AppendText(fich2);
wr.Write("NSF,");
using (SqlCommand comf = new SqlCommand(
"SELECT distinct EPISODIO, COD_ANTIBIO, COD_MICRO FROM
[AlertN].[dbo].[analisesKF4] group by EPISODIO, COD_ANTIBIO,
COD_MICRO order by EPISODIO, COD_ANTIBIO, COD_MICRO "
,sql))
{
SqlDataReader drf = comf.ExecuteReader();
while (drf.Read())
{
wr.Write(drf[0].ToString() + "_" + drf[1].ToString() + "_"
+ drf[2].ToString() + ",");
}
comf.Dispose();
drf.Dispose();
drf.Close();
}
Console.WriteLine("Feito!");
wr.Close();
sql.Close();
}
catch
{
Console.WriteLine("falhou !");
}
}
}
}
47
Download