stagiopbd / ipbl2019

0 stars 7 forks source link

US137-T04 Criar rotina que simule no banco de dados percentuais pré definidos de resultados positivos e negativos de exame de sangue para detecção da infecção pelo vírus do Sarampo. #295

Open hdblouro opened 5 years ago

hdblouro commented 5 years ago

A rotina deverá funcionar conforme análise feita previamente em: https://drive.google.com/file/d/1_Ztp4mFNpR6-Wg6D8r0nHZUtmI_Zi_eO/view?usp=sharing

ghost commented 5 years ago

Vou ajudar o @hdblouro nessa tarefa pois acho que na US de sistemas de mapas temos pessoas bastante capacitadas nesse momento. E aqui imagino que será algum tipo de script ou programa mais "simples" que já estou mais acostumado e acho que posso ajudar mais.

ghost commented 5 years ago

ATUALIZACAO_AUTOMATICA_EXAMES_V1.zip

Fiz uma primeira versão, e o funcionamento dela parece adequado. Amanhã irei adicionar mais comentários sobre a estratégia utilizada, bem como irei adicionar o código-fonte no repositório oficial do GitHub. Por hora disponibilizo em anexo os códigos utilizados no teste.

ghost commented 5 years ago

Fiz o commit da primeira versão do código. Está disponível em uma nova branch, 'development_us137': https://github.com/stagiopbd/ipbl2019/tree/development_us137

Há comentários no código, mas um resumo: 1) O código se baseia em atualização automática das tuplas à medida em que elas são inseridas na base via Consumidor Kafka. 2) Cada porcentagem é implementada como sendo "1 a cada X". Ou seja, para 5%, "1 a cada 20" requisições de exame terá um resultado positivo. Para 10%, "1 a cada 10" requisições de exame terá um resultado positivo e assim por diante. 3) Se forem inseridos números para os quais não haja divisão exata, o mecanismo não atualiza todos os exames para garantir que o resultado seja o mais fiel possível à porcentagem desejada. Por exemplo: suponha que sejam inseridas 132 requisições de exame, com 5% de positivos. 132*5% = 6.6, o que seria inviável de atender, porém o algoritmo continua agindo pela regra do "1 a cada 20" comentada anteriormente e preenche APENAS os resultados primeiros 120. Assim, quem consultar os resultados dos exames verá que de 120 que tiveram resultado definido, exatamente 6 (os 5%) foram positivos. Os 12 que faltaram serão preenchidos assim que atingir 140, pois daí será possível aplicar a regra do "1 a cada 20" novamente. 4) A regra do "1 a cada X" não funciona bem para porcentagens muito altas. Nos testes que fiz, até 30% os resultados se comportam razoavelmente bem, sendo que para 5% e 10% o resultado parece que é sempre exato. Isso porque 30% é "1 a cada 3", o que ainda é viável. Se pegar 80%, seria "1 a cada 1,25", e como não existe 1,25 tupla, seria 1 a cada 1 e todas as tuplas ficam com resultado positivo. 5) O comportamento descrito no ponto 4 é da própria natureza da probabilidade e do problema que estamos tentando lidar e não vejo como resolver de forma fácil. Porém, se funciona bem até 30% acho que é razoável, já que mais que 30% de infecção seria uma total calamidade do ponto de vista de epidemia (fim dos tempos?)

ghost commented 5 years ago

Uma propriedade usada na implementação é que se conseguimos definir uma porcentagem para dois grupos pequenos de tuplas, o grupo maior composto por esses dois grupos tem a mesma probabilidade.

Ex: Suponha que cheguem 5 requisições de exame e deseje-se 20% de positivos, então essas 5 ficariam com os seguintes resultados: (POSITIVO, NEGATIVO, NEGATIVO, NEGATIVO, NEGATIVO).

Agora se chegarem mais 5, é possível manter esses 20% positivos também nesses novos que chegaram, e ficaria por exemplo assim: (NEGATIVO, NEGATIVO, POSITIVO, NEGATIVO, NEGATIVO).

É imediato ver que se juntarmos os 2 grupos temos 10 tuplas, das quais 2 tem resultado POSITIVO o que são os mesmo 20% desejados (2/10 = 1/5).