Lei de Benford: Aplicada na Detecção de Fraudes em Dados Financeiros

Marcos Gois
8 min readJun 29, 2023

--

Lei de Benford: Aplicada na Detecção de Fraudes em Dados Financeiros

A Lei de Benford, também conhecida como a Lei do Primeiro Dígito, é uma ferramenta estatística poderosa que tem sido amplamente utilizada para identificação de fraudes em conjuntos de dados do mundo real. Neste artigo, exploraremos a Lei de Benford e sua aplicação na detecção de fraudes em dados financeiros, mais especificamente nas ações da PETR4. Veremos como essa lei pode revelar padrões não esperados nos dados e como se tornou uma técnica valiosa para a identificação de irregularidades.

O que é a Lei de Benford?

A Lei de Benford é uma teoria estatística que descreve a frequência de ocorrência dos dígitos iniciais em conjuntos de dados do mundo real. Segundo essa lei, a probabilidade de o primeiro dígito de um número ser 1 é de cerca de 30,1%. Essa probabilidade diminui à medida que os números aumentam, de forma que o número 2 aparecerá como o primeiro dígito cerca de 17,6% das vezes, o número 3 aparecerá cerca de 12,5% das vezes, e assim por diante, até o número 9, que aparecerá como o primeiro dígito apenas 4,6% das vezes.

Ocorrência dos dígitos

Essa lei surpreendentemente se aplica a uma variedade de conjuntos de dados, desde alturas de edifícios e tamanhos de rios até populações de cidades, preços de ações e dados contábeis(exemplos práticos). Sua aplicação na detecção de fraudes tem se mostrado particularmente eficaz. O presente artigo esta focado na aplicação da Lei de Benford, para saber mais sobre como é feito o calculo, consulte as referências ao final.

Lembrando que nem todos os conjuntos de dados se encaixam na Lei de Benford. Ela é mais provável de se aplicar em dados que abrangem várias ordens de magnitude e não são influenciados por regras ou restrições humanas. Além disso, é importante notar que desvios da Lei de Benford não são uma prova definitiva de irregularidade, eles são apenas um sinal de que talvez seja necessário um exame mais aprofundado.

Aplicação prática em ações da PETR4

Para a aplicação da Lei de Benford na detecção de fraudes em dados financeiros, utilizaremos os dados das ações da PETR4 retirados do kaggle. Primeiramente, importamos as bibliotecas necessárias e carregamos os dados.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import chisquare
import seaborn as sns
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.graph_objects as go

import warnings
warnings.filterwarnings('ignore')
stocks_brazilian = pd.read_csv('/kaggle/input/brazilian-stock-exchange-shares-for-forecast/stocks_prediction.csv')
stocks_brazilian.head()
Dados financeiros do Brasil

Em seguida, executaremos duas funções: transformation_data e separe_stocks. A função transformation_data ajusta e transforma o dataframe das ações, selecionando apenas os dados da ação desejada, ordenando-os e definindo a data como índice. As colunas desnecessárias para a análise são removidas, deixando apenas os preços de fechamento das ações. A função separe_stocks separa os dados de cada ação listada no dataframe original, filtrando apenas as ações negociadas a partir do ano de 2010 e criando uma lista de dataframes, cada um contendo os dados de uma ação específica, no caso, a PETR4.

def transformation_data(df, stock_name):
# Seleciona apenas os dados da ação desejada
df_stock = df[(df['Stock Name'] == stock_name) & (df['Date'] >= '2010-01-01')]

# Ajusta e ordena as datas
df_stock.Date = pd.to_datetime(df_stock.Date)
df_stock = df_stock.sort_values(by=['Date'])
df_stock = df_stock.reset_index(drop=True)
df_stock = df_stock.set_index('Date')

# Remove colunas desnecessárias
df_stock = df_stock.drop(['Open','High', 'Low', 'Volume'], axis=1)

return df_stock

def separe_stocks(df, stocks_name):
list_dataframe_stocks = []

for name in stocks_name:
list_dataframe_stocks.append(transformation_data(df, name))
# lista para anexar estoques separados
list_dataframe_stocks = []

# lista de nomes de ações no dataframe original
list_stock_names = stocks_brazilian['Stock Name'].unique()

