Sobre Bigodes e Violinos

Livro Audit Analytics

Algumas considerações sobre alguns gráficos apresentados no capítulo Foundations of Audit Analystics do livro Audit Analytics do J. C. Westland.

Marcos F. Silva
2021-01-24

Considerações iniciais

Em linhas gerais o capítulo trata da exploração grafica de variáveis em um conjunto de dados, dos tipos de variáveis e comenta sobre as estruturas de dados existentes no R (vetores, matrizes, arrays, data frames, listas e fatores) e comenta rapidamente sobre a importância de outras estruturas de dados importantes em contabilidade como as séries temporais, os dados geolocalizados e os grafos.

Uma novidade pra mim foi o pacote plotluck que eu não conhecia. O pacote se propõe a apresentar a melhor visualização dos dados com base em suas características.

O livro possui um pacote associado chamado auditanalytics e pode ser instalado a partir do repositório do livo no GitHub onde estão disponíveis os dados utilizados, bem como notebooks com resumos dos capítulos do livro.

O resumo do capítulo 2 está contido no arquivo ch_2_statistics_analytics.Rmd.

A instalação do pacote pode ser feita da seguinte forma:

# install.packages("devtools")
devtools::install_github("westland/auditanalytics")

Os dados utilizados estão armazenados em arquivos csv no próprio pacote e nesse aspecto acho que um ponto de melhoria seria disponibilizá-los no formato .RData com a correspondente documentação como usualmente ocorre nos pacotes do R.

A falta de documentação dos dados, tanto no livro como no repositório e no pacote é uma falha importante visto que uma boa análise de dados pressupõe um bom conhecimento dos mesmos.

A disponibilização dos dados em arquivos csv torna a importação um pouco mais trabalhosa.

Gráficos apresentados no capítulo

A motivação para eu escrever este post foi a percepção de que alguns dos gráficos apresentados no capítulo não me pareceram uma boa escolha ou talvez eu não tenha compreendido corretamente a proposta do autor.

O capítulo apresenta ao leitor quatro tipos de gráficos: histograma, gráfico de violino, boxplot e diagrama de dispersão como formas de explorar os dados, o que me faz chamar a atenção para o fato de que os gráficos a serem utilizados pelo auditor em grande medida dependem do tipo de dado que se queira visualizar e que infelizmente o uso de gráficos pelos auditores como uma ferramenta de exploração é ainda bastante incipiente.

O primeiro gráfico que eu gostaria de comentar consta da página 29 e tem por objetivo, nas palavras do autor:

“Na figura a seguir estamos interessados em saber se a fraude em cartões de crédito é influenciada pelo valor pago ao auditor. A gente analisa uma variável binária examinando a variação em uma outra variável conforme os valores da mesma estejam associados ao valor 0 ou 1 da variável binária.”

O gráfico em questão, utilizado com vistas a ilustrar a exploração de variáveis binárias, é o seguinte:

Show code
library(auditanalytics)
library(ggplot2)
library(dplyr)

# Importação dos dados
sox_stats <- read.csv(system.file("extdata", "ch_2_data_types.csv", package="auditanalytics", mustWork=TRUE))

# Gráfico
ggplot(sox_stats, aes(x=non_audit_fee, y=audit_fee, col=as.factor(card)))+
  geom_violin() +
  labs(col="Fraud = 1 (green)")

A primeira coisa a comentar é o uso do gráfico de violino, que por ser um gráfico muito pouco conhecido, certamente não seria uma opção para a grande maioria dos auditores.

A ajuda da função geom_violin() diz que “O gráfico de violino é uma representação compacta de uma distribuição contínua. É uma mistura do geom_boxplot() e do geom_density(): o gráfico de violino é um gráfico de densidade ‘espelhado’ representado da mesma forma que um boxplot.

O “box and whisker plot” (gráfico de caixa e bigodes) ou simplesmente boxplot, é um gráfico que tem por objetivo apresentar a distribuição de uma variável quantitativa por intermédio dos quartis da distribuição e indicação de limites superiores e inferiores denominados “cercas”.

O boxplot e o gráfico de violino tem função semelhante, sendo que o gráfico de violino tem a vantagem de mostrar além da variabilidade dos dados e os quartis a forma da distribuição da variável por intermédio de sua densidade.

