Comunicação de Acidente de Trabalho (CAT) é o documento emitido para reconhecer um acidente de trabalho ou de trajeto, bem como uma doença ocupacional.
Clique para ver o sumário
Para começar este projeto de Comunicação de Acidente de Trabalho, é ncessário configurar um ambiente Python e ter o Power BI instalado para criar as visualizações.
O projeto foi desenvolvido para fornecer insights sobre acidentes de trabalho e doenças ocupacionais, utilizando o plano de dados abertos do governo.
Antes de começar, certifique-se de ter o seguinte:
Veja a lista de pré-requisitos
- Acesso a internet para download dos arquivos;
- Ambiente de desenvolvimento, recomendo o uso de:
- VS Code (com extensão do Jupyter Notebook); ou
- Google Colab (vem com Jupyter integrado e roda na nuvem);
- Python instalado na máquina, caso utilize o VS Code. Versão 3.7 ou superior;
- Bibliotecas Python utilizadas:
- pandas: Para manipulação e análise dos dados;
- re: Para criação de expressão regular;
- xlrd: Para trabalhar com arquivos .xls;
- Power BI Desktop: Para criar e visualizar painéis;
- Power BI Online: Conta para publicar e compartilhar o dashboard;
- Git: Para clonar este repositório;
- Github: Para criar seu repositório online.
Com os pré-requisitos acima atendidos, pode-se prosseguir para as próximas etapas do projeto.
Para ter acesso aos dados utilizados, confira a tabela abaixo:
Fonte | Link |
---|---|
Comunicação de Acidente de Trabalho (2016-2018) | dados.gov.br/cat_pt1 |
Comunicação de Acidente de Trabalho (2023-2025) | dados.gov.br/cat_pt2 |
Classificação Brasileira de Ocupações (CBO) | mte.gov.br/cargos |
Classificações Estatísticas Nacionais (CNAE) | ibge.gov.br/atividades |
Códigos de Municípios do IBGE | ibge.gov.br/municipios |
Códigos Internacionais de Doenças (CID) | datasus.gov.br/cid_10 |
Documentação Técnica do eSocial (Tabelas) | esocial.gov.br/acidente |
Outros links úteis para dados do CID-10:
- Cremesp - Arquivo .pdf com as subcategorias
- Tabnet - Lista de tabulação para morbidade
- Dr. Jorge Assunção - Tabela no google sheets
Important
Os dados da CAT utilizados no projeto são apenas de 2024.
As tabelas do eSocial utilizadas foram: 13, 14, 15 e 17.
Para iniciar uma Comunicação de Acidente de Trabalho é preciso cadastrar as informações na página da Previdência Social, informando: tipo da comunicação, tipo do empregador, cnpj do empregador, cpf do empregado e data do acidente.
Quando baixamos os dados públicos dessas comunicações, obtemos ainda:
- Onde aconteceu o acidente
- De que forma aconteceu
- O que causou e a lesão sofrida
- O benefício recebido e por quem
- Se houve óbito ou não
As dimensões utilizadas se relacionam com os dados da CAT a partir dos códigos disponibilizados e servem como base para complementação dos dados.
Como tem limitação de caracteres nas colunas de texto da CAT, utilizei as dimensões e as tabelas do eSocial para completar e corrigir os textos abaixo:
- Espécie do benefício (ajuste ortográfico e de sigla)
- Agende causador do acidente (tabelas 14 e 15 do eSocial)
- Natureza da lesão (tabela 17 do eSocial)
- Parte do corpo atingida (tabela 13 do eSocial)
- Categorias do CID-10 (tabela com as categorias)
Para isso, exportei as colunas separadamente e, no Excel, alinhei os dados, criando um dicionário (ref. ft_catweb_v2.ipynb).
# Armazena as colunas selecionadas, dropando valores duplicados
verifica_cid = catweb_2024[['cd_cid', 'nm_cid']].drop_duplicates()
# Exporta a tabela para uso posterior
verifica_cid.to_csv('cid-10.csv', index=False, encoding='latin1')
# Cria o dicionário com os valores da coluna e seus ajustes
beneficio = {
'Pa': 'Auxílio-acidente',
'Auxílio Doenca por A': 'Auxílio-doença acidentário',
'Pensão por Morte Aci': 'Pensão por morte acidental'
}
# Aplica o dicionário na coluna, substituindo os valores
catweb_2024['tipo_beneficio'] = catweb_2024['tipo_beneficio'].replace(beneficio)
Optei por realizar duas transformações nos dados coletados. Primeiro, um tratamento mais simples, padronizando os valores e normalizando os dados. Depois um mais complexo, que consistiu em substituir valores existentes em relação a ortografia, e cortes nos textos, deixando os valores mais legíveis ao carrregar no Power BI.
Pesquisei pelos dados da CAT no Portal Brasileiro de Dados Abertos e baixei os arquivos .zip diretamente, armazenando na pasta do projeto (já que escolhi usar o VS Code na execução).
Iniciei essa etapa, comparando os arquivos extraídos, para saber se eles têm as mesmas colunas e se elas estão na mesma ordem, para então empilhá-los.
Verificação dos dataframes:
# Salva as colunas de cada dataframe em uma variável
colunas_jan = set(catweb_jan.columns)
colunas_fev = set(catweb_fev.columns)
colunas_mar = set(catweb_mar.columns)
colunas_abr = set(catweb_abr.columns)
colunas_mai = set(catweb_mai.columns)
# Verifica se as colunas são iguais em todos os dataframes
verifica_colunas = (colunas_jan == colunas_fev == colunas_mar == colunas_abr == colunas_mai)
# Verifica se as colunas estão na mesma ordem em todos os dataframes
verifica_ordem = (colunas_jan == colunas_fev == colunas_mar == colunas_abr == colunas_mai)
# Imprime o resultado (retornou True para ambos)
print("Todos os dataframes têm as mesmas colunas:", verifica_colunas)
print("Todos os dataframes têm colunas na mesma ordem:", verifica_ordem)
Outras verificações realizadas:
- Remoção de espaços em branco
strip()
- Substituição de valores nulos
replace('x','y')
- Padronização da quantidade de caracteres
zfill(x)
- Extração de valores pela quantidade de caracteres
str[:y]
- Padronização dos valores de data, veja abaixo
Como o .unique()
abstrai valores quando em grande quantidade, fiz uma segunda verificação dos campos de data para ter certeza de que todas tinham o mesmo formato, após empilhar os dataframes e antes de converter a coluna.
Verificação dos campos de data:
import re
# Expressão regular para verificar o formato da data
regex = re.compile(r'^\d{2}/\d{2}/\d{4}$')
# Verifica se todos os valores correspondem ao formato
formatos_invalidos = catweb_2024['dt_acidente'].apply(lambda x: not bool(regex.match(x))).sum()
# Imprime o resultado (retornou True para todos)
if formatos_invalidos > 0:
print(f'Há {formatos_invalidos} datas que não correspondem ao formato dd/mm/yyyy.')
else:
print('Todas as datas estão no formato dd/mm/yyyy.')
Após concluir o tratamento, comecei a busca pelas dimensões e adaptei elas apenas para este projeto, mas o ideal é ter dimensões que possam ser utilizadas em projetos distintos, ou seja, mais completas e com mais informações.
- dim_cnae - atividades econômicas no nível de classe;
- dim_cbo - estrutura do cbo no nível de ocupações;
- dim_mun - relação dos estados e municípios do Brasil;
- dim_cid - tabela de morbidade no nível de categoria;
Tip
A pasta arquivos tem as tabelas do eSocial compiladas em único aquivo, bem como, as tabelas exportadas no primeiro tratamento para ajustes realizados no segundo tratamento, a seguir.
Assim como o exemplo 2 acima, no segundo tratamento foram aplicadas várias substituições de valores incorretos gramaticalmente e/ou incompletos pela limitação da quantidade de caracteres da coluna.
O trabalho foi minuncioso e contou com apoio de tabelas do eSocial. Foi realizado no Excel, colocando os valores lado a lado e depois passado para o dicionário em Python.
Isso porque os códigos das tabelas do eSocial não constam nos dados da CAT para aplicar um relacionamento direto.
Note
Além disso, optei por substituir a coluna com a data de nascimento do acidentado pela idade, calculando a idade na data do acidente.
Para o painel, no Power BI, fiz as páginas por tema. A primeira página mostra uma visão geral das Comunicações de Acidentes de Trabalho; a segunda possui dados relacionados ao acidentado; a última conta com as causas das lesões sofridas.
Acesse o painel online, no link: Painel CAT e veja uma prévia abaixo: