Observações: (1). Este documento é destinado a usuários sem conhecimento prévio em programação e é parte integrante do curso de Tópicos Especiais em Geotecnologias, ofertado para o curso de geografia da Universidade Federal Fluminense, campus de Campos dos Goytacazes, no 1º semestre de 2020. Sinta-se livre para divulga-lo desde que referencie o documento original.

(2). Abra os arquivos disponibilizados pelo Google Drive em uma nova janela ou em uma nova guia (cliques simples dão erro).

(3). Este conteúdo foi preparado para ser desenvolvido no RStudio, que é uma interface gráfica do R.

(4): Página em construção!!!!

1 Introdução

O objetivo desta aula é introduzir os alunos na leitura e manipulação de microdados de um survey ou censo demográfico. Nesse ponto pretende-se distinguir inicialmente a diferenciação entre dado e informação: as informações são dados devidamente tratados e analisados, produzindo algum conteúdo relevante. Os dados são usualmente denominados dados brutos, antes do seu processamento e tabulação, que então passam a ser denominados dados básicos ou dados primários.

Os dados básicos normalmente consistem em uma série de valores que são agrupados na forma de tabelas, geralmente classificadas segundo certas variáveis, tais como idade e número de filhos, ou ainda segundo alguns atributos ou características (i.e. sexo, estado civil, etc.). Quando os dados são classificados segundo diversas variáveis ou atributos, simultaneamente, estas tabelas são denominadas tabelas cruzadas ou tabelas de múltipla entrada (IUSSP 2020b).

Os Censos Demográficos e Surveys são mais comumente divulgados da forma agregada, como por exemplo, tabelas da taxa de analfabetismo por unidades territoriais. A divulgação agregada geralmente é em função de privacidade dos respondentes e também devido a grande quantidade de dados contidos em um censo, que facilmente excede a casa de milhões de registros. Entretanto aagregar dados resulta em perda de informações: se pretendemos gerar tabelas de escolaridade, sexo e idade, por exemplo, essa informação pode não estar disponível nos dados agregados, para determinada unidade territorial. O acesso aos microdados permite aos pesquisadores mais liberdade para investigar interações e desenvolver análises mais detalhadas.

Quando os dados têm os indivíduos como unidade de abrangência, elas devem ser referenciadas como microdados. Os microdados são distintos dos dados agregados ou macrodados quando a unidade de análise é distinta do indivíduo, como por exemplo, um país ou uma unidade territorial dentro de uma unidade da federação. Os microdados podem ser derivados de diferentes fontes de dados, como pesquisas de campo ou uma amostra de registros vitais (IUSSP 2020a). Outra fonte de microdados é a amostra proveniente das áreas de ponderação do Censo Demográfico Brasileiro.

Nesses termos microdado é a menor fração de um dado de um survey ou censo e está disponível no nível da unidade de análise (indivíduo ou domicílio). Os dados sobre a idade, sexo, nível educacional, trabalho e diversas outras variáveis, por exemplo, são apresentados em uma tabela sendo que cada registro (linha) é um indivíduo que respondeu ao questionário. (Minnesota Population Center 2019). A figura a seguir apresenta um formato geral deste tipo de arquivo.

As bases de microdados são organizadas para serem compreendidas por softwares específicos, a exemplo do R, Stata, SAS, SPSS e outros. Geralmente o microdado é um arquivo de texto simples (formato ASCII) que pode ser aberto em qualquer software, ou, em alguns casos, uma tabela de um banco de dados. Esses arquivos seguem uma padrão relativamente pré-definido o que agiliza o processo de tratamento e cálculos estatísticos. Uma sintaxe de leitura desses microdados deve ser elaborada com base em um dicionário do banco de dados (documentação do banco de dados) identificando cada uma das variáveis contidas no arquivo. A figura na sequencia apresenta um exemplo de como estes arquivos são traduzidos e um modelo de código no SAS para a tradução desse arquivo de texto em uma tabela.

No Brasil o Instituto Brasileiro de Geografia e Estatística (IBGE) e o Instituto Nacional de Pesquisas Educacionais Anísio Teixeira (INEP) são exemplo de produtores de microdados: Censo Demográfico, Pesquisa Nacional de Amostra por Domicílios, Censo Escolar, Censo da Educação Superior, Prova Brasil, dentre outras. Um exemplo interessante da divulgação de microdados é o IPUMS que disponibiliza dados de censos e pesquisas surveys de todo o mundo de forma integrada e compatibilizada. A compatibilização e documentação do IPUMS facilita o desenvolvimento de pesquisas comparativas entre países, tendências históricas, comparação de pesquisas de objetivos diversos, permitindo a análise no níveis do indivíduo, famílias ou comunidades.

Este tutorial, especificamente, foi organizado em torno dos microdados de duas pesquisas do IBGE: o Censo Demográfico de 2010 e a Pesquisa Nacional de Amostra por Domicílios Contínua.

2 Os Microdados do Censo Demográfico de 2010

Um Censo Demográfico é a mais complexa trabalho estatístico realizado por um país. Neste momento são investigadas características de toda a população e dos domicílios em todo o território nacional. Ao pesquisar todos os domicílios os censos se transforma na principal fonte de referência para o conhecimento das condições de vida da população em todos os municípios e em seus recortes territoriais - distritos, subdistritos, bairros e em áreas urbanas ou rurais. Para ter informações mais informações mais detalhadas sobre essa pesquisa, consulte (IBGE. Fundação Instituto Brasileiro de Geografia e Estatística 2010).

Os arquivos de microdados do Censo Demográfico do IBGE são parte integrante do processo de disseminação dos resultados de suas pesquisas. O conjunto de arquivos disponibilizados na divulgação é bem extenso mas, neste texto, vamos nos fundamentar em três tipos arquivos, que foram disponibilizados no Google Drive (abra os arquivos em uma nova janela ou nova guia):

Estes arquivos foram disponibilizados na pasta Censo2010 no Google Drive. Os arquivos referentes a todas Unidades da Federação brasileiras, estão disponíveis no servidor FTP do IBGE.

2.1 Amostra e os questionários do Censo

O levantamento de dados do Censo Demográfico 2010 utilizou dois tipos de questionário: o Questionário Básico e o Questionário da Amostra.

O Questionário Básico contém 37 quesitos e foi aplicado em todas as unidades domiciliares, exceto nas selecionadas para a amostra, e investiga características do domicílio e dos moradores. Por definição, dados do Censo que compreendem as características de domicílios e pessoas investigadas em sua totalidade são denominados resultados do universo e são divulgados pelo IBGE de forma agregada a exemplo dos Agregados por Setores Censitários e o aplicativo Web que gera gráficos e cartogramas por setores e municípios. Este documento não aborda o uso e manipulação dos dados do universo.

