ipeaGIT / acesso_oport

IPEA - Projeto Acesso a Oportunidades
https://www.ipea.gov.br/acessooportunidades/
51 stars 20 forks source link

hexágonos com renda per capita infinita porque têm renda mas não têm pop #115

Closed dhersz closed 2 years ago

dhersz commented 2 years ago

Não sei se esse problema surgiu agora com o novo processo de agregação ou já existia:

library(data.table)

grid <- setDT(readRDS("L:/Proj_acess_oport/data/acesso_oport/hex_agregados/2019/hex_agregado_rio_08_2019.rds"))

grid[is.infinite(renda_capita), .(pop_total, pop_homens, pop_mulheres, renda_total, renda_capita)]
#>     pop_total pop_homens pop_mulheres renda_total renda_capita
#>  1:         0          0            0          39          Inf
#>  2:         0          7            7         228          Inf
#>  3:         0         12           16        6471          Inf
#>  4:         0          0            0         103          Inf
#>  5:         0          0            0           3          Inf
#>  6:         0          3            3          53          Inf
#>  7:         0          1            1         100          Inf
#>  8:         0          0            0           6          Inf
#>  9:         0          0            0         136          Inf
#> 10:         0          1            1         202          Inf
#> 11:         0          0            0           7          Inf
#> 12:         0          0            0         164          Inf
#> 13:         0          0            0         407          Inf
#> 14:         0          0            0          36          Inf
#> 15:         0          0            0          80          Inf
#> 16:         0          3            3          71          Inf
#> 17:         0          0            0         275          Inf
#> 18:         0          0            0           5          Inf
#> 19:         0          0            0           8          Inf
#> 20:         0          0            0         268          Inf
#> 21:         0          0            0         178          Inf
#> 22:         0          0            0          46          Inf
#> 23:         0          0            0          61          Inf
#> 24:         0          0            0          36          Inf
#> 25:         0          0            0         155          Inf
#>     pop_total pop_homens pop_mulheres renda_total renda_capita

Created on 2022-02-01 by the reprex package (v2.0.1)

kauebraga commented 2 years ago

Isso foi um erro de uma pequena correção que estava sendo feita quando pop_total == 0 & soma(pop por cores) > 0. Quando esse caso acontecia, eu estava zerando o pop_total, mas acabei esquecendo de zerar o pop_homens e pop_mulheres.

Essa correção serve pra "esconder" um problema maior: o que fazer quando uma grande tem pop > 0 mas não tem nenhum setor inserido (ou quase não tem) nela que tenha população por cor ou por idade?

Exemplo: a grade abaixo tem população (pela grade) de 6 pessoas. As únicas interseções de setores com alguma população são os dois pedacinhos no superior, do esquerdo e do centro. Quando faz a interpolação, a área/população de interseção dessas áreas é tão pequena que essa grade acaba não pegando nenhuma população por cor/idade. Nesse caso, por exemplo, a grade vai "ter" 0.11 pop_branca de um setor e 0.03 pop_branca do outro. Então a grade vai ter no total 0.14 pop_branca, que quando arredonda dá 0. Por fim, essa grade vai ficar com pop_total = 3 e soma(pop por cor) = 0. Esse tipo de situação vai acontecer em áreas mais remotas. image

Talvez seja possível adotar uma solução somente para esses casos mais remotos, como, por exemplo, em vez de pegar a interseção área/população, adotar 1 ou 0. Tipo, nesse caso ai, adotar que a proporção por cor dentro dessa grade é a proporção média que foi observada nos setores que tiveram alguma interseção. Ou trabalhar algo em cima do arredondamento.

kauebraga commented 2 years ago

O jeito que tá sendo feito hoje (pra ajudar até eu mesmo entender): 1) O pedacinho superior da esquerda concentra 2% da população da grade, que dá 0.13 pessoas; 2) A proporção de população branca que tem no setor que está no pedacinho é de 89%; 3) A quantidade de pessoas brancas que tem no pedacinho é 0.13 * 0.89 = 0.11 pessoas brancas

A idéia de usar a proporção da população por cor dos setores foi justamente pra garantir que os totais por cor/idade sejam baseados na população da grande. Só não estávamos contando com essa interseção com setores sem população por cor/idade (ou seja, proporções zeradas).

rafapereirabr commented 2 years ago

isso aqui foi resolvido?

kauebraga commented 2 years ago

Trazendo junto a issue https://github.com/ipeaGIT/acesso_oport/issues/103#issuecomment-1048835432

Dando uma dimensao do problema:

Solução 1: Nesse caso, acho que vale a pena a gente considerar a pop_total na grade como verdadeira, e aplicar a proporcao de pop cor e idade que tem os hex vizinhos dela. O problema desas proporção eh que adicionaria mais uma camada de erro arredondamento. Por ex, se o pop_total for 2, e a proporcao do vizinho for 25% de cada cor, ficaríamos com 0.5 habitantes para cada grupo de cor. Quando arredondasse, cada grupo ia ficar com 1 habitante, totalizando 4, que eh o dobro do pop_total. Solução 2: distribuir o pop_total igualmente ou aleatoriamente por cada classe de cor/idade. Se for distribuir igualmente, vai dar problema quando o pop_total for menor que 7, que eh o total de classes Solução 3, indesejada: zerar o pop_total. Se fossemos zerar o pop_total (grade), "perderíamos" cerca de 2600 habitantes, o que da 0.044% da população total do rio. Pra Fortaleza, ta dando 0.006%

kauebraga commented 2 years ago

Uma forma de minimizar os erros de arredondamento eh so fazer o arredondamento da pop na segunda etapa, quando passar da grade -> hex. Ai a base das grade ficaria com a populacao quebrada

rafapereirabr commented 2 years ago

Kaue, esse problema foi resolvido agora q a gente voltou a usar a interseção entre centroide da grade e os hexagonos?

kauebraga commented 2 years ago

Esses testes indicam q ta tudo OK

https://github.com/ipeaGIT/acesso_oport/blob/e91f70dacd81aea43fac9bee055c28ae39bd7523/R/03.3-agrupamento_das_variaveis_por_hexagonos.R#L326

> hex_junto[pop_total == 0 & renda_total > 0]
Empty data.table (0 rows and 40 cols): id_hex,h3_resolution,geometry,sigla_muni,ano,cor_branca...
> hex_junto[pop_total == 0 & (quintil != 0)]
Empty data.table (0 rows and 40 cols): id_hex,h3_resolution,geometry,sigla_muni,ano,cor_branca...
> hex_junto[pop_total == 0 & (decil != 0)]
Empty data.table (0 rows and 40 cols): id_hex,h3_resolution,geometry,sigla_muni,ano,cor_branca...
> hex_junto[pop_total > 0 & renda_total == 0]
Empty data.table (0 rows and 40 cols): id_hex,h3_resolution,geometry,sigla_muni,ano,cor_branca...
> hex_junto[pop_total > 0 & idade_0a5 + idade_6a14 + idade_15a18 + idade_19a24 + idade_25a39  + idade_40a69 + idade_70 == 0]
Empty data.table (0 rows and 40 cols): id_hex,h3_resolution,geometry,sigla_muni,ano,cor_branca...
> hex_junto[pop_total > 0 & cor_branca + cor_amarela + cor_indigena + cor_negra == 0]
Empty data.table (0 rows and 40 cols): id_hex,h3_resolution,geometry,sigla_muni,ano,cor_branca...