Introdução ao R e ao RStudio

Aula Prática 1 - Geografia da População

Author
Affiliation
Gustavo Henrique Naves Givisiez

Departamento de Geografia de Campos - Universidade Federal Fluminense

Published

January 13, 2025

Warning

Este documento é destinado a usuários sem conhecimento prévio em programação e é parte integrante do curso de Geografia da População, ofertado para o curso de geografia da Universidade Federal Fluminense, campus de Campos dos Goytacazes, no 2º semestre de 2025. Sinta-se livre para divulga-lo desde que referencie o documento original.

Tip

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

1 Introdução

O R é um ambiente de programação para manipulação, análise de dados e apresentação gráfica, desenvolvido inicialmente por Robert Gentleman e Ross Ihaka, na Universidade de Auckland, Nova Zelândia. Atualmente, é mantido pelo R Development Core Team e resulta de um esforço colaborativo global (R Core Team, 2024). Com código aberto e distribuição gratuita, o R oferece uma base robusta (R base) complementada por mais de 21 mil pacotes adicionais, atraindo inúmeros desenvolvedores. Sua simplicidade, transparência e flexibilidade para criar novos pacotes são seus principais diferenciais.

Esta aula irá abordar os fundamentos da linguagem R, incluindo sintaxe, operações, estruturas de dados e manipulação de arquivos. As versões do R para Windows, Mac e Linux podem ser baixadas no site oficial do projeto: https://www.r-project.org. O site também oferece manuais, pacotes, documentação e atualizações do projeto. Além do R básico, destaca-se o RStudio, um ambiente de desenvolvimento integrado (IDE) que facilita o uso do R. Disponível gratuitamente em https://www.rstudio.com, o RStudio possui recursos como autocompletar funções, argumentos e objetos, sendo especialmente útil para iniciantes.

# Lista de pacotes necessários
pacotes_necessarios <- c("ggplot2", "dplyr", "readr",
                         "scales","remotes", "knitr")
# Função para instalar pacotes ausentes
instalar_pacotes <- function(pacotes) {
  pacotes_faltantes <- 
    pacotes[!pacotes %in% installed.packages()[, "Package"]]
  if (length(pacotes_faltantes) > 0) {
    install.packages(pacotes_faltantes)
  }
  invisible(lapply(pacotes, library, character.only = TRUE))
}
# Executa a verificação e carrega os pacotes
instalar_pacotes(pacotes_necessarios)

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

Attaching package: 'scales'
The following object is masked from 'package:readr':

    col_factor
knitr::opts_chunk$set(
    comment = "#>", # Como o código será comentado
    output = file("aula_pratica_01.R", open = "wt") # Define o arquivo onde o código será salvo
)

2 Conceitos básicos do R e do RStudio

O R funciona por meio de linhas de comando, onde o usuário digita instruções para o programa executar e retornar os resultados. O R é um programa independente e na interface do RStudio ele está na janala inferior esquerda, na aba Console - o RStudio é, na verdade, uma interface gráfica do R.

A Interface do RStudio organiza o ambiente de trabalho em quatro painéis principais, facilitando a utilização do R:

  1. Script (Superior Esquerdo): área para editar, salvar e organizar comandos em arquivos .R e também em outra linguagens de programaças (Python, java, C++, etc.). Por este quadros é possível envie comandos ao console usando atalhos ou clicando no botão Run.

  2. Console (Inferior Esquerdo): é onde os comandos são executados e os resultados aparecem. Principal janela do R, onde comandos são executados e resultados exibidos. O símbolo > indica que o R está pronto para receber um comando, enquanto + significa que o comando anterior não está completo. Mensagens de erro ou saída de funções também aparecem aqui.

  3. Environment e History (Superior Direito):

    1. Environment: Lista os objetos criados no espaço de trabalho (datasets, vetores, etc.).

    2. History: Exibe o histórico de comandos executados.

  4. Files/Plots/Packages/Help (Inferior Direito):

    1. Files: Navegação nos arquivos do computador.

    2. Plots: Exibição de gráficos gerados.

    3. Packages: Gerenciamento de pacotes instalados.

    4. Help: Acesso à documentação e explicações sobre funções.

    O RStudio integra essas ferramentas, otimizando a experiência de programação e análise de dados. É uma interface amigável muito comum em plataformas de programação, tanto para iniciantes quanto para usuários avançados. O RStudio torna o uso do R mais intuitivo, organizando as janelas e oferecendo ferramentas que otimizam o trabalho (Debastiani, 2020).

2.1 Arquivos mais comuns

Os R gera alguns tipos de arquivos que podem ser salvos. As principais deles são:

  • .R - Usado para salvar códigos criados e rotinas de análises (scripts).

  • .RData - Usado para salvar os objetos da área de trabalho (workspace).

  • .Rhistory - Usado para salvar o histórico dos comandos executados (normalmente salvo automaticamente).

  • .Rproj - Formato exclusivo do RStudio, serve para salvar todas as informações utilizadas anteriormente pelo RStudio de maneira simplificada.

  • .rds e .rda: arquivos de dados nativos do R

2.2 Área de trabalho e diretório de trabalho

O R é uma linguagem de programação orientada a objetos, onde os dados e resultados de análises são armazenados temporariamente no workspace (área de trabalho). Ao iniciar o R, o workspace está vazio, mas você pode criar objetos para armazenar informações. Esses objetos podem ser exportados ou salvos em arquivos. Quando o R é fechado, os objetos são apagados, a menos que sejam salvos previamente.

O R opera em um diretório de trabalho (working directory), uma pasta específica no computador. Arquivos nesse diretório são carregados facilmente, e qualquer arquivo exportado será salvo lá por padrão, salvo indicação contrária. Você pode alterar o diretório de trabalho sem impactar os objetos existentes no workspace.

getwd() # Mostrar o diretório de trabalho atual
dir() # Listar os arquivos do diretório
setwd() # Mudar o diretório de trabalho

2.3 Pacotes

Como existem muitos pacotes para R só alguns deles são pré-instalados, os demais precisam ser instalados no computador. O procedimento de instalação precisa ser realizado apenas uma vez (além de atualização de tempos em tempos). Após instalados os pacotes estarão disponívels para uso, mas é preciso carregar o pacote para utilização.

#install.packages("gapminder") # instala o pacote gapminder
library("gapminder") # Carrega o pacote

Existem alguns detalhes que são importantes no R. Os principais são:

  • Caracteres maiúsculos e minúsculos: O R diferencia maiúsculas de minúscula (é case sensitive), ou seja A é diferente a

  • Separador decimal: O separador decimal será sempre um símbolo do ponto (.). A vírgula (,) é reservado para separar diferentes objetos em uma função ou valores em um vetor. Para alterar essa opção é preciso configurar nas preferências gerais do sistema operacional mas eu não recomendo.

  • Parênteses, colchetes e chaves - Os símbolos de parênteses - () - servem para agrupar objetos dentro de uma função e os símbolos de chaves - {} - servem para agrupar funções dentro de outras funções. Os colchetes - [] - são utilizados para indexar objetos dentro de outros objetos. Esses são simbolos que agrupam consjuntos de outros símboloa ou funções e sempre que forem abertos, deverão ser fechados: deve haver um símbolo - ), ], ou } - para finalizar o agrupamento.

  • Caracteres especiais: caracteres como por acentos e espaços devem ser evitados pra nomes de objetos ou funções. Minha recomendação é usar underline (_) nos lugares onde você gostaria dos espaços. Esses símbolos especiais podem ser nos resultados finais, como, por exemplo, em gráficos.

2.4 Calculadora

2 + 2      # Soma
#> [1] 4
8 - 3      # Subtração
#> [1] 5
3 * 8      # Multiplicação
#> [1] 24
8 / 2      # Divisão
#> [1] 4
2^8        # Potência
#> [1] 256
(2 + 4) / 7 # Ordem de operações
#> [1] 0.8571

2.5 Funções do R

Estrutura básica para chamar uma função é sempre funcao(argumento1 = valor1, argumento2 = valor2). Por exemplo:

log(x = 8, base = 2)      # Logaritmo de 8 na base 2
rep(x = 1, times = 4)     # Repetir o número 1 quatro vezes
sum(1, 8, 79)             # Soma de vários números

2.6 Ajuda

Use help() ou ? para consultar funções:

help(log)   # Ajuda da função log
args(log)   # Exibe apenas os argumentos
#> function (x, base = exp(1)) 
#> NULL
??mean      # Busca por funções relacionadas ao termo "mean"

2.7 Trabalhando com Objetos

2.7.1 Criação e atribuição

x <- 10    # Atribui o valor 10 ao objeto x
y <- sum(2, 9, 43)  # Salva o resultado da soma de 2+9+43 em y
z <- y / 19         # Usa y em uma operação

2.7.2 Listar e Remover Objetos

ls()            # Lista os objetos no workspace
#> [1] "instalar_pacotes"    "pacotes_necessarios" "x"                  
#> [4] "y"                   "z"
rm(x)           # Remove o objeto x
rm(list = ls()) # Remove todos os objetos

2.8 Tipos de Dados

2.8.1 Numérico

x <- 4.5 # Número decimal
is.numeric(x) # Verifica se x é numérico
#> [1] TRUE

2.8.2 Texto (Character):

x <- "R é ótimo" # Texto deve estar entre aspas
is.character(x)  # Verifica se x é texto
#> [1] TRUE

2.8.3 Lógico (Logical):

x <- TRUE   # Valor lógico (verdadeiro)
y <- FALSE # Valor lógico (falso)

2.9 Estruturas de Dados

2.9.1 Vetores

Armazenam elementos do mesmo tipo em conjunto.

alturas = c(1.70, 1.65, 1.80,1.75,1.55)  # Cria um vetor
alturas[2] # Acessa o 2º elemento
#> [1] 1.65
alturas[-1] # Exclui o 1º elemento
#> [1] 1.65 1.80 1.75 1.55
letras = c('a')

2.9.2 Fatores

No R, fatores são usados para representar variáveis categóricas, que podem ser nominais (sem ordem) ou ordinais (com ordem). Fatores são importantes para análises estatísticas, pois permitem que o R reconheça as categorias como níveis distintos, facilitando comparações, análises de variância, regressões e outros métodos.

2.9.2.1 Variáveis Nominais

Representam categorias sem ordem natural ou hierarquia. Cada categoria é tratada como equivalente, sem relação de maior ou menor.

cor_olhos <- factor(c("azul", "verde", "castanho", "azul", "verde"))
estado_civil = factor(c("solteiro", "casado", "divorciado","viúvo","casado"))
levels(cor_olhos)   # Mostra os níveis: "azul", "castanho", "verde"
#> [1] "azul"     "castanho" "verde"
table(cor_olhos)    # Frequência de cada cor
#> cor_olhos
#>     azul castanho    verde 
#>        2        1        2
levels(estado_civil)
#> [1] "casado"     "divorciado" "solteiro"   "viúvo"
table(estado_civil)
#> estado_civil
#>     casado divorciado   solteiro      viúvo 
#>          2          1          1          1
table(estado_civil,cor_olhos)
#>             cor_olhos
#> estado_civil azul castanho verde
#>   casado        0        0     2
#>   divorciado    0        1     0
#>   solteiro      1        0     0
#>   viúvo         1        0     0

2.9.2.2 Variáveis Ordinais

Representam categorias com ordem ou hierarquia, onde uma categoria é maior ou menor que outra.

satisfacao_vida <- factor(c("bom", "ótimo", "ruim", "bom", "regular"),
                     levels = c("ruim", "regular", "bom", "ótimo"), 
                     ordered = TRUE)
escolaridade = factor(
  c("medio", "fundamental", "superior", "superior", "medio"),
  levels=c("fundamental", "medio", "superior"),ordered = T)
levels(satisfacao_vida)  # Mostra os níveis na ordem definida
#> [1] "ruim"    "regular" "bom"     "ótimo"
is.ordered(satisfacao_vida)  # Verifica se o fator é ordenado
#> [1] TRUE
escolaridade
#> [1] medio       fundamental superior    superior    medio      
#> Levels: fundamental < medio < superior
table(satisfacao_vida,escolaridade)
#>                escolaridade
#> satisfacao_vida fundamental medio superior
#>         ruim              0     0        1
#>         regular           0     1        0
#>         bom               0     1        1
#>         ótimo             1     0        0

No R, é possível realizar cálculos diretamente com vetores, permitindo análises estatísticas rápidas e eficientes. Por exemplo, você pode calcular a média com mean(), a mediana com median(), e o desvio padrão com sd(). Além disso, a função summary() fornece um resumo estatístico completo, incluindo os valores mínimos, máximos e a mediana, enquanto a função quantile() permite calcular os quartis específicos de um vetor.

mean(alturas)
#> [1] 1.69
median(alturas)
#> [1] 1.7
sd(alturas)
#> [1] 0.09618
summary(alturas)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    1.55    1.65    1.70    1.69    1.75    1.80
quantile(alturas)
#>   0%  25%  50%  75% 100% 
#> 1.55 1.65 1.70 1.75 1.80
# Soma e total de valores
sum(alturas)
#> [1] 8.45
length(alturas)
#> [1] 5

2.9.3 Data Frames

O data.frame é uma das principais estruturas de dados no R, amplamente utilizado em análises estatísticas e manipulação de dados. Ele permite armazenar diferentes tipos de dados (numéricos, caracteres, lógicos, fatores, etc.) em colunas distintas dentro de uma mesma estrutura, tornando-o extremamente versátil e adequado para trabalhar com dados tabulares.

O data.frame organiza os dados em linhas e colunas, onde cada coluna é um vetor contendo elementos do mesmo tipo, e cada linha representa uma observação. Diferente de vetores ou matrizes, que exigem que todos os elementos sejam do mesmo tipo, o data.frame permite combinar tipos diferentes, como números, texto e valores lógicos, em uma única estrutura. Essa característica torna o data.frame ideal para representar dados reais, como tabelas de pesquisas, resultados experimentais ou relatórios.

Uma das maiores vantagens do data.frame é sua flexibilidade. Ele pode combinar dados heterogêneos em uma única tabela e é facilmente manipulável, permitindo acessos e alterações por linha, coluna ou com base em condições específicas. Por exemplo, você pode acessar colunas pelo nome, filtrar linhas com condições ou adicionar novas colunas conforme necessário.

Além disso, o data.frame é compatível com muitas funções estatísticas e gráficas no R, o que o torna uma escolha padrão para análises de dados. Ele também serve como base para pacotes mais avançados, como dplyr e tibble, que otimizam e simplificam ainda mais a manipulação de dados.

Você pode criar um data.frame usando a função data.frame() (ou dplyr::tibble()) Por exemplo, a estrutura abaixo combina três vetores diferentes em uma tabela:

cor_olhos = factor(c("azul", "verde", "castanho", "azul", "verde"))
estado_civil = factor(c("solteiro", "casado", "divorciado","viúvo","casado"))
satisfacao_vida = factor(c("bom", "ótimo", "ruim", "bom", "regular"),
                     levels = c("ruim", "regular", "bom", "ótimo"), 
                     ordered = TRUE)
escolaridade = factor(
  c("medio", "fundamental", "superior", "superior", "medio"),
  levels=c("fundamental", "medio", "superior"),ordered = T)

nomes = c("Pedro", "Ana", "Carlos","Maria","Franscisco")
alturas = c(1.70, 1.65, 1.80,1.75,1.55)
fumantes = c(FALSE, TRUE, FALSE,FALSE,FALSE)

