Category

microeconometria

A desigualdade de renda nos microdados da PNAD: uma análise com o R

By | microeconometria

Na última terça-feira, na nossa 10ª live de análise de dados com R (clique aqui para se inscrever para a próxima), eu mostrei como analisar microdados da PNAD Contínua com o R. Em particular, mostrei alguns dados sobre renda nesse país desigual chamado Brasil. Nesse post faço um resumo da aula.

Conheça o Curso de Avaliação de Políticas Públicas usando o R

Na aula, usei os pacotes abaixo.


library(tidyverse)
library(PNADcIBGE)
library(survey)
library(geobr)

O pacote PNADcIBGE é utilizado, basicamente, para baixar e ler os dados. Você pode baixar os microdados da PNAD de forma direta para o RStudio ou pegar os dados manualmente no ftp do IBGE. Na aula, optei por usar essa última opção, posto que há uma demora para baixar/ler os dados. Assim, peguei os microdados da PNAD Contínua trimestral referente ao 4º trimestre de 2020 no ftp e importei para o R como abaixo. Além de ler os dados, também já preparei os mesmos para ser analisado com o pacote survey.


microdados_pnadc = read_pnadc('PNADC_042020.txt', 'input_PNADC_trimestral.txt')
microdados_pnadc = pnadc_labeller(microdados_pnadc,
'dicionario_PNADC_microdados_trimestral.xls')
microdados_pnadc = pnadc_design(microdados_pnadc)

Uma vez que os dados estejam prontos, nós podemos analisar alguns dados de renda e tirar algumas lições importantes. Por exemplo, qual a renda média mensal do brasileiro? Para ver isso, podemos rodar a linha de código abaixo.


renda_media = svymean(~VD4020, microdados_pnadc, na.rm=T)

Chegamos à conclusão que a renda média mensal no nosso país é de R$ 2482,40. Há diferença se a pessoa é branca ou preta? Vejamos...


svymean(~VD4020, subset(microdados_pnadc, V2010 == "Branca"), na.rm=T)
svymean(~VD4020, subset(microdados_pnadc, V2010 == "Preta"), na.rm=T)

Uma pessoa branca ganha em média R$ 3197,70 enquanto uma pessoa preta ganha em média bem menos, R$ 1845,90.

A coisa parece ficar ainda mais complicada se adicionamos o sexo. Por exemplo, um homem branco com mais de 38 anos ganha em média R$ 4075, 40. Para ver isso, basta rodar a linha de código abaixo.


svymean(~VD4020, subset(microdados_pnadc, V2007 == 'Homem' & V2010 == "Branca" &
V2009 > 38), na.rm=T)

Já uma mulher branca com mais de 38 anos ganha em média R$ 3112,50. Homens pretos com mais de 38 anos ganham em média R$ 2311,3 e mulheres pretas com mais de 38 anos ganham em média 1684,90. Para visualizar esses dados, basta substituir no código acima o sexo (V2007) e a cor (V2010).

Nesse país extremamente desigual, o sexo e a cor da pele explicam diferenciais consideráveis de renda.

Mas, vamos lembrar que o Brasil também é um país pobre. A renda média, como visto, é de pouco menos de R$ 2500. E quanto você acha que é preciso ganhar para estar nos 10% mais ricos? Podemos ver os quantis de renda com a linha de código abaixo.


renda_quantile = svyquantile(~VD4020, microdados_pnadc,
quantiles = c(.1,.25,.5,.75,.90,.99,.999),
na.rm=TRUE, ci=TRUE)

print(xtable(renda_quantile), type='html')
0.1 0.25 0.5 0.75 0.9 0.99 0.999
VD4020 400.00 1000.00 1500.00 2500.00 5000.00 20000.00 40000.00

Pois é. Para estar entre os 10% mais ricos, basta ganhar mais do que R$ 5000 mensais. Já para estar nos 1% mais ricos, você deve auferir R$ 20 mil de renda mensal. E, acredite, para estar no 0,1% mais rico da população brasileira, você tem que ganhar mais do que R$ 40 mil mensais.

A maioria da população não tem ideia de quão pobre é o Brasil e isso é um baita problema, viu...

E a educação importa para a renda?


### Média de renda por nível educacional

mediaRendaEduc = svyby(~VD4020, ~VD3004, microdados_pnadc, svymean, na.rm=T)

