Skip to contents

Introdução

  • O IBGE enfrenta desafios logísticos e altos custos na coleta de dados
  • Território vasto e unidades geograficamente dispersas
  • Necessidade de otimização na alocação de Unidades Primárias de Amostragem (UPAs)

O Pacote R orce

  • Desenvolvido para otimizar a alocação das diversas “Unidades de Coleta” (UPAs, Escolas, Municípios) nas pesquisas do IBGE
  • Utiliza programação linear inteira mista
  • Objetivo: Minimizar os custos totais de coleta, tendo como dada a rede atual de agências do IBGE.

Fatores Considerados na Otimização

  • Distâncias e tempo de deslocamento
Calculados com o OpenStreetMap.
  • Custos com entrevistadores
Remuneração e custo de deslocamento (combustível, horas de trabalho e diárias).
  • Restrições específicas das agências
Carga de trabalho máxima, custos fixos, etc.

Benefícios da Otimização

  • Melhoria no Planejamento:
  • Calcula o custo da pesquisa (diárias, combustível, e remuneração).
  • Facilita o planejamento e gestão da coleta de dados
  • Otimização de Recursos:
  • Otimiza a alocação de entrevistadores e UPAs entre as agências.
  • Garante carga de trabalho equilibrada entre agências

Recursos Principais do orce

  • Roteamento e Geocodificação
  • Otimização Avançada de Alocação
  • Cálculo Detalhado de Custos
  • Flexibilidade e Adaptabilidade.
  • Auxílio no cálculo dos custos de treinamento.

PNADC e CNEFE

Pontos representativos das UPAs

  • Não utilizamos a centroide dos setores ou UPAs
  • Utilizamos, em vez disso, o CNEFE (público).
  • Para cada UPA, utilizando a função ponto_densidade, calculamos a densidade de domicílios para cada domicílio da UPA. O domicílios com a maior densidade calculada é considerado o ponto representativo do domicílio.
  • Esse procedimento diminui a possibilidade de calcular distâncias de agências a pontos vazios ou inacessíveis nos setores/UPAs.

Cálculo de distâncias

  • Função calcula_distancias auxilia nesse trabalho. Utiliza dados do OpenStreetMaps com a Open Source Routing Machine (OSRM).
  • As distâncias são calculadas entre todas as agências para os pontos representativos de cada UPAs da amostra mestra.

Cálculo de diárias

Dados do IBGE:

Parâmetro:

  • duracao_horas para calcular Pernoite

Função:

  • calcula_diarias

Função para alocação de UCs: alocar_ucs

  • Alocação otimizada de Unidade de Coleta (UCs, no caso UPAs) às agências.

  • Dados por UPA: código da UPA, agência de jurisdição, dias de coleta, número de viagens.

  • Dados por agência: código da agência, custo fixo, número máximo de dias de coleta alocáveis para a agência.

  • Dados por díade UPA-Agência: distância em km, horas de viagem, faz jus a diárias (independentemente da distância), faz jus a diárias (pernoite).


Ideal para pesquisas com equipes exclusivas ou com limitação no número de equipamentos (e.g. PeNSE).


Função para alocação de municípios: alocar_municipios

  • Realiza a alocação otimizada de municípios às agências.

  • São utilizados os mesmos argumentos e dados da função alocar_ucs.

  • Ou seja, as UCs de um mesmo município são alocadas integralmente para uma mesma agência. O custo de deslocamento agência-município é a soma dos custo de deslocamento entre cada UCs de um município e a agência candidata.


Permite maior sinergia entre as várias pesquisas em campo.


Parâmetros para o cálculo:

  • CNEFE realizado no trimestre anterior ao da 1ª entrevista do Painel
  • 200 dias de trabalho por entrevistador/ano
  • 5 dias de coleta para CNEFE e 5 dias de coleta para a PNADC
  • Uma viagem em caso de diárias inteiras, 5 (CNEFE) e 5 (PNADC) viagens nos casos sem diárias (ou com meias-diárias)
  • São sugeridas alterações de jurisdição somente quando a economia proporcionada é maior que R$ 100.

Parâmetros (2):

  • Todas as viagens são feitas por automóvel, o custo por litro de combustível é de R$ 6, o automóvel percorre 10 quilômetros com um litro. Cada hora de viagem tem custo adicional equivalente a R$ 10.
  • Viagens (ida) com mais de 1,5 horas de duração fazem jus a diárias.
  • A diária tem o valor de R$ 335, e é paga nos casos de pernoite ou quando a UPA é de fora da jurisdição/microrregião/região metropolitana da agência.
  • Remuneração por entrevistador por mês: R$ 2675 .

