Você está na página 1de 9

Usando R para Importar Microdados

Marcos F. Silva
http://sites.google.com/site/marcosfs2006
Trabalho em elabora
c~
ao...

Rio de Janeiro, 14 de fevereiro de 2012


Versao 0.2

Sum
ario
1 Introduc
ao

2 Dicion
ario de Dados

3 Leitura dos dados com a func


ao read.fwf()

4 Leitura dos dados usando SQL

5 Conclus
ao

10

Introduc
ao

Alguns dados sao disponibilizados ao p


ublico em arquivos de texto organizados em colunas de
tamanho fixo sem qualquer delimitador para separar os valores das variaveis.
Para que o conte
udo desse tipo de arquivo, denominados arquivos texto de tamanho fixo,
possa ser corretamente importado pelo aplicativo e necessario que se disponha de informacoes
quanto a posicao de incio e fim de cada coluna contendo o valor de cada variavel.
Esta informacao suplementar necessaria para entender o arquivo e o que usualmente se denomina dicionario de dados. O dicionario de dados contem informacoes sobre quais variaveis
constam do arquivo de dados e as posicoes de inicio e fim ou inico e comprimento de cada
coluna. Sem o dicionario de dados nao e possvel saber onde iniciam e terminam as colunas
contendo os dados correspondentes a cada variavel.
Como estes arquivos geralmente contem dados provenientes da tabulacao da pesquisa realizada,
ou seja, contem as informacoes obtidas de cada unidade pesquisada, sem qualquer agregacao,
estando dessa forma no menor nvel de detalhe possvel, sao comumente denominados microdados.
Exemplos de microdados sao os dados da Pesquisa Nacional por Amostras de Domiclios PNAD divulgados pelo IBGE e os dados do Censo Escolar divulgados pelo INEP.
Este documento objetiva mostrar como realizar a leitura dos dados contidos nestes arquivos
utilizando o R. Para tanto utilizaremos os microdados do Censo Escolar 2010 e da PNAD 2009
disponibilizados respectivamente pelo INEP e pelo IBGE.

Dicion
ario de Dados

Ao serem divulgados ao p
ublico, os microdados sao acompanhados do dicionario de dados,
que e um arquivo onde normalmente constarao as seguintes informacoes: o codigo das variaveis,
a descricacao da variavel e as posicoes de incio e fim de cada variavel no arquivo.
O pacote IBGEPesq introduz um formato para o dicionario de dados que sera muito u
til. O
dicionario de dados, consiste de um data frame contendo as seguintes variaveis: inicio,
tamanho, cod e desc.
A variavel inicio contem a posicao de incio de cada campo no arquivo de dados, a variavel
tamanho informa o comprimento de cada campo, a variavel cod informa o codigo da variavel e
a variavel desc traz a descricao de cada uma das variaveis.
O pacote IBGEPesq mantido pelo IBGE traz alguns dicionarios de dados. O pacote dicionariosIBGE disponibiliza os dicionarios de dados de diversas PNADs (Pesquisa Nacional
por Amostras de Domiclios), da POF (Pesquisa de Orcamentos Familiares) e PME (Pesquisa
2

Mensal de Empregos).
Apenas para efeito de visualizacao, apresentamos a seguir, os primeiros registros dos dicionarios
de dados dos arquivos de domiclios e de pessoas da PNAD de 2006 contido no pacote IBGEPesq
versao 1.0-3.
> library(IBGEPesq)
> data(dicPNAD2006)
> ls()
[1] "dicdom2006" "dicpes2006"
> head(dicdom2006)

1
2
3
4
5
6

inicio
1
5
5
13
16
18

cod tamanho
desc
V0101
4
ANO DE REFERENCIA
UF
2 UNIDADE DA FEDERACAO
V0102
8
NUMERO DE CONTROLE
V0103
3
NUMERO DE SERIE
V0104
2
TIPO DE ENTREVISTA
V0105
2
TOTAL DE MORADORES

> head(dicpes2006)

1
2
3
4
5
6

inicio
1
5
5
13
16
18

cod tamanho
desc
V0101
4
ANO DE REFERENCIA
UF
2 UNIDADE DA FEDERACAO
V0102
8
NUMERO DE CONTROLE
V0103
3
NUMERO DE SERIE
V0301
2
NUMERO DE ORDEM
V0302
1
SEXO