mediaRendaEduc %>%
ggplot(aes(x=VD4020, y=VD3004))+
geom_bar(stat='identity', colour='lightblue', fill='lightblue')

Sim, parece que sim. Pessoas com nível superior completo auferem em média mais de R$ 5000 mensais, quase três vezes mais de quem tem apenas o ensino médio completo.

E a ocupação importa para a renda?


mediaRendaOcup = svyby(~VD4020, ~VD4008, microdados_pnadc,
svymean, na.rm=T)

mediaRendaOcup$VD4008 = recode(mediaRendaOcup$VD4008,
"Empregado no setor público (inclusive servidor estatutário e militar)" =
"Empregado no setor público")

mediaRendaOcup %>%
as_tibble() %>%
ggplot(aes(x=VD4020, y=VD4008))+
geom_bar(stat='identity', colour='orange', fill='orange')

A renda média do empregado no setor público é quase o dobro do empregado no setor privado.

Por fim, como é a renda nos estados?


### Média da Renda nas UFs

mediaRendaUF = svyby(~VD4020, ~UF, microdados_pnadc, svymean, na.rm = TRUE)

states = read_state(year=2019)

### Gráfico

no_axis = theme(axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank())

states = left_join(states, mediaRendaUF, by = c('name_state' = 'UF'))
sapply(states, function(x) sum(is.na(x)))

states$VD4020[states$name_state=='Amazônas'] = mediaRendaUF$VD4020[mediaRendaUF$UF=='Amazonas']
states$VD4020[states$name_state=='Rio Grande Do Norte'] = mediaRendaUF$VD4020[mediaRendaUF$UF=='Rio Grande do Norte']
states$VD4020[states$name_state=='Rio Grande Do Sul'] = mediaRendaUF$VD4020[mediaRendaUF$UF=='Rio Grande do Sul']
states$VD4020[states$name_state=='Mato Grosso Do Sul'] = mediaRendaUF$VD4020[mediaRendaUF$UF=='Mato Grosso do Sul']
states$VD4020[states$name_state=='Rio De Janeiro'] = mediaRendaUF$VD4020[mediaRendaUF$UF=='Rio de Janeiro']

ggplot()+
geom_sf(data=states, aes(fill = as.numeric(VD4020)), colour=NA, size=.15)+
scale_fill_distiller(palette = 'Spectral', name='Renda Média')

O Distrito Federal destoa no mapa como sendo quase uma ilha, com a maior renda média do país. Por que será?

_______________________

(*) A renda aqui considerada é o rendimento mensal efetivo de todos os trabalhos para pessoas de 14 anos ou mais de idade (apenas para pessoas que receberam em dinheiro, produtos ou mercadorias em qualquer trabalho).

(**) Conheça o Curso de Avaliação de Políticas Públicas usando o R

Avaliando o impacto do transporte público na renda

By | Economia, microeconometria

O transporte pode ter grande impacto nos aspectos econômicos de uma localidade, pois permite e expande o acesso das pessoas aos empregos, promove a eficiência e fomenta economias de aglomeração. econômica. Assim, estimaremos o impacto da construção de estações de metrô na renda dos domicílios próximos a elas. Mais especificamente, analisaremos o impacto de três estações de metrô construídas em São Paulo entre 2006 e 2007: Chácara Klabin, Santos-Imigrantes e Alto do Ipiranga.

Conheça o Curso de Avaliação de Políticas Públicas usando o R

Utilizaremos dados dos censos de 1991, 2000 e 2010 com algumas variáveis em nível de setor censitário para a cidade de São Paulo. Para fazer o download dos dados, clique aqui. Existem outras variáveis demográficas/socioeconômicas neste arquivo, mas nesta análise utilizaremos apenas a renda domiciliar per capita, a proporção de apartamentos e a proporção de pessoas com ensino superior.

 

library(tidyverse)
library(MatchIt)
library(viridis)

Para fins de definição dos setores censitários tratados, ou seja, que sofreram a intervenção da política pública, estamos considerando a distância de até 1km até a estação construída mais próxima. No mapa a seguir, mostramos como era a renda per capita dos setores censitários de São Paulo em 1991. Os números estão deflacionados e constantes para valores de 2010.


