O objetivo deste tutorial é explorar a base de dados do MapBiomas.

Introdução

O MapBiomas é uma iniciativa inovadora que utiliza tecnologia de ponta para mapear a cobertura e o uso do solo no Brasil. Esta iniciativa colaborativa reúne organizações da sociedade civil, universidades e empresas de tecnologia para gerar dados anuais de alta precisão sobre as mudanças na paisagem brasileira. Utilizando imagens de satélite e algoritmos avançados de aprendizado de máquina, o MapBiomas oferece uma visão detalhada das transformações ocorridas em diferentes ecossistemas, desde a expansão urbana até a desflorestação, agricultura e recuperação de áreas degradadas. Estas informações são cruciais para o planejamento ambiental, políticas públicas, estudos científicos e atividades de conservação, contribuindo significativamente para o entendimento e a gestão sustentável dos recursos naturais do Brasil.

Base de dados

O MapBiomas oferece em seu portal robusto uma área dedicada ao download de sua extensa base de dados, disponível no site oficial do projeto, em https://brasil.mapbiomas.org/estatisticas/. Nesta página, os usuários podem encontrar uma variedade de informações e estatísticas relacionadas à cobertura e uso do solo no Brasil. O processo de download é intuitivo e bem estruturado, permitindo aos usuários selecionar e baixar dados específicos de acordo com suas necessidades, seja para fins de pesquisa, planejamento ambiental ou estudos de conservação. A plataforma fornece dados classificados por coleções anuais, abrangendo diversas categorias de uso do solo e cobertura vegetal. Esses dados são essenciais para entender as dinâmicas ambientais do Brasil e são uma ferramenta valiosa para políticas públicas, gestão ambiental e projetos de sustentabilidade.

Conceitos principais

“Cobertura da terra” e “uso da terra” são dois conceitos fundamentais em geografia, planejamento ambiental e estudos relacionados à gestão de recursos naturais. Embora muitas vezes usados de forma intercambiável, eles têm significados distintos.

  1. Cobertura da Terra: Refere-se às características físicas e biológicas da superfície terrestre. Inclui elementos naturais como florestas, rios, lagos, e montanhas, bem como características artificiais como áreas urbanizadas, estradas e construções. A cobertura da terra é, portanto, uma descrição daquilo que cobre a terra, podendo ser vegetação, água, construções artificiais, entre outros. É um termo mais relacionado à ecologia e geografia física, destacando os aspectos naturais e físicos do ambiente.

  2. Uso da Terra: Este conceito, por outro lado, descreve como as pessoas utilizam a terra, incluindo práticas como agricultura, urbanização, conservação, e recreação. É uma perspectiva mais centrada na ação humana, refletindo as decisões econômicas, culturais e políticas que influenciam como a terra é utilizada. Por exemplo, uma área pode ser coberta por floresta (cobertura da terra), mas seu uso pode ser para conservação, exploração madeireira, ou recreação.

  3. Transições: são as mudanças na cobertura e uso da terra que têm implicações significativas para questões como mudanças climáticas, biodiversidade, sustentabilidade dos recursos naturais, e qualidade de vida humana.

Base de dados

# carrega as bibliotecas
library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## ── Attaching packages
## ───────────────────────────────────────
## tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.4     ✔ purrr   1.0.2
## ✔ tibble  3.2.1     ✔ stringr 1.5.1
## ✔ tidyr   1.2.1     ✔ forcats 0.5.2
## ✔ readr   2.1.3     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(gt)
library(networkD3)

# Opção de vizualização
options(scipen = 999)

# importando os dados
df.cobertura <- read_excel("TABELA-GERAL-MAPBIOMAS-COL8.0-BIOMASxESTADOS-1.xlsx", 
    sheet = "COBERTURA_COL8.0")
View(df.cobertura)

Minas Gerais - cobertura e uso

Nível 0

Os dados apresentados fornecem uma visão da cobertura da terra categorizadas como Antrópica (Anthropic), Natural e Não Aplicada (Not applied) ao longo dos anos de 1985 a 2022. Esta análise será realizada em duas partes: primeiro, a análise dos valores absolutos (área em hectares) e, em seguida, a análise percentual.

