Em Cuiabá, cidade que nasci e cresci, pau-rodado é um substantivo que define pessoas que nasceram em outro Estado mas moram em Cuiabá e ali construíram suas vidas. Aliás, Cuiabá sempre foi conhecida por ser uma Cidade super acolhedora e talvez por isso todos encaram o dito pau-rodado de uma forma engraçada e sem qualquer sentido pejorativo.

Muito bem, meu interesse com este post é analisar o comportamento dos fluxos migratórios entre Estados e assim encontrar os Estados que tem mais e menos pau-rodado em sua população residente. Serei breve e não vamos abordar todos os Estados, mas se você tiver curiosidade poderá aproveitar o código para uma análise mais ampla.

A motivação partiu de uma matéria do Nexo Jornal sobre este tema, porém ao nível estadual. Depois de algumas horas tentando decifrar o site do IBGE, cheguei na página que informa a população residente, por lugar de nascimento e unidade da federação.

Então vamos começar a análise carregando os pacotes do R necessários para este post.

if (!require("pacman")) install.packages("pacman")
pacman::p_load(readr, dplyr, tidyr, forcats, sf, geosphere, brmap, ggplot2, ggrepel, geofacet)
pacman::p_load_gh("italocegatta/brmap")

Os dados originais estão disponíveis neste link, fiz apenas adequações porque o IBGE insiste em mesclar células nas tabelas disponibilizadas. Já nesta tabela você consegue olhar para o Estado que você mora e analisar quanto dos residentes nasceram em outros Estados. Mas o objetivo é enxergar isso de forma gráfica para ampliar a percepção dos dados.

base <- read_csv2("https://raw.githubusercontent.com/italocegatta/italocegatta.github.io_source/master/content/dados/pnad_2015_migracao.csv")

base
## # A tibble: 27 x 28
##    Estado Rondônia  Acre Amazonas Roraima  Pará Amapá Tocantins Maranhão
##    <chr>     <dbl> <dbl>    <dbl>   <dbl> <dbl> <dbl>     <dbl>    <dbl>
##  1 Rondô~    57.4   1.84     1.9     0.08  0.7  NA        0.02      1.02
##  2 Acre       1.54 87.9      3.89    0.02  0.17 NA        0.02      0.11
##  3 Amazo~     0.46  1.6     87.6     0.23  5.36  0.13     0.06      0.87
##  4 Rorai~     0.65  0.24     5.16   55.6   6.54  0.04     0.570    19.0 
##  5 Pará       0.03  0.02     0.49    0.02 84.6   0.19     1.07      6.89
##  6 Amapá      0.1   0.03     0.2     0.17 20.8  72.7      0.1       3.65
##  7 Tocan~     0.07  0.07     0.02   NA     2.83  0.02    69.5       8.58
##  8 Maran~     0.03  0.01     0.05   NA     1.11  0.01     0.32     92.4 
##  9 Piauí      0.04  0.02     0.04    0.05  0.28 NA        0.11      3.97
## 10 Ceará      0.03  0.04     0.11   NA     0.22  0.01     0.03      0.35
## # ... with 17 more rows, and 19 more variables: Piauí <dbl>, Ceará <dbl>,
## #   `Rio Grande do Norte` <dbl>, Paraíba <dbl>, Pernambuco <dbl>,
## #   Alagoas <dbl>, Sergipe <dbl>, Bahia <dbl>, `Minas Gerais` <dbl>,
## #   `Espírito Santo` <dbl>, `Rio de Janeiro` <dbl>, `São Paulo` <dbl>,
## #   Paraná <dbl>, `Santa Catarina` <dbl>, `Rio Grande do Sul` <dbl>, `Mato
## #   Grosso do Sul` <dbl>, `Mato Grosso` <dbl>, Goiás <dbl>, `Distrito
## #   Federal` <dbl>

Dados longitudinais como estes ajudam humanos a enxergar os valores de forma mais fácil, mas do ponto de vista de processamento de dados, não dá pra fazer muita coisa com os dados assim. Vamos organizá-los seguindo a filosofia do Tidy data.

A nova tabela nos informa a porcentagem da população residente (coluna ‘valor’) para cada Estado, subdividindo os valores por local de nascimento. E agora vai a primeira simplificação: foram selecionados apenas os 6 Estados de nascimento mais representativos para cada Estado de residência.

df <- base %>% 
  gather(reside, valor, -Estado) %>%
  select(nasce = Estado, reside, valor) %>% 
  replace_na(list(valor = 0)) %>% 
  group_by(nasce) %>% 
  filter(row_number(-valor) <= 6) %>% 
  ungroup()

