Limpeza do ambiente e importação dos dados brutos

rm(list = ls())
gc()
##           used  (Mb) gc trigger  (Mb) max used  (Mb)
## Ncells 2299280 122.8    3962208 211.7  3962208 211.7
## Vcells 3927028  30.0    8388608  64.0  7055318  53.9
data_estudos <- fread("C:/Users/danim/Downloads/2000 - média anos de estudos.csv",
sep = ";", dec = ",", skip = 1)

data_renda <- fread("C:/Users/danim/Downloads/2000 - renda per capita.csv",
sep = ";", dec = ",", skip = 1)

data_gini <- fread("C:/Users/danim/Downloads/2000 - gini.csv",
sep = ";", dec = ",", skip = 1)

data_populacao <- fread("C:/Users/danim/Downloads/2000 - população.csv",
sep = ";", dec = ",", skip = 1)

data_populacao_urbana <- fread("C:/Users/danim/Downloads/2000 - população urbana.csv",
sep = ";", dec = ",", skip = 1)

data_area <- fread("C:/Users/danim/Downloads/2000 - area.csv",
sep = ";", dec = ",", skip = 1)

data_homicidios <- fread("C:/Users/danim/Downloads/2000 - homicidios.csv",
sep = ";", dec = ",", skip = 1)

data_desocupacao <- fread("C:/Users/danim/Downloads/2000 - desocupação.csv",
sep = ";", dec = ",", skip = 1)

data_fpm <- fread("C:/Users/danim/Downloads/2000 - fpm.csv",
sep = ";", dec = ",", skip = 1)

data_esgotofossa <- fread("C:/Users/danim/Downloads/2000 - rede esgoto e fossa.csv",
sep = ";", dec = ",", skip = 1)

data_pobreza1990 <- fread("C:/Users/danim/Downloads/ipeadata[18-11-2025-10-51].csv",
sep = ";", dec = ",", skip = 1)

data_analf1980 <- fread("C:/Users/danim/Downloads/ipeadata[22-11-2025-11-49].csv",
sep = ";", dec = ",", skip = 1)

Renomenado os elementos

Criando uma função de padronização dos datasets e Unindo as base, depois de padronizadas no conjunto de dados final

# Renomear colunas

setnames(data_estudos,          "2000", "media_anos_estudo")
setnames(data_renda,            "2000", "renda_pc")
setnames(data_gini,             "2000", "gini")
setnames(data_populacao,        "2000", "pop")
setnames(data_populacao_urbana, "2000", "pop_urb")
setnames(data_area,             "2000", "area")
setnames(data_homicidios,       "2000", "tax_hom")
setnames(data_desocupacao,      "2000", "tax_desocup")
setnames(data_fpm,              "2000", "fpm")
setnames(data_esgotofossa,      "2000", "tax_sewage")
setnames(data_pobreza1990,      "1991", "pobreza_1991")
setnames(data_analf1980,        "1980", "analfabetismo_1980")

# Função de padronização

padronizar_base <- function(dt) {
dt[, municipio_codigo := paste0(Sigla, "*", Código, "*", Município)]
cols_excluir <- c("Sigla", "Código", "Município", "V5")
cols_excluir <- intersect(cols_excluir, names(dt))
dt[, (cols_excluir) := NULL]
setcolorder(dt, c("municipio_codigo", setdiff(names(dt), "municipio_codigo")))
return(dt)
}

data_estudos           <- padronizar_base(data_estudos)
data_renda             <- padronizar_base(data_renda)
data_gini              <- padronizar_base(data_gini)
data_populacao         <- padronizar_base(data_populacao)
data_populacao_urbana  <- padronizar_base(data_populacao_urbana)
data_area              <- padronizar_base(data_area)
data_homicidios        <- padronizar_base(data_homicidios)
data_desocupacao       <- padronizar_base(data_desocupacao)
data_fpm               <- padronizar_base(data_fpm)
data_esgotofossa       <- padronizar_base(data_esgotofossa)
data_pobreza1990       <- padronizar_base(data_pobreza1990)
data_analf1980         <- padronizar_base(data_analf1980)

# Unir todas as bases

dados_2000 <- Reduce(
function(x, y) merge(x, y, by = "municipio_codigo", all = TRUE),
list(
data_estudos, data_renda, data_gini, data_populacao,
data_populacao_urbana, data_area, data_homicidios,
data_desocupacao, data_fpm,
data_esgotofossa, data_pobreza1990, data_analf1980
)
)