Parâmetros (3):

  • diarias_entrevistador_max = Inf
  • n_entrevistadores_min = 1
  • dias_treinamento = 0
  • agencias_treinadas = NULL
  • agencias_treinamento = NULL
  • distancias_agencias = NULL

Executando a otimização:

## amostra mestra/pnadc
#pontos_upas_29 <- readRDS(here::here("data-raw/pontos_upas_29.rds"))
#ufs_now <- ufs%>%filter(uf_sigla==params2$uf_sigla)

render_tables <- function(ufnow) {
  ufs_now <- ufs%>%filter(uf_sigla==ufnow)
  uf_codigo_now <- ufs_now$uf_codigo
  ufnow <- ufs%>%filter(uf_codigo==uf_codigo_now)
  amostra_mestra <- readr::read_rds(here::here("data-raw/amostra_br_2024_01_2025_06.rds"))%>%
    filter(ano_mes>=as.Date("2024-07-01"), ano_mes<=as.Date("2025-06-01"), uf_codigo==uf_codigo_now)
  amostra_pnadc <- amostra_mestra%>%
    distinct(uc=upa, pesquisa=paste("pnadc", substr(ano_mes,1,7)), agencia_codigo, dias_coleta=params2$dias_coleta_pnadc, viagens=params2$viagens_pnadc)
  library(lubridate)## so months works
  amostra_cnefe <- amostra_mestra%>%
    filter(entrevista_numero==1)%>%
    mutate(ano_mes=ano_mes-months(3))%>%
    distinct(uc=upa, pesquisa=paste("cnefe", substr(ano_mes,1,7)), agencia_codigo, dias_coleta=params2$dias_coleta_cnefe, viagens=params2$viagens_cnefe)
  carga_pnadc <- bind_rows(amostra_cnefe, amostra_pnadc)%>%
    group_by(uc, agencia_codigo, municipio_codigo=substr(uc,1,7))%>%
    summarise(dias_coleta=sum(dias_coleta), viagens=sum(viagens))
  municipio_principal <- carga_pnadc%>%group_by(municipio_codigo)%>%summarise(dias_coleta=sum(dias_coleta))%>%arrange(desc(dias_coleta))%>%
    head(1)
  carga_pnadc_uf <- carga_pnadc%>%
    filter(substr(uc,1,2)==ufnow$uf_codigo)%>%
    ## Importante: Sem as agências do principal municipio
    filter(!grepl(municipio_principal$municipio_codigo, agencia_codigo))%>%
    #ungroup#%>%filter(agencia_codigo%in%c("291360600", "291480200", "292870300", "293290300", "290490200", "292740800", "292740801", "291640100"))
    ungroup#%>%filter(agencia_codigo%in%unique(agencia_codigo)[1:20])
  
  ## distancias uc
  fname <- here::here(paste0("data-raw/distancias_agencias_upas_osrm_", uf_codigo_now, ".rds"))
  distancias_ucs_all <- readRDS(fname)%>%
    rename(uc=upa)%>%
    transmute(uc, agencia_codigo, distancia_km, duracao_horas, municipio_codigo=substr(uc,1,7), ponto_origem)%>%
    left_join(agencias_municipios_diaria, by=c("agencia_codigo", "municipio_codigo"))%>%
    semi_join(carga_pnadc_uf, by="uc")%>%
    mutate(diaria_pernoite=duracao_horas>params2$horas_viagem_pernoite)%>%
    group_by(uc, agencia_codigo)%>%
    ## só a configuração de upa mais distante
    arrange(desc(duracao_horas))%>%
    slice(1)%>%
    ungroup()
  #distancias_ucs_all%>%ungroup%>%count(ponto_origem)
  
  agencias_uf <-  carga_pnadc_uf%>%
    group_by(agencia_codigo)%>%
    summarise(n_ucs_jurisdicao=n(), dias_coleta_jurisdicao=sum(dias_coleta))%>%
    mutate(dias_coleta_agencia_max=Inf, 
           custo_fixo=0)%>%
    ## tira Cipó
    mutate(dias_coleta_agencia_max=if_else(agencia_codigo=="290790500", 0, dias_coleta_agencia_max))
  
  
  
  ## sem custo fixo nem custo de treinamento
  params_pnadc_0  <- list(ucs=carga_pnadc_uf,
                          agencias=agencias_uf,
                          custo_litro_combustivel = params2$custo_litro_combustivel,
                          custo_hora_viagem = params2$custo_hora_viagem,
                          kml = params2$kml,
                          valor_diaria = params2$valor_diaria,
                          ## em um ano de coleta, um entrevistador consegue
                          ## 48 upas pnadc / 24 upas POF / 18 Municipios
                          dias_coleta_entrevistador_max=params2$dias_coleta_entrevistador_max,
                          diarias_entrevistador_max=Inf,
                          dias_treinamento = 0,
                          agencias_treinadas = NULL,
                          agencias_treinamento  = NULL,
                          distancias_ucs=distancias_ucs_all,
                          ## for symphony solver
                          #gap_limit=5, 
                          adicional_troca_jurisdicao  = params2$adicional_troca_jurisdicao,
                          solver=params2$solver,
                          max_time=params2$max_time,
                          rel_tol=params2$rel_tol,
                          resultado_completo=FALSE 
  )
  library(tictoc)
  tic()
  estrategias_pnadc <- bind_rows(
    tibble(params_pnadc=list(params_pnadc_0), 
           descricao='sem remuneração entrevistadores'),
    tibble(params_pnadc=list(modifyList(params_pnadc_0, 
                                        list( remuneracao_entrevistador=params2$remuneracao_entrevistador*12)
    )), 
    descricao=glue::glue('remuneracao entrevistador por mês {params2$remuneracao_entrevistador}')),
    tibble(params_pnadc=list(modifyList(params_pnadc_0, 
                                        list(n_entrevistadores_min=2, remuneracao_entrevistador=params2$remuneracao_entrevistador*12)
    )), 
    descricao=glue::glue('mínimo de entrevistador=2, remuneracao entrevistador por mês {params2$remuneracao_entrevistador}')),
    tibble(params_pnadc=list(modifyList(params_pnadc_0, 
                                        list(n_entrevistadores_min=3, remuneracao_entrevistador=params2$remuneracao_entrevistador*12)
    )), 
    descricao=glue::glue('mínimo de entrevistador=3, remuneracao entrevistador {params2$remuneracao_entrevistador} por mês'))
  )%>%
    ungroup%>%#slice(1:2)%>%
    mutate(resultado_uc=purrr::map(params_pnadc, ~do.call(alocar_ucs, .x)),
           resultado_municipio=purrr::map(params_pnadc, ~do.call(alocar_municipios, .x))
           )
  #toc()
  
  estrategias_pnadc_sum_uc <-
    estrategias_pnadc%>%
    rowwise(descricao)%>%
    reframe(
      bind_rows(
        resultado_uc$resultado_agencias_otimo%>%mutate(modelo="Ótimo"),
        resultado_uc$resultado_agencias_jurisdicao%>%mutate(modelo="Jurisdição")
        )%>%
        group_by(modelo)%>%
        mutate(n_agencias=1)%>%
        summarise(across(matches("custo|n_agencias"), ~sum(.x, na.rm=TRUE))))%>%
    mutate(custo_total=custo_deslocamento+custo_fixo+custo_total_entrevistadores)%>%
    select(descricao, modelo, n_agencias, custo_total, everything())
  estrategias_pnadc_sum_municipio <-
    estrategias_pnadc%>%
    rowwise(descricao)%>%
    reframe(
      bind_rows(
        resultado_municipio$resultado_agencias_otimo%>%mutate(modelo="Ótimo"),
        resultado_municipio$resultado_agencias_jurisdicao%>%mutate(modelo="Jurisdição")
        )%>%
        group_by(modelo)%>%
        mutate(n_agencias=1)%>%
        summarise(across(matches("custo|n_agencias"), ~sum(.x, na.rm=TRUE))))%>%
    mutate(custo_total=custo_deslocamento+custo_fixo+custo_total_entrevistadores)%>%
    select(descricao, modelo, n_agencias, custo_total, everything())
  tdist <- lapply(1:nrow(estrategias_pnadc), function(i) report_plans(estrategias_pnadc$resultado_uc[[i]])|>
                    gt::tab_options(table.font.size = "small", footnotes.font.size ="small")|>
                    gt::opt_interactive(use_compact_mode = TRUE, use_filters=TRUE))
  tdist_municipios <- lapply(1:nrow(estrategias_pnadc), function(i) report_plans(estrategias_pnadc$resultado_municipio[[i]], level = "municipio_codigo")|>
                    gt::tab_options(table.font.size = "small", footnotes.font.size ="small")|>
                    gt::opt_interactive(use_compact_mode = TRUE, use_filters=TRUE))
  alocacao_municipios <- lapply(1:nrow(estrategias_pnadc), function(i) plano_municipios(r = estrategias_pnadc$resultado_municipio[[i]])%>%
                                  filter(troca)%>%
  select(municipio_nome, agencia_nome, agencia_nome_jurisdicao, total_diarias, total_diarias_jurisdicao, custo_combustivel, custo_combustivel_jurisdicao)%>%gt::gt()%>%
  gt::tab_caption("Sem remuneração por APM")%>%
  gt::opt_interactive(use_compact_mode = TRUE, use_filters=TRUE))
  
  tplans_uc <- estrategias_pnadc_sum_uc%>%
    group_by(descricao)%>%
    select(-modelo)%>%
    reframe(across(everything(), diff))%>%
    group_by(descricao)%>%
    arrange(descricao)%>%
    slice(1)%>%
    select(descricao, n_agencias, custo_total, custo_total_entrevistadores, custo_diarias, custo_combustivel)%>%
    ungroup%>%
    #arrange(-custo_total)%>%
    gt::gt()%>%
    gt::cols_label(descricao='Modelo')%>%
    gt::tab_caption("Redução de custos promovido pela otimização da rede de coleta")%>%
    print_gt()
  tplans_municipio <- estrategias_pnadc_sum_municipio%>%
    group_by(descricao)%>%
    select(-modelo)%>%
    reframe(across(everything(), diff))%>%
    group_by(descricao)%>%
    arrange(descricao)%>%
    slice(1)%>%
    select(descricao, n_agencias, custo_total, custo_total_entrevistadores, custo_diarias, custo_combustivel)%>%
    ungroup%>%
    #arrange(-custo_total)%>%
    gt::gt()%>%
    gt::cols_label(descricao='Modelo')%>%
    gt::tab_caption("Redução de custos promovido pela otimização da rede de coleta")%>%
    print_gt()
  
  list(sumario_planos_uc=tplans_uc, sumario_planos_municipio=tplans_municipio, distribuicao=tdist, distribuicao_municipios=tdist_municipios, alocacao_municipios=alocacao_municipios)
}
plano_dist <- 3