Aproveitando o fato de que tanto o IBGE quanto o INEP distribuem os microdados acompanhados de um arquivo contendo um script para leitura do arquivo utilizando o software
SAS, escrevi uma pequena funcao (getdic()) para converter estes arquivos em um dicionario
de dados com a mesma estrutura dos que sao disponibilizados nos pacotes acima mencionados (IBGEPesq e dicionariosIBGE). Com este script sera possvel gerar os dicionarios para a
importacao dos microdados das pesquisas realizadas pelo INEP.
Para gerar o dicionario de dados dos microdados das escolas do Censo Escolar de 2010, podemos
utilizar a funcao acima da seguinte forma:
> source("getdic.R")
> dicEscola2010 <- getdic("INPUT_SAS_ESCOLA.sas")
> head(dicEscola2010)
3

1
2
3
4
5
6

inicio tamanho
cod
desc
1
5
ANO_CENSO
Ano do Censo
6
9
PK_COD_ENTIDADE
C
odigo da Escola

15
5
COD_ORGAO_REGIONAL_INEP C
odigo do Org~
ao Regional de Ensino
20
15 DESC_SITUACAO_FUNCIONAMENTO
Situa
c~
ao de funcionamento
35
20
DT_ANO_LETIVO_INICIO
In
cio do ano letivo
55
20
DT_ANO_LETIVO_TERMINO
T
ermino (Previs~
ao) do ano letivo

INPUT_SAS_ESCOLA.sas e um arquivo texto contendo o script para a importacao dos microdados


com o software SAS. Este arquivo e fornecido juntamente com os microdados.

Leitura dos dados com a fun


c
ao read.fwf()

Dispondo-se do dicionario de dados correspondente ao arquivo de microdados que se dejesa


importar, a leitura dos dados pode ser feita com a funcao read.fwf(). Vamos ilustrar como
importar o arquivo de microdados das Escolas (arquivo TS_ESCOLA.TXT) do Censo Escolar de
2010.
A primeira coisa a se fazer e obter o dicionario de dados, o que ja foi feito na secao anterior.
De posse do dicionario de dados, a importacao de todo o arquivo pode ser feita da seguinte
forma:
> escolas2010 <- read.fwf("TS_ESCOLA.TXT", widths=dicEscola2010$tamanho,
comment.char="", strip.white=TRUE)
> names(escolas2010) <- dicEscola2010$cod
> head(escolas2010[, 1:4])

1
2
3
4
5
6

ANO_CENSO PK_COD_ENTIDADE COD_ORGAO_REGIONAL_INEP DESC_SITUACAO_FUNCIONAMENTO


2010
12001945
NA
1
2010
12006726
NA
2
2010
12006742
NA
1
2010
12006750
NA
1
2010
12006769
NA
2
2010
12006777
NA
2

Se em vez de importar os dados de todas as variaveis do arquivos, queisermos importar apenas


algumas variaveis especficas, uma possibilidade bem conveniente e a que apresentamos a seguir
com o uso da funcao selectvar() que escrevemos justamente com o objetivo de facilitar a
selecao das variaveis cujos dados queremos informar. O procedimento e apresentado a seguir:
> source("selectvar.R")
> variaveis <- selectvar(dicEscola2010)
4

A funcao selectvar() apresenta ao usuario uma janela com a relacao de todas as variaveis
contidas no dicionario de dados. No caso presente, todas as variaveis do dicionario relativo aos
microdados das Escolas.
A selecao de mais de uma variavel e feita clicando-se na descricao das variaveis apresentada na
janela com a tecla CTRL pressionada.
Escolhidas as variaveis que se deseja importar, cuja informacao encontra-se no objeto variaveis, que e uma lista com os componentes cod, contendo os codigos das variaveis selecionadas
e tamanho, contendo os tamanhos dos campos das variaveis a serem importadas1 devemos passar
esta informacao a` funcao read.fwf() conforme ilustrado seguir:
> escolas2010 <- read.fwf("TS_ESCOLA.TXT", widths=variaveis$tamanho,
comment.char="", strip.white=TRUE)
> names(escolas2010) <- variaveis$cod
Com isto serao importados apenas os dados relativos a`s variaveis escolhidas. No nosso caso
as variaveis C
odigo da Escola, Situa
ca
~o de Funcionamento, C
odigo do Munic
pio, Depend^
encia Administrativa e Localiza
ca
~o.
> head(escolas2010[, 1:3])
PK_COD_ENTIDADE DESC_SITUACAO_FUNCIONAMENTO FK_COD_MUNICIPIO
1
12001945
1
1200336
1

