Indício de fraude nas eleições? Usando a Lei de Benford.


Compartilharam, recentemente, uma análise das eleições presidenciais utilizando a lei de Benford. Para quem não conhece, a lei de Benford é bastante utilizada na detecção de fraudes em uma gama de circunstâncias, como demonstrações contábeis e, inclusive, eleições. Para entender um pouco mais sobre o assunto, leia aqui (Lei de Benford), aqui (Lei de Benford – por que ela surge?) ou aqui (benford.analysis 0.1).

A análise tomou os votos da Dilma por município e extraiu os primeiros dígitos das observações. Por exemplo, se em um dado município foram contabilizados 1.529 votos para a candidata, o primeiro dígito é 1. Já se o número tivesse sido 987, o primeiro dígito é 9. Segundo a lei de Benford, deveríamos observar cerca de 30,1% dos municípios começando com o dígito 1; em seguida, 17,6% dos municípios com a totalização dos votos iniciada pelo número 2. E assim sucessivamente, como no gráfico a seguir:

benford_1_d

Se os números observados diferirem substancialmente do que é previsto pela lei, isso poderia ser um indício de manipulação dos dados ou de algum outro fato atípico. Mas, seria pertinente utilizar este instrumento para analisar fraudes em votos municipais? Para responder a essa pergunta, devemos responder, na verdade, outra: estes dados tenderiam a ter uma distribuição de Benford?

Em uma primeira aproximação, a resposta é sim. Dados de população municipal tendem a seguir a lei de Benford. Veja, por exemplo, a distribuição dos primeiros dígitos dos dados de população por município, no Brasil (estou utilizando o pacote de R benford.analysis; o gráfico em que você tem que prestar mais atenção é o primeiro, em que a linha pontilhada vermelha é o valor previsto e a barra azul é o valor observado):

pop_1_d

Ora, e como a população define o eleitorado, também é de se esperar que a lei tenda a aparecer nos números de eleitores. E, de fato, aparece:

eleitorado_1_D

E, por fim, como o eleitorado define o número de votos dos candidatos, também é natural se esperar que a distribuição apareça nesta situação. Em todos os casos vale lembrar que a lei de Benford nunca valerá exatamente, será apenas uma aproximação –  testes estatísticos formais tem que ser interpretados com cautela e não são muito úteis, a principal função da lei é identificar possíveis focos de observações que mereçam análise/auditoria mais aprofundada.

Voltando, portanto, à análise mencionada anteriormente, foram calculados os desvios dos valores observados em relação aos valores esperados e, com isso, a estatística de chi-quadrado. Mas isso foi feito para cada estado da federação:

Captura de Tela 2014-11-02 às 13.00.02

Note que alguns estados em que Dilma ganhou com bastante diferença como BA, PE ou PI tem grande  discrepância em relação ao esperado pela lei, e isso causou certa estranheza. Por que logo estes estados?

Contudo, ocorre que, apesar de a distribuição do número de eleitores (ou da população) por municípios ter um bom ajuste quando usamos os dados do Brasil inteiro, isso não precisa valer para cada estado separadamente. E de fato não vale. Para deixar mais claro, vejamos, abaixo, o grau de ajuste do número de eleitores e da população para cada estado separadamente, e comparemos isso com o ajuste do número de votos:

Captura de Tela 2014-11-02 às 13.45.53

Note que a Bahia tem um chi-quadrado alto para o número de votos (72.725), mas também já tinha esse valor alto para o número de eleitores (68.988) e população (60.712). Observa-se a mesma coisa com MG, PE, PI e RS, por exemplo. Na verdade, a correlação dessas três séries é bem alta. A correlação entre o Qui-Quadrado do número de votos e o Qui-Quadrado do Número de Eleitores é de 0.968.

Captura de Tela 2014-11-02 às 13.53.24

Deste modo, para o caso em questão,  as grandes discrepâncias entre a lei de Benford e o número de votos em alguns estados parecem decorrer, em grande medida, do próprio desvio já presente nas distribuições da população e do eleitorado.

Há mais coisas que podem ser investigadas nos dados, e acho que esse é um bom exemplo para explorar a lei de Benford na prática. Por exemplo, a lei de Benford não estipula somente uma distribuição para o primeiro dígito, mas sim para todos os dígitos significativos, então você poderia analisar os dois primeiros dígitos (dada a quantidade de observações, não acredito que dê para analisar os três primeiros). Ou, ainda, verificar se a divisão por regiões mais amplas do país tenderiam a seguir a lei para o eleitorado (e para o número de votos).