# prepara tabela
tab00a<- df.cobertura %>% filter(state == "Minas Gerais") %>% 
  group_by(level_0) %>% 
  summarise(`1985`=round(sum(`1985`,na.rm = TRUE)/1000),
            `1990`=round(sum(`1990`,na.rm = TRUE)/1000),
            `2000`=round(sum(`2000`,na.rm = TRUE)/1000),
            `2010`=round(sum(`2010`,na.rm = TRUE)/1000),
            `2020`=round(sum(`2020`,na.rm = TRUE)/1000),
            `2022`=round(sum(`2022`,na.rm = TRUE)/1000)) 
tab00a %>%  gt()
level_0 1985 1990 2000 2010 2020 2022
Anthropic 34006 35071 36321 36759 37139 37031
Natural 24192 23385 22175 21756 21376 21417
Not applied 453 195 155 136 137 204
  1. Anthropic (Áreas Antrópicas): Houve um aumento constante na área antrópica de 34,005,829 ha em 1985 para 37,030,845.5 ha em 2022. Este crescimento indica uma expansão contínua de áreas utilizadas para atividades humanas, como urbanização, agricultura, e infraestrutura.

  2. Natural: A área classificada como natural diminuiu de 24,192,392.4 ha em 1985 para 21,416,949.3 ha em 2022. Este declínio reflete a perda de ecossistemas naturais, possivelmente devido à conversão em áreas antrópicas.

  3. Not Applied: Esta categoria, que pode incluir áreas não mapeadas ou indeterminadas, mostrou variações menores, começando em 453,159.3 ha em 1985 e aumentando para 203,585.8 ha em 2022, com um declínio inicial seguido de um aumento recente.

# conferencia de totais de área
colSums(tab00a[,c(2:7)],na.rm=TRUE)
##  1985  1990  2000  2010  2020  2022 
## 58651 58651 58651 58651 58652 58652
# salva a área total
area <- colSums(tab00a[,c(2:7)],na.rm=TRUE)[1]*1000

# fazendo em proporção
tab00b<- df.cobertura %>% filter(state == "Minas Gerais") %>% 
  group_by(level_0) %>% 
  summarise(`1985`=round(sum(`1985`,na.rm = TRUE)/area*100,2),
            `1990`=round(sum(`1990`,na.rm = TRUE)/area*100,2),
            `2000`=round(sum(`2000`,na.rm = TRUE)/area*100,2),
            `2010`=round(sum(`2010`,na.rm = TRUE)/area*100,2),
            `2020`=round(sum(`2020`,na.rm = TRUE)/area*100,2),
            `2022`=round(sum(`2022`,na.rm = TRUE)/area*100,2)) 
tab00b %>%  gt()
level_0 1985 1990 2000 2010 2020 2022
Anthropic 57.98 59.80 61.93 62.67 63.32 63.14
Natural 41.25 39.87 37.81 37.09 36.45 36.52
Not applied 0.77 0.33 0.26 0.23 0.23 0.35
  1. Anthropic: Em termos percentuais, houve um aumento de 57.98% em 1985 para 63.14% em 2022. Este crescimento percentual sugere que a expansão das áreas antrópicas está ocorrendo a um ritmo mais rápido do que qualquer outra mudança de uso da terra.

  2. Natural: A porcentagem de área natural diminuiu de 41.25% em 1985 para 36.52% em 2022. Este declínio percentual é consistente com a expansão das áreas antrópicas e indica uma pressão crescente sobre os ecossistemas naturais.

  3. Not Applied: A proporção desta categoria teve uma pequena variação, começando com 0.77% em 1985, diminuindo para 0.23% em 2010 e 2020, e depois aumentando ligeiramente para 0.35% em 2022.

Nível 1

# prepara tabela
tab01a<- df.cobertura %>% filter(state == "Minas Gerais") %>% 
  group_by(level_1) %>% 
  summarise(`1985`=round(sum(`1985`,na.rm = TRUE)/1000),
            `1990`=round(sum(`1990`,na.rm = TRUE)/1000),
            `2000`=round(sum(`2000`,na.rm = TRUE)/1000),
            `2010`=round(sum(`2010`,na.rm = TRUE)/1000),
            `2020`=round(sum(`2020`,na.rm = TRUE)/1000),
            `2022`=round(sum(`2022`,na.rm = TRUE)/1000)) 
tab01a %>%  gt()
level_1 1985 1990 2000 2010 2020 2022
1. Forest 20256 19849 18764 18315 18009 17913
2. Non Forest Natural Formation 3217 2822 2765 2735 2737 2820
3. Farming 33859 34880 36006 36375 36672 36558
4. Non Vegetated Area 600 386 470 520 603 676
5. Water 719 714 646 706 630 684
6. Non Observed 0 0 0 0 0 0
# conferencia de totais de área
colSums(tab01a[,c(2:7)],na.rm=TRUE)
##  1985  1990  2000  2010  2020  2022 
## 58651 58651 58651 58651 58651 58651
# salva a área total
area <- colSums(tab01a[,c(2:7)],na.rm=TRUE)[1]*1000

# fazendo em proporção
tab01b<- df.cobertura %>% filter(state == "Minas Gerais") %>% 
  group_by(level_1) %>% 
  summarise(`1985`=round(sum(`1985`,na.rm = TRUE)/area*100,2),
            `1990`=round(sum(`1990`,na.rm = TRUE)/area*100,2),
            `2000`=round(sum(`2000`,na.rm = TRUE)/area*100,2),
            `2010`=round(sum(`2010`,na.rm = TRUE)/area*100,2),
            `2020`=round(sum(`2020`,na.rm = TRUE)/area*100,2),
            `2022`=round(sum(`2022`,na.rm = TRUE)/area*100,2)) 
tab01b %>% gt()
level_1 1985 1990 2000 2010 2020 2022
1. Forest 34.54 33.84 31.99 31.23 30.70 30.54
2. Non Forest Natural Formation 5.48 4.81 4.71 4.66 4.67 4.81
3. Farming 57.73 59.47 61.39 62.02 62.53 62.33
4. Non Vegetated Area 1.02 0.66 0.80 0.89 1.03 1.15
5. Water 1.23 1.22 1.10 1.20 1.07 1.17
6. Non Observed 0.00 0.00 0.00 0.00 0.00 0.00
  1. Floresta (Forest): Observa-se uma tendência de declínio constante na cobertura florestal, de 34.54% em 1985 para 30.54% em 2022. Este decréscimo indica uma perda contínua de áreas florestais, possivelmente devido à desflorestação para outras formas de uso da terra, como agricultura ou urbanização.

  2. Formação Natural Não Florestal (Non Forest Natural Formation): Houve uma diminuição de 5.48% em 1985 para 4.71% em 2000, seguida por uma estabilização e um leve aumento para 4.81% em 2022. Este padrão sugere uma certa resiliência ou recuperação dessas áreas naturais não florestais após um período inicial de declínio.

  3. Agricultura (Farming): Esta categoria apresentou um aumento consistente, de 57.73% em 1985 para 62.33% em 2022. Este aumento reflete uma expansão contínua da terra utilizada para agricultura, o que pode estar relacionado ao crescimento da população e à demanda por alimentos, bem como a políticas de uso da terra.

  4. Área Não Vegetada (Non Vegetated Area): Houve um aumento nesta categoria, de 1.02% em 1985 para 1.15% em 2022. Este crescimento pode ser atribuído à expansão de áreas urbanas, infraestrutura e outras atividades que resultam na remoção da vegetação natural.

  5. Água (Water): A cobertura de água teve pequenas variações, diminuindo ligeiramente de 1.23% em 1985 para 1.10% em 2000, e depois aumentando para 1.17% em 2022. Estas variações podem ser devido a mudanças naturais em corpos d’água ou a alterações antrópicas, como a construção de reservatórios.

  6. Não Observado (Non Observed): Manteve-se em 0.00% ao longo de todo o período, indicando que não houve áreas não mapeadas ou indeterminadas nos dados analisados.

Nível 2