df <- data.frame(cor_olhos,estado_civil,nomes,alturas,fumantes)
df
cor_olhos estado_civil nomes alturas fumantes
azul solteiro Pedro 1.70 FALSE
verde casado Ana 1.65 TRUE
castanho divorciado Carlos 1.80 FALSE
azul viúvo Maria 1.75 FALSE
verde casado Franscisco 1.55 FALSE

2.10 Indexação (Acesso aos Dados)

A indexação é o processo de acessar ou manipular partes específicas de um conjunto de dados dentro de data.frame, vetores e matrizes. No R, a indexação de um data.frame é muito flexível e poderosa, permitindo selecionar linhas, colunas ou até mesmo células individuais com base em suas posições ou nomes. Isso é feito usando colchetes ([ , ]), onde o primeiro elemento representa as linhas e o segundo as colunas. Além disso, o R permite o uso de condições lógicas, nomes de colunas ou linhas, e operadores especiais como $, tornando a navegação e a manipulação de dados intuitivas e eficientes. A compreensão dessa funcionalidade é essencial para extrair informações relevantes de tabelas e aplicar transformações específicas nos dados.

2.10.1 Indexação de vetores

escolaridade[2]
#> [1] fundamental
#> Levels: fundamental < medio < superior
satisfacao_vida[5]
#> [1] regular
#> Levels: ruim < regular < bom < ótimo

2.10.2 Indexação de Data Frames

df[1,2] #primeira linha, segunda coluna
#> [1] solteiro
#> Levels: casado divorciado solteiro viúvo
mean(df$alturas)
#> [1] 1.69

2.11 Exercícios

  1. Crie um vetor com os números de 1 a 5.

  2. Transforme-o em um fator.

  3. Crie um data.frame que combine o vetor com outro contendo nomes fictícios.

2.12 A base de dados Gapminder

Gapminder é uma fundação independente originária da Suécia sem fins lucrativos e sem vinculações políticas, religiosas ou econômicas que se autointitula um repositório de fatos (fact think) e não um repositório de ideias (think tank). O objetivo dessa fundação é disponibilizar recursos para o ensino que traduzam fatos mundiais de forma mais compreensível. A ideia da fundação é trabalhar com dados estatísticos gerados ou processados por universidades, agências da ONU e organizações não-governamentais. Recomendo uma visita ao site da instituição que possui diversas ferramentas para o ensino de dados sobre a economia, demografia e geografia mundial. Os dados baixados do site foram processadas e foi gerado o arquivo gapminder.rds disponível neste link para download (estão no seu diretório de trabalho).

#rode o comando a seguir para carregar
# o arquivo baixado para sua áreas de trabalho
gapminder<-readRDS('gapminder.rds')

O banco de dados tem um conjunto de 19 variáveis, sendo 12 de identificação dos países e territórios e sete variáveis socioeconômicas, assim descritas:

  • geo: unidade territorial que neste banco de dados (191 estados reconhecidos pela ONU)

  • name: nome da unidade territorial

  • four_regions, eight_regions e six_regions: região do país, considerando a subdivisão em quatro, oito e seis regiões globais, respectivamente

  • member_oecd_g77: Países signatários da “Declaração conjunta dos 77 países em Desenvolvimento” (G-77), membro da OECD ou outros.

  • Lat e Long: Centroide (local útil para títulos e pontos de rotas)

  • Dt_Member: Data em que o país se tornou membro da ONU

  • WB_reg e WB_income2017: classficação do país no Banco Mundial segundo a região, e nível de renda.

  • time: ano a que se refere a informação (de 1800 a 2010)

  • pop: População passada e projetada (versão ONU 2017)

  • ipp e GDP: renda per capita e produto interno bruto

  • le: Expectativa de vida ao nascer

  • cm: Probabilidade de morte antes de completar cinco anos

  • tfr: taxa de fecundidade total (numero médio de nascidos vivos por mulher)

  • co2: emissão de dióxido de carbono pela queima de combustível fóssil (ton de CO2 por pessoa)

Para maiores informações sobre as fontes dessas informações consulte no site do Gapminder. Para explorar o banco de dados, use os comandos a seguir