Criando novas variavéis a partir dos dados coletados

dados_2000[, fpm_pc        := fpm / pop]
dados_2000[, share_urbano  := 100 * (pop_urb / pop)]
dados_2000[, densidade_pop := pop / area]
dados_2000[, gini_escala   := gini * 100]

Gerando descritvas da base com e sem os NAs

stargazer(dados_2000, type = "text",
title = "Estatísticas Descritivas - Base Completa",
summary.stat = c("n","mean","sd","min","max","p25","median","p75"))
## 
## Estatísticas Descritivas - Base Completa
## =====================================================================================================================
## Statistic            N       Mean        St. Dev.     Min         Max         Pctl(25)       Median       Pctl(75)   
## ---------------------------------------------------------------------------------------------------------------------
## media_anos_estudo  5,507     4.039         1.288     0.814       9.653          3.009         4.069         4.912    
## renda_pc           5,564    338.580       192.440    62.650    1,759.760       173.520       308.720       463.207   
## gini               5,564     0.547         0.069     0.300       0.870          0.500         0.550         0.590    
## pop                5,507  30,846.710    186,763.400   795     10,435,546       5,152.5       10,473        21,407    
## pop_urb            5,506  25,049.990    180,038.200    44      9,814,133       2,401.8        5,308       13,240.8   
## area               5,507   1,543.187     5,714.000   2.900    160,755.000      205.100       415.800      1,028.600  
## tax_hom            5,562    10.703        16.427     0.000      166.810         0.000         3.400        15.697    
## tax_desocup        5,564     9.593         5.636     0.000      55.980          5.410         8.940        12.800    
## fpm                5,304 2,663,333.000 5,591,000.000 0.000  228,143,100.000 1,298,214.000 1,660,987.000 2,715,333.000
## tax_sewage         5,487    34.355        31.199     0.050      99.930          4.545        25.810        61.195    
## pobreza_1991       4,491    62.823        21.822     4.830      98.850         46.975        65.960        82.410    
## analfabetismo_1980 3,991    36.743        18.056     2.900      91.400         21.650        32.700        52.600    
## fpm_pc             5,304    213.010       656.350    0.000    46,648.200       116.652       159.220       242.534   
## share_urbano       5,506    58.757        23.326     1.447      100.000        40.435        59.224        77.875    
## densidade_pop      5,507    98.005        533.634    0.132    12,915.980       11.387        23.762        48.210    
## gini_escala        5,564    54.707         6.868       30         87             50            55            59      
## ---------------------------------------------------------------------------------------------------------------------
dados_2000l <- dados_2000[complete.cases(dados_2000)]

stargazer(dados_2000l, type = "text",
title = "Estatísticas Descritivas - Base Sem NA",
summary.stat = c("n","mean","sd","min","max","p25","median","p75"))
## 
## Estatísticas Descritivas - Base Sem NA
## =====================================================================================================================
## Statistic            N       Mean        St. Dev.     Min         Max         Pctl(25)       Median       Pctl(75)   
## ---------------------------------------------------------------------------------------------------------------------
## media_anos_estudo  3,853     4.236         1.292     1.316       9.653          3.161         4.321         5.123    
## renda_pc           3,853    359.769       200.600    69.200    1,759.760       183.700       337.110       487.970   
## gini               3,853     0.548         0.063     0.330       0.820          0.510         0.550         0.590    
## pop                3,853  39,187.080    220,041.500   795     10,435,546        6,592        13,316        26,910    
## pop_urb            3,853  32,770.290    212,178.900   423      9,814,133        3,384         7,344        17,695    
## area               3,853   1,458.454     5,960.681   3.600    160,755.000      217.100       417.800       959.700   
## tax_hom            3,853    11.019        15.347     0.000      127.960         0.000         5.770        16.360    
## tax_desocup        3,853    10.198         5.189     0.000      39.430          6.520         9.590        13.140    
## fpm                3,853 3,061,497.000 6,219,610.000 0.000  228,143,100.000 1,356,829.000 2,007,012.000 3,110,174.000
## tax_sewage         3,853    40.244        31.594     0.050      99.930          8.570        36.700        68.380    
## pobreza_1991       3,853    62.010        22.140     4.830      98.850         45.500        64.740        82.100    
## analfabetismo_1980 3,853    36.321        18.009     2.900      91.400         21.400        31.900        52.100    
## fpm_pc             3,853    181.826       145.325    0.000     4,591.236       108.443       148.795       207.000   
## share_urbano       3,853    63.712        21.492     1.559      100.000        46.894        64.850        81.370    
## densidade_pop      3,853    121.844       622.826    0.168    12,915.980       14.425        28.032        58.036    
## gini_escala        3,853    54.834         6.301       33         82             51            55            59      
## ---------------------------------------------------------------------------------------------------------------------

