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 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.
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):
Os arquivos dos microdados do Roraima e Rio de Janeiro em formato txt
Os arquivos dos microdados do Roraima e Rio de Janeiro em formato Rda
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.
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.
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’.
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.
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.
read_fwfA 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; ecol_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:
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.
read.fortranUma 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)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)_joinUma 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.
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 |
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
dplyrO 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 |
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().
ifelse para criar variáveis derivadasA 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:
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'.geom_col foi definida para representar a
população relativa e não absoluta (position='fill').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).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))case_when para criar variáveis derivadasO 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))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)