str(gapminder) #Apresenta a estrutura do Banco de Dados Gapminder
#> tibble [59,297 × 19] (S3: tbl_df/tbl/data.frame)
#>  $ geo             : Factor w/ 197 levels "afg","ago","alb",..: 1 1 1 1 1 1 1 1 1 1 ...
#>  $ name            : Factor w/ 197 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
#>  $ four_regions    : Factor w/ 4 levels "África","Américas",..: 3 3 3 3 3 3 3 3 3 3 ...
#>  $ eight_regions   : Factor w/ 8 levels "África do Norte",..: 5 5 5 5 5 5 5 5 5 5 ...
#>  $ six_regions     : Factor w/ 6 levels "América","Extremo Oriente",..: 5 5 5 5 5 5 5 5 5 5 ...
#>  $ members_oecd_g77: Factor w/ 3 levels "g77","oecd","others": 1 1 1 1 1 1 1 1 1 1 ...
#>  $ Lat             : num [1:59297] 33 33 33 33 33 33 33 33 33 33 ...
#>  $ Long            : num [1:59297] 66 66 66 66 66 66 66 66 66 66 ...
#>  $ Dt_UNMember     : Date[1:59297], format: "1946-11-19" "1946-11-19" ...
#>  $ WB_reg          : Factor w/ 7 levels "East Asia & Pacific",..: 6 6 6 6 6 6 6 6 6 6 ...
#>  $ WB_income2017   : Ord.factor w/ 4 levels "Low income"<"Lower middle income"<..: 1 1 1 1 1 1 1 1 1 1 ...
#>  $ time            : num [1:59297] 1800 1801 1802 1803 1804 ...
#>  $ pop             : num [1:59297] 3280000 3280000 3280000 3280000 3280000 3280000 3280000 3280000 3280000 3280000 ...
#>  $ ipp             : num [1:59297] 603 603 603 603 603 603 603 603 603 603 ...
#>  $ gdp             : num [1:59297] 1.98e+09 1.98e+09 1.98e+09 1.98e+09 1.98e+09 ...
#>  $ tfr             : num [1:59297] 7 7 7 7 7 7 7 7 7 7 ...
#>  $ le              : num [1:59297] 28.2 28.2 28.2 28.2 28.2 ...
#>  $ cm              : num [1:59297] 469 469 469 469 469 ...
#>  $ co2             : num [1:59297] NA NA NA NA NA NA NA NA NA NA ...
head(gapminder) # Exibe as 6 primeiras observações
geo name four_regions eight_regions six_regions members_oecd_g77 Lat Long Dt_UNMember WB_reg WB_income2017 time pop ipp gdp tfr le cm co2
afg Afghanistan Asia Ásia Ocidental Sul da Ásia g77 33 66 1946-11-19 South Asia Low income 1800 3280000 603 1.978e+09 7 28.21 468.6 NA
afg Afghanistan Asia Ásia Ocidental Sul da Ásia g77 33 66 1946-11-19 South Asia Low income 1801 3280000 603 1.978e+09 7 28.20 468.6 NA
afg Afghanistan Asia Ásia Ocidental Sul da Ásia g77 33 66 1946-11-19 South Asia Low income 1802 3280000 603 1.978e+09 7 28.19 468.6 NA
afg Afghanistan Asia Ásia Ocidental Sul da Ásia g77 33 66 1946-11-19 South Asia Low income 1803 3280000 603 1.978e+09 7 28.18 468.6 NA
afg Afghanistan Asia Ásia Ocidental Sul da Ásia g77 33 66 1946-11-19 South Asia Low income 1804 3280000 603 1.978e+09 7 28.17 468.6 NA
afg Afghanistan Asia Ásia Ocidental Sul da Ásia g77 33 66 1946-11-19 South Asia Low income 1805 3280000 603 1.978e+09 7 28.16 468.6 NA
summary(gapminder) # Principais estatísticas descritivas das variáveis 
#>       geo                         name         four_regions  
#>  afg    :  301   Afghanistan        :  301   África  :16254  
#>  ago    :  301   Albania            :  301   Américas:10535  
#>  alb    :  301   Algeria            :  301   Asia    :17759  
#>  and    :  301   Andorra            :  301   Europa  :14749  
#>  are    :  301   Angola             :  301                   
#>  arg    :  301   Antigua and Barbuda:  301                   
#>  (Other):57491   (Other)            :57491                   
#>             eight_regions                            six_regions   
#>  África Subsaariana:14448   América                        :10535  
#>  Extremo Oriente   : 9632   Extremo Oriente                : 9632  
#>  Ásia Ocidental    : 8127   Europa Central e Ásia Ocidental:16254  
#>  Europa Ocidental  : 7525   Oriente Médio e Norte da África: 6020  
#>  Leste Europeu     : 7224   Sul da Ásia                    : 2408  
#>  América do Norte  : 6923   África Subsaariana             :14448  
#>  (Other)           : 5418                                          
#>  members_oecd_g77      Lat             Long         Dt_UNMember        
#>  g77   :39130     Min.   :-42.0   Min.   :-175.0   Min.   :1945-10-24  
#>  oecd  : 9030     1st Qu.:  4.0   1st Qu.:  -5.5   1st Qu.:1945-12-27  
#>  others:10836     Median : 17.5   Median :  21.8   Median :1960-09-28  
#>  NA's  :  301     Mean   : 19.1   Mean   :  22.9   Mean   :1965-09-09  
#>                   3rd Qu.: 40.0   3rd Qu.:  51.5   3rd Qu.:1977-09-20  
#>                   Max.   : 65.0   Max.   : 179.1   Max.   :2011-07-14  
#>                                                    NA's   :1204        
#>                         WB_reg                  WB_income2017        time     
#>  Europe & Central Asia     :15652   Low income         : 9331   Min.   :1800  
#>  Sub-Saharan Africa        :14448   Lower middle income:15652   1st Qu.:1875  
#>  Latin America & Caribbean : 9933   Upper middle income:16555   Median :1950  
#>  East Asia & Pacific       : 9632   High income        :17458   Mean   :1950  
#>  Middle East & North Africa: 6321   NA's               :  301   3rd Qu.:2025  
#>  (Other)                   : 3010                               Max.   :2100  
#>  NA's                      :  301                                             
#>       pop                ipp              gdp                tfr      
#>  Min.   :6.45e+02   Min.   :   245   Min.   :1.02e+06   Min.   :1     
#>  1st Qu.:4.25e+05   1st Qu.:   901   1st Qu.:4.88e+08   1st Qu.:2     
#>  Median :2.63e+06   Median :  1750   Median :3.40e+09   Median :5     
#>  Mean   :2.31e+07   Mean   :  6486   Mean   :1.60e+11   Mean   :5     
#>  3rd Qu.:1.08e+07   3rd Qu.:  4855   3rd Qu.:2.92e+10   3rd Qu.:6     
#>  Max.   :1.65e+09   Max.   :179297   Max.   :5.05e+13   Max.   :9     
#>                     NA's   :12302    NA's   :12302      NA's   :3311  
#>        le             cm             co2       
#>  Min.   : 1     Min.   :  0.2   Min.   :  0    
#>  1st Qu.:32     1st Qu.: 15.7   1st Qu.:  0    
#>  Median :49     Median :179.1   Median :  1    
#>  Mean   :53     Mean   :209.2   Mean   :  3    
#>  3rd Qu.:74     3rd Qu.:403.4   3rd Qu.:  4    
#>  Max.   :95     Max.   :756.3   Max.   :247    
#>  NA's   :3167   NA's   :1800    NA's   :42415
mean(gapminder$ipp) #Gera erro por causa dos valores missing (vazios)
#> [1] NA
mean(gapminder$ipp, na.rm = TRUE)
#> [1] 6486