Gerando o Modelo OLS

modelo_olslimpo <- lm(
tax_hom ~ media_anos_estudo + renda_pc +
gini_escala + tax_desocup + tax_sewage +
share_urbano + densidade_pop,
data = dados_2000l
)

summary(modelo_olslimpo)
## 
## Call:
## lm(formula = tax_hom ~ media_anos_estudo + renda_pc + gini_escala + 
##     tax_desocup + tax_sewage + share_urbano + densidade_pop, 
##     data = dados_2000l)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -54.575  -8.928  -4.754   5.069 116.951 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -5.6421628  2.5171036  -2.242   0.0250 *  
## media_anos_estudo  0.7371891  0.4445905   1.658   0.0974 .  
## renda_pc           0.0004489  0.0027039   0.166   0.8681    
## gini_escala        0.0855465  0.0392658   2.179   0.0294 *  
## tax_desocup        0.4561056  0.0529993   8.606  < 2e-16 ***
## tax_sewage        -0.0504799  0.0101996  -4.949 7.77e-07 ***
## share_urbano       0.0836771  0.0168108   4.978 6.72e-07 ***
## densidade_pop      0.0060364  0.0003899  15.480  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.22 on 3845 degrees of freedom
## Multiple R-squared:  0.1426, Adjusted R-squared:  0.141 
## F-statistic: 91.35 on 7 and 3845 DF,  p-value: < 2.2e-16
# Testes de diagnóstico

bptest(modelo_olslimpo)  # Heterocedasticidade
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_olslimpo
## BP = 70.746, df = 7, p-value = 1.044e-12
vif(modelo_olslimpo)     # Multicolinearidade
## media_anos_estudo          renda_pc       gini_escala       tax_desocup 
##          6.277726          5.601556          1.165353          1.440047 
##        tax_sewage      share_urbano     densidade_pop 
##          1.977121          2.485395          1.123075

Gerando o Modelo IV - TSLS

modelo_tsls <- ivreg(
  tax_hom ~ media_anos_estudo + renda_pc +
    tax_desocup + tax_sewage +
    share_urbano + densidade_pop + gini_escala |
    
    # Exógenas incluídas + instrumentos excluídos
    tax_desocup + tax_sewage +
    share_urbano + densidade_pop + gini_escala +
    analfabetismo_1980 + pobreza_1991,
  
  data = dados_2000l
)
##Gerando Diagnóstico 
###Teste F - relevância, Wu-Hausmann - verificando a necessidade de usar o modelo IV
summary(modelo_tsls, diagnostics = TRUE)
## 
## Call:
## ivreg(formula = tax_hom ~ media_anos_estudo + renda_pc + tax_desocup + 
##     tax_sewage + share_urbano + densidade_pop + gini_escala | 
##     tax_desocup + tax_sewage + share_urbano + densidade_pop + 
##         gini_escala + analfabetismo_1980 + pobreza_1991, data = dados_2000l)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -60.575  -8.990  -4.370   5.262 118.128 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        7.4781108  3.2169517   2.325   0.0201 *  
## media_anos_estudo -4.4858328  0.8896108  -5.042 4.81e-07 ***
## renda_pc           0.0310942  0.0055077   5.646 1.77e-08 ***
## tax_desocup        0.6143090  0.0605695  10.142  < 2e-16 ***
## tax_sewage        -0.0601917  0.0109595  -5.492 4.23e-08 ***
## share_urbano       0.1227166  0.0185082   6.630 3.81e-11 ***
## densidade_pop      0.0060095  0.0004004  15.011  < 2e-16 ***
## gini_escala       -0.0188827  0.0432069  -0.437   0.6621    
## 
## Diagnostic tests:
##                                       df1  df2 statistic  p-value    
## Weak instruments (media_anos_estudo)    2 3845   4186.81  < 2e-16 ***
## Weak instruments (renda_pc)             2 3845   3753.93  < 2e-16 ***
## Wu-Hausman                              2 3843     24.86 1.87e-11 ***
## Sargan                                  0   NA        NA       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.5 on 3845 degrees of freedom
## Multiple R-Squared: 0.109,   Adjusted R-squared: 0.1074 
## Wald test: 91.39 on 7 and 3845 DF,  p-value: < 2.2e-16