Planos RJ

r <- render_tables("RJ")
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union
#> `summarise()` has grouped output by 'uc', 'agencia_codigo'. You can override
#> using the `.groups` argument.
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
r$alocacao_municipios[[1]]

r$sumario_planos_municipio%>%
  gt::tab_caption("Por Município")
Por Município
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 0 −R$199.589 −R$256.800 R$37.520 R$14.472
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês 0 −R$199.278 −R$256.800 R$32.998 R$20.357
remuneracao entrevistador por mês 2675 −1 −R$175.245 −R$256.800 R$47.402 R$28.391
sem remuneração entrevistadores 0 −R$13.744 R$0 −R$4.020 −R$9.664
r$sumario_planos_uc%>%
  gt::tab_caption("Por UC")
Por UC
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 0 −R$244.071 −R$256.800 R$20.602 −R$8.606
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês 0 −R$280.688 −R$288.900 R$9.212 −R$1.255
remuneracao entrevistador por mês 2675 0 −R$250.234 −R$256.800 R$15.912 −R$8.567
sem remuneração entrevistadores 0 −R$18.496 R$0 −R$5.528 −R$11.322

RJ - Com remuneração dos entrevistadores

r$distribuicao_municipios[[2]]

Planos ES

r <- render_tables("ES")
#> `summarise()` has grouped output by 'uc', 'agencia_codigo'. You can override
#> using the `.groups` argument.
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
r$alocacao_municipios[[1]]

r$sumario_planos_municipio%>%
  gt::tab_caption("Por Município")
Por Município
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 0 −R$112.642 −R$96.300 −R$45.728 R$22.782
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês 0 −R$110.024 −R$96.300 −R$40.368 R$20.944
remuneracao entrevistador por mês 2675 0 −R$111.087 −R$96.300 −R$54.102 R$30.698
sem remuneração entrevistadores 0 −R$37.532 R$0 −R$58.122 R$15.766
r$sumario_planos_uc%>%
  gt::tab_caption("Por UC")
Por UC
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 0 −R$171.181 −R$128.400 −R$76.882 R$26.608
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês 0 −R$169.259 −R$128.400 −R$63.482 R$17.218
remuneracao entrevistador por mês 2675 0 −R$172.676 −R$128.400 −R$77.552 R$25.951
sem remuneração entrevistadores 0 −R$49.988 R$0 −R$77.552 R$21.290

Planos BA

r <- render_tables("BA")
#> `summarise()` has grouped output by 'uc', 'agencia_codigo'. You can override
#> using the `.groups` argument.
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
r$alocacao_municipios[[1]]

r$sumario_planos_municipio%>%
  gt::tab_caption("Por Município")
Por Município
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 −15 −R$904.492 −R$1.155.600 R$181.068 R$55.973
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês −23 −R$1.676.509 −R$2.247.000 R$513.052 R$47.579
remuneracao entrevistador por mês 2675 −3 −R$615.352 −R$674.100 −R$9.882 R$55.137
sem remuneração entrevistadores −1 −R$91.187 R$0 −R$101.840 R$7.737
r$sumario_planos_uc%>%
  gt::tab_caption("Por UC")