df
## # A tibble: 162 x 3
##    nasce    reside   valor
##    <chr>    <chr>    <dbl>
##  1 Rondônia Rondônia 57.4 
##  2 Acre     Rondônia  1.54
##  3 Amazonas Rondônia  0.46
##  4 Acre     Acre     87.9 
##  5 Amazonas Acre      1.6 
##  6 Acre     Amazonas  3.89
##  7 Amazonas Amazonas 87.6 
##  8 Roraima  Amazonas  5.16
##  9 Roraima  Roraima  55.6 
## 10 Amazonas Pará      5.36
## # ... with 152 more rows

Vamos nos preparar para a segunda simplificação: selecionar os extremos em termos de população que nasceu e reside no mesmo Estado. Então, RS, CE e PE são os Estados que mais tem moradores nascidos dentro do próprio Estado, enquanto RO, RR e DF tem uma parcela maior de residentes nascidos em outros Estados.

estados_interesse <- df %>%
  filter(reside == nasce) %>%
  filter(row_number(-valor) <= 3 | row_number(valor) <= 3) %>% 
  arrange(-valor) %>%
  pull(nasce)

estados_interesse
## [1] "Rio Grande do Sul" "Ceará"             "Pernambuco"       
## [4] "Rondônia"          "Roraima"           "Distrito Federal"

Preparando para o mapa, vamos pegar as coordenadas dos centroides de cada Estado.

estado_cent <- brmap_estado_simples %>% 
  st_centroid() %>% 
  cbind(., st_coordinates(.)) %>% 
  st_set_geometry(NULL) %>% 
  select(estado = estado_nome, lon = X, lat = Y)

estado_cent
##                 estado       lon        lat
## 1             Rondônia -62.84198 -10.913179
## 2                 Acre -70.47331  -9.212856
## 3             Amazonas -64.65314  -4.154180
## 4              Roraima -61.39929   2.084236
## 5                 Pará -53.06412  -3.974753
## 6                Amapá -51.95593   1.443332
## 7            Tocantins -48.32923 -10.150295
## 8             Maranhão -45.27924  -5.060364
## 9                Piauí -42.96862  -7.387507
## 10               Ceará -39.61569  -5.093333
## 11 Rio Grande do Norte -36.67345  -5.839671
## 12             Paraíba -36.83252  -7.121067
## 13          Pernambuco -37.99844  -8.326032
## 14             Alagoas -36.62489  -9.513860
## 15             Sergipe -37.44398 -10.584509
## 16               Bahia -41.72093 -12.475028
## 17        Minas Gerais -44.67342 -18.456183
## 18      Espírito Santo -40.67104 -19.575096
## 19      Rio de Janeiro -42.65244 -22.188742
## 20           São Paulo -48.73408 -22.263477
## 21              Paraná -51.61670 -24.635890
## 22      Santa Catarina -50.47486 -27.247326
## 23   Rio Grande do Sul -53.32041 -29.705543
## 24  Mato Grosso do Sul -54.84563 -20.327333
## 25         Mato Grosso -55.91218 -12.949089
## 26               Goiás -49.62337 -16.042019
## 27    Distrito Federal -47.79736 -15.780667

E agora, o pulo do gato. Vamos criar as linhas que ligam os Estados entre si e em seguida adicionar à tabela que informa as relações de fluxo. Portanto, para cada relação entre Estado de nascimento/residência temos uma feição de linha e o valor que representa a porcentagem de residentes.

coord <- df %>% 
  left_join(estado_cent, by = c("nasce" = "estado")) %>% 
  left_join(estado_cent, by = c("reside" = "estado")) %>%
  filter(nasce %in% estados_interesse)

linhas <- gcIntermediate(
  select(coord, lon.x, lat.x), 
  select(coord, lon.y, lat.y), 
  sp = TRUE, addStartEnd = TRUE
  ) %>% 
  st_as_sf()

fluxo_linha <- coord %>% 
  select(nasce, reside, valor) %>% 
  bind_cols(linhas) %>% 
  left_join(estado_cent, by = c("reside" = "estado")) %>% 
  mutate(nasce = fct_relevel(nasce, estados_interesse)) %>% 
  st_as_sf()