Para replicar os cálculos acima, você pode utilizar estes dados aqui (link) e o script de R a seguir:


# instale o pacote e carregue os dados
install.packages("benford.analysis")
library(benford.analysis)
load("benford_eleicoes.rda")

#### Geral ####
bfd_votos <- benford(votos_dilma$votos, number.of.digits=1)
plot(bfd_votos)

bfd_pop <- benford(dados_pop$pop, number.of.digits=1)
plot(bfd_pop)

bfd_eleitorado <- benford(eleitorado$eleitores, number.of.digits=1)
plot(bfd_eleitorado)

#### Por Estado ####
# separando os dados
split_votos_uf <- split(votos_dilma, votos_dilma$uf)
split_pop_uf <- split(dados_pop, dados_pop$uf)
split_eleitorado_uf <- split(eleitorado, eleitorado$uf)

# benford dos votos
bfd_votos_uf <- lapply(split_votos_uf, function(x) benford(x$votos, number.of.digits=1))
chi_votos_uf <- sapply(bfd_votos_uf, function(x) chisq(x)$stat)
chi_votos_uf

# plote um estado de exemplo
plot(bfd_votos_uf[["BA"]])

# benford da população
bfd_pop_uf <- lapply(split_pop_uf, function(x) benford(x$pop, number.of.digits=1))
chi_pop_uf <- sapply(bfd_pop_uf, function(x) chisq(x)$stat)
chi_pop_uf

# plote um estado de exemplo
plot(bfd_pop_uf[["BA"]])

# benford do eleitorado
bfd_eleitorado_uf <- lapply(split_eleitorado_uf, function(x) benford(x$eleitores, number.of.digits=1))
chi_eleitorado_uf <- sapply(bfd_eleitorado_uf, function(x) chisq(x)$stat)
chi_eleitorado_uf

# plote um estado de exemplo
plot(bfd_eleitorado_uf[["BA"]])

# comparando as estatísticas chi-quadrado
compara <- data.frame( Chi_Quadrado_Votos = chi_votos_uf,
                       Chi_Quadrado_Número_de_Eleitores = chi_eleitorado_uf,
                       Chi_Quadrado_População = chi_pop_uf)
row.names(compara) <- gsub("([A-Z]{2}).*", "\\1", row.names(compara))
compara

# correlações
cor(compara)

Anúncios

Distribuindo pacotes no R. Qual o alcance?


Faz mais ou menos 1 mês que o pacote benford.analysis 0.1 foi disponibilizado no CRAN. 

Achei que valeria o esforço adicional de criar o pacote por alguns motivos e, entre eles, dois se destacam: (i) pacotes deixam os arquivos fontes mais estruturados, facilitam o uso das funções, forçam a criar uma documentação e passam por uma bateria de sanity tests que ajudam a criar boas práticas de programação; (ii) pacotes tornam o compartilhamento do código extremamente simples, ainda mais se o pacote estiver no CRAN, pois, basta rodar

 install.packages("benford.analysis") 

e qualquer pessoa de qualquer lugar do mundo terá o pacote instalado em sua máquina.

Sobre este último ponto, infelizmente, não é possível ter dados de download do CRAN de uma maneira consolidada, pois há diversos espelhos do site ao redor do mundo e nem todos guardam informações de acesso. Entretanto, o CRAN do RStudio faz esse registro. Assim resolvi baixar os dados de lá e ver se alguma outra alma além de mim baixou o benford.analysis.

Sinceramente, eu achei que encontraria uns 10 ou 11 downloads registrados – no máximo -, pois estamos com dados de apenas um espelho do CRAN e estamos falando de um pacote simples e relativamente desconhecido. Ocorre que neste 1 mês de existência o benford.analysis foi baixado 190 vezes em mais de 40 países diferentes considerando apenas o espelho do RStudio.  Um número pequeno quando comparado com pacotes como ggplot2 (que deve estar em virtualmente quase toda máquina de usuário do R), mas, ainda assim, grande o suficiente para me surpreender!

