E se existisse medida que expressa o desempenho de cidades com precisão significativamente maior do que as tradicionais métricas per capita?

Não é preciso supor hipotéticamente isso, uma vez é existente, de fato, tal medida mais precisa. Ela é formalmente nomeada de Scale Adjusted Metropolitan Indicators (SAMIs).

Medidas que representam com maior fidelidade a realidade são vitais para efetuar diagnósticos mais acurados, fundamentais para o planejamento estratégico (OLIVEIRA, 2007).

Saber o desempenho de cidades com maior precisão, especialmente no aspecto econômico, pode ser útil não apenas para cidades, mas também para negócios (ENRIGHT et al., 2016), uma vez que os últimos encaixam-se em particularidades locais e regionais, melhores conhecidas através de dados.


Neste Markdown, vamos importar, pré-processar, analisar visualmente e modelar dados para identificar SAMIs de cidades mineiras.

Também vamos testar os modelos para averiguar a validade dos mesmos.

Ao final do Markdown, ainda adotamos os SAMIs estimados para gerar um novo produto, que envolve clustering em redes, considerado como valioso para tomada de decisão de cidades, de acordo com a literatura científica.

Em um Shiny app, disponibilizamos acesso visual interativo para série histórica de SAMIs de cidades, assim como o novo produto (que envolve clustering, embasada em correlações positivas) mencionado acima: https://ggthomazini.shinyapps.io/shiny_app_sami/

A variável que vamos tratar e identificar SAMIs é o PIB.

Para os leitores mais interessados, posteriormente neste Markdown fornecemos sucinta explicação da existência de SAMIs.

Abaixo é expresso o código.

——————————————————————————————————


Leitura de pacotes e importação de dados.


