7  Microdados POF

Objetivo da aula: atualizar os dados de Paglioto e Machado (2012, Perfil dos frequentadores de atividades culturais: o caso nas metrópoles brasileiras).

Baixar os microdados da Pesquisa de Orçamento Familiar (POF) 2017-2018 em: https://www.ibge.gov.br/estatisticas/sociais/trabalho/9050-pesquisa-de-orcamentos-familiares.html

Figura 7.1: Microdados POF

7.1 Importar Dados

Ver arquivo oficial do IBGE: POF_2017_2018/Programas_de_Leitura_20210304/R/Leitura dos Microdados - R.R

importar_pof.R
# desabilitar notação científica
options(scipen = 999)

library(tidyverse) 
library(tidyr) 
library(dtplyr) 
library(data.table) 
library(rio)
library(here) 
library(tictoc) 

here::here()

local_codigo <- here::here()
local_dados <- here::here('/mnt/raid0/Pesquisa/Microdados/POF_2017_2018/Dados_20230713')

# local_codigo <- getwd()
# local_dados <- getwd('/mnt/raid0/Pesquisa/Microdados/POF_2017_2018/Dados_20230713')
# setwd(local_dados)
# setwd(local_codigo)
dir()

# O IBGE não disponibiliza separador entre colunas para os microdados, para 
# saber onde começa e termina cada variável devemos utilizar um arquivo de dicionário, 
# que na POF existe para o R, e está disponível em:

# POF/Memoria_de_Calculo_20200917/Memória de Cálculo/R

# a função read.fwf() permite utilizar o argumento 'widths' onde indicamos qual 
# o tamanho de cada variável, e o argumetno 'col.names' para os nomes das variáveis. Exemplo:
# a primeira variável do arquivo 'MORADOR.txt' se chama 'UF' e tem tamanho 2 (duas colunas ou dois números) 
# a segunda variável do arquivo 'MORADOR.txt' se chama 'ESTRATO_POF' e tem tamanho 4

here::here(local_dados, "MORADOR.txt")
paste(local_dados, 'MORADOR.txt', sep = '/')

# REGISTRO - MORADOR
tictoc::tic()
morador <- 
  read.fwf(here::here(local_dados, "MORADOR.txt"), 
           , widths = c(2, 4, 1, 9, 2, 1, 2, 2, 1, 2, 2, 4, 3, 1, 1,
                        1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                        1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1,
                        2, 1, 2, 14, 14, 10)
           , na.strings = c(" ")
           , col.names = c("uf", "estrato_pof", "tipo_situacao_reg",
                           "cod_upa", "num_dom", "num_uc",
                           "cod_informante", "v0306", "v0401",
                           "v04021", "v04022", "v04023", "v0403",
                           "v0404", "v0405", "v0406", "v0407",
                           "v0408", "v0409", "v0410", "v0411",
                           "v0412", "v0413", "v0414", "v0415",
                           "v0416", "v041711", "v041712", "v041721",
                           "v041722", "v041731", "v041732", "v041741",
                           "v041742", "v0418", "v0419", "v0420",
                           "v0421", "v0422", "v0423", "v0424",
                           "v0425", "v0426", "v0427", "v0428",
                           "v0429", "v0430", "anos_estudo", "peso", 
                           "peso_final", "renda_total")
           , dec = "."
)   
tictoc::toc()

data.table::fwrite(morador, here::here(local_dados, 'morador.csv'))

data.table::fread(here::here(local_dados, 'morador.csv')) |>
    dtplyr::lazy_dt() ->
    morador

dim(morador)
names(morador)
head(morador)
class(morador)

# REGISTRO - DESPESA COLETIVA
tictoc::tic()
despesa_coletiva <- 
  read.fwf(here::here(local_dados, "DESPESA_COLETIVA.txt")
           , widths = c(2, 4, 1, 9, 2, 1, 2, 2, 7, 2, 4, 10, 2, 2, 1
                        , 10, 1, 12, 10, 10, 1, 1, 2, 14, 14, 10)
           , na.strings = c(" ")
           , col.names = c("uf", "estrato_pof", "tipo_situacao_reg",
                           "cod_upa", "num_dom", "num_uc", "quadro",
                           "seq", "v9001", "v9002", "v9005", "v8000",
                           "v9010", "v9011", "v9012", "v1904",
                           "v1905", "deflator", "v8000_defla",
                           "v1904_defla", "cod_imput_valor",
                           "cod_imput_quantidade", "fator_anualizacao",
                           "peso", "peso_final", "renda_total"
           )
           , dec = "."
)
tictoc::toc()