# função de transformação e separação
separe_stocks(stocks_brazilian, list_stock_names)

stock_pret4 = list_dataframe_stocks[0]
stock_pret4.head()
Dados financeiros do Brasil filtrados

Uma vez que os dados foram transformados, podemos prosseguir com a análise de Benford. Para isso, criaremos uma classe chamada BenfordAnalysis, que realizará a análise de Benford nos dados de cada valor de fechamento da ação PETR4. Essa classe também gerará gráficos para obtermos insights dos dados e identificar possíveis anomalias.

class BenfordAnalysis:
def __init__(self, df):
self.df = df
self.df['Primeiro_dígito'] = self.df['Close'].apply(lambda x: int(str(x)[0]))
self.df_resampled = self.df['Primeiro_dígito'].resample('M').apply(self.aderencia_benford)

@staticmethod
def aderencia_benford(x):
contagem = x.value_counts().sort_index()
contagem = contagem.reindex(np.arange(1, 10), fill_value=0)
distribuicao_real = contagem / contagem.sum()
distribuicao_benford = np.log10(1 + 1 / np.arange(1, 10))
return chisquare(distribuicao_real, distribuicao_benford)[0]

def generate_plots(self):
limiar = np.percentile(self.df_resampled, 99)
fig = make_subplots(rows=2, cols=2, subplot_titles=('Série Temporal do Preço de Fechamento',
'Histograma dos Primeiros Dígitos',
'Série Temporal da Aderência à Lei de Benford',
'Boxplot da Aderência à Lei de Benford'))

fig.add_trace(go.Scatter(x=self.df.index, y=self.df['Close'], mode='lines'), row=1, col=1)
fig.add_trace(go.Histogram(x=self.df['Primeiro_dígito'], nbinsx=9), row=1, col=2)
fig.add_trace(go.Scatter(x=self.df_resampled.index, y=self.df_resampled, mode='lines'), row=2, col=1)
fig.add_trace(go.Box(y=self.df_resampled, name=''), row=2, col=2)

fig.update_layout(height=800, width=1000, title_text="Análise da Aderência à Lei de Benford")
fig.show()

fig = go.Figure()
fig.add_trace(go.Scatter(x=self.df_resampled.index, y=self.df_resampled, mode='lines', name='Aderência',
line=dict(color='blue')))
fig.add_trace(go.Scatter(x=self.df_resampled.index, y=[limiar]*len(self.df_resampled), mode='lines', name='Limiar',
line=dict(color='red', dash='dash')))
fig.add_trace(go.Scatter(x=self.df_resampled.index, y=self.df_resampled, mode='none', name='Área Suspeita',
fill='tonexty', fillcolor='rgba(255, 0, 0, 0.2)', line=dict(width=0), showlegend=False))

fig.update_layout(title='Aderência à Lei de Benford', xaxis_title='Data', yaxis_title='Aderência', hovermode='x')
fig.show()

Após a definição da classe BenfordAnalysis, podemos instanciá-la passando os dados da ação PETR4 e gerar os gráficos para análise.

ba = BenfordAnalysis(stock_pret4)
ba.generate_plots()

Análise e Entendimento dos Gráficos Gerados

Série Temporal do Preço de Fechamento

Este gráfico mostra o comportamento do preço de fechamento da ação PETR4 ao longo do tempo. Podemos observar a variação dos preços e identificar possíveis tendências ou momentos de instabilidade.

Série Temporal do Preço de Fechamento

Histograma dos Primeiros Dígitos

O histograma dos primeiros dígitos do preço de fechamento nos ajuda a visualizar a distribuição desses dígitos de acordo com a Lei de Benford. Esperamos que a distribuição esteja inclinada em favor de números menores, ou seja, que ocorram mais preços de fechamento iniciados com o dígito ‘1’. Desvios significativos dessa distribuição podem indicar anomalias nos dados.

Histograma dos Primeiros Dígitos

É possível identificar que o número de dígitos ‘2’ é maior do que o número de dígitos ‘1’, e outros dígitos também apresentam anomalias em relação à distribuição esperada pela Lei de Benford. Isso indica a necessidade de uma análise mais aprofundada dos dados.