O Questionário da Amostra contém 108 quesitos, onde foram registradas as características do domicílio e de seus moradores na data de referência. Ele é aplicado nas unidades domiciliares selecionadas para a amostra e levanta, além das informações do Questionário Básico, outras características do domicílio e pessoas como informações sociais, econômicas e demográficas dos seus moradores. A amostragem no Censo Demográfico 2010 aplicou cinco frações de amostragem, considerando os tamanhos dos municípios em relação à população estimada em 1º de julho de 2009. Vale ressaltar que os valores apresentados na tabela a seguir são os valores médios, uma vez em que, nos municípios pequenos, procurou-se garantir tamanho suficiente para a divulgação dos resultados e, em alguns municípios de grande porte, foram aplicadas de frações amostrais diferentes em cada uma de suas divisões administrativas intramunicipais (distritos e subdistritos).

O questionário da amostra está disponível na pasta do Censo 2010 vinculada a esta atividade. Recomendo a todos a análise cuidadosa desse arquivo pois ele é peça fundamental para compreender o fluxo da pesquisa e a organização do banco de dados. Leia as instruções e o fraseamento dos quesitos para compreender os dados que são investigadas e como eles são gerados na pesquisa. O manual do recenceador é um documento extenso mas pode ser necessário para compreensão de como o recenseador é instruído no seu trabalho e traz também a definição detalhada de cada variável inclusive aquelas de definição mais sensível (cor, religião e trabalho, por exemplo).

A imagem a seguir apresenta o início do questionário original da amostra e, exemplificando como utiliza-lo como suporte ao processamento e análise dos microdados da pesquisa, vamos observar o quesito 1.09, referente ao Tipo do Domicílio. O banco de dados dos microdados usa os mesmos nomes para variáveis que foram adotados no questionário e, no caso do quesito 1.09 a variável no banco de dados é denominada V0109. Da mesma forma, as categorias de resposta são as mesmas que estão no questionário e a variável V0109 tem 13 categorias de resposta possíveis: 11 (casa), 12 (casa em vila ou condomínio), 13 (apartamento) e assim sucessivamente.

2.2 O dicionário de dados e as tabelas de microdados

O dicionário dos dados de uma pesquisa é um arquivo que descreve o banco de dados. No caso específico da amostra do censo demográfico 2010 este arquivo está em formato de planilha eletrônica como o Layout_microdados_Amostra.xls. Este arquivo é organizado em quatro planilhas - DOMI, PESS, EMIG e MORT, referente aos arquivos de Domicílios, Pessoas, Emigração e Mortalidade, respectivamente. Observe que a pasta txt, que contém os microdados propriamente ditos, contém oito arquivos do tipo texto simples, refrentes aos estados do Rio de Janeiro (Código 33) e do Roraima (Código 14). A pasta Rda, por sua vez, contém oito arquivos no formato Rda, sendo quatro para cada estado. Ou seja, cada planilha dentre essas quatro é o dicionário de cada um desses quatro arquivos. Observe ainda que as duas primeiras colunas de cada variável contém a identificação da variável (Coluna A: VAR) e a descrição da variável (coluna B: NOME) e também, em alguns casos, as categorias da variável (UFs por exemplo)

Nesse ponto vale uma ressalva sobre o banco de dados do Censo Demográfico 2010: organizar um banco de dados em várias tabelas é muito comum pois isso compacta os dados evitando redundância. Explicando melhor, lembrem-se que a unidade de análise do Censo Demográfico é o domicílio e, nesse sentido, todos os 370.244 domicílios entrevistados na amostra no estado do Rio de Janeiro estarão listados no arquivo ‘Amostra_Domicilios_33.txt’ e são identificados por um número único (variável de controle - V0300), por unidade da federação. O arquivo de domicílios é nossa primeira referencia e neste arquivo contém dados sobre cada um dos domicílios: abastecimento de água, bens de consumo, esgotamento sanitário, coleta de lixo, dentre outros. Seria redundância repetir essas informações em todas as linhas do arquivo de pessoas, denominado ‘Amostra_Pessoas_33.txt’, que contém 1.143.650 registros e dados sobre as pessoas: escolaridade, idade, sexo, cor, dentre outras. Observe que, no questionário, a seção cinco refere-se a lista de moradores do domicílio e a seção seis foi repetida uma vez para cada morador. A título de exemplo, o domicílio nº 12833 possui dois moradores: o arquivo de domicílios terá uma única linha com o código V0300 igual a 12833 e o arquivo de pessoas terá duas linhas com esse código (uma para cada morador). Já o domicílio nº 20358 que tem seis moradores, ou seja, terá seis linhas no arquivo de pessoas e apenas uma no arquivo de domicílios. Um raciocínio análogo pode ser feito para o arquivo sobre mortalidade (ver seção sete no questionário) e emigração internacional (ver seção três no questionário): domicílios que não relataram alguma morte no ano de referência do Censo, não estará listado no arquivo ‘Amostra_Mortalidade_33.txt’; e, domicílios que não tenha declarado que algum morador tenha emigrado para fora do país no ano de referencia, não estarão listado no arquivo ‘Amostra_Emigracao_33.txt’.

2.2.1 Usando os arquivos Rda

Em que pese a importância em compreender como os arquivos txt foram convertidos em Rda, este tutorial faz uso de arquivos Rda já lidos e disponíveis na pasta Rda. Este arquivo foi lido utilizando o comando read.fortan apresentado na seção seguinte e foram salvos quatro arquivos neste formato: DOMIUU.Rda, PESSUU.Rda, EMIGUU.Rda e MORTUU.Rda, onde UU é o código da UF. Para carrega-los primeiro devemos baixalos para a pasta do projeto e, na sequencia, carrega-los para sua área de trabalho usando o comando load, com exemplificado no código abaixo.

load('DOMI14.Rda')
load('PESS14.Rda')

Optamos por usar aqui o estado do Roraima que é o menor estado brasileiro e, por isso mesmo, o que tem o menor arquivo de microdados. Mas, o dicionário dos dados é igual para todas as UFs e os códigos aqui apresentados irão funcionar em todas as unidades da federação. Após executar o script acima, quatro objetos irão aparecer na sua área de trabalho: DOMI, PESS, EMIG e MORT. Clicando em um dos arquivos é possível perceber que esses objetos são dataframes, contendo as variáveis listadas no arquivo de documentação. Observe que este arquivo só contém variáveis numéricas: os fatores não foram definidos e os campos de texto foram lidos como numéricos. Mas, com estes arquivos já é possível preparar algumas frequências e gerar diversas informações inestimáveis para uma pesquisa. Sendo assim, a seção ‘Tabelas usando os Microdados do Censo 2010’ irá explicar como gerar essas frequencias.