data.table::fwrite(despesa_coletiva, here::here(local_dados, 'despesa_coletiva.csv')) 

data.table::fread(here::here(local_dados, 'despesa_coletiva.csv')) |>
    dtplyr::lazy_dt() ->
    despesa_coletiva

# REGISTRO - DESPESA INDIVIDUAL
tictoc::tic() 
despesa_individual <- 
  read.fwf(here::here(local_dados, "DESPESA_INDIVIDUAL.txt") 
           ,  widths = c(2,  4,  1,  9,  2, 1, 2, 2, 2, 7, 2, 10, 2
                        , 2, 1, 1, 1, 12, 10, 1, 2, 14, 14, 10)
           , na.strings = c(" ")
           , col.names = c("uf", "estrato_pof", "tipo_situacao_reg",
                           "cod_upa", "num_dom", "num_uc",
                           "cod_informante", "quadro", "seq", "v9001",
                           "v9002", "v8000", "v9010", "v9011", "v9012",
                           "v4104", "v4105", "deflator", "v8000_defla",
                           "cod_imput_valor", "fator_anualizacao",
                           "peso", "peso_final", "renda_total"
           )
           , dec = "."
  )   
tictoc::toc() 

data.table::fwrite(despesa_individual, here::here(local_dados, 'despesa_individual.csv')) 

# REGISTRO - ALUGUEL ESTIMADO
tictoc::tic() 
aluguel_estimado <- 
  read.fwf(here::here(local_dados, "ALUGUEL_ESTIMADO.txt")
           , widths = c(2, 4, 1, 9, 2, 1, 2, 7, 2, 10, 2, 2, 12, 10, 1, 2, 14, 14, 10)
           , na.strings = c(" ")
           , col.names = c("uf", "estrato_pof", "tipo_situacao_reg",
                           "cod_upa", "num_dom", "num_uc", "quadro",
                           "v9001", "v9002", "v8000", "v9010", "v9011",
                           "deflator", "v8000_defla", "cod_imput_valor",
                           "fator_anualizacao", "peso", "peso_final",
                           "renda_total"
           )
           , dec = "."
  )   
tictoc::toc() 

data.table::fwrite(aluguel_estimado, here::here(local_dados, 'aluguel_estimado.csv'))

# REGISTRO - RENDIMENTO DO TRABALHO
tictoc::tic() 
rendimento_trabalho <- 
  read.fwf(here::here(local_dados, "RENDIMENTO_TRABALHO.txt")
           , widths = c(2, 4, 1, 9, 2, 1, 2, 2, 1, 1, 7, 1, 1, 1, 1, 1, 1, 7, 7, 7
                        , 7, 2, 2, 3, 1, 12, 10, 10, 10, 10, 1, 1, 14, 14, 10)
           , na.strings = c(" ")
           , col.names = c("uf", "estrato_pof", "tipo_situacao_reg",
                           "cod_upa", "num_dom", "num_uc",
                           "cod_informante", "quadro", "sub_quadro",
                           "seq", "v9001", "v5302", "v53021", "v5303",
                           "v5304", "v5305", "v5307", "v8500", "v531112",
                           "v531122", "v531132", "v9010", "v9011",
                           "v5314", "v5315", "deflator", "v8500_defla",
                           "v531112_defla", "v531122_defla",
                           "v531132_defla", "cod_imput_valor",
                           "fator_anualizacao", "peso", "peso_final",
                           "renda_total"
           )
           , dec = "."
  )
tictoc::toc() 

data.table::fwrite(rendimento_trabalho, here::here(local_dados, 'rendimento_trabalho.csv')) 