Boxplot da Aderência à Lei de Benford

O boxplot da aderência à Lei de Benford nos mostra a distribuição dos valores de aderência para cada período analisado. Outliers nesse gráfico podem indicar períodos em que a aderência à Lei de Benford foi particularmente baixa, sugerindo a possibilidade de anomalias ou manipulações nos dados.

Boxplot da Aderência à Lei de Benford

Podemos identificar a presença de outliers, o que indica a existência de períodos com baixa aderência à Lei de Benford. Esses períodos requerem uma investigação mais detalhada.

Série Temporal da Aderência à Lei de Benford

Este gráfico apresenta a aderência à Lei de Benford ao longo do tempo. A aderência é calculada utilizando o teste qui-quadrado, no qual um valor mais alto indica menor aderência à Lei de Benford.

Série Temporal da Aderência à Lei de Benford

Ao analisar a série temporal da aderência à Lei de Benford para a ação PETR4, é possível identificar que existem períodos em que a aderência é significativamente baixa, o que sugere a presença de anomalias nos dados. Esses períodos podem ser alvos de investigação mais detalhada.

Gráfico de Aderência à Lei de Benford

O gráfico de aderência à Lei de Benford é uma representação visual clara da aderência ao longo do tempo. Ele mostra a linha de aderência, que indica a aderência em cada período, e uma linha de limite, que marca o 99º percentil da aderência ou seja 99% dos dados estão abaixo desse valor. Quando a linha de aderência cruza a linha de limite, indica que a aderência à Lei de Benford é excepcionalmente baixa, sugerindo a presença de anomalias ou manipulações nos dados.

Gráfico de Aderência à Lei de Benford

No gráfico da ação PETR4, podemos observar que há uma área suspeita em relação à aderência à Lei de Benford, especialmente no mês de março de 2015. Essa área suspeita ultrapassa o limiar estabelecido, o que indica a presença de possíveis irregularidades nos dados.

Investigando a Área Suspeita (Março de 2015)

Após identificar a área suspeita no gráfico de aderência à Lei de Benford, é importante investigar as possíveis causas dessa anomalia. Em uma pesquisa breve, encontramos algumas notícias vinculadas à empresa PETR4 durante o mês de março de 2015.

Abrir postagem

Nesse período, a Petrobras enfrentou uma série de problemas e escândalos que tiveram um impacto significativo em sua reputação e situação financeira. O principal evento foi a revelação da Operação Lava Jato (sobre a operação), uma investigação que expôs um esquema de corrupção envolvendo a Petrobras, empreiteiras e políticos.

A investigação revelou um amplo esquema de desvio de dinheiro e pagamento de propinas a executivos da Petrobras em troca de contratos superfaturados. Estima-se que bilhões de reais tenham sido desviados ao longo de vários anos. Essa revelação abalou a confiança dos investidores na empresa e causou uma crise institucional e econômica no Brasil.

Abrir postagem

Como resultado, a Petrobras enfrentou uma série de consequências. A empresa foi processada nos Estados Unidos por violações de leis anticorrupção e teve que pagar multas significativas. Além disso, houve uma queda no valor das ações da empresa e na sua capacidade de obter financiamento.

Conclusão

A análise da Lei de Benford aplicada às ações da PETR4 demonstra sua eficácia na detecção de possíveis irregularidades nos dados financeiros. Os gráficos gerados permitem identificar anomalias na distribuição dos primeiros dígitos dos preços de fechamento e na aderência à Lei de Benford ao longo do tempo.

No caso específico da PETR4, a área suspeita identificada no mês de março de 2015 está relacionada aos escândalos de corrupção envolvendo a empresa fazendo com que os preço oscilassem em um padrão incomum. Essa coincidência reforça a importância da análise estatística na detecção de fraudes e irregularidades.

A Lei de Benford se mostra uma ferramenta complementar valiosa em auditorias e na identificação de padrões não esperados nos dados financeiros. Podendo auxiliar na tomada de decisões mais informadas e na prevenção de fraudes.

Referências:

--

--

Marcos Gois

Full stack developer | Data Science | Machine Learning | Python | C# | SQL