fluxo_linha
## Simple feature collection with 36 features and 5 fields
## geometry type:  LINESTRING
## dimension:      XY
## bbox:           xmin: -64.65314 ymin: -29.70554 xmax: -36.62489 ymax: 2.084236
## epsg (SRID):    4326
## proj4string:    +proj=longlat +ellps=WGS84 +no_defs
## # A tibble: 36 x 6
##    nasce    reside  valor                             geometry   lon    lat
##    <fct>    <chr>   <dbl>                     <LINESTRING [°]> <dbl>  <dbl>
##  1 Rondônia Rondôn~ 57.4  (-62.84198 -10.91318, -62.84198 -10~ -62.8 -10.9 
##  2 Roraima  Amazon~  5.16 (-61.39929 2.084236, -61.46309 1.96~ -64.7  -4.15
##  3 Roraima  Roraima 55.6  (-61.39929 2.084236, -61.39929 2.08~ -61.4   2.08
##  4 Roraima  Pará     6.54 (-61.39929 2.084236, -61.23585 1.96~ -53.1  -3.97
##  5 Roraima  Maranh~ 19.0  (-61.39929 2.084236, -61.08345 1.94~ -45.3  -5.06
##  6 Distrit~ Maranh~  4.42 (-47.79736 -15.78067, -47.74601 -15~ -45.3  -5.06
##  7 Ceará    Piauí    0.39 (-39.61569 -5.093333, -39.68117 -5.~ -43.0  -7.39
##  8 Distrit~ Piauí    5.08 (-47.79736 -15.78067, -47.69952 -15~ -43.0  -7.39
##  9 Roraima  Ceará    2.76 (-61.39929 2.084236, -60.9725 1.942~ -39.6  -5.09
## 10 Ceará    Ceará   95.8  (-39.61569 -5.093333, -39.61569 -5.~ -39.6  -5.09
## # ... with 26 more rows

Para deixar o gráfico um pouco mais bonito, vamos dar cor ao valor que estamos estudando. Mas agora a feição será o polígono que representa o Estado de residentes.

fluxo_poligono <- brmap_estado_simples %>% 
  left_join(df, by =  c("estado_nome" = "reside")) %>% 
  rename(reside = estado_nome) %>% 
  filter(nasce %in% estados_interesse) %>% 
  mutate(nasce = fct_relevel(nasce, estados_interesse)) %>% 
  select(nasce, reside, valor)

fluxo_poligono
## Simple feature collection with 36 features and 3 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -73.80156 ymin: -33.75077 xmax: -34.79288 ymax: 5.271841
## epsg (SRID):    4674
## proj4string:    +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
## # A tibble: 36 x 4
##    nasce       reside  valor                                       geometry
##  * <fct>       <chr>   <dbl>                                  <POLYGON [°]>
##  1 Rondônia    Rondôn~ 57.4  ((-61.58313 -8.798689, -61.5801 -8.802692, -6~
##  2 Roraima     Amazon~  5.16 ((-63.37209 2.211862, -63.35979 2.197102, -63~
##  3 Roraima     Roraima 55.6  ((-58.8955 1.227694, -58.89546 0.9047314, -58~
##  4 Roraima     Pará     6.54 ((-54.87225 2.433747, -54.87625 2.426694, -54~
##  5 Roraima     Maranh~ 19.0  ((-41.81411 -2.739309, -41.82457 -2.756218, -~
##  6 Distrito F~ Maranh~  4.42 ((-41.81411 -2.739309, -41.82457 -2.756218, -~
##  7 Ceará       Piauí    0.39 ((-41.32268 -2.92132, -41.32156 -2.935416, -4~
##  8 Distrito F~ Piauí    5.08 ((-41.32268 -2.92132, -41.32156 -2.935416, -4~
##  9 Roraima     Ceará    2.76 ((-37.25329 -4.831556, -37.44645 -4.880961, -~
## 10 Ceará       Ceará   95.8  ((-37.25329 -4.831556, -37.44645 -4.880961, -~
## # ... with 26 more rows

Pronto, já temos todos os dados que fazer o gráfico de interesse. Lembrando que optamos por dar destaque a 6 Estados e para cada um deles, os 6 Estados de nascimento que mais representam a população de residentes. Sim, é um tanto complexo. Eu fiquei algumas horas para poder criar o código e entender o que estava processando.

Como exemplo vamos interpretar as informações de Roraima: do total de residentes, 55.6% nasceram no próprio Estado de Roraima; 5.2%, 6.5% e 19% nasceram no Amazonas, Pará e Maranhão, respectivamente.