Realiza leitura dos pacotes necessários

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(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.1.3
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(lmtest)
## Carregando pacotes exigidos: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(stringr)
library(knitr)
library(reshape2)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.1.3
## corrplot 0.92 loaded
library(Hmisc)
## Warning: package 'Hmisc' was built under R version 4.1.3
## Carregando pacotes exigidos: lattice
## Carregando pacotes exigidos: survival
## Carregando pacotes exigidos: Formula
## 
## Attaching package: 'Hmisc'
## The following object is masked from 'package:plotly':
## 
##     subplot
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(igraph)
## Warning: package 'igraph' was built under R version 4.1.3
## 
## Attaching package: 'igraph'
## The following object is masked from 'package:plotly':
## 
##     groups
## The following objects are masked from 'package:dplyr':
## 
##     as_data_frame, groups, union
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
library(sidrar)
## Warning: package 'sidrar' was built under R version 4.1.3


Inicialmente é setada pasta de trabalho e importados, para o R, dados coletados no IPEADATA (PIB), DATASUS (população total de cidades), IBGE (ACPs) e SIDRA (IPCA).
# Seta a pasta
setwd('C:/Users/Usuario/Documents/samis_cidades_mg_pib')


# Importa dados de, respectivamente, PIB, POP, ACPs e IPCA. 
pib <- read.table("pib_municipal_mg_2010-2019.csv", header = TRUE, quote = "\"", sep = ";", dec = ",")

pop <- read.table("pop_total_municipios_mg_2010-2019.csv", 
                  header = TRUE, quote = "\"", sep = ";", dec = ",")

acps <- read.table("acps.csv", header = TRUE, quote = "\"", sep = ";")

ipca_tot <- get_sidra(api = "/t/1737/n1/all/v/69/p/201012,201112,201212,201312,201412,201512,201612,201712,201812,201912/d/v69%202")
## All others arguments are desconsidered when 'api' is informed


——————————————————————————————————

Manipulação de DFs.


Em sequência, é necessário investigar e tratar propriedades dos dados e dos DataFrames (DFs) que podem impactar em procedimentos que serão executados posteriormente.

O primeiro tratamento executado é separação entre nome e código de municípios, isso referente ao DF “pop”. Também são renomeadas as colunas deste DF para torná-lo mais informativo.

# Visualiza o DF antes de alterá-lo.
kable(pop[1:5,], format="markdown")
Município X2010 X2011 X2012 X2013 X2014 X2015 X2016 X2017 X2018 X2019
310010 Abadia dos Dourados 6704 6724 6743 6967 6992 7015 7037 7059 6972 6989
310020 Abaeté 22700 22716 22740 23451 23494 23535 23574 23611 23223 23237
310030 Abre Campo 13311 13309 13306 13703 13711 13719 13726 13733 13465 13454
310040 Acaiaca 3924 3923 3925 4045 4050 4056 4061 4065 3994 3994
310050 Açucena 10298 10183 10093 10297 10216 10140 10066 9997 9575 9470
# Mantém apenas números.
pop["Código"] <- as.numeric(gsub("[^[:digit:]]","",pop$Município))   


# Mantém caracteres alfabéticos.
pop[,1] <- gsub("[[:digit:]]","",pop$Município)


# Prepara nomes de colunas.
nomes_pop_tot <- paste0("pop_", 2010:2019)


# Cria novas colunas com os nomes desenvolvidos acima.
colnames(pop)[2:11] <- nomes_pop_tot


# Visualiza o DF após alterá-lo.
kable(pop[1:5,], format="markdown")
Município pop_2010 pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 pop_2019 Código
Abadia dos Dourados 6704 6724 6743 6967 6992 7015 7037 7059 6972 6989 310010
Abaeté 22700 22716 22740 23451 23494 23535 23574 23611 23223 23237 310020
Abre Campo 13311 13309 13306 13703 13711 13719 13726 13733 13465 13454 310030
Acaiaca 3924 3923 3925 4045 4050 4056 4061 4065 3994 3994 310040
Açucena 10298 10183 10093 10297 10216 10140 10066 9997 9575 9470 310050


As colunas do DF pib são renomeadas. A seguir, os DFs pib e pop são fundidos em apenas um. Também é efetuada limpeza de colunas no DF resultante; são excluídas as que não serão utilizadas posteriormente.

# Prepara nomes para colunas. 
nomes_pib_cor <- paste0("pib_", 2010:2019)


# Cria colunas novas com os nomes criado acima.
colnames(pib)[4:13] <- nomes_pib_cor


# Ajusta o codigo de cidades ao retirar uma casa decimal para possibilitar fusão de DFs.
pib$Código <- as.integer(pib$Código/10) 


# Funde DFs.
p_p <- merge(pib, pop, by = "Código")


# Mantém apenas colunas de interesse.
p_p <- p_p[,-c(2,14)]


# Visualiza o DF p_p.
kable(p_p[1:5,], format="markdown")
Código Município.x pib_2010 pib_2011 pib_2012 pib_2013 pib_2014 pib_2015 pib_2016 pib_2017 pib_2018 pib_2019 pop_2010 pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 pop_2019
310010 Abadia dos Dourados 63672.21 76883.45 95242.59 110339.89 141211.43 112799.37 114403.95 94822.18 75982.69 72595.30 6704 6724 6743 6967 6992 7015 7037 7059 6972 6989
310020 Abaeté 226324.64 229332.01 232081.74 243261.65 257920.95 232899.78 272824.23 260784.21 293556.75 294357.19 22700 22716 22740 23451 23494 23535 23574 23611 23223 23237
310030 Abre Campo 106813.97 136361.00 103346.87 108350.71 114454.47 125563.11 119223.85 113807.89 111181.55 115775.18 13311 13309 13306 13703 13711 13719 13726 13733 13465 13454
310040 Acaiaca 22440.23 23001.28 23084.38 24184.34 22963.17 21859.08 23082.72 23726.78 26249.39 31777.15 3924 3923 3925 4045 4050 4056 4061 4065 3994 3994
310050 Açucena 48966.31 50062.56 44437.85 50892.14 62498.07 56029.33 60060.27 59375.23 59836.04 53243.29 10298 10183 10093 10297 10216 10140 10066 9997 9575 9470


Por garantia, é investigada a quantia de NAs existentes no DF p_p. Tal investigação é efetuada para todas as colunas e linhas.

colSums(is.na(p_p))
##      Código Município.x    pib_2010    pib_2011    pib_2012    pib_2013 
##           0           0           0           0           0           0 
##    pib_2014    pib_2015    pib_2016    pib_2017    pib_2018    pib_2019 
##           0           0           0           0           0           0 
##    pop_2010    pop_2011    pop_2012    pop_2013    pop_2014    pop_2015 
##           0           0           0           0           0           0 
##    pop_2016    pop_2017    pop_2018    pop_2019 
##           0           0           0           0



Neste ponto, é útil informar brevemente sobre a base teórica da existência de SAMIs.


A população total pode ser considerada como uma medida do tamanho de cidades. É esperado que, conforme a população total de cidades aumente, diversas outras medidas (alusivas às cidades) também aumentem. Exemplos dessas medidas são PIB, casos de AIDS e quantia de patentes geradas.

Caso o incremento de uma unidade do tamanho (mensurado por população total) de cidades estivesse relacionado com o aumento de uma unidade de outras mencionadas medidas (como PIB), seria constatado um scaling linear de cidades. Ou seja, conforme cidades escalam (aumentam de tamanho), outras medidas de cidades escalam na mesma proporção.

Mas este não é o caso. O aumento de uma unidade de população total não está relacionado com o aumento de uma unidade de outras medidas (como PIB) de cidades.

Assim, há um scaling não-linear válido para cidades. Mais especificamente, para métricas que são manifestações de dinâmicas socioeconômicas (como o PIB), o scaling é superlinear (seu expoente de escala é superior a 1).

Esse scaling é devido, em parte muito significativa, ao fato de que habitantes de cidades mais populosas tendem a interagir socioeconomicamente mais. Por exemplo, habitantes de cidades mais populosas tendem a efetuar mais chamadas telefônicas.

Medidas per capita assumem um scaling linear e, portanto, não são muito precisas.

Quando estimamos leis de escala, identificamos o verdadeiro scaling de cidades. Desvios de tal scaling indicam verdadeiras idiossincrasias de cidades. Esses desvios são os resíduos de regressão utilizada para estimar leis de escala. No contexto de leis de escala de cidades, tais resíduos são intitulados SAMIs.

Assim, para obter SAMIs, devem ser estimadas leis de escala.

As pesquisas que estimam leis de escala usualmente focalizam interações sociais para definir o que são cidades. Isto é, essas pesquisas não fornecem grande importância para divisões administrativas, mas sim priorizam interações sociais para definir cidades.

No Brasil, existem unidades espaciais que são definidas por interações sociais. Essas unidades são as Áreas de Concentração de População (ACPs) (IBGE, 2008). Elas são compostas por um município núcleo (de maior população) e por alguns outros próximos fisicamente a esse núcleo.

As ACPs são consideradas como observações válidas neste Markdown para estimar leis de escala e, assim, possibilitar obter SAMIs.



Abaixo é ajustado o Código das cidades componentes de ACPs no DF acps.Isso para possibilitar futuras interações desse DF com o que contém informação de PIB e de população total de cidades.

Também são excluídos municípios não situados no estado de SP e investigada a quantia de NAs no DF que contém, como observações, municípios componentes de ACPs paulistas.

# Visualiza o DF acps antes de alterá-lo.
kable(acps[1:5,], format="markdown")
UF ACP NOME_ACP codmun Nome_mun
13 130100 ACP de Manaus 1302603 Manaus
15 150100 ACP de Belém 1500800 Ananindeua
15 150100 ACP de Belém 1501303 Barcarena
15 150100 ACP de Belém 1501402 Belém
15 150100 ACP de Belém 1501501 Benevides
# Efetua as transformações mencionadas neste DF.
acps$codmun <- as.integer(acps$codmun/10)

acps_mg <- subset(acps, UF == "31")

row.names(acps_mg) <- 1:nrow(acps_mg)


# Investiga se são inexistentes os NAs.
colSums(is.na(acps_mg))
##       UF      ACP NOME_ACP   codmun Nome_mun 
##        0        0        0        0        0


Ao tratar do DF acps_mg, são criadas colunas para receberem valores de pop e de PIB.

acps_mg[nomes_pib_cor] <- as.numeric(NA)

acps_mg[nomes_pop_tot] <- as.numeric(NA)


# Visualiza o DF acps_mg pronto para receber dados.
kable(acps_mg[1:5,], format="markdown")
UF ACP NOME_ACP codmun Nome_mun pib_2010 pib_2011 pib_2012 pib_2013 pib_2014 pib_2015 pib_2016 pib_2017 pib_2018 pib_2019 pop_2010 pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 pop_2019
31 310100 ACP de Belo Horizonte 310620 BeloHorizonte NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
31 310100 ACP de Belo Horizonte 310670 Betim NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
31 310100 ACP de Belo Horizonte 310900 Brumadinho NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
31 310100 ACP de Belo Horizonte 311000 Caeté NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
31 310100 ACP de Belo Horizonte 311250 CapimBranco NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA


Abaixo são identificados os valores de PIB e de pop, isso para todas as cidades componentes de ACPs do estado de São Paulo e para todos os anos.

for (j in 1:nrow(acps_mg)){
  for (n in 1:nrow(p_p)){
    for (k in 6:25){                    # Colunas com valores das variaveis no DF acps_mg.
      for (i in 3:22){                  # Colunas com valores das variaveis no DF p_p.
        if (k == i+3){
          if(acps_mg[j,4]==p_p[n,1]){      
            acps_mg[j,k] <- p_p[n,i] 
          }
        }
      }
    }
  }
}


# Renomeia a quarta coluna de acps_mg.
colnames(acps_mg)[4] <- "Código"


# Visualiza o DF acps_mg após terem sido inseridos dados.
kable(acps_mg[1:5,], format="markdown")
UF ACP NOME_ACP Código Nome_mun pib_2010 pib_2011 pib_2012 pib_2013 pib_2014 pib_2015 pib_2016 pib_2017 pib_2018 pib_2019 pop_2010 pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 pop_2019
31 310100 ACP de Belo Horizonte 310620 BeloHorizonte 59203074.1 61222353.79 63863103.85 65417205.74 64361809.04 59876485.24 56077944.1 54460882.44 54602879.45 55310771.82 2375444 2385640 2395785 2479165 2491109 2502557 2513451 2523794 2501576 2512070
31 310100 ACP de Belo Horizonte 310670 Betim 23384913.4 20158835.11 18518261.63 17507729.15 16451753.28 16393498.85 15958719.1 14135028.20 15098383.26 15969967.05 377547 383571 388873 406474 412003 417307 422354 427146 432575 439340
31 310100 ACP de Belo Horizonte 310900 Brumadinho 1335180.1 2025941.90 2054342.40 2360153.98 2181799.06 1098187.00 1025394.4 1217784.40 1531989.82 1431760.87 34013 34538 35085 36748 37314 37857 38373 38863 39520 40103
31 310100 ACP de Belo Horizonte 311000 Caeté 317354.3 390664.52 416234.77 421788.47 438760.64 390645.35 389779.5 353765.83 353776.04 454853.17 40786 41092 41423 43036 43395 43739 44066 44377 44377 44718
31 310100 ACP de Belo Horizonte 311250 CapimBranco 62321.9 62001.69 61286.38 68503.69 56385.07 52465.68 50507.9 52737.63 52819.99 57562.08 8880 8957 9030 9382 9461 9537 9609 9678 9679 9754


Por garantia, abaixo é investigada a quantia de NANs e/ou NAs existentes nos novos dados adicionados no DF acps_mg.

colSums(is.na(acps_mg))
##       UF      ACP NOME_ACP   Código Nome_mun pib_2010 pib_2011 pib_2012 
##        0        0        0        0        0        0        0        0 
## pib_2013 pib_2014 pib_2015 pib_2016 pib_2017 pib_2018 pib_2019 pop_2010 
##        0        0        0        0        0        0        0        0 
## pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 
##        0        0        0        0        0        0        0        0 
## pop_2019 
##        0


Em sequência é criado um DF (pp_acps_mg) para as ACPs receberem todos os seus valores finais. Esses valores (da variável x, no período y, referente à ACP z) são determinados pela soma dos valores que cidades componentes da ACP z apresentam no período y e na variável x. Tais valores finais são computados para todas as ACPs, períodos e variáveis e são inseridos no DF pp_acps_mg.

pp_acps_mg <- p_p[c(66, 824, 420, 357, 213, 806),]

for (i in 6:25){
  for(k in 3:22){
    if(i == k + 3){
      pp_acps_mg[1,k] <- sum(acps_mg[1:28,i])
      pp_acps_mg[2,k] <- sum(acps_mg[29:29,i])
      pp_acps_mg[3,k] <- sum(acps_mg[30:32,i])
      pp_acps_mg[4,k] <- sum(acps_mg[33:37,i])
    }
  }
}


# Visualiza o DF pp_acps_mg.
kable(pp_acps_mg[1:5,], format="markdown")
Código Município.x pib_2010 pib_2011 pib_2012 pib_2013 pib_2014 pib_2015 pib_2016 pib_2017 pib_2018 pib_2019 pop_2010 pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 pop_2019
66 310620 Belo Horizonte 129869660.6 131302449.0 133665470 137007287 133294651 122391423 115645113 114542794 115303047 119092560 5038063 5081258 5122007 5321463 5365679 5408111 5448496 5486835 5486429 5528384
824 317020 Uberlândia 18950577.5 18051573.3 19531983 20460780 20943435 20211865 20651384 20941395 22232361 21410811 600285 611904 619536 646673 654681 662362 669672 676613 683247 691305
420 313670 Juiz de Fora 10323282.5 10086320.3 10588042 10921659 10692199 10269625 9603053 10119456 10387287 10981548 534099 537157 541684 563023 567916 572611 577077 581319 581816 586495
357 313130 Ipatinga 10817166.2 10874564.9 10823828 11133719 10277874 9196057 8480397 9078715 10174601 10065980 468043 472547 476574 495398 499748 503922 507893 511663 512211 516377
213 311940 Coronel Fabriciano 920040.1 989046.5 1027664 1105658 1094374 1054227 1026819 1009335 1012545 1017797 103797 104174 104637 108302 108843 109363 109857 110326 109405 109855


Destaco que, para além de focalizar interações sociais para definir cidades, um critério populacional também é utilizado em pesquisas que estimam leis de escala.

Cidades devem apresentar ao menos 50 mil habitantes para serem consideradas observações válidas.

Considerando isso, voltamos ao código.


Para deter as mesmas observações em todos os anos, é adotado um critério para exclusão (ou não) de cidades válidas para todos os períodos. Nesse cenário, foi adotado corte populacional de 50 mil habitantes, isso ao tratar do primeiro ano do período.


Ou seja, municípios com população total inferior a 50 mil habitantes no ano de 2010 são excluídos, o restante é mantido.

Também são excluídos municípios componentes de ACPs (que não sejam núcleo) e as ACPs em si (cuja nomemclatura é representada pela do município núcleo) são adicionadas.

# Matém cidades que detém, ao mínimo, 50 mil habitantes.
p_p_filtrado <- subset(p_p, pop_2010 >= 50000) 


# Exclui cidades componentes de ACPs que não sejam o núcleo.
p_p_filtrado <- anti_join(p_p_filtrado, acps_mg, by = "Código")


# Insere ACPs em p_p_filtrado e nomeia o DF resultante (p_p_filtrado_pln), onde _pln indica prévia de ln.
p_p_filtrado_pln <- rbind(p_p_filtrado, pp_acps_mg)


# Visualiza o DF p_p_filtrado_pln.
kable(p_p_filtrado_pln[1:5,], format="markdown")
Código Município.x pib_2010 pib_2011 pib_2012 pib_2013 pib_2014 pib_2015 pib_2016 pib_2017 pib_2018 pib_2019 pop_2010 pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 pop_2019
310160 Alfenas 1284402.4 1403257 1449044.2 1400008.5 1437861.2 1458391.4 1456590.8 1630855.5 1548152.0 1469400.4 73722 74298 74804 77618 78176 78712 79222 79707 79481 79996
310350 Araguari 2147788.7 2044189 2416520.6 2246305.6 2441245.8 2533614.6 2443051.0 2504871.7 2766134.3 3149438.1 109779 110402 110983 114970 115632 116267 116871 117445 116691 117267
310400 Araxá 2573182.6 2665381 3368787.6 3387936.8 3508979.6 3361644.4 3022699.6 3148188.2 3666194.8 3665443.6 93683 94799 95888 99986 101136 102238 103287 104283 105083 106229
310560 Barbacena 1578866.9 1583251 1619996.9 1667789.4 1668424.3 1625277.0 1625632.5 1642925.9 1699569.0 1777446.9 126325 127218 128120 132980 133972 134924 135829 136689 136392 137313
311120 Campo Belo 524701.4 576001 604777.4 622786.3 610761.5 585712.8 593869.8 602264.5 610490.6 592809.5 51509 51725 51900 53656 53870 54076 54272 54458 53866 54029


É mantido em um mesmo DF (p_p_filtrado_pln_ipca) informações de PIB e de IPCA.

# Prepara nome de colunas.
nomes_col_ipca <- paste0("ipca_", 2010:2019)


# Cria novo DF para receber valores de IPCA.
p_p_filtrado_pln_ipca <- p_p_filtrado_pln


# Cria colunas para receberem valores de IPCA.
p_p_filtrado_pln_ipca[nomes_col_ipca] <- as.numeric(NA)


# Insere valores de IPCA.
for(i in 23:32){
  for(j in 1:10){
    if(i - j == 22){
      p_p_filtrado_pln_ipca[,i] <- ipca_tot[j,5]
    }
  }
}


# Visualiza o DF p_p_filtrado_pln_ipca.
kable(p_p_filtrado_pln_ipca[1:5,], format="markdown")
Código Município.x pib_2010 pib_2011 pib_2012 pib_2013 pib_2014 pib_2015 pib_2016 pib_2017 pib_2018 pib_2019 pop_2010 pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 pop_2019 ipca_2010 ipca_2011 ipca_2012 ipca_2013 ipca_2014 ipca_2015 ipca_2016 ipca_2017 ipca_2018 ipca_2019
310160 Alfenas 1284402.4 1403257 1449044.2 1400008.5 1437861.2 1458391.4 1456590.8 1630855.5 1548152.0 1469400.4 73722 74298 74804 77618 78176 78712 79222 79707 79481 79996 5.91 6.5 5.84 5.91 6.41 10.67 6.29 2.95 3.75 4.31
310350 Araguari 2147788.7 2044189 2416520.6 2246305.6 2441245.8 2533614.6 2443051.0 2504871.7 2766134.3 3149438.1 109779 110402 110983 114970 115632 116267 116871 117445 116691 117267 5.91 6.5 5.84 5.91 6.41 10.67 6.29 2.95 3.75 4.31
310400 Araxá 2573182.6 2665381 3368787.6 3387936.8 3508979.6 3361644.4 3022699.6 3148188.2 3666194.8 3665443.6 93683 94799 95888 99986 101136 102238 103287 104283 105083 106229 5.91 6.5 5.84 5.91 6.41 10.67 6.29 2.95 3.75 4.31
310560 Barbacena 1578866.9 1583251 1619996.9 1667789.4 1668424.3 1625277.0 1625632.5 1642925.9 1699569.0 1777446.9 126325 127218 128120 132980 133972 134924 135829 136689 136392 137313 5.91 6.5 5.84 5.91 6.41 10.67 6.29 2.95 3.75 4.31
311120 Campo Belo 524701.4 576001 604777.4 622786.3 610761.5 585712.8 593869.8 602264.5 610490.6 592809.5 51509 51725 51900 53656 53870 54076 54272 54458 53866 54029 5.91 6.5 5.84 5.91 6.41 10.67 6.29 2.95 3.75 4.31


É deflacionado o PIB.

# Cria primeiro índice.
p_p_filtrado_pln_ipca["indice_10"] <- (1+p_p_filtrado_pln_ipca[,23]/100)*100


# Prepara para receber todos os outros índices.
nomes_indices <- paste0("indice_", 11:19)

p_p_filtrado_pln_ipca[nomes_indices] <- as.numeric(NA)


# Cria todos os outros índices.
for(i in 24:32){
  for(k in 34:42){
    if(i == k - 10){
      p_p_filtrado_pln_ipca[,k] <- (1+p_p_filtrado_pln_ipca[,i]/100)*p_p_filtrado_pln_ipca[,k-1]
    }
  }
}


# Prepara para receber todos os PIB reais.
nomes_pib_real <- paste0("PIB_real.", 2010:2019)

p_p_filtrado_pln_ipca[nomes_pib_real] <- as.numeric(NA)


# Cria PIB real.
# OBS: neste código utilizo vários for loops (como o abaixo). Esses loops alcançam o objetivado.
# Existem, em casos no R, meios mais elegantes e eficientes para executar atividades similares a for loop.
# Em um futuro sucinto código demonstrarei como fazer isso.
for(i in 3:12){
  for(j in 33:42){
    for(k in 43:52){
      if(i == j - 30 & j == k - 10){
          p_p_filtrado_pln_ipca[,k] <- 
        p_p_filtrado_pln_ipca[,42]*p_p_filtrado_pln_ipca[,i]/p_p_filtrado_pln_ipca[,j]
      }
    }
  }
}


# Seleciona colunas com nome de cidades, código, população total e valores de PIB real.
p_p_filtrado_pln_clean <- p_p_filtrado_pln_ipca[,c(1:2,43:52,13:22)]


# Visualiza o DF p_p_filtrado_pln_clean.
kable(p_p_filtrado_pln_clean[1:5,], format="markdown")
Código Município.x PIB_real.2010 PIB_real.2011 PIB_real.2012 PIB_real.2013 PIB_real.2014 PIB_real.2015 PIB_real.2016 PIB_real.2017 PIB_real.2018 PIB_real.2019 pop_2010 pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 pop_2019
310160 Alfenas 2138369.2 2193659.9 2140246.3 1952431.7 1884428.6 1727057.9 1622848.4 1764938.4 1614877.4 1469400.4 73722 74298 74804 77618 78176 78712 79222 79707 79481 79996
310350 Araguari 3575799.2 3195603.7 3569214.3 3132665.3 3199441.8 3000359.9 2721904.8 2710812.9 2885354.7 3149438.1 109779 110402 110983 114970 115632 116267 116871 117445 116691 117267
310400 Araxá 4284026.8 4166690.4 4975718.0 4724767.6 4598789.9 3980930.3 3367715.5 3407020.4 3824207.8 3665443.6 93683 94799 95888 99986 101136 102238 103287 104283 105083 106229
310560 Barbacena 2628615.7 2475037.5 2392744.4 2325875.1 2186599.4 1924687.4 1811184.8 1778001.1 1772820.4 1777446.9 126325 127218 128120 132980 133972 134924 135829 136689 136392 137313
311120 Campo Belo 873562.1 900440.8 893259.6 868528.8 800450.3 693613.5 661655.1 651780.5 636802.8 592809.5 51509 51725 51900 53656 53870 54076 54272 54458 53866 54029


Em sequência, os dados são transformados logaritmicamente.

Tal transformação logarítmica é adotada para que os métodos aqui adotados sejam embasados nos já validados para estimar leis de escala (BETTENCOURT et al., 2007; BETTENCOURT et al., 2010; WEST, 2017). A validade de efetuar tal transformação ficará bastante evidente quando vislumbrados a relação de log(pop) com log(pib).

# Cria duplicado para receber ln.
p_p_filtrado_ln <- p_p_filtrado_pln_clean


# Transforma utilizando log.
p_p_filtrado_ln[,c(3:22)] <- log(p_p_filtrado_ln[,c(3:22)]) 


# Renomeia linhas.
row.names(p_p_filtrado_ln) <- 1:nrow(p_p_filtrado_ln)


# Visualiza tabela.
kable(p_p_filtrado_ln[1:5,], format="markdown")
Código Município.x PIB_real.2010 PIB_real.2011 PIB_real.2012 PIB_real.2013 PIB_real.2014 PIB_real.2015 PIB_real.2016 PIB_real.2017 PIB_real.2018 PIB_real.2019 pop_2010 pop_2011 pop_2012 pop_2013 pop_2014 pop_2015 pop_2016 pop_2017 pop_2018 pop_2019
310160 Alfenas 14.57555 14.60108 14.57643 14.48459 14.44914 14.36193 14.29969 14.38363 14.29477 14.20036 11.20806 11.21584 11.22263 11.25955 11.26672 11.27355 11.28001 11.28611 11.28327 11.28973
310350 Araguari 15.08970 14.97729 15.08786 14.95739 14.97849 14.91424 14.81684 14.81276 14.87516 14.96273 11.60622 11.61188 11.61713 11.65243 11.65817 11.66364 11.66883 11.67373 11.66728 11.67221
310400 Araxá 15.27040 15.24263 15.42008 15.36833 15.34130 15.19703 15.02975 15.04135 15.15686 15.11446 11.44767 11.45951 11.47094 11.51279 11.52422 11.53506 11.54527 11.55486 11.56251 11.57335
310560 Barbacena 14.78197 14.72177 14.68795 14.65961 14.59786 14.47027 14.40949 14.39100 14.38808 14.39069 11.74661 11.75366 11.76072 11.79795 11.80539 11.81247 11.81915 11.82546 11.82329 11.83002
311120 Campo Belo 13.68033 13.71064 13.70263 13.67456 13.59293 13.44967 13.40250 13.38746 13.36422 13.29263 10.84951 10.85370 10.85707 10.89035 10.89433 10.89815 10.90176 10.90518 10.89425 10.89728


——————————————————————————————————

Análise visual dos dados.


Analisamos visualmente a relação entre a variável dependente (PIB) e a independente (população total). Ela demonstra-se substancialmente linear, de acordo com o esperado de estimação de leis de escala e os métodos adotados.

for(i in 3:12){
  for(k in 13:22){
    if(k == i + 10){
print(ggplot(data = p_p_filtrado_ln, aes_q(x = p_p_filtrado_ln[,k], y = p_p_filtrado_ln[,i])) +
  geom_point(color = "#FF06EF", alpha = 0.65) + theme_bw(base_size = 17) + 
  geom_line(formula= y~x, color = "#51FF05", method = "lm", alpha = 0.6, stat = "smooth", size = 1) +
  geom_smooth(formula = y~x, method = "lm", color = "#51FF05", alpha = 0.2) +
  labs(title="Relação entre PIB e população total",
       x= paste("População total em ln", i + 2007),
       y= paste("PIB em ln", i + 2007)))
    }
  }
}


——————————————————————————————————

Modelagem de dados: estimando leis de escala.


Ao considerar as plotagens, somado aos procedimentos já realizados (que adequam-se aos propostos pela literatura científica para estimar leis de escala), regressões são estimadas entre PIB (y) e população total (x). Tais regressões são estimadas pelo Método dos Mínimos Quadrados (MMQ).

As informações dessas regressões são inseridas em lista nomeada “mods”.

# Cria lista.
mods <- list()


# Insere informações de regressões estimadas na lista mods.
for(i in 3:12){
  for(k in 13:22){
    if(k == i + 10){
      mods[[i - 2]] <- lm(p_p_filtrado_ln[,i] ~ p_p_filtrado_ln[,k])
    }
  }
}


——————————————————————————————————

Testagem dos modelos.


Nessa seção são realizados testes e análises que visam identificar propriedades das regressões estimadas. Cada teste e análise foi realizado para cada regressão separadamente.

O primeiro desses testes foi o de White, que visa captar heterocedasticidade ou sua ausência (WOOLDRIDGE, 2002). Todas as regressões não apresentam indícios estatisticamente significativos (p < 0.05) de heterocedasticidade.

for(i in 1:10){
  print(bptest(mods[[i]], ~ 
                 p_p_filtrado_ln[,i + 12] + I(p_p_filtrado_ln[,i + 12])^2, data = p_p_filtrado_ln))
}
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 2.3929, df = 1, p-value = 0.1219
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 2.358, df = 1, p-value = 0.1246
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 2.2457, df = 1, p-value = 0.134
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 2.0065, df = 1, p-value = 0.1566
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 2.1087, df = 1, p-value = 0.1465
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 1.5132, df = 1, p-value = 0.2186
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 0.89056, df = 1, p-value = 0.3453
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 1.4987, df = 1, p-value = 0.2209
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 1.375, df = 1, p-value = 0.241
## 
## 
##  studentized Breusch-Pagan test
## 
## data:  mods[[i]]
## BP = 0.73133, df = 1, p-value = 0.3925


Em sequência, é executado teste de RESET. Ele é um teste geral de especificação incorreta, que é projetado para detectar variáveis omitidas e forma funcional inadequada (SHUKUR, 2004). De acordo com esse teste (executado abaixo), em nenhum modelo foram constatados indícios estatisticamente significativos de erro de especificação (RAMSEY, 1969), especialmente referente à forma funcional.

for(i in 1:10){
  print(resettest(mods[[i]]))
  }
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 0.071802, df1 = 2, df2 = 50, p-value = 0.9308
## 
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 0.0081014, df1 = 2, df2 = 50, p-value = 0.9919
## 
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 0.063276, df1 = 2, df2 = 50, p-value = 0.9388
## 
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 0.10139, df1 = 2, df2 = 50, p-value = 0.9038
## 
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 0.16838, df1 = 2, df2 = 50, p-value = 0.8455
## 
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 0.447, df1 = 2, df2 = 50, p-value = 0.6421
## 
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 0.4425, df1 = 2, df2 = 50, p-value = 0.6449
## 
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 0.35038, df1 = 2, df2 = 50, p-value = 0.7061
## 
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 0.38627, df1 = 2, df2 = 50, p-value = 0.6816
## 
## 
##  RESET test
## 
## data:  mods[[i]]
## RESET = 1.2926, df1 = 2, df2 = 50, p-value = 0.2836


Para além de análises econométricas, foi realizada análise teórica e empírica. Para isso, as inclinações das retas obtidas pelas regressões foram comparadas com as inclinações esperadas pela teoria e por achados empíricos.

Tais inclinações demonstraram valores entre 1.1 e 1.15. Isso demonstra grande coerência com a inclinação esperada teoricamente as identificadas empiricamente em diversas pesquisas (BETTENCOURT, 2013; BETTENCOURT et al., 2007; BETTENCOURT et al., 2010; MEIRELLES et al., 2018).

for(i in 3:12){
  for(k in 13:22){
    if(k == i + 10){
      print(summary(lm(p_p_filtrado_ln[,i] ~ p_p_filtrado_ln[,k]))$coefficients[2,1])
    }
  }
}
## [1] 1.15104
## [1] 1.115975
## [1] 1.125086
## [1] 1.131563
## [1] 1.129902
## [1] 1.136082
## [1] 1.129139
## [1] 1.109821
## [1] 1.118466
## [1] 1.137613


Ao considerar os resultados dos testes adotados, somada a coerência que os procedimentos expressos neste código apresentam perante pesquisas já validadas para estimar leis de escala, a validade dos resultados obtidos é reforçada (MEIRELLES et al., 2018).

——————————————————————————————————

Identificação e visualização de SAMIs.


Como mencionado, leis de escala possibilitam identificar medidas análogas às per capita que estimam, com alta precisão, o desempenho de cidades.

Essas medidas são os simples resíduos das regressões estimadas, chamadas de SAMIs (Scale Adjusted Metropolitan Indicators) (BETTENCOURT et al., 2010).

Os SAMIs são inseridos em um DF.

# Cria o DF.
samis_mg <- data.frame(matrix(NA, nrow = nrow(p_p_filtrado_ln), ncol = 11))


# Cria nome de colunas e insere tais nomes no DF samis_mg;
nome_cols_samis_mg <- c("Cidades", paste("SAMI PIB", " ", 2010:2019))

colnames(samis_mg) <- nome_cols_samis_mg


# Insere o nome das cidades no DF samis_mg.
samis_mg[,1] <- p_p_filtrado_ln[,2]


# Insere os valores dos SAMIs no DF samis_mg.
for(i in 1:10){
  samis_mg[,i + 1] <- mods[[i]][["residuals"]]
}


# Salva o DF samis_mg em formato de csv para ter um backup dos dados alcançados até o momento.
# write.table(samis_mg, "samis_mg.csv", sep = ";", col.names = TRUE, row.names = FALSE)


# Apresenta o DF samis_mg.
kable(samis_mg[1:5,], format="markdown")
Cidades SAMI PIB 2010 SAMI PIB 2011 SAMI PIB 2012 SAMI PIB 2013 SAMI PIB 2014 SAMI PIB 2015 SAMI PIB 2016 SAMI PIB 2017 SAMI PIB 2018 SAMI PIB 2019
Alfenas 0.1193665 0.1337401 0.1419185 0.0779938 0.1101919 0.1860150 0.2125482 0.2701879 0.1977514 0.1478368
Araguari 0.1752044 0.0679692 0.2094901 0.1062433 0.1972434 0.2951494 0.2906692 0.2691400 0.3486366 0.4750961
Araxá 0.5384094 0.5033557 0.7061976 0.6751901 0.7114068 0.7240168 0.6430874 0.6296449 0.7475317 0.7392815
Barbacena -0.2941199 -0.3457675 -0.3519659 -0.3562181 -0.3497274 -0.3178938 -0.2864203 -0.3210210 -0.3129243 -0.2764761
Campo Belo -0.3631538 -0.3525596 -0.3206024 -0.3142565 -0.3252505 -0.2997535 -0.2575538 -0.3032138 -0.2976989 -0.3134373


Para efetuar posterior plotagem, é contruído DF que contém série histórica de SAMIs das, em média, 2 cidades mineiras que demonstraram melhor e pior desempenho. Este DF também contém série histórica das 2 cidades, em média, mais populosas deste estado.

# Identifica média de SAMIs e de população total.
samis_mg["media_samis"] <- rowMeans(samis_mg[,2:11])

samis_mg["media_pop"] <- rowMeans(p_p_filtrado_ln[,13:22])


# Cria um DF composto pelas 2 cidades de maior e menor média de SAMIs. Esse DF também contém as 2 cidades mais populosas, em média ao longo do período considerado, do estado de MG.
samis_mg_plt <- samis_mg %>%                                     
  arrange(desc(media_samis)) %>%
  slice(1:2, 53:54) 

samis_mg_plt[c(5:6),] <- samis_mg %>%                                     
  arrange(desc(media_pop)) %>%
  slice(1:2) 


# Mantém apenas colunas que serão utilizadas no plot.
samis_mg_plt <- samis_mg_plt[,c(1:11)]


Prepara o DF para efetuar plotagem no formato desejado e realiza tal plotagem.

# Coleta nome das cidades.
nomes_plts <- samis_mg_plt[,1]


# Com exceção da coluna 1, transpõe todas as outras.
samis_mg_plt_t <- as.data.frame(t(samis_mg_plt[,-1]))


# Insere nomes de cidades no DF transposto.
colnames(samis_mg_plt_t) <- nomes_plts


# Em uma coluna, insere informação de anos.
samis_mg_plt_t["Ano"] <- 2010:2019


# Efetua melt do DF samis_mg_plt_t para possibilitar plotagem do modo almejado.
samis_mg_plt_t_melt <- melt(samis_mg_plt_t, id="Ano")


# Renomeia coluna que contém cidades.
colnames(samis_mg_plt_t_melt)[2] <- "Cidades"


# Realiza plotagem.
ggplot(samis_mg_plt_t_melt,aes(x=Ano, y=value, group=Cidades)) + 
  geom_line(aes(colour = Cidades), lwd = 1.5, alpha = 0.6) +
  labs(y = "SAMIs PIB", x = "Ano") + theme_bw(base_size = 15) + scale_x_continuous(breaks=seq(2010, 2019, 1))


A série histórica de SAMIs de todas as cidades pode ser visualizada em https://ggthomazini.shinyapps.io/shiny_app_sami/


——————————————————————————————————

Clustering de cidades com base em séries históricas de SAMIs.


Aqui explicamos o valioso produto (mencionado no começo deste Markdown) embasado em SAMIs que vamos alcançar.

A literatura indica que agrupamentos de cidades, embasados em séries históricas de SAMIs, refletem comunalidades de escolhas econômicas e de trajetórias históricas dessas cidades (BETTENCOURT et al., 2010).

Isso sugere que cidades situadas em um mesmo grupo exibem vantagens e desafios em comum, conforme elas evoluem (BETTENCOURT et al., 2010).

Assim, ao buscar desafios e soluções análogos de suas cidades, é útil que formuladores de políticas considerem cidades no mesmo grupo da sua de interesse (BETTENCOURT et al., 2010).

Ao tratar de aspecto econômico (dado pelo PIB), tais agrupamentos também podem ser úteis para negócios situados nas cidades consideradas.

Dada essa relevante utilidade, vamos agrupar cidades com base na séries histórica de seus SAMIs.


Para agrupar as cidades, obtemos medida de similaridade entre elas. Tal medida aqui adotada, em coerência com Bettencourt et al. (2010), é a simples correlação de Pearson entre cidades, considerando a série histórica de seus SAMIs.

# Cria DF para calcular correlação entre cidades.
row.names(samis_mg) <- samis_mg[,1]

samis_mg_to_cor <- t(samis_mg[,c(2:11)])


# Calcula e visualiza a correlação de Pearson entre as cidades. 
cor_samis_mg <- cor(samis_mg_to_cor)

corrplot(cor_samis_mg, method = "color", order = "hclust",  tl.cex = 0.45, col.text = "red")
## Warning in text.default(pos.xlabel[, 1], pos.xlabel[, 2], newcolnames, srt =
## tl.srt, : "col.text" não é um parâmetro gráfico
## Warning in text.default(pos.ylabel[, 1], pos.ylabel[, 2], newrownames, col =
## tl.col, : "col.text" não é um parâmetro gráfico
## Warning in title(title, ...): "col.text" não é um parâmetro gráfico


Em posse dessa medida de similaridade, é possível efetuar clustering de cidades. O método aqui adotado será o de detecção de comunidades de redes. Essas comunidades não precisam ter seu tamanho ou quantia predeterminadas pelo pesquisador (BARABÁSI, 2014) pois se visa que seja identificada a estrutura verdadeira de clusters, que pode ser desconhecida pelo cientista (SOARES, 2020).Assim, configura-se como uma abordagem robusta de agrupamento.

É visado considerarmos apenas as conexões com nível de significância de 95% para obtermos a rede final (ORIGUELA; PRATAVIEIRA, 2017), que será considerada para efetuar tal agrupamento.

# Identifica o valor p de todas as correlações e discreciona iguais ou superiores a 0.05. 
cor_e_valp <- rcorr(as.matrix(samis_mg_to_cor)) 

cor_p <- round(cor_e_valp$P, 3)

cor_p[cor_p >= 0.05 | is.na(cor_p)] <- 1


# Mantém valores não nulos apenas para correlações estatisticamente significativas, dado o nível de confiança mencionado previamente.
for(i in 1:54){
  for(k in 1:54){
    if(cor_p[i,k] == 1){
      cor_samis_mg[i,k] <- 0
    }
  }
}


Correlações positivas e negativas expressam relações de similaridade e dissimilaridade, respectivamente.

Por expressarem relações distintas, é elaborada uma matriz apenas com correlações positivas e outra com apenas correlações negativas. Para descrever a intensidade como um todo, uma terceira e final matriz apresenta valores absolutos de todas as correlações (positiavas e negativas).

# Prepara DFs de positivo, negativo e alcança, em formato final, DF com valores absolutos.
cor_samis_mg_posi <- cor_samis_mg
cor_samis_mg_neg <- cor_samis_mg
cor_samis_mg_abs <- abs(cor_samis_mg)


# Mantém apenas valores positivos e negativos, respectivamente.
cor_samis_mg_posi[cor_samis_mg_posi < 0] <- 0
cor_samis_mg_neg[cor_samis_mg_neg > 0] <- 0


# Uma vez que uma rede não pode ser composta por conexões negativas, os valores menores que 0 são transformados em valores postivos. A matriz segue, naturalmente, representando conexões negativas.
cor_samis_mg_neg <- abs(cor_samis_mg_neg)


Transforma as três matrizes obtidas acima em redes (grafos) e detecta suas comunidades (clusters), utilizando algoritmo de Blondel et al (2008).

# Transforma em grafos.
g_samis_mg_posi <- graph_from_adjacency_matrix(cor_samis_mg_posi, weighted = TRUE, mode = "undirected")

g_samis_mg_neg <- graph_from_adjacency_matrix(cor_samis_mg_neg,weighted = TRUE, mode = "undirected")

g_samis_mg_abs <- graph_from_adjacency_matrix(cor_samis_mg_abs,weighted = TRUE, mode = "undirected")



# Detecta comunidades (clusters).
comu_posi <- cluster_louvain(g_samis_mg_posi)

comu_neg <- cluster_louvain(g_samis_mg_neg, weights = NULL)

comu_abs <- cluster_louvain(g_samis_mg_abs, weights = NULL)


Os clusters de cidades, embasados estritamente em conexões estatísticamente significativas (a nível de 95%), são expressos a seguir.

# Insere informações de cidades e pertencimento à comunidades em DFs.
comu_posi_final <- data.frame (Nomes  = comu_posi$names,
                  Comunidades = comu_posi$membership)

comu_neg_final <- data.frame (Nomes  = comu_neg$names,
                  Comunidades = comu_neg$membership)

comu_abs_final <- data.frame (Nomes  = comu_abs$names,
                  Comunidades = comu_abs$membership)



# Ordena DFs para facilitar visualização de pertencimento à clusters por parte de cidades.
comu_posi_final <- comu_posi_final[order(comu_posi_final$Comunidades),]

comu_neg_final <- comu_neg_final[order(comu_neg_final$Comunidades),]

comu_abs_final <- comu_abs_final[order(comu_abs_final$Comunidades),]



# Vislumbra os três DFs obtidos acima. Cidades que apresentam mesmo número na coluna "Comunidades", são situadas no mesmo cluster.

# Primeiro sobre a rede embasada em correlações postivas.
kable(comu_posi_final[1:5,], format="markdown")
Nomes Comunidades
1 Alfenas 1
2 Araguari 1
4 Barbacena 1
6 Caratinga 1
11 Formiga 1
# Em sequência tratando de rede embasada em correlações negativas.
kable(comu_neg_final[1:5,], format="markdown")
Nomes Comunidades
1 Alfenas 1
13 Governador Valadares 1
14 Itabira 1
16 Itaúna 1
19 Januária 1
# Por fim, demonstramos comunidades da rede construída com valores absolutos de correlações (negativas e postivas).
kable(comu_abs_final[1:5,], format="markdown")
Nomes Comunidades
1 Alfenas 1
2 Araguari 1
4 Barbacena 1
6 Caratinga 1
11 Formiga 1


Todos os clusters embasados em correlações positivas podem ser visualizados em https://ggthomazini.shinyapps.io/shiny_app_sami/



Visando cooperar com uma compreensão inicial dos clusters obtidos, fornecemos iniciais potenciais explicações dos resultados obtidos.

Comunidades baseadas em correlações negativas podem indicar cidades concorrentes entre si, especialmente considerando cidades que apresentam estruturas econômicas e parceiros comerciais similares. Nesse caso, negócios podem considerar essas cidades como ponto de partida para identificar concorrentes e, posteriormente, estudá-los.

Ainda, comunidades da rede formada por correlações negativas, especialmente tratando de cidades que pouco interagem entre si (diretamente e também indiretamente, por meio de terceiros), podem indicar cidades cujas economias são marcadas por produtos substitutos. Desse modo, flutuações macroeconômicas descrevem a correlação negativa entre elas.

Já as comunidades identificadas em rede de correlações positivas podem indicar cidades com estruturas econômicas similares e que não disputam o mesmo mercado. Caso seja confirmada tal similaridade estrutural, negócios podem olhar para essas cidades como potenciais fontes de obtenção de know-how.

Ainda, comunidades embasadas em rede de correlação positiva podem indicar cidades que cooperam econômicamente entre si, trocando informações, bens e serviços de modo que seja benéfico para ambas as cidades. Dada essa potencial característica, se confirmado o funcionamento harmônico dessas cidades, é interessante que gestores públicos e negócios desenvolvam planejamento e ações integrados, uma vez que o sucesso de uma tende a estar associado com o sucesso da outra.

Por fim, comunidades da rede formada por correlações positivas e negativas (em valores absolutos), em comparação com as outras duas redes, fornece informações menos específicas sobre o tipo de conexão. Sua utilidade resume-se, significativamente, em exprimir um retrato mais abrangente de similaridade, entre cidades, de comportamento temporal de SAMIs.



Cada uma dessas redes é exportada para ter sua visualização obtida em software que demonstra-se superior ao R nesse quesito, que é o software Gephi. Essa exportação e visualização são efetuadas a seguir.

# Exporta as redes.
# write.table(cor_samis_mg_posi, "rede_cor_posi_samis_mg.csv", sep = ";", col.names = TRUE)
# 
# write.table(cor_samis_mg_neg, "rede_cor_samis_mg_neg.csv", sep = ";", col.names = TRUE)
# 
# write.table(cor_samis_mg_abs, "rede_cor_samis_mg_abs.csv", sep = ";", col.names = TRUE)




A visualização das três redes é efetuada abaixo.

Ela contém nós (cidades) e arestas (correlação entre cidades).

O tamanho dos nós é positivamente correlacionado com o grau ponderado. A expessura das arestas é proporcional á força da correlação; cores expressam comunidades (clusters).

As redes demonstradas são as embasadas em, respectivamente, correlações positivas (que são duas redes, uma ao lado da outra), negativas e valores absolutos de correlações negativas e postivas.

Para tornar a visualização mais limpa, foram mantidos apenas cidades que apresentam ao menos uma conexão.


Rede embasada em correlações positivas



Rede embasada em correlações negativas



Rede embasada em todas as correlações


——————————————————————————————————

Considerações finais.


Neste Markdown importamos, pré-processamos, analisamos visualmente e modelamos dados para identificar precisas medidas do desempenho econômico de cidades mineiras. Os modelos também foram testados para investigar a validade dos mesmos.

As mencionadas precisas medidas de desempenho são chamadas de SAMIs.

Medidas mais precisas, representativas da realidade, são vitais para efetuar diagnósticos mais acurados, fundamentais para o planejamento estratégico (OLIVEIRA, 2007).

Saber o desempenho de cidades com maior precisão, especialmente no aspecto econômico, pode ser útil não apenas para cidades, mas também para negócios, uma vez que os últimos encaixam-se em particularidades locais e regionais, melhores conhecidas através de dados.

Com base nos SAMIs estimados, identificamos clusters de cidades. Esses são úteis para tomada de decisão, de acordo com a literatura científica (BETTENCOURT et al., 2010).

Em um Shiny app, disponibilizamos acesso visual interativo para série histórica de SAMIs de cidades, assim como para os mencionados clusters embasados em correlações positivas: https://ggthomazini.shinyapps.io/shiny_app_sami/

——————————————————————————————————


Referências.


BETTENCOURT, L. M. et al. Growth, innovation, scaling and the pace of life in cities. Bloomington: PNAS, 2007.
BETTENCOURT, L. M. et al. Urban Scaling and Its Deviations: Revealing the Structure of Wealth, Innovation and Crime across Cities. PLoS ONE, [S.l.], v. 5, n. 11, 2010.
BETTENCOURT, L. M. The origins of Scaling in Cities. Science, [S.l.], v. 340, p. 1438-1441, 2013.
BLONDEL, V. D. et al. Fast unfolding of communities in large networks. Journal of Statistical Mechanics: Theory and Experiment, IOP Publishing Ltd and SISSA, 2008.
ENRIGHT, M. et al. How cities and business can work together for growth. 2016.
INSTITUTO BRASILEIRO DE GEOGRAFIA E ESTATÍSTICA (IBGE). Regiões de Influência das Cidades 2007. Rio de Janeiro: IBGE, 2008.
INSTITUTO BRASILEIRO DE GEOGRAFIA E ESTATÍSTICA (IBGE). Regiões de Influência das Cidades 2007. Rio de Janeiro: IBGE, 2008.
MEIRELLES, Joao et al. Evolution of urban scaling: Evidence from Brazil. PloS one, v. 13, n. 10, p. e0204574, 2018.
ORIGUELA, Leticia Aparecida; PRATAVIERA, Gilberto Aparecido. Estrutura de Rede das “Melhores Empresas para se Trabalhar” Gerada por Indicadores de Rentabilidade. Revista de Finanças e Contabilidade da Unimep, v. 4, n. 2, p. 73-89, 2017.
OLIVEIRA, Djalma de Pinho Rebouças de. Planejamento estratégico-conceitos, metodologia e práticas. 1986.
RAMSEY, James Bernard. Tests for specification errors in classical linear least‐squares regression analysis. Journal of the Royal Statistical Society: Series B (Methodological), v. 31, n. 2, p. 350-371, 1969.
SHUKUR, Ghazi; MANTALOS, Panagiotis. Size and power of the RESET test as applied to systems of equations: a bootstrap approach. Journal of modern applied statistical methods, v. 3, n. 2, p. 10, 2004.
SOARES, Giovane Thomazini. Avaliação paradigmática da saúde paulista sob as lentes da complexidade. 2020. Dissertação de Mestrado. Universidade de São Paulo.
WOOLDRIDGE, J. M. Introductory Econometrics: A Modern Approach. 2. ed. California: South-Western College, 2002.