Não faz muito sentido para nós visualizarmos as variáveis descritivas de todas as variáveis em todas as observações (comando summary). Pelo comando head é possível notar que há uma linha para cada ano, referente a cada país (só o Afeganistão aparece na lista). Embora os dados estejam ali, não sabemos, a princípio como processa-los e visualiza-los. Por exemplo, queremos saber qual a população do Brasil, em 2020. Os comandos a seguir fazem esta seleção da forma tradicional do R (os comandos foram feitos passo a passo para esclarecer as relações de igualdade).

#LINHA com o nome Brazil 
gapminder[gapminder$name=='Brazil'
      #   E (AND) time = 2020
          & gapminder$time==2020
# COLUNA com o nome pop
      , names(gapminder)=='pop']
pop
212559409

Ou seja, 212.559.409 habitantes. Mas, essa sequencia de comandos é complexa e difícil de entender. Isso posto, vamos introduzir o pacote dplyr, que nos fornecem ferramentas mais intiuitivas para essas operações.

2.13 Manipulação de dados com o pacote dplyr

#install.packages("dplyr")
library(dplyr)
  gapminder %>%
    filter(time==2020) %>% # Todos os países em 2020
    head() # Exibe apenas a seis primeira observações do dataset
geo name four_regions eight_regions six_regions members_oecd_g77 Lat Long Dt_UNMember WB_reg WB_income2017 time pop ipp gdp tfr le cm co2
afg Afghanistan Asia Ásia Ocidental Sul da Ásia g77 33.00 66.000 1946-11-19 South Asia Low income 2020 38928341 1800 7.007e+10 4.04 64.41 58.08 NA
alb Albania Europa Leste Europeu Europa Central e Ásia Ocidental others 41.00 20.000 1955-12-14 Europe & Central Asia Upper middle income 2020 2877800 13225 3.806e+10 1.70 78.58 8.52 NA
dza Algeria África África do Norte Oriente Médio e Norte da África g77 28.00 3.000 1962-10-08 Middle East & North Africa Upper middle income 2020 43851043 14040 6.157e+11 2.54 78.31 22.18 NA
and Andorra Europa Europa Ocidental Europa Central e Ásia Ocidental others 42.51 1.521 1993-07-28 Europe & Central Asia High income 2020 77265 55047 4.253e+09 NA NA 2.85 NA
ago Angola África África Subsaariana África Subsaariana g77 -12.50 18.500 1976-12-01 Sub-Saharan Africa Lower middle income 2020 32866268 5444 1.789e+11 5.41 65.36 72.29 NA
atg Antigua and Barbuda Américas América do Norte América g77 17.05 -61.800 1981-11-11 Latin America & Caribbean High income 2020 97928 25007 2.449e+09 2.01 77.41 6.09 NA
gap_brusa2020 <-  gapminder %>%
    filter(geo=='per' | geo=='bra', time==2020)%>%
    select(name,pop,ipp)
gap_brusa2020
name pop ipp
Brazil 212559409 14501
Peru 32971846 13327
plot(x = gapminder$time, y = gapminder$le)

plot(x = gapminder$time, y = gapminder$le,col=gapminder$six_regions)

gap_filtered <-  gapminder %>%
    filter(time %in% c(1800, 1850, 1900, 1950, 2000))
boxplot(gap_filtered$le ~ gap_filtered$time)

2.14 Visualização de dados com pacotes dplyr e ggplot2

Anteriormente, nós vimos rapidamente como organizar um banco de dados, filtrando os casos para destacar variáveis de interesse. A proposta agora é aprender os conceitos iniciais para elaborarmos gráficos para visualizar esse mesmo banco de dados por meio do pacote ggplot2. No gráfico a seguir, por exemplo, são apresentadas quatro variáveis para o ano de 2018: renda per capita, no eixo dos x; esperança de vida ao nascer, no eixo dos y; a região que o país se localiza, identificada pelas cores; e, a população de cada país, identificada pelo tamanho de cada bolinha (bubbles). O gráfico demonstra claramente que há uma associação quase que direta entre a renda per capita e a esperança de vida, ou em outras palavras, é notório que quanto menor a renda per capita menor a esperança de vida. A partir da análise das cores também é possível sugerir que há uma associação geográfica entre a renda per capita, a esperança de vida e a região do globo onde o país se localiza. Mas, aparentemente não há qualquer relação entre a renda, a esperança de vida e a população total. Esse gráfico sozinho já é capaz de nos levar a uma pergunta: então Malthus estava errado?

