apresentacao cbis 2010
TRANSCRIPT
Projeto de Identificação de Pacientes do Cartão SUS do estado de São Paulo
Secretaria Estadual de Saúde de São Paulo - SESSP
Laboratório de Sistemas Integráveis e Tecnológico - LSITEC
Organização Pan-Americana da Saúde - OPAS
Laboratório de Sistemas Integráveis – LSI EP/USP
Emerson Moretto
Contexto
Estatísticas erradas Consultas incertas Registros homônimos ou são a mesma pessoa? Informações não confiáveis!
Os problemas
Banco de dados com pacientes replicados• Paciente cria um novo Cartão SUS a cada atendimento...• Mais de uma fonte de dados• Erros de digitação
O desafio
Identificar e remover pacientes duplicados em uma base com
~30 milhões de pacientes
Como resolver?
Mas...
Nenhum campo é 100% significativo
Comparação de nomes não é tão simples
Erros de digitação
Erros de fonética
Maior parte dos registros não possuem documentos
preenchidos
Comparando os registros entre si!
Comparar todos com todos?
30 mi comparando todos com todos:
449.999.985.000.000 comparações!
Computacionalmente falando*:
~ 2 anos* considerando que cada comparação de pacientes leva 1 ms
A solução
Criar conjuntos! (divisão e conquista)
ou seja,
Agrupar os possíveis pacientes duplicados
e depois,
Comparar todos com todos, porém somente
dentro do conjunto
Agrupamento
Cintia F Souza = CTASZ
Cintia Ferreira Sousa = CTASZCinthia F Souza = CTASZ
Sintia Sousa = CTASZ
Basta criarmos um Hash significativo para cada pacienteusando fonética e considerações sobre erros de digitação
Juliano Moraes = JLNMREGiuliano Moraes = JLNMREGiuliano Morais = JLNMRE
CTASZJLNMRE
Cintia Ferreira SousaMãe: Maria Sousa
Primeiro nome fonético + último nome fonético+ Primeiro nome da mãe fonético + último nome da mãe fonético
Hash significativo = CTASZMRSZ
Ex:
Comparando
Com os grupos de candidatos formados...
Realizamos as comparações entre os candidatos do mesmo grupo apenas
1 x 21 x 31 x 42 x 32 x 43 x 4
1. Cintia F Souza = CTASZ
3. Cintia Ferreira Sousa = CTASZ
2. Cinthia F Souza = CTASZ
4. Sintia Sousa = CTASZ
Grupo CTASZ
Progressãoaritmética
A comparação
É feita uma comparação estatística que gera um percentual de similaridade entre 2 pacientes
Para os nomes, usamos algoritmos de distância de caracteres considerando fonemas e erros de digitação Algoritmo Levenshtein (bastante modificado) Ex: Cinthya F Souza x Cintia Ferreira Sousa ~= 92,3%
Para as datas, algoritmos de consideração de erros de digitação baseados em erros comuns e na disposição do teclado Ex: 21/09/1982 e 12/09/1982 ~= 89% de similaridade
A comparação
nome Cinthya Fereira Souza x Cintia Ferreira Sousa
92,3% * peso (0.29)
nome da mãe Maria Souza x Maria Sousa
98,1% * peso (0.26)
nome do pai Paulo Oliveira Souza x Paulo Oliveira Souza
100% * peso (0.20)
data de nascimento 20/09/1982 x 21/09/1982
86% * peso (0.25)
Percentual de similaridade: 93,76 %
A comparação
if percentual de similaridade >= 68% {
Comparação é considerada candidata e vai para uma base de dados de comparação
O usuário analisa as comparações candidatas através de uma interface que acessa esta base
}
Demonstração
Tela de listagem
Tela de comparação
ArquiteturaBase de dados
Cartão SUSOracle 10g
Banco de dadosem árvore
desenvolvido pelo LSI
Thread de comparação Thread de
comparação
Thread de comparação
Distribuidor
ETL
Escalável sobreTCP/IP
Banco de comparaçõesPostgreSQL 8.4
Comparação>= 68%Interface do
usuárioFlex 3.4
Decisão dousuário
Algumas informações técnicas
Feito em Java 6 Multi-thread assíncrono sobre TCP/IP Interface do usuário em Adobe Flex 3.4 Desenvolvido e executando em Linux (CentOS) “Magic numbers” foram encontrados por análise
estatística Para processar os 30 milhões ~= 3 dias Atualização diária de novos registros
(~5.000 pacientes) leva 40s Tempo médio de cada comparação: 0,12 ms