2.2.2 Leitura do arquivo txt dos microdados

Importante: Essa seção foi reservada para quem está muito interessado em entender como é feita a tradução de uma arquivo txt para um dataframe no R. Para este tutorial faz o uso do arquivo Rda, como explicado no útlimo código da seção anterior.

Observe que o dicionário não tem apenas as colunas de identificação da variável e descrição da variável. As colunas adicionais são as informações que nos indicam como traduzir o arquivo de texto (ASCII) em um banco de dados: colunas que identificam a posição da variável (Posição Inicial e Posição Final) e o tipo da variável (A para caracteres, N para numéricas e C para categóricas).

As colunas J e K são usadas de forma distinta quando se referem a números ou textos. Quando são números decimais, a coluna INT identifica a parte inteira do número (total de dígitos da parte inteira do número) e a coluna DEC identifica a parte decimal do número (total de dígitos da parte decimal do número). Quando são textos ou números inteiros apenas a coluna INT estará preenchida indicando a largura da coluna a ser lida no banco de dados.

2.2.2.1 A leitura dos microdados com o comando read_fwf

A leitura de um arquivo texto pode ser feito por vários comandos. Inicialmente vamos utilizar o comando read_fwf do pacote readr (FWF é um acrônimo para Fixed Width Format, ou, em português, Formato de Largura Fixa). Mas, antes de usar este comando devemos preparar um dicionário de dados que possa ser usado como dicionário de dados pelo r. Para elaborarmos este dicionário vamos usar os comandos fwf_positions preenchendo três argumentos

  • start: vetor contendo a posição inicial de cada campo a ser lido, identificado pela coluna H (Posição Inicial) do arquivo Arquivo de Layout;
  • end: vetor contendo a posição final de cada campo, identificado pela coluna I (Posição Final) do arquivo Arquivo de Layout; e
  • col_names: um vetor de strings com o nome que será dada para cada uma das variáveis, identificado pela coluna A (VAR) no Arquivo de Layout.

E essas informações serão preenchidas com os dados das seguintes variáveis:

  • V0002: Código do município (tipo texto, posição inicial 3 e posição final 7)
  • V0300: Controle (tipo texto, posição inicial 21 e posição final 28)
  • V0010: Peso amostral (tipo número decimal, posição inicial 29 e posição final 44, com 13 casas decimais)
  • V1006: Situação do domicílio (tipo categórica, posição inicial e final 53)
  • V0401: Total de moradores no domicílios (tipo numérico inteiro, posição inicial 105 e posição final 106)
  • V6529: Rendimento mensal domiciliar (tipo numérico inteiro, posição 109 e posição final 115)
  • V6600: Adequação da moradia (tipo categórica, posição inicial e final 143)

O código abaixo, cria este dicionário

library(readr)
dicionario_domi<-fwf_positions(
                     start=c(3,21,29,53,105,109,143),
                     end=c(7,28,44,53,106,115,143),
                     col_names=c('V0002','V0300', 'V0010','V1006','V0401','V6529','V6600'))

O comando read_fwf tem dois argumentos que devem ser preenchidos: - file : o nome e o caminho do arquivo txt; - col_positions: um dataframe gerado no comando anterior e que contém as colunas begin, end e col_names que representam, respectivamente, a posição inicial, a posição final e o nome do campo identificado pelas coluna H, I e A (Posição Inicial, Posição Final e VAR) no Arquivo de Layout.

O código a seguir faz a leitura das variáveis usando este dicionário. Observe que

library(readr)
domi_rj <-read_fwf(file='./Censo2010/txt/Amostra_Domicilios_33.txt',
                   col_positions=dicionario_domi)

Perceba que o tipo da variável, assim como as casas decimais do campo não estão definidas nesse dicionário e, por isso, o banco de dados gerado pelo comando read_fwf gera os tipos de forma automática e, obviamente, cometendo alguns equívocos. Uma forma de contornar esse problema é rodar o comando a seguir sendo que internamente à lista (list) foram especificados o formato de cada uma das colunas, sendo ‘c’ para caracteres, ‘n’ para números e ‘f’ para fatores (categorias). Este objeto colcl será passado para o argumento col_types do comando read_fwf.

colcl <- do.call('cols',list('c','c','n','f','n','n','f'))
domi_rj <-read_fwf(file='./Censo2010/txt/Amostra_Domicilios_33.txt',
                   col_positions=dicionario_domi,
                   col_types =colcl)

Outro ponto que é importante ressaltar é que as variáveis decimais (como o peso representada pela variável P001) são lidas como números inteiros e, para corrigir isso, é necessário dividi-la pelo total de casas decimais. Exemplos de como fazer isso são apresentados nas linhas de código a seguir.

2.2.2.2 A leitura dos microdados com o comando read.fortran

Uma outra forma de ler este arquivo de dados é pelo comando read.fortran que permite que todas as características das variáveis sejam passadas no momento da leitura. O inconveniente do comando read.fortran é que ele lê a linha de texto completa e precisa que a largura de todos os campos sejam definidas no comando. Mas, tem a vantagem de poder definir exatamente o tipo e o tamanho das variáveis por meio dos formatos dos campos.

O formato de um campo é passado para o r no padrão rF1.d, rDl.d, rXl, rAl, rIl, onde l é o comprimento do campo em caracteres, d é o número de casas decimais e r é o número de repetições. F e D são formatos numéricos, A é caractere, I é inteiro e X indica que a coluna deve ser ignorada. O código de repetição r e as casas decimais d são sempre opcionais. O comprimento de campo l é obrigatório exceto para o formato X quando r está presente.

As linhas de comando a seguir fazem a leitura de todas as 76 variáveis do banco de dados dos domicílios no Censo Demográfico de 2010, assumindo que todas as variáveis são do tipo texto.