library('ggplot2')
library('scales')

gapminder_leipp<-gapminder %>%
  filter(time == 2018) %>%
  select(eight_regions,pop,le,ipp) %>%
  na.omit()
    
 ggplot(data=gapminder_leipp,
        aes(x=ipp,y=le,size=pop,color=eight_regions))+
   geom_point()+scale_x_log10(labels=label_dollar())+
   labs(x="log(Renda Per Capita) em US$/pessoa",
        y="Esperança de vida ao nascer")+
   scale_size_continuous(name="População",
                         labels=c("10 milhões","80 milhões","250 milhões","750 milhões"),
                         breaks=c(10000000,80000000,250000000,750000000))+
   scale_color_discrete(levels(gapminder_leipp$eight_regions))

Para a construção deste gráfico os dois pacotes trabalham juntos: as funções do primeiro (dplyr) preparam os dados a serem exibidos pelo segundo (ggplot2).

gapminder_1950 <- gapminder %>%
  filter(time==1950) %>%
  na.omit()
Tip

O comando acima parece não retornar resultados. Mas, na verdade, salva o subconjunto do dataset gapminder, que foi filtrado pela sequencia gapminder %>% filter(time==1950), em um novo dataset chamado aqui de gapminder_1950. Observe que um novo dataset gapminder_1950 surge na aba Environment do RStudio. Se você chamar agora o dataset head(gapminder_1950) no console de comandos, você verá apenas dados 1950.

Após filtar os dados é possível fazer um gráfico que relacione a fecundidade nos países (`tfr`, ou número médio de filhos por mulher) e a esperança de vida ao nascer (`le`). Você pode fazer isso a partir de um diagrama de dispersão que use o eixo das abcissas ( _x_) para a `tfr` e o eixo das ordenadas ( _y_) o número médio de filhos.

ggplot(data=gapminder_1950, aes(x=le,y=tfr))+
  geom_point()

O gráfico desenhado anteriormente revela uma relação interessante entre essas duas variáveis. Em 1950, famílias maiores (6 ou mais filhos por mulher nas ordenadas) apresentavam baixa esperança de vida (entre 30 e 50 anos). A medida que a esperança de vida cresce acima de 50 anos observamos uma queda progressiva do número médio de filhos. De certa forma, em 1950, nota-se que países com famílias grandes tinha mortalidade mais alta. Segundo (HANS ROSLING MOSTRA AS MELHORES ESTATÍSTICAS QUE VOCÊ JÁ VIU - LEGENDADO, 2015), professor sueco, quando ele perguntava ao seus alunos sobre assuntos globais frequentemente ele escutava a divisão do mundo entre ‘nós’ e ‘eles’ que significava nada mais do que uma divisão preconceituosa e preconcebida que se resumia ao mundo ocidental (nós) e o mundo em desenvolvimento (eles). Percebendo o preconceito, ele ia além: mas qual a definição disso? Existe uma definição clara para diferenciar esses dois mundos? Todo mundo sabe qual a diferenciação desses mundos, é óbvio. Mas, uma aluna dele deu uma descrição simples e intrigante: o mundo ocidental tem vida longa e família pequena e o mundo em desenvolvimento tem famílias grandes e vida curta. O gráfico apresenta mostra-nos um mundo assim: separado em um grupo com vida longa e família pequena e um outro separado em famílias pequenas e vida longa. Ou nas palavras de (caldwell1982?) dois regimes distintos: (i) Alta Fecundidade e Alta Mortalidade (países mundo Ocidental); e (ii) Baixa Fecundidade e Baixa Mortalidade (países em desenvolvimento)

Mas, fica o questionamento: tal relação ainda é verdadeira? Sabemos pelos nossos estudos que os países em desenvolvimento também entraram numa tendencia de queda da mortalidade e da fecundidade. Como será que esses gráfico se apresentaria para dados de 2020?

Os gráficos a seguir desenha a esperança de vida no eixo x e a taxa de fecundidade total no eixo y e vão, progressivamente, acrescentando outros elementos estéticos. Inicialmente vamos trabalhar cor e tamanho, mapeados esteticamente como regiões e população, respectivamente.

A região será mapeada por meio da variável eight_regions que é uma variável categórica que usará cores em sua caegorização cores. Países da Europa (púrpura e rosa) e América do Norte (verde) tinham, de fato, famílias pequenas e vidas longas e os países da África (vermelho e ocre), América do Sul (verde) e Ásia (azul), com alguma diferenças entre eles, tinham alta fecundidade e alta mortalidade.

ggplot(data=gapminder_1950, aes(x=le,y=tfr,color=eight_regions))+
  geom_point()

População é uma contagem ou uma variável numérica. Uma boa forma de representa-las no gráficos é com pontos de vários tamanhos: quanto maiores os pontos, maior a população. Assim como para as regiões apenas um novo elemento estático é acrescentado ao nosso gráfico: size=pop