ggplot() +
geom_sf(data = df,
aes(fill = RPC_1991,
geometry = geometry),
color = NA) +
geom_sf(data = subset(df, df$tratamento == 1),
aes(geometry = geometry),
color = NA,
fill = "red",
alpha = 0.3) +
theme_classic() +
scale_fill_viridis() +
geom_curve(data = data.frame(x = -46.4617242682569, y = -23.8093571426162, xend = -46.6083021725803, yend = -23.5976335030379),
mapping = aes(x = x, y = y, xend = xend, yend = yend),
arrow = arrow(30L, unit(0.1, "inches"),
"last", "closed"),
inherit.aes = FALSE) + 
geom_text(data = data.frame(x = -46.4800517493454, y = -23.8206005999123, label = "Setores a menos de 1km das estações"),
mapping = aes(x = x, y = y, label = label),
size = 2.82, inherit.aes = FALSE)

Veja que a renda é bastante heterogênea espacialmente. Ou seja, para avaliarmos o impacto da inauguração destas estações, não podemos apenas comparar os setores tratados com o restante do município. Quando comparamos a distribuição da renda entre estes dois grupos (tratados (1) e restantes (0)) isso fica mais claro.


df %>%
select(RPC_1991, tratamento) %>%
pivot_longer(!tratamento, names_to = "variable", values_to = "value") %>%
# mutate(value = scale(value)) %>%
ggplot(aes(x = value, fill = as.factor(tratamento))) +
geom_density(alpha = .5) +
theme_classic()

Assim, para avaliar o efeito, é preciso tornar esses grupos semelhantes. Para isso, podemos utilizar técnicas de pareamento, como o Propensity Score Matching, que permite selecionar setores de dentro do grupo restante para formar um grupo de controle parecido com o grupo de tratamento. Além da renda, também utilizamos a proporção de domicílios que são apartamentos, que mede a verticalização do setor censitário, e a proporção de pessoas com ensino superior. O resultado é que a distribuição da renda do grupo de controle fica mais próxima ao setores tratados.


match = matchit(tratamento ~ RPC_1991 + AP_1991 +grad_1991, data = df, method = "nearest", ratio = 3)

matched = match.data(match)

matched %>%
select(RPC_1991, tratamento) %>%
pivot_longer(!tratamento, names_to = "variable", values_to = "value") %>%
ggplot(aes(x = value, fill = as.factor(tratamento))) +
geom_density(alpha = .5)+
theme_classic()


Com isso, podemos estimar o efeito da política pública pelo método de diferenças-em-diferenças. Uma hipótese importante que devemos cumprir para isso é avaliar se a tendência da variável de interesse dos dois grupos era paralela antes do tratamento.

df_reg = matched %>%
select(COD_SET_1991,RPC_1991, RPC_2000, RPC_2010, tratamento) %>%
pivot_longer(!c("COD_SET_1991", "tratamento"),
names_to = c(".value", "ano"),
names_sep = "(_)") %>%
mutate(ano_2010 = ifelse(ano == 2010, 1,0),
pos_tratado = ano_2010*tratamento)

df_reg %>%
group_by(tratamento, ano) %>%
summarise(mean = mean(RPC), n = n()) %>%
ggplot() +
geom_line(aes(x = ano, y = mean, group = tratamento, color = as.factor(tratamento))) +
geom_vline(xintercept = 2) +
theme_classic()

  

As tendências parecem de fato paralelas no momento anterior ao tratamento. Entretanto, idealmente, deveríamos dispor de mais períodos de tempo anteriores ao tratamento para avaliar se as tendências são de fato paralelas e dar robustez aos resultados.

Assim, estimamos o resultado com uma regressão que utiliza três variáveis binárias, ou dummies. A primeira (tratamento) é igual a 0 quando o setor censitário faz parte do grupo de controle e 1, caso seja do grupo de tratamento. A segunda (ano_2010) equivale a 0 se o período é anterior ao ano de tratamento e 1 se for após o ano de tratamento, no caso 2010. A terceira variável (pos_tratado) é a nossa variável de impacto, que é a interação das duas anteriores, ou seja, se ambas forem igual a 1, essa terá valor 1, caso contrário, 0.



reg_rpc = lm(RPC ~ tratamento + ano_2010 + pos_tratado, data = df_reg)


summary(reg_rpc)

O resultado da regressão mostra um impacto de 254 reais das estações na renda domiciliar dos setores censitários próximos, medido pelo valor do parâmetro "pos_tratado".

 

