Filtros e detecção de pagamentos outliers com R

https://rpubs.com/vag/569442

Filtragem dos dados

O objetivo desse script é possibilitar ao usuário a utilização da técnica de filtragem de dados. Por exemplo, pode-se querer selecionar registros superiores

a determinado valor ou relativos a determinado período ou de determinado jurisdicionado ou de determinado elementos de despesa etc.

Selecionando o diretório de trabalho

setwd(‘caminho_diretorio_trabalho’)
getwd()

Carregando os pacotes necessários

library(dplyr) # para utilização da função filter
library(readxl) # para carregar o arquivo Excel
library(stringr) # para trabalhar com string
library(utils) # para gravar arquivo csv com o resultado da análise de outliers

Carregando os dados

dados <- read_excel(“arquivo.xlsx”)
View(dados)

Fazendo a filtragem dos dados

Vamos supor que o objetivo seja selecionar apenas os registros no elemento de despesa 30.

unique(dados$ELEMENTO_DESPESA) # esse comando relaciona os elementos de despesa (que é uma variável do dataset)

dados %>%
filter(ELEMENTO_DESPESA == “30”) %>%
head()

Ou podemos selecionar os registros dos elementos de despesa 30 e 39.

dados %>%
filter(ELEMENTO_DESPESA %in% c(“30”, “39”)) %>%
head()

Importante destacar que nos dois comandos acima, não houve alteração no dataset original, pois não utilizamos a atribuição <- .

A filtragem nos dados foi feita apenas na seção, mas poderíamos ter criado um novo dataset com os filtros, por exemplo:

dados2 <- dados %>%
filter(ELEMENTO_DESPESA %in% c(“30”, “39”))
View(dados2)

Caso objetivo seja, por exemplo, selecionar apenas os registros superiores a R$ 1 milhão.

dados3 <- dados %>%
filter(VALOR_LIQUIDO_PAGAMENTO > 1000000)
View(dados3)

Ou se quisermos apenas os pagamentos superiores a R$ 1 milhão no elemento de despesa 39.

dados4 <- dados %>%
filter(ELEMENTO_DESPESA == ‘39’,
VALOR_LIQUIDO_PAGAMENTO > 1000000)
View(dados4)

Ou ainda se quisermos filtrar por algum termo/palavra dentro de alguma coluna.

dados5 <- dados %>%
filter(str_detect(DESCRICAO_EMPENHO, “OBRA”))

dados6 <- dados %>%
filter(VALOR_LIQUIDO_PAGAMENTO > 1000000,
str_detect(DESCRICAO_EMPENHO, “OBRA”))

Gerando valor para a adutoria com análise de dados.

Problema de negócio: há pagamentos outliers realizados pela Prefeitura X (código do jurisdicionado = 11111111) no exercício de 2018

no elemento de despesa 30?

Um outliers é uma observação que se diferencia tanto das demais que levanta suspeitas. Pode decorrer de erro ou manipulação.

Vamos utilizar o método de amplitude interquartílica para detecção de outliers.

analise1 <- dados %>%
filter(CODIGO_JURISDICIONADO == ‘11111111’,
EXERCICIO == ‘2018’,
ELEMENTO_DESPESA == ‘30’)
analise1 <- c(dados$VALOR_LIQUIDO_PAGAMENTO)
View(analise1)

Abaixo, algumas estatísticas básicas dos pagamentos filtrados (analise1)

mean(analise1) # média
median(analise1) # mediana

Amplitude interquartítilica

q1 <- quantile(analise1, probs = 0.25)
q3 <- quantile(analise1, probs = 0.75)
amp <- q3 - q1
lim_max <- q3 + 3 * amp
lim_min <- q1 - 3 * amp
print(lim_max) # Limite superior, no caso desses dados, é igual a 9414.2
print(lim_min) # Limite inferior = -6729.9

Interpretando o resultado: os valores dos pagamentos no elemento 30 superiores a R$ 9.414,20 são outliers e poderiam ser selecionados para

uma análise pormenorizada pela equipe de auditoria. Caso a amostra ainda fique com muitos registros, poderia ser aplicado sobre os pagamentos

já selecionados, o método de Pareto.

Objetivo: criar um arquivo “.csv” com a relação dos pagamentos outliers

Manipulação do dataset - incluindo a coluna OUTLIER

dados7 <- dados %>%
filter(ELEMENTO_DESPESA == “30”,
EXERCICIO == ‘2018’,
CODIGO_JURISDICIONADO == ‘1112200’)

dados7 <- mutate(dados7, OUTLIER = ifelse(VALOR_LIQUIDO_PAGAMENTO > 9414.2, “sim”, “não”))
View(dados7)

write.table(dados7, file = ‘diretorio/nome_arquivo.csv’, sep = ‘;’, col.names = NA)

Abaixo link com o documento atualizado:
https://rpubs.com/vag/569678