A seguir apresento o mesmo conjunto de dados usando um boxplot, um gráfico de densidade e um gráfico de violino para tentar realçar a diferença entre os dois. Os dados são apresentados em cinza para dar uma ideia da localização dos mesmos.

Show code
# Boxplot
sox_stats %>% 
  filter(card %in% c(0, 1)) %>% 
ggplot(aes(y=audit_fee, x=as.factor(card)))+
  geom_boxplot() +
  geom_jitter(color="grey", width = 0.2)
Show code
# Density
sox_stats %>% 
  filter(card %in% c(0, 1)) %>% 
ggplot(aes(y=audit_fee))+
  geom_density(fill="lightblue") +
  facet_wrap(~ as.factor(card)) 
Show code
# Violino
sox_stats %>% 
  filter(card %in% c(0, 1)) %>% 
ggplot(aes(y=audit_fee, x=as.factor(card)))+
  geom_violin(draw_quantiles = c(0.25, 0.5, 0.75), color="blue") +
  geom_jitter(color="grey", width = 0.2)

Examinando os três gráficos é possível perceber que o gráfico de violino é um gráfico de densidade refletido, o que lhe dá a simetria observada e é também parecido com um boxplot, mostrando a variabilidade dos dados e os quartis.

Onde existe maior concentração de dados, o gráfico de violino expressa isso na “largura” da curva, ou seja, onde tem maior concentração de dados a curva é mais larga.

Voltando ao gráfico apresentado pelo autor, comentei que o objetivo declarado desse gráfico seria avaliar se a fraude em cartões de crédito é influencidada pelo valor pago aos auditores contratados.

O gráfico faz uso de 3 variáveis: audit_fee, non_audit_fee e card e como já disse a base de dados não está comentada, não possuindo informações sobre o significado de cada variável e a estrutura geral dos dados. Assim, será necessário deduzir algumas coisas, o que não é o que se deve fazer na prática. O auditor deve buscar compreender com a maior clareza possível o significado de cada variável e suas particularidades para que possa ter condições de identificar situações que fujam da normalidade.

Aparentemente a variável card indica se a observação refere-se à fraude ou não. As outras variáveis indicam o valor pago aos auditores em razão de serviços contratados de auditoria e serviços não relacionados a auditoria.

A primeira coisa que não fica clara no gráfico apresentado é o uso da variável non_audit_fee, uma variável quantitativa contínua, no eixo dos x. Considerando que o objetivo de um gráfico de violino é representar a distribuição da variável no eixo y, que deve ser quantitativa, a variável non_audit_fee não traz informação adicional para o gráfico.

O mesmo problema ocorre com o gráfico apresentado na página 30, e que reproduzo a seguir utilizando o código apresentado no livro:

Show code
library(tidyr)

sox_stats$card <- as.integer(sox_stats$card)

sox_stats1 <- gather(sox_stats,
                     key="metric",
                     value = value,
                     effective_303,
                     mat_weak_303,
                     sig_def_303,
                     effective_404,
                     auditor_agrees_303)

ggplot(sox_stats1, aes(x=non_audit_fee, y=audit_fee, col=metric)) +
  geom_violin() +
  scale_x_continuous(trans = "log2") +
  scale_y_continuous(trans = "log2")

O gráfico mostra os “violinos” igualmente espaçados e mostrando a mesma distribuição para a variável audit_fee para todos os valores da variável metric.

Novamente aqui a variável non_audit_fee parece não ter qualquer influência no gráfico. Chama a atenção também o fato dos “violinos” serem todos iguais. O fato de não conhecermos em mais detalhes a base de dados dificulta a inspeção em busca de confirmação quanto a correção do resultado apresentado.

O fato é que não é possível extrair maiores informações nem confirmar a exatidão do resultado sem um maior conhecimento dos dados.

Também os gráficos apresentados nas páginas 31 e 32 não me pareceram uma boa escolha para o propósito desejado.

Aqui o objetivo do autor é ilustrar a análise de variáveis ordinais, mais especificamente omissões ou duplicidades em variáveis que possuem valores sequenciais, tais como os números das notas fiscais.

O gráfico a seguir, apresentado pelo autor, tem o objetivo de permitir a identificação visual de faturas duplicadas.