Dependent variable:
RPC
tratamento-186.231**
ano_2010836.212***
pos_tratado254.091*
Constant1,385.171***
Observations1,656
R20.135
Residual Std. Error1,089.272 (df = 1652)
Note:*p < 0.1; **p < 0.05; ***p < 0.01

_______________________

Conheça o Curso de Avaliação de Políticas Públicas usando o R

Regressões Quantílicas

By | microeconometria

No nosso Curso de Microeconometria usando o R, nosso objetivo é capacitar alunos de graduação e pós-graduação, professores e profissionais de mercado em econometria aplicada a microdados. O curso envolve tanto a apresentação teórica de modelos de regressão, quanto a aplicação no R de diversos exemplos associados a dados de corte transversal, séries de tempo e dados em painel. Espera-se que ao final do Curso o aluno tenha facilidade em desenvolver trabalhos empíricos empregando microdados.

Para ilustrar, vamos considerar hoje uma das aulas do Curso, envolvendo Regressões Quantílicas.

Regressões que utilizam o método de mínimos quadrados modelam a média condicional de uma variável de interesse. Isto é, E(Y|X), o valor esperado de y dado um vetor x. Às vezes, entretanto, podemos estar interessados em outras características da distribuição condicional, como por exemplo a mediana ou, de forma mais geral, os quantis.

O modelo de regressão quantílica pela função quantílica condicional

(1)   \begin{align*} Q_y (\tau|x) = x_{i}^{T} \beta ; \end{align*}

i.e., Q_y (\tau|x) denota o quantil \tau de y condicionado a x. As estimativas são então obtidas minimizando \sum_{i} \varrho_{\tau} (y_i - x_{i}^{T} \beta) com respeito a \beta, onde para \tau \in (0,1), \varrho_{\tau} denota a função linear por partes \varrho_{\tau} = u {\tau - I (u < 0)}, sendo I a função indicativa.

De modo a ilustrar a aplicação da regressão quantílica no R, vamos estimar o seguinte modelo:

(2)   \begin{align*} Q_{log(wage)} (\tau|x) = \beta_1 + \beta_2 experience + \beta_3 experience^2 + \beta_4 education  \end{align*}

Para estimar 2, nós recorremos à função `rq` do pacote `quantreg` e ao dataset **CPS1988**, como abaixo. Por default, `rq` seta \tau = 0.5, isto é, a mediana de y.


library(quantreg)
library(AER)
data('CPS1988')
cps_f <- log(wage) ~ experience + I(experience^2) + education
cps_lad <- rq(cps_f, data = CPS1988)

A seguir, o output da regressão.

Dependent variable:
log(wage)
experience 0.077***
(0.001)
I(experience2) -0.001***
(0.00003)
education 0.094***
(0.001)
Constant 4.241***
(0.022)
Observations 28,155
Note: *p<0.1; **p<0.05; ***p<0.01

A regressão quantílica é particularmente interessante quanto modelamos vários quantis de forma simultânea, como abaixo. Para isso, basta setar o argumento tau da função.


cps_rq <- rq(cps_f, tau = c(0.25, 0.75), data = CPS1988)

Uma questão natural derivada desse tipo de análise é se as linhas ou superfícies de regressão são paralelas; ou seja, se os efeitos dos regressores são uniformes nos quantis. Existe o método `anova()` para explorar esta questão.


cps_rq25 <- rq(cps_f, tau = 0.25, data = CPS1988)
cps_rq75 <- rq(cps_f, tau = 0.75, data = CPS1988)
anova(cps_rq25, cps_rq75, joint = FALSE)

Observamos que o efeito não é uniforme ao longo dos quantis, com as diferenças estando associadas ao coeficiente da **experiência**. Podemos ver essa diferença de modo gráfico com o código a seguir.


cps_rqbig <- rq(cps_f, tau = seq(0.05, 0.95, by = 0.05), data = CPS1988)
cps_rqbigs <- summary(cps_rqbig)
plot(cps_rqbigs)

Com isso, visualizamos a variação dos coeficientes em função de \tau, sendo bastante claro que a influência das covariáveis está longe de ser uniforme. As áreas sombreadas representam intervalos de confiança pontuais de 90% (por padrão) para as estimativas da regressão quantílica. Para comparação, as linhas horizontais sólidas e tracejadas mostradas em cada gráfico representam a estimativa do OLS e um intervalo de confiança de 90% associado.

_________

(*) Cadastre-se aqui na nossa Lista VIP para receber um super desconto na abertura das Turmas 2021.

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente