Validando hipóteses.

Há três meses o Felipe B Cabral publicou um artigo sobre como seria o caminho traçado pela Operação Serenata de Amor até o final da primeira fase do projeto. Agora, vim explicar como aconteceu esse processo até aqui.

Nenhum projeto de data science é feito para durar apenas três meses. Existe um longo processo de análise de dados e estudo de métodos até ser desenvolvido algo concreto. Entretanto, como queríamos fazer o projeto acontecer, usamos nossos conhecimentos em métodos agéis (adquiridos com nossa experiência de desenvolvimento) e descobrimos que a melhor forma de adaptar o tempo que tínhamos era utilizando HDD (hyphothesis-driven development) junto a técnica timeboxing. Ou seja, eram levantadas hipóteses para serem desenvolvidas em um espaço de tempo pré-determinado.

Como Cabral explicou, as hipóteses levantadas para essa primeira fase foram: distância/tempo entre gastos, nepotismo e preços de refeição fora do padrão.

Estratégia de desenvolvimento

Como nosso tempo era escasso definimos o processo de exploração de cada hipótese de forma bem precisa:

  • Pesquisamos quais tipos de dados seriam úteis para desenvolver melhor o que queremos validar, verificando se a coleta dos mesmos seria viável no nosso tempo estimado.
  • Pra cada hipótese é criado um Jupyter Notebook, juntamente com Python, em que são feitas análises com base no conjunto de dados que temos.
  • Quando temos um notebook com avaliações consistentes o suficiente e a informação obtida foi validada, passamos para a fase de “ensinar” a Rosie sobre o que descobrimos, como explico nesse artigo.

1. Analisando as bases de dados

Para exemplificar o processo selecionei uma das hipóteses que validamos, distância/tempo entre gastos com alimentação. O tempo demarcado para esse caso era de uma semana de análise. Então, durante essa semana direcionamos nossos esforços para que, com os dados que temos disponíveis, seja possível fazer análises nos reembolsos da Câmara dos Deputados.

O notebook desenvolvido para essa hipótese está disponível aqui. Daqui para frente vou explicar com detalhes como selecionamos os dados que utilizamos, de que forma separamos quais gastos foram feitos no mesmo dia, a maneira que filtramos quais desses eram em cidades diferentes e por fim de que modo é feito o cálculo da distância entre cidades.

2. Importando dados

Para desenvolver ciência de dados, precisamos, veja só, de dados. Para o Serenata de Amor nós já coletamos dados de várias formas diferentes e cruzando esses dados conseguimos descobrir irregularidades. Até agora, já conseguimos reunir os seguintes dados (que coletamos e disponibilizamos para nosso projeto):

Existem outras bases que consultamos, mas por enquanto essas são as mais relevantes. Para o exemplo de distâncias viajadas nós utilizamos os dados dos reembolsos feitos pela CEAP.

Como é feita a importação de dados de reembolsos

Logo após importarmos os dados dos reembolsos, como o objetivo é combinar a distância entre gastos com refeições, selecionamos apenas os reembolsos de refeições.

Selecionando apenas reembolsos de refeições

Além dos dados de reembolsos, precisamos da localização geográfica dos fornecedores das refeições para poder calcular as distâncias percorridas, para isso importamos os dados de empresas.

Importando dados de empresas.

Para finalizar esse trabalho com os dados, agrupamos a soma dos valores dos gastos por dia.

Agrupando a soma dos valores de gastos por dia.

3. Calculando distâncias entre cidades

Para calcular distâncias, utilizamos as bibliotecas geopy que calcula a distância entre dois pontos usando a fórmula direta de Vicenty e Ipython.display para mostrar a distância calculada:

Código para cálculo das distância entre dois pontos.

Depois disso fazemos um cálculo de pair wise para calcular a distância entre pares em uma métrica definida, no caso quilômetros.

Código de pair wise para calcular a distância entre pares em métrica definida.

4. Filtrando casos suspeitos

Uma vez calculadas as distâncias entre as refeições feitas em um dia, aplicamos alguns algoritmos, para detectar casos suspeitos na nossa base de dados. Ou seja, detectar anomalias nos reembolsos.

Quando falamos em machine learning, existem vários algoritmos que tem por sua função encontrar pontos fora da curva em valores. Então, na Operação Serenata de Amor, o que fazemos é procurar algoritmos que sejam adequados para nossa hipótese e ao fim da análise, decidimos qual foi o que apresentou melhores resultados, entre todas as tentativas.

Para a hipótese de distâncias viajadas, fizemos um comparativo de resultados para os seguintes algoritmos:

4.1 . Desvio padrão

No caso de dados normalmente distribuídos, podemos observar que anomalias em valores serão três ou mais vezes do que o valor do desvio padrão, dessa forma podemos considerar essa técnica como uma forma de detecção de anomalias. Para essa hipótese consideramos avaliar com reembolsos com valores acima de três e cinco vezes o desvio padrão.

3 vezes o desvio padrão
5 vezes o desvio padrão

4.2. Isolation Forest

Seguindo a linha de detecção de anormalidades em preços, outro algoritmo que escolhemos avaliar os dados foi o Isolation Forest, que funciona ‘isolando’ as observações. Ele faz a seleção de uma característica dos dados e, em seguida, escolhe aleatoriamente um valor para dividir os dados entre um conjunto de valores máximo e mínimo do recurso selecionado.

IsolationForest

4.3. Local Outlier Factor

O Local Outlier Factor é baseado em um conceito de densidade local, onde a localidade é dada por n vizinhos mais próximos, e a densidade é estimada usando a distancia entre os vizinhos. Comparando a densidade local de um objeto com as densidades locais de seus vizinhos, pode-se identificar regiões de densidade semelhante e pontos que têm uma densidade substancialmente menor do que seus vizinhos. Estes são considerados anômalos.

Local Outlier Factor

4.4. Regressão Polinomial

Regressão polinomial não é bem uma forma de detecção de anomalias, mas serve para alertar sobre casos que mereçam ser auditados e que mais informação deve ser obtida. Mais informações sobre como esse método funciona, virá em um post técnico apenas sobre algoritmos utilizados.

Polynomial regression

5. Concluindo uma hipótese

Ao concluir sobre qual a melhor forma de selecionar reembolsos numa hipótese, adicionamos ao notebook informações que explicam por que de utilizarmos o método que selecionamos. No caso de distâncias viajadas resolvemos utilizar o método de regressão polinomial, por que ele inclui não só reembolsos suspeitos, mas também casos que merecem uma análise mais profunda, com mais informações.

Exemplo de conclusão de hipótese comum no final de cada notebook.

Todas as ideias desenvolvidas em um notebook são de preferência anotadas no mesmo para que qualquer outra pessoa que não tenha participado da análise possa seguir a linha de raciocínio criada.

Comparar os resultados obtidos é importante para escolher o melhor método de classificação dos reembolsos, e nem sempre a hipótese será validada positivamente de acordo com os resultados que temos, por isso é importante testar vários tipos de algoritmos para chegar a uma conclusão final embasada por dados.


É assim que desenvolvemos as hipóteses criadas para a Operação Serenata de Amor. Existem várias outras hipóteses estudadas (nesse link aqui), e sugestões são sempre bem-vindas!

Tem dúvidas? Olhe nosso site, lá tem várias informações sobre o projeto :)

Quer contribuir? Comece por aqui. Além disso você pode fazer com que a Operação Serenata de Amor continue à todo vapor. Continue seguindo a gente!