Show code
library(lubridate)
#library(kableExtra)

## função para gerar datas aleatórias no ano corrente
rdate <- function(x,
                  min = paste0(format(Sys.Date(), '%Y'), '-01-01'),
                  max = paste0(format(Sys.Date(), '%Y'), '-12-31'),
                  sort = TRUE) {
  dates <- sample(seq(as.Date(min), as.Date(max), by = "day"), x, replace = TRUE)
  if (sort == TRUE) {
    sort(dates)
  } else {
    dates
  }
}

## Cria um data frame com 2 coluna e preenche com os valores 1 a 1000 
invoice_no <- date <- 1:1000  ## placeholder
journal_ent_no <- cbind.data.frame(invoice_no,date)

# Sorteia 1000 datas entre 01-01-2021 e 31-12-2021 e ordena
date <- rdate(1000)

# Substitui os valores no campo 'data' pelas datas sorteadas
journal_ent_no$date <- date[order(date)]

# Adiciona duplicidades 
journal_ent_no$invoice_no <- seq(1,1000) + rbinom(1000,1,.1) # add some errors

# Cria um novo data frame com identificação das duplicidades.
duplicates <- duplicated(journal_ent_no$invoice_no)
raw <- seq(1,1000)
journal_dups <- cbind.data.frame(raw,duplicates)

# Faz o gráfico
ggplot(journal_dups, aes(x=invoice_no, y=raw, col=duplicates)) + 
  geom_point()

Como pode ser visto as duplicidades, em azul, não sobressaem muito. Como o espaço para o gráfico é pequeno os pontos se sobrepõem, dificultando a visualização.

Vou mostrar os registros iniciais do conjunto de dados utilizado para fazer esse gráfico:

Show code
head(journal_dups, 10)
   raw duplicates
1    1      FALSE
2    2      FALSE
3    3      FALSE
4    4      FALSE
5    5      FALSE
6    6      FALSE
7    7      FALSE
8    8      FALSE
9    9      FALSE
10  10      FALSE

O conjunto de dados consiste em uma coluna indicando a numeração sequencial de 1 a 1000 e outra indicando se o número está duplicado na base ou não. Esta base de dados é derivada do que seria a base “original” que apresento a seguir:

Show code
head(journal_ent_no, 10)
   invoice_no       date
1           1 2021-01-01
2           2 2021-01-01
3           3 2021-01-04
4           4 2021-01-04
5           5 2021-01-04
6           6 2021-01-04
7           7 2021-01-04
8           8 2021-01-05
9           9 2021-01-05
10         10 2021-01-05

A base de dados possui o número sequencial (invoice_no) e a data de emissão (date). Será que tem uma forma melhor de “visualizar” as duplicidades?

Vou apresentar aqui minha proposta:

Show code
ggplot(journal_dups) + 
  geom_vline(xintercept = invoice_no,
             color=ifelse(duplicates, "blue", "white"))+
  labs(x="Numeração Sequencial")

As linhas em azul indicam as faturas duplicadas. Podemos ver que a distribuição das duplicidades não aparenta ter um padrão definido.

Na minha opinião a visualização das duplicidades ficou um pouco melhor. Naturalmente que quanto maior a quantidade de dados mais difícil ficará a visualização, principalmente se a mesma referir-se a visualizar os dados inidividualmente, como é o caso apresentado pelo autor.

É claro que com um simples filtro é possível obter exatamente os números das faturas duplicadas, mas seria difícil perceber qualquer padrão nos dados caso eles existissem.

O gráfico na página 32 é muito parecido mas busca identificar faturas omitidas. Acredito que a mesma solução pode ser usada na visualização.

Bem, por ora é tudo. Espero que tenham gostado.

Citation

For attribution, please cite this work as

Silva (2021, Jan. 24). Audinalytics: Sobre Bigodes e Violinos. Retrieved from audinalytics.netlify.app/posts/2021-01-23-sobre-bigodes-e-violinos/

BibTeX citation

@misc{silva2021sobre,
  author = {Silva, Marcos F.},
  title = {Audinalytics: Sobre Bigodes e Violinos},
  url = {audinalytics.netlify.app/posts/2021-01-23-sobre-bigodes-e-violinos/},
  year = {2021}
}