ggplot() +
  geom_sf(data = brmap_estado_simples, color = "white", fill = "grey80", size = 0.3) +
  geom_sf(data = fluxo_poligono, aes(fill = valor), color = "white", size = 0.3) +
  geom_sf(data = fluxo_linha, color = "cyan", size = 0.3) +
  geom_label_repel(
    data = fluxo_linha,
    aes(lon, lat, label = round(valor, 1)),
    size = 3, segment.colour = NA
  ) +
  facet_wrap(~nasce) +
  labs(
    title = "População residente (% do total geral)",
    subtitle = "PNAD/IBGE, 2015",
    x = NULL, y = NULL
  ) +
  scale_fill_viridis_c(guide = FALSE) +
  coord_sf(datum = NA) +
  theme_void(16)

Pontos interessantes:

  • Rondônia e Roraima retém uma proporção parecida da população dentro do próprio Estado, entretanto o pessoal que mora em Rondônia veio do Sul e Sudeste; ao passo que os moradores de Roraima vêm do AM, PA e MA.
  • O Distrito Federal não me surpreendeu, grande parte de pessoas nasceram em GO, MG e BA.
  • Um número expressivo de pessoas que nasceram em São Paulo e hoje moram no CE e PE… parece que o jogo virou, não é mesmo?

Caso tenha alguma dúvida ou sugestão sobre o post, fique à vontade para fazer um comentário ou me contatar por E-mail.

