Microdados em Python: um pacote para ler dados da PNAD e POF

Utilizando Python nas principais pesquisas do IBGE

Otávio Simões Silveira
May 19 · 6 min read
Photo by Mika Baumeister on Unsplash

A Pesquisa de Orçamentos Familiares — POF e a Pesquisa Nacional por Amostra de Domicílios — PNAD são duas das principais pesquisas realizadas pelo Instituto Brasileiro de Geografia e Estatística — IBGE. Ambas são muito utilizadas por estudantes, professores e pesquisadores em artigos, dissertações, teses e trabalhos de conclusão de curso devido a grande quantidade de informações que se pode extrair de cada uma delas.

A quantidade de dados é tão grande, variada e complexa que estes são representados por códigos conhecidos como microdados, o que torna a leitura ou extração destes dados uma tarefa não tão simples, mesmo utilizando um software. Na minha época de graduação era comum utilizarmos o Stata. Hoje, no entanto, vamos ver como trabalhar com essas pesquisas utilizando Python.

Mas calma, se você nunca ouviu falar em microdados, vamos primeiro à uma breve introdução sobre o assunto.


Microdados

Segundo o próprio IBGE, microdados consistem no menor nível de desagregação dos dados de uma pesquisa, retratando, sob a forma de códigos numéricos, o conteúdo dos questionários e preservando o sigilo estatístico com vistas à não individualização das informações. O Instituto disponibiliza estes microdados em arquivos em formato .txt conhecidos como fixed width files — FWF — ou arquivos de largura fixa, em uma tradução livre.

Arquivos FWF são de leitura pouco amigável, sendo praticamente impossível extrair deles alguma informação apenas olhando. Na prática são apenas uma sequência de número jogados em um arquivo de texto, como podemos ver abaixo.

Exemplo de microdados — PNAD2015

Para que possamos extrair alguma informação útil deste amontado de números, o IBGE também disponibiliza para cada FWF um arquivo de Excel conhecido como dicionário.

Exemplo dicionário — PNAD2015

Para identificar as colunas do FWF, utilizamos as duas primeiras colunas do dicionário. Na linha 6 do Excel vemos que a primeira coluna começa na posição 1 e tem tamanho 4, representando o ano de referência. A segunda coluna tem posição inicial 5 e tamanho 2, representando a Unidade da Federação e assim por diante. As primeiras colunas seriam, portanto, divididas assim:

Exemplo de fatiamento de colunas — PNAD2015

Lendo Microdados com Python

Alguns softwares são comumente utilizados para ler e extrair informações destes arquivos como o Stata, SAS, SPSS e o R, que o IBGE inclusive recomenda, fornece informações e até um pacote para facilitar a vida do usuário.

No entanto, eu, como usuário Python, fui tentar explorar estes dados utilizando Python e, para minha surpresa, encontrei muita pouca (para não dizer nenhuma) informação de como fazê-lo.

Não é possível que as poderosas bibliotecas do Python não teriam uma forma minimamente prática de lidar com este tipo de dados. Então, continuando minha pesquisa, tomei conhecimento da função read_fwf() do pandas e pensei que o problema estava resolvido, mas não é tão simples assim, veja o output abaixo.

Exemplo de uso da função read_fwf()

Como depois entendi, o pandas não advinha o tamanho das colunas e, por isso, produz um DataFrame sem sentido. Para resolver este problema, utilizamos o parâmetro widths, que recebe uma lista de inteiros representando o tamanho desejado para cada coluna. O output então foi:

Exemplo de uso da função read_fwf()

Agora sim temos um DataFrame que faz sentido. O uso do parâmetro dtype é apenas para que o pandas leia os dados da forma que eles estão no arquivo de texto, sem tentar adivinhar o que é casa decimal e o que não é ou o que é um zero a esquerda e o que não é.

Podemos ainda adicionar o código da varável como nome da coluna, para facilitar a identificação:

Nomeando as colunas com os códigos contidos no dicionário -PNAD2015

Tudo isso pode até parecer um procedimento simples já que o pandas faz a maior parte do trabalho duro, mas não é. Este arquivo da PNAD contém mais de 400 colunas. Imagina pegar as informações sobre o tamanho e o código de cada um delas no dicionário? Isso sem contar que a PNAD é composta por 2 FWF, enquanto a POF possui OITO destes arquivos .txt. Além disso, cada PNAD e POF possue o dicionário diferente das outras.

Enfim, é realmente trabalhoso demais. Será que podemos pensar em uma solução mais prática?


pip install lerMicrodados

Isso mesmo, pensando em tornar esse processo mais fácil, fiz um pacote com funções para ler estes dados. Basta escolher entre as funções ler_PNAD() e ler_POF() e informar o caminho para o arquivo .zip baixado do site do IBGE e serão gerados arquivos .csv para cada FWF contido no arquivo .zip informado. Em posse dos arquivos .csv é só usar pd.read_csv() e começar a trabalhar!

As Funções

A função ler_PNAD() possui, além do parâmetro path, o parâmetro ano que recebe um inteiro representando o ano da PNAD — até o momento estão disponíveis 2013, 2014 e 2015, e o parâmetro header, booleano com padrão True, que informa à função se ela deve ou não nomear as colunas com o código das variáveis.

A função ler_POF() possui os mesmos parâmetros exceto o ano. Isto porquê ela só é capaz de ler corretamente dados da última POF, referente aos anos 2017/2018 e divulgada no fim de 2019. Antes dessa, só tivemos outra POF em 2008. Aqui temos o funcionamento das funções:

Funcionamento do pacote lerMicrodados

Aqui vale um Disclaimer: se você já é familiarizado com microdados da PNAD provavelmente percebeu que as colunas do FWF foram dividas de forma errada nas imagens no começo deste artigo. Isto porquê a coluna ‘UF’, na prática, não existe, sendo representada pelos primeiro dois dígitos da coluna seguinte, ‘V0102’. Fiz a explicação considerando a coluna ‘UF’ para facilitar o entendimento de quem não está acostumado com o formato. No entanto, os arquivos gerados pela função ler_PNAD() não cometem este erro. Caso você tenha necessidade de uma coluna exclusiva para as unidades da federação basta, após ler o arquivo .csv gerado pela função em um DataFrame, executar o código abaixo.

É importante ressaltar que as funções devem receber o caminho para o arquivo .zip baixado diretamente do site do IBGE. Qualquer outro arquivo, mesmo que contenha os FWF corretos, pode gerar algum erro.

Continuidade e Expansão

O projeto tende a continuar e suporte para outros anos da PNAD e POF ou até para outras pesquisas podem ser implementados conforme a necessidade e /ou demanda.

E aí o que achou? Caso tenha interesse em contribuir, tirar dúvidas, fazer sugestões ou simplesmente entrar em contato comigo, deixo meus perfis no Linkedin, Twitter e GitHub.

Data Hackers

Blog oficial da comunidade Data Hackers

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store