# REGISTRO - OUTROS RENDIMENTOS
tictoc::tic() 
outros_rendimentos <- 
  read.fwf(here::here(local_dados, "OUTROS_RENDIMENTOS.txt")
           , widths = c(2, 4, 1, 9, 2, 1, 2, 2, 2, 7, 10, 10, 2
                        , 2, 12, 10, 10, 1, 1, 14, 14, 10
           )
           , na.strings = c(" ")
           , col.names = c("uf", "estrato_pof", "tipo_situacao_reg",
                           "cod_upa", "num_dom", "num_uc",
                           "cod_informante", "quadro", "seq", "v9001",
                           "v8500", "v8501", "v9010", "v9011",
                           "deflator", "v8500_defla", "v8501_defla",
                           "cod_imput_valor", "fator_anualizacao",
                           "peso", "peso_final", "renda_total")
           , dec = "."
  )   
tictoc::toc() 

data.table::fwrite(outros_rendimentos, here::here(local_dados, 'outros_rendimentos.csv'))

# REGISTRO - DOMICILIO
tictoc::tic() 
domicilio <- 
  read.fwf(here::here(local_dados, "DOMICILIO.txt")
           , widths = c(2, 4, 1, 9, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 
                        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 14
           )
           , na.strings = c(" ")
           , col.names = c("uf", "estrato_pof", "tipo_situacao_reg",
                           "cod_upa", "num_dom", "v0201", "v0202", 
                           "v0203", "v0204", "v0205", "v0206", "v0207",
                           "v0208", "v0209", "v02101", "v02102",
                           "v02103", "v02104", "v02105", "v02111",
                           "v02112", "v02113", "v0212", "v0213",
                           "v02141", "v02142", "v0215", "v02161", 
                           "v02162", "v02163", "v02164", "v0217", 
                           "v0219", "v0220", "v0221", "peso",
                           "peso_final"
           )
           , dec = "."
  )   
tictoc::toc() 

data.table::fwrite(domicilio, here::here(local_dados, 'domicilio.csv')) 

7.2 Modelo econométrico (Paglioto e Machado, 2012)

O modelo econométrico especificado pelas autoras (Paglioto e Machado, 2012) é:

\[P(y_i) = f(Se_i, Sd_i, C_i, E_i, EA_i, G_i, T)\]

  • Sendo:
    • \(Se_i\) seriam as características socioeconômicas do domicílio;
    • \(Sd_i\) seriam as características sociodemográficas do chefe do domicílio – incluindo o número de filhos com idade inferior a 10 anos;
    • \(C_i\) compreende os gastos com bens complementares;
    • \(E_i\) é o nível de escolaridade do chefe de domicílio;
    • \(EA_i\) seria uma medida de educação artística do chefe do domicílio;
    • \(G_i\) são as dummies de regiões metropolitanas e
    • \(T\) uma binária para captar o efeito temporal.

As autoras ainda destam:

Dentre as características educacionais, destacam-se a educação e 
prática artística que, por influenciarem diretamente a formação de 
capital cultural, está diretamente ligada à formação do hábito ou 
comportamento de “vício positivo”, como considerado por Stigler e 
Becker (1977).

O modelo foi implementado utilizando os dados da POF 2002-2003 e 2008-2009, para compatibilizar os valores monetários foi necessário corrigi-los via o Índice de Preços ao Consumidor (IPC). A POF só capta os gastos de bens e serviços artísticos culturais realizados por dispêndio, excluindo da análise o consumo onde não houve dispêncio.

Para agregar a POF 2002-2003 e 2008-2009 também é necessário considerar as diferenças na estratificação amostral e excluir a região administrativa de Brasília, não presente na POF 2002-2003.

7.3 Paglioto e Machado (2012) Variáveis do modelo Probit

Tabela 7.1: Variáveis incluídas na estimação do modelo Probit
Variáveis Descrição
gcult-externo 1 – Gasto positivo em bens culturais fora do domicílio; 0 – Gasto nulo em bens culturais fora do domicílio.
Lnrendapc Logaritmo da renda domiciliar per capita.
Lncomp Logaritmo do gasto domiciliar em bens complementares (artigos de áudio, vídeo e leitura, aparelhos e serviços).
educação artística 1 - Gasto positivo: cursos e instrumentos musicais; 0 – Gasto nulo: cursos e instrumentos musicais.
Idade Idade do chefe do domicílio.
idade2 Idade elevada ao quadrado.
Estudo Escolaridade do chefe do domicílio (anos de estudo).
Sexo Sexo do chefe do domicílio.
branca / preta Dummies para cor do chefe do domicílio (cor de referência: parda)
filhos até 10 anos Número de filhos até 10 anos de idade.
Dummies RM Dummies para cada região metropolitana da POF. (Região de referência: São Paulo)
Código
rio::import(here::here(local_dados, 'morador.csv')) |>
  tibble::as_tibble() ->
  morador