nomes_domi<-c("V0001","V0002","V0011","V0300","V0010","V1001","V1002","V1003",
              "V1004","V1006","V4001","V4002","V0201","V2011","V2012","V0202",
              "V0203","V6203","V0204","V6204","V0205","V0206","V0207", "V0208",
              "V0209","V0210","V0211","V0212","V0213","V0214","V0215","V0216",
              "V0217","V0218","V0219","V0220","V0221","V0222","V0301","V0401",
              "V0402","V0701","V6529","V6530","V6531","V6532","V6600","V6210",
              "M0201","M2011","M0202","M0203","M0204","M0205","M0206","M0207",
              "M0208","M0209","M0210","M0211","M0212","M0213","M0214","M0215",
              "M0216","M0217","M0218","M0219","M0220","M0221","M0222","M0301",
              "M0401","M0402","M0701","V1005")
  formats_domi<-c("F2.0","F5.0","F13.0","F8.0","F16.13","F1.0","F2.0","F3.0",
                  "F2.0","F1.0","F2.0","F2.0","F1.0","F6.0","F9.5","F1.0",
                  "F2.0","F3.1","F2.0","F3.1","F1.0","F1.0","F1.0","F2.0",
                  "F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F1.0",
                  "F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F2.0",
                  "F1.0","F1.0","F7.0","F10.5","F8.2","F9.5","F1.0","F1.0",
                  "F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F1.0",
                  "F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F1.0",
                  "F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F1.0","F1.0",
                  "F1.0","F1.0","F1.0","F1.0")
  
domi2_rj<-read.fortran(file='./Censo2010/txt/Amostra_Domicilios_33.txt',
                            format=formats_domi,col.names=nomes_domi) 

Perceba que embora mais complexo e (bem) mais lento, este comando é mais flexível e, combinado com comandos do pacote dplyr, podem gerar os mesmos resultados que encontramos antes. Os comandos a seguir seleciona, no dataframe domi2_rj, apenas as variáveis de interesse.

domi3_rj <- domi2_rj %>%
  select(V0002,V0300,V0010,V1006,V0401,V6529,V6600,V0010)

3 Gerando tabelas usando os Microdados do Censo 2010

Esta atividade irá gerar uma tabela de quantitativo de pessoas, por sexo (V0601), grupo de idade (variável a ser derivada na varável V6033) e Destino do Lixo (V0210) para todos os 92 municípios do Rio de Janeiro. Adicionalmente, vamos incluir a variável da situação do domicílio (V1006) variável do Peso Amostral (V0010). A variável do peso amostra deve sempre ser mantida em banco de dados de uma pesquisa amostral, como é o caso da Amostra do Censo Demográfico 2010: Nunca se esqueçam dela! Para identificar o municípios vamos manter as varáveis da Unidade da Federação (V0001), o código do município (V0002) e o código do domicílio (V0300, a variável de controle)

O primeiro comando para preparar o banco de dados é selecionar as variáveis que nos interessam no arquivo de pessoas e no arquivo de domicílios. Esse comando não é necessário mas diminui muito o tamanho do banco de dados e os códigos ficam mais rápidos. Para o estado do Roraima talvez esse comandos seja desnecessário mas, para estados maiores ou para o Brasil inteiro eles são indispensável. Essa seleção é dada pelo comando select do pacote dplyr e é apresentada no código a seguir.

library(dplyr)
DOMI_selected <- DOMI %>%
  select(V0001,V0002,V0300,V0210,V0010)

PESS_selected <- PESS %>%
  select(V0001,V0002,V0300,V1006, V0601,V6033,V0010)

No segundo comando, vamos criar uma variável do código do município que inclua o código da UF (V0001). Perceba, pelo dicionário de dados, que a UF é formada por dois dígitos e o código do município é formado por cinco dígitos (V0002). A variável final terá o formato UUMMMMM, onde UU é o código da UF e MMMMM é o código do município.

DOMI_selected <- DOMI_selected %>%
  mutate(UFMUNID = V0001*100000+V0002)

PESS_selected <- PESS_selected %>%
  mutate(UFMUNID = V0001*100000+V0002)

3.1 Unindo dois arquivos: os comandos tipo _join

Uma sequência de comandos muito comum é a união de duas tabelas a partir de uma variável comum, contida nas duas tabelas. Esse comando é utilizado pelo meio de um comando do tipo _join, presente no pacote dplyr, ou pelo merge no pacote básico do R. Esses comandos são simplesmente a união de dois conjuntos de dados por meio de um ou mais campos em comum (uma chave ou um key). Existem algumas vantagens de se utilizar o _join com dplyr em relação ao merge, em especial por serem comandos mais intuitivos e por preservaram a ordem da tabela à esquerda.

As funções do tipo _join são de dois tipos

  • Mutate join: left_join(), right_join(), inner_join() e full_join()

  • Filtering joins: semi_join() e anti_join()

O comando inner_join(DOMICILIOS, PESSOAS, by='DOMICILIO') irá unir as tabelas como apresentado na figura abaixo. Perceba que o domicílio 6 que não tem moradores não estará no arquivo inner_join. Ou seja o comando irá unir apenas aquelas linhas que tenham rigorosamente os mesmos valores nas duas tabelas.

Para unir os nossos banco de dados usando o pacote dplyr podemos utilizar a sequência de comandos a seguir. Lembrem-se que o pipe (%>%) para o comando inner_join o dataframe DOMI_selected como argumento x.

library(dplyr)
PESSDOMI_selected <- DOMI_selected %>%
  inner_join(PESS_selected, by="V0300")

Ao abrir o arquivo de saída, observamos que o banco de dados gerado apresenta a variável V0001.x e V0001.y. O comando mantém todas as variáveis das duas tabelas e, quando elas tem nomes iguais, esses sufixos são acrescentados à tabela de saída. Isso não é necessariamente um erro, mas tende a deixar nossas tabelas com nomes cada vez mais complexos. A várias formas de contornar esse erro. A primeira delas, apresentada nos comandos a seguir exclui uma delas e renomeia a outra, com os comandos select e rename.

PESSDOMI_selected <- PESSDOMI_selected %>%
  select(-c(V0001.x,V0002.x,UFMUNID.x,V0010.x))%>%
  rename(V0001=V0001.y,V0002=V0002.y,UFMUNID=UFMUNID.y,V0010=V0010.y)

A segunda sequencia de comandos é mais elegante e, talvez, mais complexa para usuários inciantes: prepara o banco de dados só com as variáveis que nos interessam. Tudo em uma sequencia de comandos só. Tente compreender a sequência. Alguém já pensou em fazer esses comandos similares no Excel? A recomendação é nem tentar…

PESSDOMI_selected <- DOMI %>%
  select(V0300,V0210) %>%
  inner_join(PESS, by='V0300')%>%
  select(V0001,V0002,V0300,V0210,V1006, V0601,V6033,V0010) %>%
  mutate(UFMUNID = V0001*100000+V0002)

