Geomarketing com o Tidyverse
Censo Demográfico 2010 e Malhas Digitais
Este documento é licenciado sob a Creative Commons Attribution 4.0 International (CC BY 4.0).
Você é livre para:
- Compartilhar — copiar e redistribuir o material em qualquer meio ou formato
- Adaptar — remixar, transformar, e criar a partir do material para qualquer fim, mesmo que comercial
Desde que dê o crédito apropriado, fornecer um link para a licença, e indicar se mudanças foram feitas. Você pode fazê-lo de qualquer forma razoável, mas não de forma que sugira que o licenciante endossa você ou seu uso.
Este documento é destinado a usuários sem conhecimento prévio em programação e é parte integrante do curso de Geomarketing, ofertado para o curso de geografia da Universidade Federal Fluminense, campus de Campos dos Goytacazes, no 1º semestre de 2024. Entretanto, pode beneficiar usuários intermediários ou avançados que estejam iniciando seus estudos em Geocomputação com o R. Este conteúdo foi preparado no RStudio. As bases de dados usadas nesse tutorial estão disponíveis aqui.
1 Introdução
O R oferece diversas vantagens que o tornam uma das ferramentas preferidas para a análise de dados e estatística. Embora não diretamente projetado para ser usado como um Sistema de Informações Geográfica (SIG) ou como ferramenta de marketing e geomarketing, ele possui diversos recursos que o habilitam para esses usos. O R é uma plataforma OpenSource que foi desenvolvido originalmente para análises estatísticas e possui uma ampla gama de pacotes (library) e funções para realizar análises estatísticas complexas, manipulação de banco de dados e processamento de dados espaciais. A comunidade do R é grande e ativa proporcionando uma vasta quantidade de recursos, como pacotes adicionais, tutoriais, fóruns de discussão e exemplos de código. O Comprehensive R Archive Network (CRAN) contém mais de 20 mil de pacotes que ampliam as suas funcionalidades básicas. O R é ainda conhecido por suas capacidades gráficas robustas. Embora o R tenha limitações com grandes volumes de dados devido a seu modelo de dados em memória, existem pacotes como data.table, dplyr, sparklyr e bigmemory que otimizam o uso de grandes conjuntos de dados e integração com tecnologias de Big Data.
O RStudio, por outro lado, é um ambiente de desenvolvimento integrado (IDE ou Integrated Development Environment) popular para R, que oferece ferramentas que facilitam o desenvolvimento, depuração e visualização. O RStudio oferece uma interface de usuário com vários painéis que permitem acessar o console R, scripts, arquivos, gráficos, pacotes, e ambientes de variáveis. Isso facilita a navegação e a gestão dos projetos e trabalho. Entre as vantagens do RStudio há ferramentas integradas de depuração que permitem a execução de código passo a passo, inspecionando variáveis e o fluxo de execução que facilitam a identificação e correção de erros no código. O RStudio ainda suporta o RMarkdown que permite criar documentos dinâmicos que combinam código R, texto explicativo e visualizações. Além disso, os notebooks interativos (similar aos Jupyter Notebooks) facilitam a exploração e apresentação de análises. Com RMarkdown, é possível gerar relatórios em vários formatos, incluindo HTML, PDF, Word, e slides de apresentação. Isso facilita a disseminação de resultados e insights. O RStudio ainda facilita a instalação e gestão de bibliotecas e oferece suporte a outras linguagens como Python, C++, Stan, Shell, SQL e JavaScript, permitindo a integração de código multilinguagem.
Este tutorial não tem o objetivo de introduzir o R e o RStudio, pois existem muitos recursos online que já cobrem esses tópicos de maneira abrangente. Para a introdução a esses programas consultem Irizarry (2020) e Debastiani (2020).
O objetivo principal deste tutorial é demonstrar as potencialidades do uso de uma coleção de pacotes R, em conjunto com dados fornecidos pelo Instituto Brasileiro de Geografia e Estatística (IBGE). Seu desenvolvimento considera a necessidade de adaptação de bases cartográficas distintas em um formato que seja de mais fácil visualização e que seja compatível com outras bases. Nesse caso, o uso grades regulares é uma forma eficiente de armazenar dados populacionais que tem sido são utilizados em outras áreas de mapeamento digital desde as primeiras aplicações SIG (ver Leyk et al. (2019)). De forma específica, os comandos desenvolvidos na sequência deste documento fazem uma estimativa da população e da renda para células regulares de 0,01 graus de latitude e longitude interpolando a população proporcionalmente em relação às áreas de interseção entre a malha de setores censitários e a área de cada célula.
1.1 As bibliotecas
Para esse tutorial, vamos usar principalmente três bibliotecas (libraries) do R: geobr e o tidyverse para acesso e processamento de bases de dados e a sf para dados geoespaciais. Essas bibliotecas são, em linhas gerais, úteis para manipulação de dados geográficos, visualização e transformação de dados, permitindo uma abordagem integrada e eficiente para realizar análises complexas. A seguir, uma breve descrição de cada uma dessas três:
geobr: Utilizado para baixar e ler dados geográficos oficiais do Brasil, diretamente de fontes governamentais, facilitando a criação de mapas precisos e análises geoespaciais Pereira et al. (2024).tidyverse: Um conjunto de pacotes para ciência de dados, incluindoggplot2para visualização,dplyrpara manipulação de dados,tidyrpara transformação de dados, ereadrpara importação de dados. Projetado para trabalhar de forma coesa e eficiente.sfVoltados para manipulação e exibição de dados espaciais, integrando-os com dados tabulares. Osfsuporta uma ampla gama de operações geoespaciais e variados sistemas de coordenadas.
Adicionalmente, outras bibliotecas foram usadas para tarefas específicas a exemplo das listadas a seguir:
unitsescalessão ferramentas para trabalhar com dados que envolvem unidades de medidas (units) e para formatar a exibição dessas unidades em gráficos e tabelas (scales).ggplot2: Focado na visualização de dados, baseado na gramática de gráficos Cox (2007). Oggplotpermite a criação de gráficos complexos de maneira altamente personalizável.gridExtra,ggspatialeggpatternsão extensões doggplot2que adiciona funcionalidades aos gráficos. OgridExtraajuda a exibir mais de um gráfico (ou mapa) na janela de saída. Oggspatial, por sua vez, fornece funcionalidades adicionais para a adição de elementos cartográficos, como setas de norte, barras de escala, e grids de coordenadas. E oggpatternpermite adicionar padrões de preenchimento sofisticados a gráficos no R como listras (stripes), pontos (polka dots), linhas cruzadas (crosshatch) e outros designs visuais aos elementos dos gráficos.dplyr: Especializado na manipulação de dados, oferecendo funções eficientes e intuitivas para seleção, filtragem, transformação, agregação e junção de dados, facilitando o processamento e análise de grandes conjuntos de dados.httr: Utilizado para realizar requisições HTTP comunicando com APIs e baixando dados diretamente da web. Ohttré ideal para acessar e interagir com serviços web, permitindo a coleta e integração de dados de diversas fontes online e é essencial para desenvolvedores e analistas de dados que trabalham com APIs. Nesse tutorial vamos usá-lo apenas para apresentar uma forma de fazer download de arquivos do servidor FTP do IBGE sem precisar usar o navegador.readrereadxlsão utilizados para importar e exportar dados de forma rápida e eficiente, especialmente arquivos de texto como CSV, TSV, arquivos delimitados por espaço e no formato do Excel. Oreadré parte dotidyverseereadxldeve ser instalado e carregado separadamente. Eles foram projetados para serem mais rápidos e fáceis de usar do que as funções base do R.
Com essas ferramentas, é possível conduzir análises interessantes e robustas de uma cidade específica e criar visualizações informativas, explorando dados geográficos de maneira integrada e eficiente. O comando install.packages instala essas bibliotecas no computador. Isso só precisa ser executado uma vez.
# Tudo que está após um '#' é um comentário no código e não é executado
install.packages("geobr")
install.packages("tidyverse")
install.packages("sf")
install.packages("httr")
install.packages("readxl")
install.packages("ggspatial")
install.packages("ggpattern")
install.packages("units")
install.packages("scales")
install.packages("gridExtra")E, para carregar as bibliotecas na sua instância do R execute o código a seguir
library(geobr)
library(tidyverse)
library(sf)
library(httr)
library(readxl)
library(units)
library(ggpattern)
library(scales)
library(gridExtra)
#Para ajudar a títulas aos gráficos.
#. Faz parte do R padrão, mas deve ser carregado manualmente
library(grid) 2 Inicializando os bancos de dados e shapes
2.1 Shapefile
O comando a seguir faz download dos setores censitários da área urbana de Campo Grande, para o ano de 2010.
CampoGrande_sf<-read_census_tract(code_tract=5002704, year=2010,zone="urban")O arquivo CampoGrande_sf já foi baixado do site do IBGE e está na pasta raiz desse projeto com o nome CampoGrande_sf.rds . Na sequência, o comando plot desenha um gráfico simples de um conjunto de dados. Ele tenta identificar o tipo do objeto que você pretende exibir como gráfico e o desenha.
CampoGrande_sf <- readRDS('CampoGrande_sf.rds')
plot(CampoGrande_sf)Tudo (quase literalmente tudo) pode ser customizado com plot. Mas, ele não é amigável e complexo de usar. Pacotes como ggplot2, lattice e plotly, cada um com suas aplicações e particularidades, permitem criar visualizações de dados sofisticadas e personalizáveis, ajudando a interpretar e comunicar. Nesse exercício vamos usar ggplot que foi projetado para trabalhar em conjunto com o dplyr que são parte integrante do tidyverse.
ggplot(data = CampoGrande_sf) +
geom_sf(aes(fill = zone))Entretanto não vamos trabalhar com todos os setores censitários de Campo Grande. Experimente os comandos a seguir para ver como o arquivo de Campo Grande está organizado:
str(CampoGrande_sf)
View(CampoGrande_sf)
CampoGrande_sf$name_neighborhood
unique(CampoGrande_sf$name_neighborhood)
unique(CampoGrande_sf$code_neighborhood)Vamos trabalhar apenas com os bairros em volta do campus da UFMS. Esses arquivos estão listados na tabela a seguir e no diretório de trabalho tem um arquivo denominado bairros_selecionados.rds com a listagem dos bairros que nos interessam.
| Nome do bairro | Código do bairro |
|---|---|
| Jardim Paulista | 500270405024 |
| Piratininga | 500270405031 |
| Parati | 500270405076 |
| Pioneiros | 500270405035 |
| Dr. Albuquerque | 500270405029 |
| Carlota | 500270405028 |
| América | 500270405070 |
Com base nessa listagem, podemos selecionar na shape apenas as linhas que nos interessam. Os comandos a seguir executam:
Lê o arquivo
bairrosselecionadosf_df.rdsdo diretório de trabalho e cria o objetobairrosselecionados_dfLê o arquivo
bairros_sf.rdsdo diretório de trabalho e cria o objetobairros_sfque é uma shape dos bairros do Brasil. Esse arquivo só será usado para a perfumaria de adicionar o nome dos bairros.Filtra no objeto
CampoGrande_sfpara exibir apenas os setores desses bairros criando um objetoPertoUFMS_sf. Para fazer isso ele usa funções dodplyrExibe o objeto
PertoUFMS_sf, com os nomes dos bairros, usando o ggplot#0 - Para ler direto do IBGE e já filtrar: # bairrosselecionados_sh<-read_neighborhood(simplified=TRUE)%>% # filter(code_neighborhood %in% bairrosselecionados_df$code_neighborhood) # 1 - bairrosselecionadosf_df.rds bairrosselecionados_df<-read_rds('bairrosselecionados_df.rds') #2. Para importar a chape com todos os bairros do Brasil # direto do IBGE: # bairrosselecionados_sf<-read_neighborhood(simplified=TRUE) # filter(code_neighborhood %in% bairrosselecionados_df$code_neighborhood) # 3. Para carregar com todos os bairros braileiros bairros_sf <- read_rds("bairros_sf.rds") # 2 - Para filtrar os bairros selecionados no arquivo do Brasil bairrosselecionados_sf <- bairros_sf %>% filter(code_neighborhood %in% bairrosselecionados_df$code_neighborhood) # 4 - Filtra no objeto CampoGrande_sf apenas os setores censitários # que estão perto da UFMS PertoUFMS_sf<-CampoGrande_sf%>% filter(code_neighborhood %in% bairrosselecionados_df$code_neighborhood) # 5 - Exibe o objeto PertoUFMS_sf, com os nomes dos bairros ggplot() + geom_sf(data = PertoUFMS_sf)+ geom_sf_text(data=bairrosselecionados_sf,aes(label = name_neighborhood))
2.2 Data Frames
Para a leitura dos dados do Censo Demográfico é necessário fazer o download de arquivos sobre as Caracteristicas da Populacao e dos Domicílios no site do IBGE: Resultados do Universo - 16/11/11, mais especificamente os dados que estão no link Agregados por Setores Censitários (download).
Trata-se de um grande conjunto de dados com tabelas e a documentação dessas tabelas. O texto de Gonçalves (2023) contém uma explicação breve de como esses dados são organizados. Os arquivos do Mato Grosso Sul foram carregados direto do servidor FTP do IBGE e salvas na pasta de trabalho.
É importante baixar a documentação desses arquivos também. Explorem o arquivo BASE DE INFORMAÇÕES POR SETOR CENSITÁRIO Censo 2010 - Universo novo.pdf que está dentro da pasta Documentacao deste projeto.
#
#1. Isso aqui dá errado pois as shapes deixam os campos todos como string
#. e a base de dados do censo tem campos numéricos :-(
#2. Outro erro estranho é que o código dos bairros nessa base é diferentes
# da shape e por isso o filtro dá errado :-((
basico_df <- read_xls("MS_Censo2010/EXCEL/Basico_MS.XLS") %>%
select("Cod_setor","Cod_municipio","Nome_do_municipio",
"Cod_bairro","Nome_do_bairro","Cod_subdistrito",
"Nome_do_subdistrito")%>%
filter(Cod_bairro %in% bairrosselecionados_df$code_neighborhood)
# Isso aqui dará certo... :-)
basico_df <- read_xls("MS_Censo2010/EXCEL/Basico_MS.XLS") %>%
select(Cod_setor,
Cod_municipio,Nome_do_municipio,
Cod_bairro,Nome_do_bairro,
Cod_subdistrito,Nome_do_subdistrito)%>%
mutate(Cod_setor=as.character(Cod_setor),
Cod_municipio=as.character(Cod_municipio),
Cod_bairro=as.character(Cod_bairro),
Cod_subdistrito=as.character(Cod_subdistrito))%>%
filter(Nome_do_bairro %in% bairrosselecionados_df$name_neighborhood)
PessoaRenda_df <- read_excel("MS_Censo2010/EXCEL/PessoaRenda_MS.xls")%>%
select(Cod_setor, V020, V021, V022)%>%
mutate(Cod_setor=as.character(Cod_setor),
pessoas=as.numeric(V020),
rendimentototal=as.numeric(V022),
rpc=rendimentototal/pessoas)%>%
filter(Cod_setor %in% basico_df$Cod_setor)sprintf para criar uma sequência de strings. Por exemplo sprintf("V%03d", 1:10), em que "V%03d" significa que queremos a letra “V” seguida por um número inteiro (d) com largura de 3 dígitos (3d), preenchendo com zeros à esquerda se necessário (%03d). O vetor 1:10 gera os números de 1 a 10. Experimente colar o comando sprintf("V%03d", 1:10) no console
sprintf("V%03d", 1:10) [1] "V001" "V002" "V003" "V004" "V005" "V006" "V007" "V008" "V009" "V010"
3 Desenhando e manipulando shapes
Agora para gerar um mapa com os valores da renda ou da população será necessário unir os dados que estão PessoaRenda_df com a shape que está em PertoUFMS_sf.
ComOutrasVariaveis_sf<-PertoUFMS_sf%>%
left_join(PessoaRenda_df, by=join_by(code_tract==Cod_setor))
ggplot() +
geom_sf(data = ComOutrasVariaveis_sf, aes(fill=pessoas))+
geom_sf_text(data=bairrosselecionados_sf,aes(label = name_neighborhood))ggplot() +
geom_sf(data = ComOutrasVariaveis_sf, aes(fill=rpc))+
geom_sf_text(data=bairrosselecionados_sf,aes(label = name_neighborhood),
colour = "white")Na sequência, os comandos acrescentam algumas perfumarias ao mapa
library(RColorBrewer)
library(ggspatial)
ggplot() +
geom_sf(data = ComOutrasVariaveis_sf, aes(fill=rpc))+
geom_sf_text(data=bairrosselecionados_sf,aes(label = name_neighborhood),
colour = "white")+
scale_fill_gradient(low = "#90EE90", high = "#2F4538",
name='Renda Per Capita')+
labs(title='Vizinhança da UFMS',subtitle = 'Campo Grande, MS, 2010',
x="Longitude",y="Latitude")+
annotation_north_arrow(location = "tr", which_north = "true",
style = north_arrow_fancy_orienteering)+
annotation_scale(location = "bl", width_hint = 0.2)3.1 Células regulares
O próximo passo é criar uma grade de células regulares com a população e a renda para facilitar a visualização. Para isso uma solução possível é calcular proporcionalmente população e a renda de cada setor censitário que intercepta com cada uma das células dessa grade. A área pode ser usada como referência para essa distribuição.
O algoritmo irá, inicialmente, criar uma Bounding Box (caixa delimitadora) do objeto ComOutrasVariaveis_sf. Para isso pode-se usar a função st_bbox() do pacote sf. Essa função retorna as coordenadas mínimas e máximas da extensão espacial do objeto, que definem a caixa delimitadora.
Para criarmos shapes é sempre importante considerar que todos os dados espaciais estejam no mesmo sistema de referência de coordenadas (CRS) que já estejam sendo usados nas suas shapes. Nos comandos a seguir, a CRS de ComOutrasVariaveis_sf é salva em crs_shape para ser usada em todas as novas sf’s.
# Obter o CRS do objeto existente
crs_shape <- st_crs(ComOutrasVariaveis_sf)
# Criar um novo objeto com o bbox
# 1. cria um vetor simples com os quatro pontos
bbox<-st_bbox(ComOutrasVariaveis_sf)
# 2. cria uma sf baseado nos quatro pontos e na CRS padrão
bbox_sf <- st_as_sfc(bbox, crs = crs_shape)
#Para visualizar o Bounding Box em cima dos setores censitários
#. Foi usado o geom_sf_pattern como uma perfumaria adicional de visualização
ggplot() +
geom_sf(data = ComOutrasVariaveis_sf, fill='lightgreen')+
geom_sf_pattern(data=bbox_sf,
pattern = "stripe",fill=NA,
pattern_angle = 45,
pattern_spacing = 0.01,
pattern_size=0.1,
color = "black" )O segundo passo é criar uma grade de quadrados. A função st_make_grid() do pacote sf gera uma grade de polígonos (quadrados ou retângulos) dentro do Bounding Box especificado. Nesse caso foi criada uma grade de 6x6 quadrados com dimensão de 0,01 graus.
# Criar um grid de células
square_size <- 0.01
grid_sf <- st_make_grid(bbox_sf, cellsize = c(square_size, square_size),
what = "polygons")
grid_sf <- st_sf(geometry = grid_sf,crs = crs_shape)
# Para identificar cada uma das 36 grades:
grid_sf<-grid_sf%>%
rowid_to_column("cel_id")%>%
mutate(row_id=(cel_id-1) %/% 6+1,
col_id=(cel_id-1) %% 6+1)%>%
mutate(grid_id=row_id*10+col_id)%>%
select(grid_id)
# plotar a Grid em cima dos setores
ggplot() +
geom_sf(data=grid_sf,
fill='grey')+
geom_sf(data=ComOutrasVariaveis_sf, fill=NA,col='grey30')+
geom_sf_text(data=grid_sf,aes(label=grid_id),fontface='bold',size=5)O próximo passo é interceptar a grade 6x6, com a função grid_sf(), com a sf ComOutrasVariaveis_sf. Com essa interseção é possível calcular a área que cada setor que tem em cada célula. Por exemplo, considerando as células 32 e 33 na figura a seguir.
A célula 32 intercepta os setores censitários:
[1] "0207" "0208" "0209" "0210" "0211" "0212" "0213" "0236" "0237" "0006"
A célula 33, por sua vez, intercepta os setores
[1] "0001" "0212" "0213" "0214" "0003" "0004" "0005" "0006"
Ou seja, a população nessas células seria dada pela soma da proporção de pessoas que reside em nesses setores de forma proporcional à área da interseção, como sugerido na tabela a seguir:
O mesmo procedimento é aplicado também para a renda acumulada. O código a seguir faz a interseção entre a grade e a sf ComOutrasVariaveis_sf e calcula as áreas (área total do setor e a área da interseção).
O código, além de calcular a área com a funçao st_area(), usa o drop_units() para excluir a unidade e simplicar o processamento. A título de esclarecimento, o comando st_intersection atribui a unidade de medida padrão do CRS à área calculada que é metro quadrado (SIRGAS 2000)
# Realizar a interseção
interseccao_sf <- st_intersection(grid_sf, ComOutrasVariaveis_sf)%>%
select(code_tract,grid_id)
# Calcular a área Total do Setor
ComOutrasVariaveis_sf<-ComOutrasVariaveis_sf%>%
mutate(area_original=st_area(geom))%>%
drop_units()
# Calcular a área de cada interseção
interseccao_sf <- interseccao_sf%>%
mutate(area_interseccao=st_area(geometry))%>%
drop_units()
library(gridExtra)
gg1<-ggplot() +
geom_sf(data=ComOutrasVariaveis_sf, aes(fill=area_original),col='grey30')+
scale_fill_gradient(low = "#edf8b1", high = "#2c7fb8",
name='Área (ha)',
labels = label_number(accuracy = 0.1,scale=10**-4))+
labs(x=NULL,y=NULL,title='Área dos Setores')+
theme(
title = element_text(hjust = 0.5,face='bold')
)
gg2<-ggplot() +
geom_sf(data=interseccao_sf, aes(fill=area_interseccao),col='grey30')+
scale_fill_gradient(low = "#fde0dd", high = "#c51b8a",
name='Área (ha)',
labels = label_number(accuracy = 0.1,scale=10**-4))+
labs(x="Longitude",y='Latitude',title='Área da Interseção ')+
theme(
title = element_text(hjust = 0.5,face='bold')
)
grid.arrange(gg1, gg2, nrow = 2)Baseado na proporção da área de interseção sobre a área total de cada polígono original, redistribua as variáveis pessoas e rendimentototal.
# Exclui as geomtrias e combina a área original com a interseção
uniao_df<-interseccao_sf%>%
st_drop_geometry()%>%
inner_join(ComOutrasVariaveis_sf%>%st_drop_geometry(),
by=join_by(code_tract))%>%
mutate(proporcao_area=area_interseccao/area_original,
pessoas=proporcao_area*pessoas,
rendimentototal=proporcao_area*rendimentototal)%>%
select(grid_id,pessoas,rendimentototal)Por fim, vamos fazer um summarise para exibir apenas as células em nosso mapa e clacular a renda per capita.
uniao_summarised_sf<-uniao_df%>%
group_by(grid_id)%>%
summarise(pessoas=sum(pessoas,na.rm = T),
rendimentototal=sum(rendimentototal,na.rm = T))
grid_summarised_sf<-grid_sf %>%
inner_join(uniao_summarised_sf,by = join_by(grid_id))%>%
mutate(rpc=rendimentototal/pessoas)
gg1<-ggplot() +
geom_sf(data = grid_summarised_sf, aes(fill=pessoas))+
geom_sf(data=bairrosselecionados_sf,fill=NA,colour='black')+
scale_fill_gradient(low = "#fff7bc", high = "#d95f0e",
name='População')+
labs(x=NULL,y=NULL)+
theme(
title = element_text(hjust = 0.5,face='bold')
)
gg2<-ggplot() +
geom_sf(data = grid_summarised_sf, aes(fill=rpc))+
geom_sf(data=bairrosselecionados_sf,fill=NA,colour='black')+
scale_fill_gradient(low = "#90EE90", high = "#2F4538",
name='Renda per Capita')+
labs(x="Lon",y='Lat')+
theme(
title = element_text(hjust = 0.5,face='bold')
)
grid.arrange(gg1, gg2, nrow = 2)O algoritimo a seguir prepara uma grade populacional de 0,05º para todo o município de Campo Grande. Observe que foi necessário procurar por geometrias inconsistentes e corrigi-las com as funções st_is_valid() e st_make_valid(). Optamos também por simplificar a shape para mitigar erros em cascata com a função st_simplify().
# Incialização
#CampoGrande_sf<-read_census_tract(code_tract=5002704, year=2010,zone="urban")
CampoGrande_sf <- readRDS('CampoGrande_sf.rds')
PessoaRenda_df <- read_excel("MS_Censo2010/EXCEL/PessoaRenda_MS.xls")%>%
select(Cod_setor, V020, V021, V022)%>%
mutate(Cod_setor=as.character(Cod_setor),
Cod_municipio=str_sub(Cod_setor,end=7),
pessoas=as.numeric(V020),
rendimentototal=as.numeric(V022),
rpc=rendimentototal/pessoas)%>%
filter(Cod_municipio == '5002704')
ComOutrasVariaveis_sf<-CampoGrande_sf%>%
left_join(PessoaRenda_df, by=join_by(code_tract==Cod_setor))
crs_shape <- st_crs(ComOutrasVariaveis_sf)
bbox<-st_bbox(ComOutrasVariaveis_sf)
bbox_sf <- st_as_sfc(bbox, crs = crs_shape)
square_size <- 0.05
grid_sf <- st_make_grid(bbox_sf, cellsize = c(square_size, square_size),
what = "polygons")
grid_sf <- st_sf(geometry = grid_sf,crs = crs_shape)
grid_sf<-grid_sf%>%
rowid_to_column("grid_id")%>%
select(grid_id)%>%
mutate(area_celula = st_area(geometry))%>%
drop_units()%>%
mutate(area_celula=area_celula*10**-4)
interseccao_sf <- st_intersection(grid_sf, ComOutrasVariaveis_sf)%>%
select(code_tract,grid_id,area_celula)
valid_geometries <- interseccao_sf %>%
mutate(is_valid = st_is_valid(geometry))
interseccao_sf <- interseccao_sf %>%
mutate(geometry = st_make_valid(geometry))
interseccao_sf <- interseccao_sf %>%
mutate(geometry = st_simplify(geometry, preserveTopology = TRUE))
interseccao_sf <- interseccao_sf %>%
mutate(area_interseccao = st_area(geometry)) %>%
drop_units()
ComOutrasVariaveis_sf<-ComOutrasVariaveis_sf%>%
mutate(area_original=st_area(geom))%>%
drop_units()
interseccao_sf <- interseccao_sf%>%
mutate(area_interseccao=st_area(geometry))%>%
drop_units()
uniao_df<-interseccao_sf%>%
st_drop_geometry()%>%
inner_join(ComOutrasVariaveis_sf%>%st_drop_geometry(),
by=join_by(code_tract))%>%
mutate(proporcao_area=area_interseccao/area_original,
pessoas=proporcao_area*pessoas,
rendimentototal=proporcao_area*rendimentototal)%>%
select(grid_id,pessoas,rendimentototal,area_celula)
uniao_summarised_sf<-uniao_df%>%
group_by(grid_id)%>%
reframe(pessoas=sum(pessoas,na.rm = T),
rendimentototal=sum(rendimentototal,na.rm = T),
densidade=pessoas/area_celula)
grid_summarised_All_sf<-grid_sf %>%
inner_join(uniao_summarised_sf,by = join_by(grid_id))%>%
mutate(rpc=rendimentototal/pessoas)
write_rds(grid_summarised_All_sf,'grid_summarised_All_sf.rds')grid_summarised_All_sf<-read_rds('grid_summarised_sf.rds')
# CampoGrandeBoundary_sf<-read_municipality()%>%
# filter(code_muni==5002704)
#write_rds(CampoGrandeBoundary_sf,'CampoGrandeBoundary_sf.rds')
CampoGrandeBoundary_sf<-read_rds('CampoGrandeBoundary_sf.rds')
ggplot() +
geom_sf(data = grid_summarised_All_sf, aes(fill=densidade))+
scale_fill_gradient(low = "#fff7bc", high = "#d95f0e",
name='Pop por ha')+
geom_sf(data=CampoGrandeBoundary_sf,fill=NA,colour='black')+
labs(x='Longitude',y="Latitude",title='Densidade Populacional')+
annotation_scale(location = "bl", width_hint = 0.2)+
annotation_north_arrow(location = "tr", which_north = "true",
style = north_arrow_fancy_orienteering)+
theme(
axis.title.y = element_text(hjust = 0),
axis.title.x = element_text(hjust = 0),
title = element_text(hjust = 0.5,face='bold')
)4 Considerações Finais
Os fundamentos para as diferentes abordagens compatibilizar de dados em grade s estatísticas requerem a realocação de dados espacialmente distribuídos de uma fonte organizadas em unidades administrativas ou censitárias em células alvo. Esse procedimento pode se basear em várias técnicas que de forma esquemática estão representados na figura a seguir.
A forma mais simples é a ponderação por área (Area weighting) que redistribui a população contabilizada nas áreas administrativas em células alvo, como representado esquematicamente pelo desenho identificado pela letra a. A ponderação por área não faz uso de outras informações para se apoiar e distribui proporcionalmente a população em células desconsiderando a heterogeneidade existente, e, dessa forma, pode ser considerado como uma grosseira simplificação. Entretanto, essa opção é computacionalmente eficiente e, em níveis globais e continentais, gera resultados consistentes. Esses produtos são mais indicados para consultas e para esforços de planejamento que não exigem alta resolução espacial. Os métodos aplicados na produção do Gridded Population of the World, Version 4 (GPWv4), desenvolvido pelo Center for International Earth Science Information Network (CIESIN) da Columbia University, com apoio da Agência Espacial Americana (SEDAC) (CIESIN (2018)), fazem uso de métodos de Area weighting, por exemplo.
Quando informações auxiliares são acrescentadas ao processamento, para a redistribuição da população em células alvo, a técnica é denominada Dasimética. Todas as técnicas dasimétricas se baseiam no pressuposto de que existe relacionamentos estatísticos entre a população, informada pelos censos demográficos, e as informações auxiliares, obtidas por mapas de o uso da terra, por exemplo. As camadas auxiliares de informação estão, em alguns casos, disponíveis em alta resolução espacial e podem ser usadas para realocar as frequências de população em células alvo mais ‘adequadas’. Variáveis auxiliares podem incluir uso da terra, topografia, densidades de vias, imagens de sensores remotos, dentre outros. O desenho esquemático identificado pela letra b é um modelo conservador, que distribui a população nas células de forma dicotômica identificando células construídas e não construídas. Modelos mais sofisticados podem estimar pesos para as células com base em um conjunto adicional de pressupostos ou de modelos estatísticos.