Grafico sobre relevancia instrumental (Analfabetismo 1980 → Educação 2000)

# 1º estágio: Analfabetismo 1980 → Educação 2000
ggplot(dados_2000l, aes(x = analfabetismo_1980, y = media_anos_estudo)) +
  geom_point(alpha = 0.4, color = "darkgrey") +
  geom_smooth(method = "lm", color = "red", linewidth = 1.2) +
  labs(
    title = "Analfabetismo (1980) → Educação (2000)",
    x = "Taxa de analfabetismo em 1980 (%)",
    y = "Média de anos de estudo (2000)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title  = element_text(face = "bold", hjust = 0.5),
    axis.title  = element_text(face = "bold")
  )

Grafico sobre relevancia instrumental (Analfabetismo 1980 → Educação 2000)

# 1º estágio: Pobreza 1991 → Renda per capita 2000
ggplot(dados_2000l, aes(x = pobreza_1991, y = renda_pc)) +
  geom_point(alpha = 0.4, color = "darkgreen") +
  geom_smooth(method = "lm", color = "blue", linewidth = 1.2) +
  labs(
    title = "Pobreza (1991) → Renda per capita (2000)",
    x = "Taxa de pobreza em 1991 (%)",
    y = "Renda per capita (2000)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.title = element_text(face = "bold")
  )

Matriz Correlação Geral

vars_geral <- c(
  "media_anos_estudo", "renda_pc", "gini", "pop", "pop_urb", "area",
  "tax_hom", "tax_desocup", "fpm", "tax_sewage", "pobreza_1991",
  "analfabetismo_1980", "fpm_pc", "share_urbano", "densidade_pop",
  "gini_escala"
)

dados_corr_geral <- as.data.frame(dados_2000l[, ..vars_geral])

col_fun <- colorRampPalette(
  c("#2C7BB6", "#ABD9E9", "#FFFFFF", "#FDAE61", "#D7191C")
)

corr_geral <- cor(dados_corr_geral, use = "pairwise.complete.obs")

corrplot(
  corr_geral,
  method      = "color",
  col         = col_fun(200),
  type        = "upper",
  order       = "hclust",
  addCoef.col = "black",
  tl.col      = "black",
  tl.srt      = 45,
  number.cex  = 0.7,
  tl.cex      = 0.8,
  diag        = FALSE
)

Matriz de correlação variaveis usadas no modelo IV e OLS

# Variáveis do modelo IV:
# - Dependente: tax_hom
# - Endógenas: media_anos_estudo, renda_pc
# - Controles: gini_escala, tax_desocup, tax_sewage, share_urbano, densidade_pop
# - Instrumentos: pobreza_1991, analfabetismo_1980

vars_iv <- c(
  "tax_hom",           # dependente
  "media_anos_estudo", # endógena
  "renda_pc",          # endógena
  "gini_escala",       # controle
  "tax_desocup",       # controle
  "tax_sewage",        # controle
  "share_urbano",      # controle
  "densidade_pop",     # controle
  "pobreza_1991",      # instrumento
  "analfabetismo_1980" # instrumento
)

dados_iv <- as.data.frame(dados_2000l[, ..vars_iv])
M_iv <- cor(dados_iv, use = "pairwise.complete.obs")

labels_iv <- c(
  "Taxa de homicídios\n(por 100 mil hab.)", # tax_hom
  "Média de anos de estudo",                # media_anos_estudo
  "Renda per capita",                       # renda_pc
  "Gini (0–100)",                           # gini_escala
  "Taxa de desocupação",                    # tax_desocup
  "Proporção com esgoto/fossa",             # tax_sewage
  "Proporção urbana",                       # share_urbano
  "Densidade populacional",                 # densidade_pop
  "Pobreza 1991",                           # pobreza_1991
  "Analfabetismo 1980"                      # analfabetismo_1980
)

colnames(M_iv) <- labels_iv
rownames(M_iv) <- labels_iv

corrplot(
  M_iv,
  method      = "color",
  col         = col_fun(200),
  type        = "upper",
  order       = "original",
  addCoef.col = "black",
  number.cex  = 0.8,
  tl.col      = "black",
  tl.cex      = 0.8,
  tl.srt      = 45,
  diag        = TRUE   
)