rio::import(here::here(local_dados, 'domicilio.csv')) |>
  tibble::as_tibble() ->
  domicilio

rio::import(here::here(local_dados, 'despesa_individual.csv')) |>
  tibble::as_tibble() ->
  despesa_individual

rio::import(here::here(local_dados, 'despesa_coletiva.csv')) |>
  tibble::as_tibble() ->
  despesa_coletiva

rio::import(here::here(local_dados, 'aluguel_estimado.csv')) |>
  tibble::as_tibble() -> 
  aluguel_estimado

rio::import(here::here(local_dados, 'rendimento_trabalho.csv')) |>
  tibble::as_tibble() -> 
  rendimento_trabalho

## ------ sexo, cor, idade, estudo, renda

morador |> 
  dplyr::filter(v0306 == 1) |> 
  dplyr::select(uf, estrato_pof, tipo_situacao_reg, cod_upa, num_dom, pr = v0306,  
                sexo = v0404, cor = v0405, 
                idade_anos = v0403, estudo_anos = anos_estudo) ->
  pr

morador |> 
  dplyr::group_by(uf, estrato_pof, tipo_situacao_reg, cod_upa, num_dom) |>
  dplyr::summarise(moradores = dplyr::n()) |>
  dplyr::ungroup() ->
  moradores

pr |>
  dplyr::left_join(moradores) ->
  pr

pr |>
  dplyr::filter(idade_anos >= 18) |>
  dplyr::mutate(idade = dplyr::case_when(idade_anos <= 25 ~ '18a25', 
                                         idade_anos <= 30 ~ '26a30', 
                                         idade_anos <= 40 ~ '31a40', 
                                         idade_anos <= 50 ~ '41a50', 
                                         idade_anos <= 60 ~ '51a60', 
                                         .default = "61mais")) ->
  pr

pr |>
  dplyr::mutate(estudo = dplyr::case_when(estudo_anos == 0 ~ '0', 
                                         estudo_anos <= 3 ~ '1a3', 
                                         estudo_anos <= 7 ~ '4a7', 
                                         estudo_anos <= 8 ~ '8', 
                                         estudo_anos <= 10 ~ '9a10', 
                                         estudo_anos <= 11 ~ '11', 
                                         .default = "12mais")) ->
  pr

morador |> 
  dplyr::select(uf, estrato_pof, tipo_situacao_reg, cod_upa, num_dom, v0306, sexo = v0404, idade_anos = v0403) |>
  dplyr::filter(v0306 %in% c(4, 5, 6)) |>
  dplyr::filter(idade_anos <= 10) |> 
  dplyr::group_by(uf, estrato_pof, tipo_situacao_reg, cod_upa, num_dom) |>
  dplyr::summarise(filhos_ate10 = dplyr::n()) ->
  filhos_ate10

pr |> 
  dplyr::left_join(filhos_ate10) |>
  dplyr::mutate(filhos_ate10 = tidyr::replace_na(filhos_ate10, 0)) -> 
  pr

rendimento_trabalho |>
  dplyr::select(uf, estrato_pof, tipo_situacao_reg, cod_upa, num_dom, num_uc, cod_informante, renda_total) |>
  dplyr::group_by(uf, estrato_pof, tipo_situacao_reg, cod_upa, num_dom) |> 
  dplyr::summarise(renda_total = sum(renda_total)) |> 
  dplyr::ungroup() |>
  dplyr::mutate(renda_ntile = dplyr::ntile(renda_total, 4)) ->
  renda_total

pr |> 
  dplyr::left_join(renda_total) ->
  pr

7.4 Consumiu cultura?

Na POF ver Cadastro de Produtos em POF_2017_2018/Documentacao_20210423/Cadastro de Produtos.xls e selecionar os bens e serviços culturais. Como feito na Tabela 7.2.