E também para me preocupar. Nesse meio tempo encontrei dois pequenos bugs no pacote. E se antes achava que não deveria ter pressa para corrigi-los, agora esperem uma atualização em breve (mas, claro, depois do carnaval)!

benford.analysis 0.1


O pacote benford.analysis (versão 0.1) está disponível no CRAN e você já pode instalar no R com o comando:

 install.packages("benford.analysis") 

O objetivo do pacote é prover algumas funções que facilitem a validação de dados utilizando a Lei de Benford (para saber mais sobre a lei, veja aqui e aqui).

Validar como e para quê?

Um dos objetivos pode ser o auxilío na detecção de manipulações contábeis. Dados financeiros (como pagamentos) tendem a seguir a Lei de Benford e tentativas de manipulação podem acabar sendo identificadas.

Por exemplo, a lei 8.666/93 estabelece que o limite para se fazer uma licitação na modalidade convite é de R$80.000,00. Será que os valores de licitações seguiriam a Lei de Benford? Pode ser que sim. E, caso haja a tendência, uma tentativa de manipular artificialmente valores licitados para algo pouco abaixo de R$80 mil geraria um “excesso” de dígitos iniciais 7. Restaria verificar uma amostra desses registros para confirmar a existência ou não de manipulação indevida.

Outro objetivo pode ser acadêmico: a validação de dados de pesquisas e censos. Por exemplo, dados de população de municípios, ou dados de renda dos indivíduos tendem a ter distribuição conforme a lei de Benford. Assim, desvios dos valores observados em relação aos valores esperados podem ajudar a identificar e corrigir dados anômalos, melhorando a qualidade da estatística.

Vejamos rapidamente alguns exemplos das funções básicas do pacote.

O benford.analysis tem 6 bases de dados reais, retiradas do livro do Mark Nigrini, para ilustrar as análises. Aqui vamos utilizar 189.470 registros de pagamentos de uma empresa no ano de 2010. Os valores vão desde lançamentos negativos (estornos) até valores na ordem de milhões de dólares.

Primeiramente, precisamos carregar o pacote (se você já o tiver instalado) e em seguida carregar os dados de exemplo:

library(benford.analysis) #carrega pacote

data(corporate.payment) #carrega dados

Para analisar os dados contra a lei de benford, basta aplicar a função benford nos valores que, no nosso caso, estão na coluna ‘Amount’.

 bfd.cp <- benford(corporate.payment$Amount)

Com o comando acima criamos um objeto chamado “bfd.cp” contendo os resultados da análise para os dois primeiros dígitos dos lançamentos positivos, que é o padrão. Caso queira, você também pode mudar quantos digitos deseja analisar, ou se quer analisar os dados negativos e positivos juntos, entre outras opções Para mais detalhes, veja a ajuda da função:

 ?benford

Com a análise feita, vejamos os principais gráficos com o comando:

 plot(bfd.cp) 

Os gráficos resultantes se encontram abaixo. Os dados da empresa estão em azul e os valores esperados pela lei de benford em vermelho.

plot_cp

O primeiro gráfico diz respeito à contagem de observações com relação aos seus dois primeiros dígitos, comparando-a com o valor esperado pela Lei de Benford.  Percebe-se que os dados da empresa se ajustam à Lei, mas, também, que há um salto claro no dígito 50!

O segundo gráfico é análogo ao primeiro, mas faz esta contagem para a diferença dos dados ordenados. Como nossos dados são discretos, este saltos em 10, 20, 30,  são naturais e não devem ser encarados como algo suspeito. Por fim, o terceiro gráfico tem um objetivo diferente e, em geral, você também não deve esperar encontrar um bom ajuste dos dados à reta vermelha, principalmente com dados de cauda pesada. Ali se encontra a soma dos valores das observações agrupadas por primeiros dígitos e a  intenção é identificar grupos de valores influentes (que, se estiverem errados, podem afetar bastante uma estatística).

Vejamos agora os principais resultados da análise com o comando

 print(bfd.cp) 

ou somente

bfd.cp

results_cp

Primeiramente são mostrados dados gerais da análise, como o nome da base de dados, o número de observações e a quantidade de primeiros dígitos analisados.

Logo em seguida têm-se as principais estatísticas da mantissa do log das observações. Se um conjunto de dados segue a lei de benford esses valores deveriam ser próximos de:

  • média: 0.5;
  • variância: 1/12 (0.08333…);
  • curtose: 1.2;
  • assimetria: 0.

