Geomarketing com o Tidyverse

Censo Demográfico 2010 e Malhas Digitais

Author
Affiliation
Gustavo Henrique Naves Givisiez

Departamento de Geografia de Campos - Universidade Federal Fluminense

Published

August 1, 2024

Este documento é licenciado sob a Creative Commons Attribution 4.0 International (CC BY 4.0).

Você é livre para:

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.

🤔 Observações:

  1. 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.

  2. Este conteúdo foi preparado no RStudio.

  3. 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:

  1. 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).

  2. tidyverse: Um conjunto de pacotes para ciência de dados, incluindo ggplot2 para visualização, dplyr para manipulação de dados, tidyr para transformação de dados, e readr para importação de dados. Projetado para trabalhar de forma coesa e eficiente.

  3. sf Voltados para manipulação e exibição de dados espaciais, integrando-os com dados tabulares. O sf suporta 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:

  1. units e scales sã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).

  2. ggplot2: Focado na visualização de dados, baseado na gramática de gráficos Cox (2007). O ggplot permite a criação de gráficos complexos de maneira altamente personalizável.

  3. gridExtra, ggspatial e ggpattern são extensões do ggplot2 que adiciona funcionalidades aos gráficos. O gridExtra ajuda a exibir mais de um gráfico (ou mapa) na janela de saída. O ggspatial, 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 o ggpattern permite 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.

  4. 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.

  5. httr: Utilizado para realizar requisições HTTP comunicando com APIs e baixando dados diretamente da web. O httr é 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.

  6. readr e readxl sã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. O readr é parte do tidyverse e readxl deve 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:

  1. Lê o arquivo bairrosselecionadosf_df.rds do diretório de trabalho e cria o objeto bairrosselecionados_df

  2. Lê o arquivo bairros_sf.rds do diretório de trabalho e cria o objeto bairros_sf que é uma shape dos bairros do Brasil. Esse arquivo só será usado para a perfumaria de adicionar o nome dos bairros.

  3. Filtra no objeto CampoGrande_sf para exibir apenas os setores desses bairros criando um objeto PertoUFMS_sf. Para fazer isso ele usa funções do dplyr

  4. Exibe 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.

Atenção:

É 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)

📖 Dica:

Para criar um vetor com muitas variáveis no formato dos dados do IBGE uma boa opção é usar a função 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.

Atenção:

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).

📖 Observaçã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.

5 Referências

CIESIN. Gridded Population of the World, Version 4 (GPWv4): Population Density Adjusted to Match 2015 Revision UN WPP Country Totals, Revision 11. [S.l.]: Palisades, NY: NASA Socioeconomic Data and Applications Center (SEDAC). Disponível em: <https://sedac.ciesin.columbia.edu/data/set/gpw-v4-population-density-adjusted-to-2015-unwpp-country-totals-rev11>. Acesso em: 13 jun. 2023., 2018
COX, Nicholas J. The Grammar of Graphics. Journal of Statistical Software, v. 17, 2007. Disponível em: <http://www.jstatsoft.org/v17/b03/>. Acesso em: 31 jul. 2024.
DEBASTIANI, Vanderlei Júlio. Introdução ao R. Disponível em: <https://vanderleidebastiani.github.io/tutoriais/Introducao_ao_R.html>. Acesso em: 25 jul. 2024.
GONÇALVES, Caio. Indicadores no R: Informações demográficas no agregado de setores - Censo Demográfico 2010. Disponível em: <https://rpubs.com/caiocgonc/agregadosetores>. Acesso em: 31 jul. 2024.
IRIZARRY, Rafael A. Introdução à Ciência de Dados. Disponível em: <https://rafalab.dfci.harvard.edu/dslivro/>. Acesso em: 25 jul. 2024.
LEYK, Stefan et al. The spatial allocation of population: A review of large-scale gridded population data products and their fitness for use. Earth System Science Data, v. 11, p. 1385–1409, 2019.
PEREIRA, Rafael H M et al. ipeaGIT/geobr. Brasília, DF: Ipea, 2024. Disponível em: <https://github.com/ipeaGIT/geobr>. Acesso em: 31 jul. 2024.

Reuse

Creative Commons Attribution 4.0 International (CC BY 4.0)