sessioninfo::session_info(c("readr", "dplyr", "ggplot2", "tidyr", "forcats", "sf", "geosphere", "ggrepel", "geofacet", "brmap"))
## - Session info ----------------------------------------------------------
##  setting  value                       
##  version  R version 3.5.3 (2019-03-11)
##  os       Windows 10 x64              
##  system   x86_64, mingw32             
##  ui       RTerm                       
##  language (EN)                        
##  collate  Portuguese_Brazil.1252      
##  ctype    Portuguese_Brazil.1252      
##  tz       America/Sao_Paulo           
##  date     2019-08-25                  
## 
## - Packages --------------------------------------------------------------
##  package       * version     date       lib source        
##  askpass         1.1         2019-01-13 [1] CRAN (R 3.5.2)
##  assertthat      0.2.1       2019-03-21 [1] CRAN (R 3.5.3)
##  backports       1.1.4       2019-04-10 [1] CRAN (R 3.5.3)
##  BH              1.69.0-1    2019-01-07 [1] CRAN (R 3.5.2)
##  brmap         * 0.1.0       2019-03-04 [1] local         
##  class           7.3-15      2019-01-01 [2] CRAN (R 3.5.3)
##  classInt        0.4-1       2019-08-06 [1] CRAN (R 3.5.3)
##  cli             1.1.0       2019-03-19 [1] CRAN (R 3.5.3)
##  clipr           0.7.0       2019-07-23 [1] CRAN (R 3.5.3)
##  colorspace      1.4-1       2019-03-18 [1] CRAN (R 3.5.3)
##  crayon          1.3.4       2017-09-16 [1] CRAN (R 3.5.1)
##  curl            4.0         2019-07-22 [1] CRAN (R 3.5.3)
##  DBI             1.0.0       2018-05-02 [1] CRAN (R 3.5.1)
##  digest          0.6.20      2019-07-04 [1] CRAN (R 3.5.3)
##  dplyr         * 0.8.3       2019-07-04 [1] CRAN (R 3.5.3)
##  e1071           1.7-2       2019-06-05 [1] CRAN (R 3.5.3)
##  ellipsis        0.2.0.1     2019-07-02 [1] CRAN (R 3.5.3)
##  fansi           0.4.0       2018-10-05 [1] CRAN (R 3.5.1)
##  forcats       * 0.4.0       2019-02-17 [1] CRAN (R 3.5.2)
##  geofacet      * 0.1.10      2019-03-13 [1] CRAN (R 3.5.3)
##  geogrid         0.1.1       2018-12-11 [1] CRAN (R 3.5.2)
##  geosphere     * 1.5-10      2019-05-26 [1] CRAN (R 3.5.3)
##  ggplot2       * 3.2.1       2019-08-10 [1] CRAN (R 3.5.3)
##  ggrepel       * 0.8.1       2019-05-07 [1] CRAN (R 3.5.3)
##  glue            1.3.1       2019-03-12 [1] CRAN (R 3.5.3)
##  gridExtra       2.3         2017-09-09 [1] CRAN (R 3.5.1)
##  gtable          0.3.0       2019-03-25 [1] CRAN (R 3.5.3)
##  hms             0.5.0       2019-07-09 [1] CRAN (R 3.5.3)
##  httr            1.4.1       2019-08-05 [1] CRAN (R 3.5.3)
##  imguR           1.0.3       2016-03-29 [1] CRAN (R 3.5.1)
##  jpeg            0.1-8       2014-01-23 [1] CRAN (R 3.5.0)
##  jsonlite        1.6         2018-12-07 [1] CRAN (R 3.5.2)
##  KernSmooth      2.23-15     2015-06-29 [2] CRAN (R 3.5.3)
##  labeling        0.3         2014-08-23 [1] CRAN (R 3.5.0)
##  lattice         0.20-38     2018-11-04 [2] CRAN (R 3.5.3)
##  lazyeval        0.2.2       2019-03-15 [1] CRAN (R 3.5.3)
##  magrittr        1.5         2014-11-22 [1] CRAN (R 3.5.1)
##  MASS            7.3-51.1    2018-11-01 [2] CRAN (R 3.5.3)
##  Matrix          1.2-17      2019-03-22 [1] CRAN (R 3.5.3)
##  mgcv            1.8-28      2019-03-21 [1] CRAN (R 3.5.3)
##  mime            0.7         2019-06-11 [1] CRAN (R 3.5.3)
##  munsell         0.5.0       2018-06-12 [1] CRAN (R 3.5.1)
##  nlme            3.1-137     2018-04-07 [2] CRAN (R 3.5.3)
##  openssl         1.4.1       2019-07-18 [1] CRAN (R 3.5.3)
##  pillar          1.4.2       2019-06-29 [1] CRAN (R 3.5.3)
##  pkgconfig       2.0.2       2018-08-16 [1] CRAN (R 3.5.1)
##  plogr           0.2.0       2018-03-25 [1] CRAN (R 3.5.1)
##  plyr            1.8.4       2016-06-08 [1] CRAN (R 3.5.1)
##  png             0.1-7       2013-12-03 [1] CRAN (R 3.5.0)
##  purrr           0.3.2       2019-03-15 [1] CRAN (R 3.5.3)
##  R6              2.4.0       2019-02-14 [1] CRAN (R 3.5.2)
##  RColorBrewer    1.1-2       2014-12-07 [1] CRAN (R 3.5.0)
##  Rcpp            1.0.2       2019-07-25 [1] CRAN (R 3.5.3)
##  RcppArmadillo   0.9.600.4.0 2019-07-15 [1] CRAN (R 3.5.3)
##  readr         * 1.3.1       2018-12-21 [1] CRAN (R 3.5.2)
##  reshape2        1.4.3       2017-12-11 [1] CRAN (R 3.5.1)
##  rgeos           0.5-1       2019-08-05 [1] CRAN (R 3.5.3)
##  rlang           0.4.0       2019-06-25 [1] CRAN (R 3.5.3)
##  rnaturalearth   0.1.0       2017-03-21 [1] CRAN (R 3.5.1)
##  scales          1.0.0       2018-08-09 [1] CRAN (R 3.5.1)
##  sf            * 0.7-7       2019-07-24 [1] CRAN (R 3.5.3)
##  sp              1.3-1       2018-06-05 [1] CRAN (R 3.5.1)
##  stringi         1.4.3       2019-03-12 [1] CRAN (R 3.5.3)
##  stringr         1.4.0       2019-02-10 [1] CRAN (R 3.5.2)
##  sys             3.2         2019-04-23 [1] CRAN (R 3.5.3)
##  tibble          2.1.3       2019-06-06 [1] CRAN (R 3.5.3)
##  tidyr         * 0.8.3       2019-03-01 [1] CRAN (R 3.5.3)
##  tidyselect      0.2.5       2018-10-11 [1] CRAN (R 3.5.1)
##  units           0.6-3       2019-05-03 [1] CRAN (R 3.5.3)
##  utf8            1.1.4       2018-05-24 [1] CRAN (R 3.5.1)
##  vctrs           0.2.0       2019-07-05 [1] CRAN (R 3.5.3)
##  viridisLite     0.3.0       2018-02-01 [1] CRAN (R 3.5.1)
##  withr           2.1.2       2018-03-15 [1] CRAN (R 3.5.1)
##  zeallot         0.1.0       2018-01-28 [1] CRAN (R 3.5.2)
## 
## [1] C:/Users/Italo/Documents/R/win-library/3.5
## [2] C:/Program Files/R/R-3.5.3/library