Na realidade, este componente da lista apresenta os tamanhos dos campos de todas as variaveis do arquivo
de microdados, mas apenas os tamanhos das variaveis a serem importadas sao positivos. Os tamanhos das
vari
aveis que n
ao ser
ao importadas s
ao precedidas de um sinal de menos, visto que esta e a forma de se indicar
a func
`
ao read.fwf() quais vari
aveis n
ao deverao ser importadas

2
3
4
5
6

12006726
12006742
12006750
12006769
12006777

2
1
1
2
2

1200344
1200344
1200344
1200344
1200344

Alem da funcao read.fwf() tambem e possvel utilizar a funcao le.pesquisa() do pacote


IBGEPesq. O documento Leia-me.pdf que acompanha o pacote traz instrucoes detalhadas
sobre a utilizacao da referida funcao, razao pela qual nao iremos abordar sua utilizacao neste
documento.
Um fato para o qual deve-se chamar a atencao e que nos dicionarios da PNAD as variaveis UF
e V0102 referentes, respectivamente, `a unidade da federacao e ao n
umero de controle, iniciam
na posicao 5. Para que nao haja erro na importacao dos microdados com o uso da funcao
read.fwf() recomendamos a exclusao do registro referente `a variavel UF do dicionario, o o que
pode ser feito da segunte forma:
> dicPNAD2009Dom <- getdic("input DOM2009.sas")
> head(dicPNAD2009Dom)

1
2
3
4
5
6

inicio tamanho
cod
desc
1
4 V0101
ANO DA PESQUISA
5
2
UF UNIDADE DA FEDERA
C~
AO
5
8 V0102
NUMERO DE CONTROLE
13
3 V0103
NUMERO DE SERIE
16
2 V0104
TIPO DE ENTREVISTA
18
2 V0105
TOTAL DE MORADORES

> dicPNAD2009Dom <- subset(dicPNAD2009Dom, cod != "UF")


> head(dicPNAD2009Dom)

1
3
4
5
6
7

inicio tamanho
cod
desc
1
4 V0101
ANO DA PESQUISA
5
8 V0102
NUMERO DE CONTROLE
13
3 V0103
NUMERO DE SERIE
16
2 V0104
TIPO DE ENTREVISTA
18
2 V0105
TOTAL DE MORADORES
20
2 V0106 TOTAL MORADORES 10 ANOS OU +

Deve ser observado que as duas primeiras posicoes no valor da variavel V0102 corresponde ao
codigo da UF.
Com a exclusao da variavel UF do dicionario, a importacao pode ser feita sem maiores problemas
conforme ilustrado a seguir:

> # Caso se deseje importar todo o arquivo de microdados de domic


lios por exemplo
>
> PNAD2009Dom <- read.fwf("DOM2009.TXT", widths=dicPNAD2009Dom$tamanho,
comment.char="", strip.white=TRUE)
> names(PNAD2009Dom) <- dicPNAD2009Dom$cod
> head(PNAD2009Dom[, 1:7])

1
2
3
4
5
6

V0101
2009
2009
2009
2009
2009
2009

V0102 V0103 V0104 V0105 V0106 V0201


11000015
1
8
NA
NA
NA
11000015
2
8
NA
NA
NA
11000015
3
1
7
5
1
11000015
4
1
3
3
1
11000015
5
1
1
1
1
11000015
6
5
NA
NA
NA

No caso de desejarmos realizar a importacao de apenas algumas variaveis, o procedimento e


identico ao ja descrito anteriormente:
>
>
>
>
>
>
>

# Caso se deseje importar apenas algumas vari


aveis
# Por exemplo: ANO DA PESQUISA, TIPO DE ENTREVISTA, TOTAL DE MORADORES,
#
TEM MICROCOMPUTADOR ?

var.pnad <- selectvar(dicPNAD2009Dom)


PNAD2009Dom <- read.fwf("DOM2009.TXT", widths=var.pnad$tamanho,
comment.char="", strip.white=TRUE)
> names(PNAD2009Dom) <- var.pnad$cod
> head(PNAD2009Dom)

1
2
3
4
5
6

V0101 V0104 V0105 V0231


2009
8
NA
NA
2009
8
NA
NA
2009
1
7
3
2009
1
3
1
2009
1
1
3
2009
5
NA
NA

Leitura dos dados usando SQL

Um problema bem conhecido do R e sua dificuldade em lidar com conjuntos de dados muito
grandes o que faz com que em algumas circunstancias nao seja possvel carregar toda a base de
7

dados para a memoria como acabamos de fazer com a base de dados de escolas que tem apenas
56,2MB.
Para arquivos maiores como o arquivo contendo os dados das matrculas para o Estado do Rio
de Janeiro TS_MATRICULA_RJ.txt possui 652MB ja comeca a ficar difcil carregar toda a base.
Para trabalhar com arquivos de microdados que nao possam ser carregados integralmente
para a memoria, apresentamos a seguir uma forma de lidar com esta situacao, que consiste em
realizar consultas em SQL na base de dados. Obviamente esta nao e a u
nica e talvez nao seja
a melhor forma de lidar com esta situacao, mas e uma possibilidade.
Existem alguns pacotes que procuram solucionar este problema, sendo possvel citar o bigmemory e o ff.
Para executar a estrategia que iremos apresentar a seguir, sera nessario utilizar o pacote sqldf
que pode ser baixado no CRAN.
Em linhas gerais, a estrategia consiste em converter o arquivo de microdados para um arquivo
.csv e utilizar o pacote sqldf para realizar as consultas em SQL diretamente no arquivo .csv
como se este fosse uma tabela de um banco de dados. Esta estrategia e interessante porque
possibilita a extracao de um subconjunto dos dados constantes do arquivo de microdados.
A seguir mostraremos como implementar esta estrategia utilizando os microdados de matrculas
(arquivo TS_MATRICULA_RJ.txt).
O primeiro passo e realizar a conversao do arquivo de microdados para .csv, para o que sera
utilizada a funcao fwf2csv() que escrevemos com este objetivo.
>
>
>
>
>
>
>

# Carrega as fun
c~
oes para o R
source("fwf2csv.R")
source("txt2df.R") # Fun
c~
ao auxiliar usada pela fun
c~
ao fwf2csv()
# Gera o dicion
ario de dados
dicMatricula2010 <- getdic("INPUT_SAS_MATRICULA.sas")
# Converte o arquivo de microdados para um arquivo csv
fwf2csv(input="TS_MATRICULA_RJ.txt",
output="Matriculas_2010.csv",
dic=dicMatricula2010,
colunas=dicMatricula2010$cod)

A funcao fwf2csv() recebe como argumento o arquivo de microdados, o nome do arquivo .csv
que se deseja criar, o dicionario de dados correspondente e os codigos das variaveis. O arquivo
.csv gerado possui ponto e vrgula como separador e apresenta como cabecalho os codigos das
variaveis utilizadas no dicionario de dados.
Feita a conversao dos dados, o proximo passo e realizar a consulta SQL no arquivo .csv recem
criado.

Supondo que tenhamos o interesse em obter a quantidade de matrculas declaradas como sendo
de alunos residentes na area urbana e rural por escola e por municipio, nas escolas p
ublicas
estaduais do Rio de Janeiro, podemos submeter a seguinte consulta a` base de dados:
>
>
>
>
>