Finalmente deve-se ressaltar que quando as variáveis são idênticas para as duas tabelas, os comandos anteriores são relevantes: um domicílio estará sempre no mesmo município e UF. Mas essa nem sempre essa igualdade é verdadeira. Pense na hipótese de uma tabela contendo o nome das UFs e outra contendo o nome dos municípios. Se o nome do campo nome for idêntico nas duas tabelas, a identificação da tabela de origem será necessária, como no exemplo apresentado na imagem a seguir. Nesses casos, pode ser interessante o uso do argumento sufffix que acrescenta um sufixo às variáveis, como, por exemplo, inner_join(x,y,by='ID',suffix=c('_UF','_Munic')) que deve ser sempre um vetor de caractere com dois elementos: o primeiro para a tabela x e o segundo para a tabela y.

Os demais tipos de comandos _join são úteis quando estamos trabalhando com bancos de dados relacionais mais complexos, como por exemplo base de dados de redes sociais (big data). Para entender o uso e a funcionalidade desses comandos consulte esse post de Cristina Freitas que é bem completo.

3.2 Tabelas de frequências simples

t<-table(PESSDOMI_selected$UFMUNID)
p<-100*prop.table(t)
cum<-cumsum(100 * p / sum(p))
freq<-data.frame(Municipio=names(t),Freq=as.numeric(t),Prop=as.numeric(p),Cum=as.numeric(cum))
freq
Municipio Freq Prop Cum
1400027 1763 2.764840 2.764840
1400050 3324 5.212891 7.977731
1400100 28120 44.099428 52.077158
1400159 2118 3.321571 55.398730
1400175 2717 4.260958 59.659688
1400209 3564 5.589273 65.248961
1400233 2628 4.121383 69.370344
1400282 2917 4.574610 73.944954
1400308 2896 4.541677 78.486631
1400407 2891 4.533835 83.020466
1400456 1940 3.042421 86.062887
1400472 2128 3.337254 89.400141
1400506 2186 3.428213 92.828354
1400605 2023 3.172587 96.000941
1400704 2550 3.999059 100.000000
t<-xtabs(V0010 ~ UFMUNID, PESSDOMI_selected)
p<-100*prop.table(t)
cum<-cumsum(100 * p / sum(p))
freq<-data.frame(Municipio=names(t),Freq=as.numeric(t),Prop=as.numeric(p),Cum=as.numeric(cum))

freq
Municipio Freq Prop Cum
1400027 9327 2.070463 2.070463
1400050 16448 3.651225 5.721687
1400100 284313 63.113486 68.835173
1400159 10943 2.429192 71.264365
1400175 13902 3.086048 74.350414
1400209 18398 4.084097 78.434511
1400233 8114 1.801194 80.235705
1400282 8696 1.930390 82.166094
1400308 14792 3.283616 85.449710
1400407 8940 1.984554 87.434264
1400456 10433 2.315979 89.750244
1400472 24279 5.389596 95.139840
1400506 6769 1.502623 96.642463
1400605 6750 1.498405 98.140868
1400704 8375 1.859132 100.000000

3.3 Tabelas de frequências cruzada

xtabs(V0010 ~ UFMUNID + V0601, PESSDOMI_selected)
##          V0601
## UFMUNID        1      2
##   1400027   4992   4335
##   1400050   8676   7772
##   1400100 140801 143512
##   1400159   5879   5064
##   1400175   7538   6364
##   1400209   9732   8666
##   1400233   4309   3805
##   1400282   4600   4096
##   1400308   7865   6927
##   1400407   4678   4262
##   1400456   5408   5025
##   1400472  12923  11356
##   1400506   3551   3218
##   1400605   3568   3182
##   1400704   4339   4036

3.4 Tabelas de frequencia usando o dplyr

O dplyr, como já apresentado na aula anterior, pode gerar frequências cruzadas e frequencias simples. Obviamente os resultados serão rigorosamente idênticos mas a vantagem em usar as funções desse pacote é a possibilidade de gerar dataframes, em geral, compatíveis com o pacote ggplot2, facilitando muito a contrução de belos gráficos. Uma das formas de gerar essas frequências é usar funções como o group_by, count e summarise de forma combinada.

No código a seguir, é gerada uma frequencia simples da população por município por meio da função count. Observe que a variável V0010 foi acrescentada por meio do argumento wt. Nesse código foram ainda acrescenados dois comandos dos pacotes knitr e kableExtra que tem por objetivo formatar a tabela de saída em formato html (argumento format='html') e formatando a tabela para não ocupar toda a largura da página (experimente altear o argumento full_width para TRUE). Os comandos kable e kable_styling imprimem a tabela de entrada (municipios) na aba Viewer do RStudio e permitem o uso de uma extensa lista de argumentos e que os dados sejam copiados e colados em processadores de texto e planilhas eletrônicas sem demandar formatação.

municipios <- PESSDOMI_selected %>%
  count(UFMUNID,wt=V0010,name="populacao")

library(knitr)
library(kableExtra)

municipios %>%
  kable(format='html') %>%
  kable_styling(full_width = F)
UFMUNID populacao
1400027 9327
1400050 16448
1400100 284313
1400159 10943
1400175 13902
1400209 18398
1400233 8114
1400282 8696
1400308 14792
1400407 8940
1400456 10433
1400472 24279
1400506 6769
1400605 6750
1400704 8375

A saída do código a seguir é uma tabela de frequência cruzada do tipo long. Nesse formato, as variáveis a serem usadas no cruzamento das informações (município e sexo neste caso) serão duas colunas no arquivo de saída que é diferente do formato gerado pelo comando xtabs apresentado anteriormente. Esse formato de tabela pode parecer estranho para a maioria dos usuários iniciantes no R, tendo em vista que outros programas, como o SPSS e o Excel, preferem os dados organizados em formato largo (como gerado pelo comando xtabs). Mas, a maioria das funções no R sào desenhadas para trabalhar melhor com dados no formato longo (long format) do que no formato largo (wide format) e, em especial, os gráficos gerados pelo pacote ggplot são bem mais simples de serem gerados a partir de tabelas no formato longo.

municipios <- PESSDOMI_selected %>%
  group_by(UFMUNID,V0601) %>%
  count(UFMUNID,wt=V0010,name="populacao")

municipios %>%
  kable("html") %>%
  kable_styling("striped", full_width = F)
UFMUNID V0601 populacao
1400027 1 4992
1400027 2 4335
1400050 1 8676
1400050 2 7772
1400100 1 140801
1400100 2 143512
1400159 1 5879
1400159 2 5064
1400175 1 7538
1400175 2 6364
1400209 1 9732
1400209 2 8666
1400233 1 4309
1400233 2 3805
1400282 1 4600
1400282 2 4096
1400308 1 7865
1400308 2 6927
1400407 1 4678
1400407 2 4262
1400456 1 5408
1400456 2 5025
1400472 1 12923
1400472 2 11356
1400506 1 3551
1400506 2 3218
1400605 1 3568
1400605 2 3182
1400704 1 4339
1400704 2 4036