# prepara tabela
tab02a<- df.cobertura %>% filter(state == "Minas Gerais") %>% 
  group_by(level_2) %>% 
  summarise(`1985`=round(sum(`1985`,na.rm = TRUE)/1000),
            `1990`=round(sum(`1990`,na.rm = TRUE)/1000),
            `2000`=round(sum(`2000`,na.rm = TRUE)/1000),
            `2010`=round(sum(`2010`,na.rm = TRUE)/1000),
            `2020`=round(sum(`2020`,na.rm = TRUE)/1000),
            `2022`=round(sum(`2022`,na.rm = TRUE)/1000)) 
tab02a %>% gt
level_2 1985 1990 2000 2010 2020 2022
Agriculture 829 1219 2103 3408 4674 4842
Beach and Dune 0 0 0 0 0 0
Forest Formation 8877 8434 8147 8233 8476 8504
Forest Plantation 391 627 893 1359 1850 1868
Grassland 2033 1794 1753 1700 1686 1726
Mining 18 25 38 51 67 66
Mosaic of Agriculture and Pasture 9622 8427 7487 8071 8493 8932
Non Observed 0 0 0 0 0 0
Other Non Forest Natural Formation 0 0 0 0 0 0
Other Non Vegetated Area 453 195 155 136 137 204
Pasture 23017 24607 25524 23537 21655 20917
River, Lake and Ocean 719 714 646 706 630 684
Rocky outcrop 640 631 630 630 633 637
Savanna Formation 11379 11416 10617 10082 9532 9409
Urban Infrastructure 129 166 277 333 400 406
Wetland 544 397 383 405 418 457
# conferencia de totais de área
colSums(tab02a[,c(2:7)],na.rm=TRUE)
##  1985  1990  2000  2010  2020  2022 
## 58651 58652 58653 58651 58651 58652
# salva a área total
area <- colSums(tab02a[,c(2:7)],na.rm=TRUE)[1]*1000

# fazendo em proporção
tab02b<- df.cobertura %>% filter(state == "Minas Gerais") %>% 
  group_by(level_2) %>% 
  summarise(`1985`=round(sum(`1985`,na.rm = TRUE)/area*100,2),
            `1990`=round(sum(`1990`,na.rm = TRUE)/area*100,2),
            `2000`=round(sum(`2000`,na.rm = TRUE)/area*100,2),
            `2010`=round(sum(`2010`,na.rm = TRUE)/area*100,2),
            `2020`=round(sum(`2020`,na.rm = TRUE)/area*100,2),
            `2022`=round(sum(`2022`,na.rm = TRUE)/area*100,2)) 
tab02b %>%  gt()
level_2 1985 1990 2000 2010 2020 2022
Agriculture 1.41 2.08 3.59 5.81 7.97 8.26
Beach and Dune 0.00 0.00 0.00 0.00 0.00 0.00
Forest Formation 15.14 14.38 13.89 14.04 14.45 14.50
Forest Plantation 0.67 1.07 1.52 2.32 3.15 3.18
Grassland 3.47 3.06 2.99 2.90 2.87 2.94
Mining 0.03 0.04 0.06 0.09 0.11 0.11
Mosaic of Agriculture and Pasture 16.40 14.37 12.76 13.76 14.48 15.23
Non Observed 0.00 0.00 0.00 0.00 0.00 0.00
Other Non Forest Natural Formation 0.00 0.00 0.00 0.00 0.00 0.00
Other Non Vegetated Area 0.77 0.33 0.26 0.23 0.23 0.35
Pasture 39.24 41.95 43.52 40.13 36.92 35.66
River, Lake and Ocean 1.23 1.22 1.10 1.20 1.07 1.17
Rocky outcrop 1.09 1.08 1.07 1.07 1.08 1.09
Savanna Formation 19.40 19.46 18.10 17.19 16.25 16.04
Urban Infrastructure 0.22 0.28 0.47 0.57 0.68 0.69
Wetland 0.93 0.68 0.65 0.69 0.71 0.78

Brasil - transições

Nível resumido