ggplot(data=gapminder_1950, aes(x=le,y=tfr,color=eight_regions,size=pop))+
  geom_point()

O gráfico agora tem com quatro dimensões mas, ainda queremos saber se o mundo ainda pode ser dividido em famílias grandes de vida curta e em famílias pequenas com vida longa. Uma solução para fazer isso é desenhar outro gráfico, agora para os dados de 2020, por exemplo. O gráfico agora nos apresenta um padrão bem distinto: apenas a África Subsaariana ainda está na condição de família grande e vida curta. Todo o resto do mundo é mais parecido: famílias com tamanho inferior a 2,5 filhos por mulher e esperança de vida entre 65 e 80 anos.

gapminder_2020 <- gapminder %>% 
  filter(time==2020)
ggplot(data=gapminder_2020, 
       aes(x=le,y=tfr,color=eight_regions,size=pop))+
  geom_point()
#> Warning: Removed 11 rows containing missing values or values outside the scale range
#> (`geom_point()`).

O gpplot2 permite ainda separar seus gráficos sem sub-gráficos, como por exemplo, um gráfico para cada continente. Isto é chamado de faceting e é uma nova forma de adicionar informações e relacionamento entre variáveis do seu banco de dados. Do inglês Facet pode ser traduzido como face em português mas não se aplica à face de uma pessoa se aplica mais a objetos a exemplo de sólidos (as faces de cubo) ou pedras lapidadas (as faces de um diamante).

ggplot(data=gapminder_2020, aes(x=le,y=tfr,size=pop))+
  geom_point()+
  facet_wrap(~four_regions)
#> Warning: Removed 11 rows containing missing values or values outside the scale range
#> (`geom_point()`).

Você cria faces num gráfico adicionando uma nova opção ao comando do ggpplot depois de um sinal de +. A sequencia de comandos a seguir separa o gráfico desenhado até então em quatro gráficos, sendo um para cada grande continente. Para gerar este gráfico foi acrescentado após o sinal + a linha de código facet_wrap(~ four_regions). O símbolo ~ aqui pode ser traduzido como por ou baseadas em: “faça faces baseada na variável que definem os quatro continentes”.

ggplot(data=gapminder_1950, aes(x=le,y=tfr,color=eight_regions,size=pop))+
  geom_point()+
  facet_wrap(~ four_regions)

Este comando permite criar várias faces criar gráficos complexos que revelam informações distribuídas no tempo e no espaço.

gapminder_anosselecionados <- gapminder %>%
  filter(time %in% c(1800,1900,1950,2020))
ggplot(data=gapminder_anosselecionados, aes(x=le,y=tfr,color=eight_regions,size=pop))+
  geom_point()+
  facet_wrap(~ time)+
  labs(title = 'Esperança de Vida x Taxa de Fecunidade Total',
       x = 'Esperança de Vida',
       y = "Taxa de Fecunidade Total",
       color = 'Regiões',
       size = 'População')
#> Warning: Removed 44 rows containing missing values or values outside the scale range
#> (`geom_point()`).

3 O pacote geopor

O pacore geopopr é um pacote que ainda está em fase de desenvolvimento e seu propósito é ser usada nas aulas de Geografia de População aqui da UFF Campos. O pacote geopopr irá conter funções e dados especificamente organizadas e desenvolvidos para este curso e seu código fonte está disponível no meu respositório do Github (Givisiez, 2025). Por enquanto (versão 0.0.0.9000) o pacote apenas gera pirâmides etárias para o grupo de países selecionado pela turma de 2024.2 e para o Brasil.

install.packages("remotes")
remotes::install_github('https://github.com/ghnaves/geopopr.git')
# dados do Bsil para 1950
library(geopopr)
head(pop_pyr_data('BRA',1950))
locationId sexId ageId sexage_population total_population relative_population age_f sex_f
76 1 7 -4636263.5 53408551 -0.0868 0-4 Male
76 1 57 -2113262.0 53408551 -0.0396 25-29 Male
76 1 58 -87825.5 53408551 -0.0016 75-79 Male
76 1 59 -50.5 53408551 0.0000 100+ Male
76 1 60 -433725.5 53408551 -0.0081 60-64 Male
76 1 61 -46122.5 53408551 -0.0009 80-84 Male
#pirâmide etária do Brasil para 1950
pop_pyr('Brazil',1950)

References

DEBASTIANI, V. J. Introdução ao R. [S. l.: s. n.], 17 May 2020. Available at: https://vanderleidebastiani.github.io/tutoriais/Introducao_ao_R.html. Accessed on: 25 Jul. 2024.
GIVISIEZ, G. H. N. Ghnaves/geopopr. Campos dos Goytacazes: Universidade, 2025. Available at: https://github.com/ghnaves/geopopr. Accessed on: 13 Jan. 2025.
HANS ROSLING MOSTRA AS MELHORES ESTATÍSTICAS QUE VOCÊ JÁ VIU - LEGENDADO. [S. l.: s. n.], 30 Apr. 2015. Available at: https://www.youtube.com/watch?v=upA-Jsg4CWs. Accessed on: 14 Jan. 2025.
R CORE TEAM. R: A language and environment for statistical computing. Vienna, Austria: R Foundation for Statistical Computing, 2024. Available at: https://www.R-project.org/.