Tabela 7.2: Dispêndio com bens e serviços culturais
QUADRO CÓDIGO DO PRODUTO DESCRIÇÃO DO PRODUTO
28 2800101 CINEMA (INGRESSO)
28 2800201 TEATRO (INGRESSO)
28 2800301 MUSEU (INGRESSO)
28 2800401 FEIRA OU EXPOSICAO (INGRESSO)
28 2800501 CIRCO (INGRESSO)
28 2800601 PARQUE DE DIVERSAO (INGRESSO)
28 2800701 SHOW (INGRESSO)
28 2800702 SERESTA (INGRESSO)
28 2800703 FORRO (INGRESSO)
28 2800704 BAR (COUVERT ARTISTICO)
28 2800801 BAILE OU FESTA (INGRESSO)
28 2800901 DANCETERIA, BOATE OU CASA NOTURNA (INGRESSO)
28 2800902 DANCETERIA (INGRESSO)
28 2800903 BOATE (INGRESSO)
28 2800904 DISCOTECA (INGRESSO)
28 2800905 CASA NOTURNA (INGRESSO)
  • Considerar:
    • v9001 = código do tipo de despesa/aquisição
    • v9002 = forma da aquisição
    • v8000 = valor em reais
Código
cultura <- c(2800101, 2800201, 2800301, 2800401, 2800501, 2800601, 2800701, 2800702, 2800703, 2800704, 2800801, 2800901, 2800902, 2800903, 2800904, 2800905) 

vari <- c('uf', 'estrato_pof',  'cod_upa', 'tipo_situacao_reg', 'cod_upa', 'num_dom', 'num_uc', 'v9001', 'v8000')

despesa_individual |>
  dplyr::select(dplyr::all_of(vari)) |> 
  dplyr::filter(v9001 %in% cultura) |>
  dplyr::filter(v8000 != 9999999.99) |>
  dplyr::group_by(uf, estrato_pof, cod_upa, num_dom) |> 
  dplyr::summarise(gasto_cultura = sum(v8000))  |> 
  dplyr::arrange(desc(gasto_cultura)) |>
  dplyr::ungroup() ->
  gasto_cultura

despesa_coletiva |>
  dplyr::select(dplyr::all_of(vari)) |> 
  dplyr::filter(v9001 %in% cultura) 

pr |> 
  dplyr::left_join(gasto_cultura) |>
  dplyr::mutate(gastou_com_cultura = ifelse(is.na(gasto_cultura), 'gc_Nao', 'gc_Sim')) ->
  pr

# pr |> 
  # dplyr::select(1:9, gastou_com_cultura) 

pr |> 
  dplyr::count(sexo, gastou_com_cultura) |>
  dplyr::mutate(n = paste0(n, ' (',  round(n / sum(n) , digits = 2), ')')) |>
  tidyr::pivot_wider(names_from = gastou_com_cultura, values_from = n) ->
  sexo_gc

pr |> 
  dplyr::count(gastou_com_cultura, cor) |>
  dplyr::mutate(n = paste0(n, ' (',  round(n / sum(n) , digits = 3), ')')) |>
  tidyr::pivot_wider(names_from = gastou_com_cultura, values_from = n) ->
  cor_gc

pr |> 
  dplyr::count(gastou_com_cultura, idade) |>
  dplyr::mutate(n = paste0(n, ' (',  round(n / sum(n) , digits = 2), ')')) |>
  tidyr::pivot_wider(names_from = gastou_com_cultura, values_from = n) ->
  idade_gc

pr |> 
  dplyr::count(gastou_com_cultura, estudo) |>
  dplyr::mutate(n = paste0(n, ' (',  round(n / sum(n) , digits = 2), ')')) |>
  tidyr::pivot_wider(names_from = gastou_com_cultura, values_from = n) ->
  estudo_gc

pr |> 
  dplyr::count(gastou_com_cultura, filhos_ate10) |>
  dplyr::mutate(n = paste0(n, ' (',  round(n / sum(n) , digits = 2), ')')) |>
  tidyr::pivot_wider(names_from = gastou_com_cultura, values_from = n) ->
  filhos_ate10_gc