# preparação dos dados
df.transicao <- read.table("sankey_data.csv",header = T,sep=";")
df.transicao %>% gt()
X Agricultura Floresta.natural Floresta.plantada Formacao.natural.nao.florestal Mosaico Pastagem
Floresta natural 14 0 4 5 7 85
Formacao natural nao florestal 7 6 0 0 0 10
Mosaico 7 7 0 0 0 21
Pastagem 29 23 4 0 16 0
# atribui nomes as linhas
rownames(df.transicao)<-df.transicao$X
# corrige nomes das colunas
colnames(df.transicao) <- gsub('\\.', ' ', colnames(df.transicao))
# verifica nomes
rownames(df.transicao)
## [1] "Floresta natural"               "Formacao natural nao florestal"
## [3] "Mosaico"                        "Pastagem"
# exclui a primeira coluna
df.transicao<-df.transicao[,-c(1)]
# transforma em formato longo
df.transicao_long <- df.transicao %>%
  rownames_to_column %>%
  gather(key = 'key', value = 'value', -rowname) %>%
  filter(value > 0)
# renomeia as colunas
colnames(df.transicao_long) <- c("source", "target", "value")
# adiciona espaço depois do nome
df.transicao_long$target <- paste(df.transicao_long$target, " ", sep="")
# Deste fluxo, precisamos criar um quadro de dados de nós: ele lista todas as entidades envolvidas no fluxo.
nodes <- data.frame(name=c(as.character(df.transicao_long$source), as.character(df.transicao_long$target)) %>% unique())
# reformata para usar os IDs
df.transicao_long$IDsource=match(df.transicao_long$source, nodes$name)-1
df.transicao_long$IDtarget=match(df.transicao_long$target, nodes$name)-1

# prepare colour scale
ColourScal ='d3.scaleOrdinal() .range(["#FDE725FF","#B4DE2CFF","#6DCD59FF","#35B779FF","#1F9E89FF","#26828EFF","#31688EFF","#3E4A89FF","#482878FF","#440154FF"])'


# Make the Network
sankeyNetwork(Links = df.transicao_long, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "name",
              sinksRight=FALSE, colourScale=ColourScal, nodeWidth=40, fontSize=13, nodePadding=20)

Nível completo

#sankey completo
df.transicao_comp <- read.table("sankey_data_completo.csv",header = T,sep=";", dec=".")
rownames(df.transicao_comp)<-df.transicao_comp$X
rownames(df.transicao_comp)
## [1] "Agricultura"                    "Corpo dagua"                   
## [3] "Floresta natural"               "Floresta plantada"             
## [5] "Formacao natural nao florestal" "Infraestrutura urbana"         
## [7] "Mosaico"                        "Outras areas nao vegetadas"    
## [9] "Pastagem"
colnames(df.transicao_comp) <- gsub('\\.', ' ', colnames(df.transicao_comp))
df.transicao_comp<-df.transicao_comp[,-c(1)]

# formato longo
df.transicao_comp_long <- df.transicao_comp %>%
  rownames_to_column %>%
  gather(key = 'key', value = 'value', -rowname) %>%
  filter(value > 0)
colnames(df.transicao_comp_long) <- c("source", "target", "value")
df.transicao_comp_long$target <- paste(df.transicao_comp_long$target, " ", sep="")

# nodes
nodes <- data.frame(name=c(as.character(df.transicao_comp_long$source), as.character(df.transicao_comp_long$target)) %>% unique())

# ids
df.transicao_comp_long$IDsource=match(df.transicao_comp_long$source, nodes$name)-1
df.transicao_comp_long$IDtarget=match(df.transicao_comp_long$target, nodes$name)-1

# prepare colour scale
ColourScal ='d3.scaleOrdinal() .range(["#FDE725FF","#B4DE2CFF","#6DCD59FF","#35B779FF","#1F9E89FF","#26828EFF","#31688EFF","#3E4A89FF","#482878FF","#440154FF"])'

# Make the Network
sankeyNetwork(Links = df.transicao_comp_long, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "name",
              sinksRight=FALSE, colourScale=ColourScal, nodeWidth=40, fontSize=13, nodePadding=20)