turicas / covid19-br

Dados diários mais recentes do coronavírus por município brasileiro
https://brasil.io/dataset/covid19
GNU Lesser General Public License v3.0
531 stars 128 forks source link

Problema de consistencia dos dados - soma por municipio #78

Closed rafapereirabr closed 4 years ago

rafapereirabr commented 4 years ago

Pessoal, estou fazendo uma agregação dos dados por municipio e data. O problema é que quando tento somar o numero de mortes o valor dá errado, embora o total de casos confirmado esteja correto. Código em R abaixo.

library(data.table)

##### read original data set
df <-data.table::fread('https://brasil.io/dataset/covid19/caso?format=csv', 
                       encoding = 'UTF-8')

#### Aggregate daily cases by municipality
cases_munis <- df[ place_type=='city', .(confirmed = sum(confirmed, nr.rm=T),
                                                      deaths = sum(deaths, nr.rm=T)), 
                                              by=.(date, state, city, is_last, estimated_population_2019)]

# remove 'Importados/Indefinidos' cases
cases_munis <- cases_munis[ !is.na(city_ibge_code)]
cases_munis <- cases_munis[ city != 'Importados/Indefinidos' ]

# check totals
cases_munis[ is_last==T, sum(confirmed, na.rm = T)]
> 12498  # valor correto

cases_munis[ is_last==T, sum(deaths, na.rm = T)]
> 1219 # valor errado. Aqui deveria em torno de 25 casos.

Repare que o mesmo código traz resultados correto por estdo.

#### Aggregate daily cases by state
cases_states <- df[ place_type=='state', .(confirmed = sum(confirmed, nr.rm=T),
                                                         deaths = sum(deaths, nr.rm=T)), by=.(date, state, is_last)]

# check totals
cases_states[ is_last==T, sum(confirmed, na.rm = T)]
> 11988

cases_states[ is_last==T, sum(deaths, na.rm = T)]
> 584
rafapereirabr commented 4 years ago

Oi Alvaro. Eu comparei o numero total de mortes agregando os resultados por estados e por municipios. Veja o codigo e resultados abaixo:

O problema parece acontecer em todas os estados, embora o problema pareça ser maior em alguns como BA, MG, PR, ES, PA, PE, RJ, RN, SP

a <- cases_states[ is_last==T, sum(deaths, na.rm = T), by=state]
b <- cases_munis[ is_last==T, sum(deaths, na.rm = T), by=state]
c <- left_join(a, b, by = "state")
names(c) <- c('state', 'dados_state', 'dados_muni')

 state dados_state dados_muni
    AC           2          5
    AL           3          6
    AM          20         28
    AP           4          4
    BA          11         62
    DF          11         11
    ES           7         25
    GO           6         27
    MA           5         11
    MG          10         73
    MS           2         11
    MT           2         16
    PA           6         23
    PB           5         12
    PE          31         47
    PI           5          9
    PR          15         81
    RJ          72        113
    RO           2          6
    RR           2          4
    RS           9         76
    SC          12         69
    SP         305        413
    TO           1          2
    RN           8         30
    CE          24         47
    SE           4          8
turicas commented 4 years ago

@rafapereirabr, de quando são os dados você está usando? Fiz uma análise aqui e encontrei valores diferentes dos seus (inconsistências apenas AM, CE e MG - que já sabemos e estamos checando).

Explicando a análise que fiz: criei algumas views em sql/setup.sql (elas são criadas pelo script analysis.sh no banco de dados SQLite data/covid19.sqlite), então criei o arquivo sql/diferenca-entre-estados-e-municipios.sql que pega o total por estado e por município e a diferença entre os valores - o resultado (depois de rodar o analysis.sh) fica no arquivo data/analysis/diferenca-entre-estados-e-municipios.csv.gz; rodei agora e obtive o seguinte resultado:

state,confirmed_cities,deaths_cities,confirmed_state,deaths_state,confirmed_diff,deaths_diff
AM,637,27,636,23,-1,-4
CE,1190,40,1188,40,-2,0
MG,560,11,559,11,-1,0
rafapereirabr commented 4 years ago

Alvaro, obrigado pela resposta. U codigo em SQL ajudou e eu acertei o erro que tinha no meu código. Obrigado mais uma vez parabens pelo trabalho!!!