Que são, de fato, similares aos dados de pagamento da empresa, confirmando a tendência.

Após isso, temos um ranking com os 5 maiores desvios, que é o que mais nos interessa aqui. Veja que o primeiro grupo é o dos números que começam com o dígito 50, como estava claro no gráfico, e o segundo grupo é o dos números que começam com 11. Esses registros são bons candidatos para uma análise mais minuciosa.

Por fim, temos um conjunto de estatísticas de grau de ajuste – que não irei detalhar agora para não prolongar muito este post. Tomemos como exemplo o teste de Pearson, que é bem conhecido. Veja que o p-valor do qui-quadrado é praticamente zero, sinalizando um desvio em relação ao esperado. Mas, como já dissemos várias vezes neste blog, o mais importante não é saber se os dados seguem ou não a lei de benford exatamente. Para isso você não precisaria sequer testá-los. O mais importante é verificar qual o tamanho do desvio e a sua importância prática. Assim, há um pequeno aviso ao final: Real data will never conform perfectly to Benford’s Law. You should not focus on p-values!

Voltando, portanto, à identificação dos desvios, você pode pegar os conjuntos dos dados “suspeitos” para análise com a função getSuspects.

 suspeitos <- getSuspects(bfd.cp, corporate.payment)

Isto irá gerar uma tabela com os dados dos 2 grupos de dígitos com maior discrepância (pela diferença absoluta), conforme ilustrado abaixo. Veja que são exatamente os dados que começam com 50 ou 11. Você pode personalizar qual a métrica de discrepância utilizar e também quantos grupos analisar. Para mais detalhes veja a ajuda da função:

 ?getSuspects

suspects

Note que nossa base de dados é de mais de 189 mil observações. Verificar todos os dados seria infactível. Poderíamos analisar uma amostra aleatória desses dados. Mas, não necessariamente isso seria eficiente.  Veja, assim, que a análise de benford, com apenas os dois primeiros dígitos, nos deu um grupo de dados suspeitos com menos de 10% das observações, permitindo um foco mais restrito e talvez mais efetivo para análise.

Há outras funcionalidades no pacote e na ajuda há exemplos com dados reais. O pacote é bem simples, o intuito é fornecer um mínimo de funções que automatize os procedimentos, facilite a vida e minimize a quantidade de caracteres digitados de quem queira fazer a análise. Algumas funcionalidades que serão adicionadas no futuro são: melhoria na parte gráfica com o Lattice, inclusão de comparação dos dados com a lognormal e inclusão de mais dados de exemplo.

Se encotrar algum bug, tiver alguma dúvida ou se quiser deixar alguma sugestão, comente aqui!

PS: com relação às sugestões, tanto o R quanto este pacote são livres e com código aberto. Então, sinta-se à vontade não somente para sugerir, mas principalmente para escrever novas funções e funcionalidades!

Benford Analysis R Package


Em post anterior falamos sobre a Lei de Benford e que ela pode ser utilizada para o auxílio na detecção de fraudes contábeis ou dados estranhos. Também explicamos por que ela surge – resumidamente, pode-se dizer que números que tenham crescimento exponencial, ou que sejam derivados da multiplicação de outros números, tenderiam à lei de Benford – e isto abrange muitos dados econômicos.

Além da Lei de Benford, temos falado bastante sobre o R por aqui. Então, que tal unirmos as duas coisas? Bem, em alguns dias, com o pacote benford.analysis, você poderá analisar facilmente e rapidamente (espero!) seus dados contra a lei de Benford para identificar possíveis erros.

A idéia do pacote é tornar a análise algo rápido e simples. Por exemplo, o gráfico abaixo é gerado com apenas dois comandos: bfd <- benford(dados) e plot(bfd).

Plot BenfordVamos ver se vai ficar bacana.

Atualização: a versão 0.1 está no CRAN.

Lei de Benford – por que ela surge?


No post anterior falamos da Lei de Benford e que ela surge naturalmente em diversos fenômenos do mundo real, inclusive em dados contábeis e econômicos. Mas não explicamos o porquê. Aqui traremos duas explicações.  A primeira, bastante intuitiva, é pensar que estes dados tem crescimento exponencial. Por exemplo, na economia (brasileira), variáveis como o PIB real e os preços crescem entre 2% e 6% ao ano, respectivamente. E como o crescimento exponencial levaria à Lei de Benford?