library(sqldf)
# Abertura de conex~
ao com a base de dados
BaseDados <- file("Matriculas_2010.csv")
# Defini
c~
ao da consulta em SQL
consulta <- "select
count(FK_COD_ALUNO) as QtdMatric,
ID_ZONA_RESIDENCIAL as ZonaResid,
ID_N_T_E_P as TipoTransp,
ID_RESPONSAVEL_TRANSPORTE as RespTransp,
PK_COD_ENTIDADE as Censo,
COD_MUNICIPIO_ESCOLA as Municipio,
ID_DEPENDENCIA_ADM_ESC as DepAdm
from
BaseDados
where
ID_DEPENDENCIA_ADM_ESC = '2'
group by PK_COD_ENTIDADE, ID_ZONA_RESIDENCIAL"
> # Submiss~
ao da consulta `
a base de dados.
> QtdMatricUrbRur <- sqldf(consulta, file.format=list(header=TRUE, sep=";"))
> head(QtdMatricUrbRur)

1
2
3
4
5
6

QtdMatric ZonaResid TipoTransp RespTransp


Censo Municipio DepAdm
645
1
0
33000026
3300605
2
159
2
1
1 33000026
3300605
2
611
1
0
33000042
3300605
2
282
2
1
1 33000042
3300605
2
189
2
0
33000115
3300605
2
978
1
0
33000158
3300605
2

Conclus
ao

A realizacao de algumas auditorias, em especial as auditorias de natureza operacional, exigem


do auditor a obtencao e analise de dados que lhe permitam avaliar polticas p
ublicas em diversas
areas de atuacao do Estado tais como educacao, trabalho, sa
ude, etc.
Um dos formatos de arquivos pelos quais alguns orgaos oficiais disseminam dados sao os denominados microdados, geralmente disponibilizados em arquivos texto de tamanho fixo.
Pensamos ser importante que os auditores tenham um conhecimento, ainda que basico, de como
acessar os dados contidos nestes arquivos para realizar as analises necessarias e, de preferencia,
utilizando um aplicativo que esteja disponvel gratuitamente a qualquer auditor.
9