Por UC
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 −13 −R$948.616 −R$1.187.700 R$153.765 R$68.844
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês −22 −R$1.647.293 −R$2.118.600 R$396.808 R$60.086
remuneracao entrevistador por mês 2675 −3 −R$699.028 −R$706.200 −R$50.418 R$45.129
sem remuneração entrevistadores −1 −R$115.154 R$0 −R$127.468 R$9.032

Planos MG

r <- render_tables("MG")
#> `summarise()` has grouped output by 'uc', 'agencia_codigo'. You can override
#> using the `.groups` argument.
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
r$alocacao_municipios[[1]]

r$sumario_planos_municipio%>%
  gt::tab_caption("Por Município")
Por Município
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 −18 −R$1.059.901 −R$1.508.700 R$372.855 R$59.070
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês −34 −R$2.218.638 −R$3.402.600 R$937.498 R$197.780
remuneracao entrevistador por mês 2675 −5 −R$781.441 −R$995.100 R$126.630 R$68.592
sem remuneração entrevistadores −1 −R$49.038 R$0 −R$69.178 R$15.439
r$sumario_planos_uc%>%
  gt::tab_caption("Por UC")
Por UC
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 −20 −R$1.254.245 −R$1.797.600 R$420.258 R$96.763
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês −34 −R$2.250.974 −R$3.338.400 R$871.502 R$171.818
remuneracao entrevistador por mês 2675 −6 −R$878.419 −R$1.027.200 R$68.005 R$62.534
sem remuneração entrevistadores 0 −R$57.464 R$0 −R$83.582 R$20.109

Planos RS

r <- render_tables("RS")
#> `summarise()` has grouped output by 'uc', 'agencia_codigo'. You can override
#> using the `.groups` argument.
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
#> Joining with `by = join_by(agencia_codigo)`
r$alocacao_municipios[[1]]

r$sumario_planos_municipio%>%
  gt::tab_caption("Por Município")
Por Município
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 −2 −R$414.147 −R$513.600 R$45.058 R$41.697
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês −9 −R$671.544 −R$1.027.200 R$294.465 R$48.903
remuneracao entrevistador por mês 2675 0 −R$514.149 −R$481.500 −R$57.955 R$20.442
sem remuneração entrevistadores 0 −R$101.923 R$0 −R$107.870 R$4.887
r$sumario_planos_uc%>%
  gt::tab_caption("Por UC")
Por UC
Modelo N Agencias Custo Total Custo Total Entrevistadores Custo Diarias Custo Combustivel
mínimo de entrevistador=2, remuneracao entrevistador por mês 2675 −2 −R$507.591 −R$513.600 −R$42.042 R$36.682
mínimo de entrevistador=3, remuneracao entrevistador 2675 por mês −8 −R$746.709 −R$1.059.300 R$227.130 R$68.653
remuneracao entrevistador por mês 2675 0 −R$550.707 −R$481.500 −R$90.115 R$16.127
sem remuneração entrevistadores 0 −R$125.956 R$0 −R$135.340 R$7.029

Conclusão

  • Benefícios:
  • Economia significativa de custos
  • Planejamento aprimorado
  • Flexibilidade para diversos cenários de pesquisa e coleta de dados
  • Importância de equilibrar redução de custos com qualidade dos dados

(Possíveis) Próximos Passos

  • Alocação de UCs/municípios levando em conta o cronograma das pesquisas.
  • Utilizar algoritmo de “traveller salesman problem” para alocação ótima de grupos de UCs
  • Sugerir alteração da jurisdição das agências.