Suponha que o valor inicial de uma variável seja 10 e que ela tenha uma taxa de crescimento de 10% por período. Veja que, ao crescer exponencialmente, a variável vai demorar 7 períodos para chegar na casa dos 20’s. Todavia, após chegar no 20, ela cresce mais rapidamente, e leva apenas 4 períodos para chegar na casa dos 30’s. Note que esta variável irá ficar apenas um período na casa dos 90’s, para logo em seguida passar mais 7 períodos nos 100’s (e com primeiro digito 1). Parece condizer com a Lei.

Para verificar, façamos uma simulação, com uma variável que cresça 3% por período. Após 2000 períodos, a distribuição dos dígitos da série segue muito aproximadamente a Lei de Benford (como a amostra é grande, no gráfico utilizamos a distribuição dos dois primeiros dígitos, que tem maior capacidade de discriminação do que apenas a distribuição do primeiro dígito).

cresc_benfordAlém do crescimento exponencial, existe, ainda, uma razão mais convincente. Dados contábeis e econômicos também são, em geral, fruto da multiplicação de diversos números. Para saber o valor da produção,por exemplo, multiplicam-se quantidades e preços. E ocorre que a multiplicação de distribuições contínuas tem como distribuição limite um conjunto  de Benford. Façamos uma simulação com distribuições normal – N(10,10) – qui-quadrado – Q(3) e uniforme – U(0,1).

Perceba que elas, separadamente, não seguem a Lei.  Primeiro, a normal:

norm_benford

Agora a Qui-Quadrado:

qui_benford

E a Uniforme:

unif_benford

Entretanto, ao multiplicarmos as 3, eis que surge a distribuição dos dígitos!

mult_benford

Lei de Benford


Chute um valor: quanto seria o percentual de posts deste blog cujo número de acessos se inicia com o número 1?

Sendo mais claro, se o post X tem 10.251 acessos e, o post Y, 152 acessos, o primeiro digito de ambos seria o número 1. Quantos semelhantes a estes, com primeiro digito 1, teríamos em relação ao total? Se extraíssemos todos os primeiros dígitos, haveria algum padrão nesta distribuição? Uma resposta “intuitiva” (mas geralmente errada) é a de que provavelmente haveria tantos posts com números iniciais 1, quanto com números 2 ou 9. Mas quem já ouviu falar da Lei de Benford saberia que, muito provavelmente, não seria isso o observado. Haveria mais ou menos 30% de números 1, seguidos de 17% de números 2 e, após, 12% de números 3, decaindo até mais ou menos 5% de números 9.

Passemos aos dados para verificar se esta tendência realmente se confirma:

Benford

Funciona.  E o interessante é que isto ocorre não somente neste blog, mas nas mais diversas estatísticas do mundo real.

A Lei de Benford é assim chamada por conta do – cada vez mais famoso – artigo de Frank Benford, The Law of Anomalous Numbers. Segundo Benford, o insight para investigar este resultado é curioso.  Aparentemente, nas tabelas de logaritmos, as páginas mais desgastadas eram aquelas cujos números tinham primeiro digito 1 (em 1930, estas tabelas eram bastante utilizadas para facilitar operações de multiplicação). Com uma base de dados de 20.000 observações dos mais diversos fatos da natureza (tamanhos de rio, população de cidades, constantes da física, taxa de mortalidade etc), Benford verificou que, em cada uma delas, a distribuição dos dígitos seguia este mesmo padrão.

O resultado investigado por Benford não define apenas uma distribuição para os primeiros dígitos, conforme ilustrado no gráfico acima, mas uma distribuição para todos os dígitos significativos de um número. Mais formalmente, um conjunto de números que siga a Lei de Benford teria a mantissa de seus logaritmos uniformemente distribuída. Para o economista isto importaria pelo seguinte motivo –  como grande parte dos dados econômicos e contábeis seguem (aproximadamente) esta distribuição, dados errados, inventados ou fraudados poderiam ser identificados por desvios dos valores esperados pela Lei de Benford. Interessante, não? Espero que sim, pois trataremos mais disto em posts futuros.