pr |> 
  dplyr::filter(!is.na(renda_ntile)) |> 
  dplyr::count(gastou_com_cultura, renda_ntile) |>
  dplyr::mutate(n = paste0(n, ' (',  round(n / sum(n) , digits = 2), ')')) |>
  tidyr::pivot_wider(names_from = gastou_com_cultura, values_from = n) ->
  renda_ntile_gc

7.5 Região metropolitana

Código
## ---- região metropolitana

capital <- c(1101, 1102, 1201, 1301:1306, 1401, 1402, 1501:1503, 1601, 1602, 1701, 2101:2103, 2201:2203, 2301:2306, 2401, 2402,  2501:2503, 2601:2603, 2701:2703, 2801, 2802, 2901:2906, 3101:3106, 3201, 3202, 3301:3309, 3501:3509, 4101:4105, 4201, 4202, 4301:4306, 5001:5003, 5101, 5102, 5201:5203, 5301:5306)

regmtr <- c(1307, 1504, 1505, 1603, 2104, 2307:2309, 2403, 2504, 2505, 2604:2606, 2704, 2803, 2907:2909, 3107:3109, 3203:3205, 3310:3318, 3510:3515, 4106:4108, 4203, 4204, 4307:4309, 5103, 5204:5206, 5301:5306)

pr |>
  dplyr::mutate(regmtr = ifelse(estrato_pof %in% c(regmtr, capital), 'RegMetr', 'Nao RegMtr')) ->
  pr

addmargins(table(pr$regmtr, pr$gastou_com_cultura, useNA = 'ifany'))

# busca genérica para MT
pr |>
  dplyr::filter(estrato_pof %in% 5101:5112) |>
  dplyr::select(4:19) |>
  dplyr::filter(regmtr == 'Nao RegMtr')

7.6 Gastou com educação artística?

Código
educacao_artistica <- c(4301901, 4302201, 4302301, 4302401, 4302501, 4302601, 4302701, 4302801, 4302901, 4303001, 4303101, 4303201, 4303301, 4303401, 4303501, 4303601, 4303701, 4303801, 4303901, 4304001, 4304101, 4304102, 4304103, 4304104, 4304105, 4304106, 4304107, 4304108, 4304109, 4304110, 4304201, 4304202, 4902802, 4904101, 4905801, 4906001, 4906201, 4910301, 4910701, 4911001, 4912901)

vari <- c('uf', 'estrato_pof',  'cod_upa', 'tipo_situacao_reg', 'cod_upa', 'num_dom', 'num_uc', 
          'v9001', 'v8000')

despesa_individual |>
  dplyr::select(dplyr::all_of(vari)) |> 
  dplyr::filter(v9001 %in% educacao_artistica) |>
  dplyr::filter(v8000 != 9999999.99) |>
  dplyr::group_by(uf, estrato_pof, cod_upa, num_dom, num_uc) |> 
  dplyr::summarise(gasto_educacao_artistica = sum(v8000))  |> 
  dplyr::arrange(desc(gasto_educacao_artistica)) |>
  dplyr::ungroup() ->
  di_educacao_artistica

despesa_coletiva |>
  dplyr::select(dplyr::all_of(vari)) |> 
  dplyr::filter(v9001 %in% educacao_artistica) |>
  dplyr::filter(v8000 != 9999999.99) |>
  dplyr::group_by(uf, estrato_pof, cod_upa, num_dom, num_uc) |> 
  dplyr::summarise(gasto_educacao_artistica = sum(v8000))  |> 
  dplyr::arrange(desc(gasto_educacao_artistica)) |>
  dplyr::ungroup() ->
  dc_educacao_artistica

rbind(dc_educacao_artistica, di_educacao_artistica) |>
  dplyr::group_by(uf, estrato_pof, cod_upa, num_dom, num_uc) |> 
  dplyr::summarise(gasto_educacao_artistica = sum(gasto_educacao_artistica)) |>
  dplyr::ungroup() ->
  gasto_educacao_artistica

7.7 Microdados Brasil

Pacote de R para baixar microdados de forma fácil.

https://github.com/lucasmation/microdadosBrasil

Código
# install.packages("devtools")
devtools::install_github("lucasmation/microdadosBrasil")
library('microdadosBrasil')