É possível converter tabelas no formato long para o formato wide. No código a seguir foi usado o comando spread que pertence ao pacote tidyr (uma boa tradução para tidy é seria arrumado, limpo ou ordenado). Esse pacote oferece várias funções criadas com o objetivo de organizar base de dados. Para comprrender melhor como fazer a conversão de longo para wide e vice versa consulte esse post no Cookbook.

No código a seguir forma acrescentadas duas outras perfumarias à nossa saída: o uso da função rename antes do comando kable que altera o nome das colunas da tabela de saída e, o estilo da tabela que foi imputado como striped. O uso do argumento escape=F, embora recomendável, é quase sempre dispensável.

library(tidyr)
municipios <- PESSDOMI_selected %>%
  group_by(UFMUNID,V0601) %>%
  count(UFMUNID,wt=V0010,name="populacao") %>%
  spread(key=V0601,value=populacao,sep=".")

municipios %>%
  rename(Homens=V0601.1, Mulheres=V0601.2, `Código do município`=UFMUNID)%>%
  kable("html", escape = F) %>%
  kable_styling("striped", full_width = F)
Código do município Homens Mulheres
1400027 4992 4335
1400050 8676 7772
1400100 140801 143512
1400159 5879 5064
1400175 7538 6364
1400209 9732 8666
1400233 4309 3805
1400282 4600 4096
1400308 7865 6927
1400407 4678 4262
1400456 5408 5025
1400472 12923 11356
1400506 3551 3218
1400605 3568 3182
1400704 4339 4036

4 Criando variáveis derivadas

Variáveis derivadas são criadas a partir de variáveis já existentes no banco de dados, usando o comando mutate do pacote dplyr. Se for necessário criar novas variáveis apenas se alguma condição for atendida as opções básicas para estruturar seu código são por meio dos comandos: ifelse() e case_when().

4.1 Uso da função ifelse para criar variáveis derivadas

A função ifelse (se_senão) tem três argumentos como em ifelse(condição, valor_se_TRUE, valor_se_FALSE). Neste caso, condição é a estrutura condicional a ser testada, valor_se_TRUE é o valor retornado se a condição for TRUE, e valor_se_FALSE é o valor retornado se a condição for FALSE. Para este exercício, a proposta é criar uma variável nova que identifique se a coleta de lixo nos domicílios é feita por um sistema de limpeza pública ou se tem outra destinação. Essa informação é dada pela variável V0210 que tem as seguintes categorias de resposta:

  1- Coletado diretamente por serviço de limpeza
  2- Colocado em caçamba de serviço de limpeza 
  3- Queimado (na propriedade)
  4- Enterrado (na propriedade)
  5- Jogado em terreno baldio ou logradouro
  6- Jogado em rio, lago ou mar
  7- Tem outro destino
  Branco (NA) - Informação não disponível

Sendo assim se a resposta for 1 ou 2, o lixo é coletado por uma companhia de limpeza pública e, em qualquer das outros opções, o lixo tem outra destinação que podem ser consideradas como inadequadas. O símbolo | é lido como ou, ou seja:

  se (V0210 é igual a um?) ou (V0210 é igual a dois?) então
    Atribua o valor 1
  senão
    Atribua o valor 2
  fim se

Os comandos na sequência são uma aplicação desse algorítimo e cria uma variável denominada QCLIXO no dataframe Qualidade_RS. Foi também gerado um gráfico de colunas, a partir de ggplot básico para apresentar esses dados.

No caso do gráfico gerado, perceba que os elementos estéticos x, y e fill foram convertidos em caracteres com a função as.character. Essa conversão, nesse caso, é necessária para que os elementos estéticos não sejam lidos como uma variavel numérica contínua e sim como uma variável categórica. Mas ainda assim, gráfico não fica legível: os códigos dos municípios se sobrepõem, os nomes dos eixos e da legenda não estão adequados e, principalmente, as barras estão desenhadas em números absolutos (total da população).

Qualidade_RS <- PESSDOMI_selected %>%
  mutate(QCLIXO=ifelse(V0210==1|V0210==2,1,2))%>%
  group_by(UFMUNID,QCLIXO) %>%
  count(UFMUNID,wt=V0010,name="Pop_QLIXO")%>%
  filter(!is.na(QCLIXO))

library(ggplot2)
ggplot(data=Qualidade_RS,aes(x=as.character(UFMUNID),y=Pop_QLIXO,fill=as.character(QCLIXO)))+
  geom_col()

Para contornar esse erros do gráfico anterior, foi criado um novo um novo dataframe denominado Qualidade_RS_f. Para isso, inicialmente foram criados quatro vetores contendo os valores (levels) e os rótulos (labels) das variáeis QCLIXO e UFMUNID. Esse vetores foram usados no comando mutate que criou as variáveis QCLIXO_f e Munic_fna partir da aplicação da função factor às variáveis UFMUNID e QCLIXO, usando esses vetores como os argumentos levels e labels. Note que as variáveis QCLIXO_f e Munic_f são do tipo factor (categóricas) e não do tipo numérico as variáveis, como QCLIXO e UFMUNID. Adicionalmente, foram acrescentados alguns elementos ao objeto ggplot:

  1. labs que rotula diversos elementos do gráfico, a exemplo dos usados aqui sequência: x='Nome do Município', y='População' e fill='Resíduos'.
  2. A geometria geom_col foi definida para representar a população relativa e não absoluta (position='fill').
  3. Por fim, o comando theme() é um comando genérico que altera diversos elementos do gráfico. Nesse caso, foi alterado o texto do eixo x (axis.text.x) para que ele fosse desenhado a 90º (angle=90) e orientado à direita (hjust=1).

Dica: Note que o vetor com o nome dos municípios usou o arquivo Excel Unidades da Federa__o, Mesorregi_es, microrregi_es e munic_pios 2010.xls como referência dos dados.

#Criando Fatores
library(readxl)
munic<-read_xls(
      path='Unidades da Federa__o, Mesorregi_es, microrregi_es e munic_pios 2010.xls',
      skip=2)

munic_AC <- munic %>%
  filter(UF==14)%>%
  select(Município, Nome_Município)

labels_munics <- munic_AC$Nome_Município
levels_munics <- as.character(munic_AC$Município)
labels_lixo <- c('coletados por cia pública','sem destinação adequada')
levels_lixo <- as.character(c(1,2))

Qualidade_RS_f <- Qualidade_RS %>%
  mutate(QCLIXO_f=factor(QCLIXO,levels=levels_lixo,labels=labels_lixo),
         Munic_f=factor(UFMUNID, levels=levels_munics,labels=labels_munics))

ggplot(data=Qualidade_RS_f,aes(x=Munic_f,y=Pop_QLIXO,fill=QCLIXO_f))+
  geom_col(position='fill')+
  labs(x='Nome do Município',y='População',fill='Resíduos')+
  theme(axis.text.x=element_text(angle=90,hjust=1))

4.2 Uso da função case_when para criar variáveis derivadas

O gráfico anterior representa o total da população com coleta de lixo adequada e inadeqada. Aparentemente, apenas o município de Boa Vista tem quase a totalidade da população atendido por um sistema público de coleta de lixo. Uma outra forma de exibir essa informação de forma mais detalhada seria cruzar essa mesma informação com a situação de domicílio. É provável que a coleta de lixo seja bem menor ou até inexistente nas áreas rurais e as próximas tabelas irão analisar de forma simultânea a coleta de lixo e a situação de domicílio.

Para combinar essas variáveis a solução é aninhar recursivamente uma sequencia de se_senão no algoritimo, como a seguir.

  se (V1006==1) então
    se (V0210==1) ou (V0210==2)
      Atribua o valor 11
    senão
      Atribua o valor 21
    Fim se
  senão
    se (V0210==1) ou (V0210==2)
      Atribua o valor 12
    senão
      Atribua o valor 22
    Fim se
  Fim se

Essa parte de algoritmo no R seria traduzido como ifelse(V0210==1|V0210==2,ifelse(V1006==1,11,12),ifelse(V1006==1,21,22)) e seria executado como na sequência a seguir.

QRS2Situacao <- PESSDOMI_selected %>%
  mutate(QCLIXOSIT = ifelse(V1006==1,ifelse(V0210==1|V0210==2,11,21),ifelse(V0210==1|V0210==2,12,22)))%>%
  group_by(UFMUNID,QCLIXOSIT) %>%
  count(UFMUNID,wt=V0010,name="Pop_QCLIXOSIT")

QRS2Situacao %>%
  spread(key=QCLIXOSIT,value=Pop_QCLIXOSIT,sep=".") %>%
  kable("html", escape = F, format.args = list(nsmall=0, digits=2)) %>%
  kable_styling("striped", full_width = F)
UFMUNID QCLIXOSIT.11 QCLIXOSIT.12 QCLIXOSIT.21 QCLIXOSIT.22 QCLIXOSIT.NA
1400027 1214 569 NA 7501 42
1400050 4695 713 62 10955 23
1400100 270465 220 6186 5200 2242
1400159 2939 191 703 7031 79
1400175 2203 864 54 10672 109
1400209 10337 604 474 6805 178
1400233 2713 723 519 4022 137
1400282 3916 27 152 4554 47
1400308 8601 NA 462 5652 77
1400407 1505 NA 763 6629 43
1400456 4282 407 210 5512 22
1400472 11321 1997 211 10443 308
1400506 4065 22 584 1965 134
1400605 3955 523 500 1697 75
1400704 606 177 532 7060 NA

Observe que sugem valores missing (NA) que são aquelas células em que não existe a combinação entre a variável coleta de lixo (V0210) e situação de domicílio (V1006). O município de Amajari (Código 1400027), por exemplo, tinha uma população residente em áreas urbanas muito pequena em 2010 e, por isso, todas as 569 pessoas residentes em áreas rurais em Amajari tinham coleta de lixo por companhia pública e nenhum habitante de áreas urbanas estavam sem coleta domiciliar de lixo. Resta-nos perguntar se este resultado está correto. Em primeira análise é um resultado inesperado: população rural relativamente muito alta e a totalidade dos domicílios urbanos como coleta domiciliar. Mas, antes de tirar conclusões apressadas é importante conferir esses resultados. Sempre procurem por um erro no seu código: desconfiem primeiro do nosso próprio erro. Uma forma de conferir se este resultado está correto é analisar a distribuição da população é áreas rurais e urbanas em Amaraji, como apresentado a seguir. A tabela revela que apenas 1,2 mil pessoas residem em áreas urbanas nesse município de quase 9 mil pessoas (13% da população) e que a maioria da população (4356) residia em domicílios onde o destino do lixo foi categorizado como ‘Tem outro destino’ (Codificação 7). Este resultado revela que, de fato, maioria da população de Amaraji, em 2010, estava residindo em áreas classificadas como áreas rurais e provavelmente essa classificação não é precisa (lembrem-se que o IBGE segue, quase sempre, a classficação regulamentada por lei municipal, que poderia estar desatualizada em 2010). Mas, para conferir essa segunda hipótese seria necessário conferir tal informação com outras bases de dados, como por exemplo, nos agregados por setor censitário do Censo 2010, que classifica as áreas urbanas e rurais em seis categorias considerando classficação do urbano de facto com o urbano de jure.

PESSDOMI_selected %>%
  filter(UFMUNID==1400027)%>%
  group_by(V1006,V0210)%>%
  count(UFMUNID,wt=V0010,name="Pop") %>%
  spread(key=V1006,value=Pop)%>%
  kable("html", escape = F, format.args = list(nsmall=0, digits=2)) %>%
  kable_styling("striped", full_width = F)
V0210 UFMUNID 1 2
1 1400027 1214.3 521
2 1400027 NA 48
3 1400027 NA 2536
4 1400027 NA 390
5 1400027 NA 219
7 1400027 NA 4356
NA 1400027 4.7 37

Essa difu=iculdade aparente em analisar esses dados revelam que estruturas condicionais com ifelse aninhados dentro de outros ifelse é de difícil análise. Um comando case_when tem resultados bem similares e nos apresenta como um código mais limpo, como sugerido a seguir.

QRS2Situacao2 <- PESSDOMI_selected %>%
  mutate(QCLIXOSIT = case_when(
    (V0210==1|V0210==2) & V1006==1 ~ 11 ,
    (V0210==1|V0210==2) & V1006==2 ~ 12 ,
    (V0210>=3) & V1006 == 1 ~ 21,
    (V0210>=3) & V1006 == 2 ~ 22)
    )%>%
  group_by(UFMUNID,QCLIXOSIT) %>%
  count(UFMUNID,wt=V0010,name="Pop_QCLIXOSIT")%>%
  spread(key=QCLIXOSIT,value=Pop_QCLIXOSIT,sep=".")

QRS2Situacao2 %>%
  kable("html", escape = F, format.args = list(nsmall=0, digits=2)) %>%
  kable_styling("striped", full_width = F)
UFMUNID QCLIXOSIT.11 QCLIXOSIT.12 QCLIXOSIT.21 QCLIXOSIT.22 QCLIXOSIT.NA
1400027 1214 569 NA 7501 42
1400050 4695 713 62 10955 23
1400100 270465 220 6186 5200 2242
1400159 2939 191 703 7031 79
1400175 2203 864 54 10672 109
1400209 10337 604 474 6805 178
1400233 2713 723 519 4022 137
1400282 3916 27 152 4554 47
1400308 8601 NA 462 5652 77
1400407 1505 NA 763 6629 43
1400456 4282 407 210 5512 22
1400472 11321 1997 211 10443 308
1400506 4065 22 584 1965 134
1400605 3955 523 500 1697 75
1400704 606 177 532 7060 NA

O único ponto que merece ressalva são os casos classificados como QCLIXOSIT.NA que são aqueles casos em que não foram levantados informações sobre o destino do lixo (domicílios improvisados ou coletivos). O comando a seguir apresenta ainda um gráfico que exie tais resultados usando a paleta de cores … do pacote RColorBrewer. Para saber mais sobre o que é ColorBrewer, consulte o link do projeto e o link do pacote.

QRS2Situacao3 <- PESSDOMI_selected %>%
  mutate(QCLIXOSIT = case_when(
    (V0210==1|V0210==2) & V1006==1 ~ 11 ,
    (V0210==1|V0210==2) & V1006==2 ~ 12 ,
    (V0210>=3) & V1006 == 1 ~ 21,
    (V0210>=3) & V1006 == 2 ~ 22,
    is.na(V0210) ~ 30)
    )%>%
  group_by(UFMUNID,QCLIXOSIT) %>%
  count(UFMUNID,wt=V0010,name="Pop_QCLIXOSIT")

labels_QCLIXOSIT <- c('Dom. urbanos com coleta de lixo',
                      'Dom. rurais com coleta de lixo',
                      'Dom. urbanos sem coleta de lixo',
                      'Dom. rurais sem coleta de lixo',
                      'Dom. sem inf. sobre a coleta de lixo')
levels_QCLIXOSIT <- as.character(c(11,12,21,22,30))

QRS2Situacao3_f <- QRS2Situacao3 %>%
  mutate(QCLIXOSIT_f=factor(QCLIXOSIT,levels=levels_QCLIXOSIT,labels=labels_QCLIXOSIT),
         Munic_f=factor(UFMUNID, levels=levels_munics,labels=labels_munics))

library(RColorBrewer)
ggplot(data=QRS2Situacao3_f,aes(x=Munic_f,y=Pop_QCLIXOSIT,fill=QCLIXOSIT_f))+
  geom_col(position='fill')+
  scale_fill_brewer(palette='Accent')+
  labs(x='Nome do Município',y='População',fill='Categoria',title='Proporção da população residente de acordo com a categoria do domicílio')+
  theme(axis.text.x=element_text(angle=45,hjust=1))

5 Alguns recursos adicionais para exibir os resultados

Essa seção é um conteúdo adicional que introduz a exibição de informações em mapas no R. O primeiro ponto necessário é a importação de shapes que contenham a malha dos municípios do estado de Roraima. Esta importação é feita por meio do comando st_read do pacote sf que importa arquivos do tipo shape e os converte em um formato de mapas vetoriais do tipo sf. Todas as malhas digitais estão disponíveis no site do IBGE e as shapes usadas nesse documento estão disníveis nesse link do Google Drive.

Na sequência dos comandos o comando ggplot é executado com a geometria geom_sf que desenha objetos do tipo sf.

library(sf)
## Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
RR.sf<-st_read('SHP/14MUE250GC_SIR.shp',options = "ENCODING=latin1")
## options:        ENCODING=latin1 
## Reading layer `14MUE250GC_SIR' from data source 
##   `/Volumes/GoogleDrive/Meu Drive/TEMetQuant/Microdados/SHP/14MUE250GC_SIR.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 15 features and 3 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -64.82525 ymin: -1.580633 xmax: -58.88688 ymax: 5.271841
## Geodetic CRS:  SIRGAS 2000
ggplot(data=RR.sf)+
  geom_sf(fill='lightsalmon1',col='grey10',lwd=.1)

A segunda tarefa é criar uma tabela, a partir dos microdados do Censo Demográfico de 2010, para ser unido com este arquivo sf por meio de um comando inner_join. Para isso, o código a seguir cria uma tabela com uma coluna de identificação do município e colunas contendo,várias informações, como por exemplo, as seguintes informações: população total, total de domicílios, tamanho médio do domicílio e taxa de urbanização.

populacao <- PESSDOMI_selected %>%
  group_by(UFMUNID) %>%
  count(UFMUNID,wt=V0010,name="populacao")

urbana <- PESSDOMI_selected %>%
  group_by(UFMUNID,V0601) %>%
  count(UFMUNID,wt=V0010,name="urbana") %>%
  filter(V0601==1)%>%
  ungroup()%>%
  select(UFMUNID,urbana)

domicilios <- PESSDOMI_selected %>%
  distinct(V0300, .keep_all = T)%>%
  group_by(UFMUNID) %>%
  count(UFMUNID,wt=V0010,name="domicilios")

mapa.df <- populacao %>%
  inner_join(urbana, by='UFMUNID') %>%
  inner_join(domicilios, by='UFMUNID')%>%
  mutate(tamanho_medio=populacao/domicilios,
         taxa_urbanizacao=urbana/populacao,
         CD_GEOCODM=as.character(UFMUNID))

 RR.sf2 <- RR.sf %>%
   inner_join(mapa.df, by.x='CD_GEOCODM',by.y='CD_GEOCODM')
 
 ggplot(data=RR.sf2)+
   geom_sf(aes(fill=taxa_urbanizacao),col='grey80',lwd=.3)+
   scale_fill_gradientn(colors=brewer.pal(7,'YlOrRd'))+
   geom_sf_text(aes(label=NM_MUNICIP),size=2)

Referencias Bibliográficas

IBGE. Fundação Instituto Brasileiro de Geografia e Estatística. 2010. Censo Demográfico 2010: Notas Metodológicas.” Rio de Janeiro: IBGE.
IUSSP. 2020a. Elaboração das estatísticas demográficas.” http://pt-ii.demopaedia.org/wiki/20.
———. 2020b. Generalidades.” http://pt-ii.demopaedia.org/wiki/10.
Minnesota Population Center. 2019. Integrated Public Use Microdata Series, International: Version 7.2 [dataset].” Minneapolis (MN): IPUMS. https://doi.org/10.18128/D020.V7.2.