Como usar o R para analisar dados da Covid-19 no Espírito Santo

9 minuto(s) de leitura

Diante da recente pandemia do novo coronavirus, ressalta-se a importância da discussão de políticas públicas para diferentes os grupos raciais da população brasileira. Aqui no Espírito Santo, foi criado o Observatório Capixaba da COVID-19 nas Favelas (OCOFA), com pesquisadores de diversas áreas: epidemiologia, estatística, ciências sociais, serviço social, geografia, design e comunicação. Em especial, o objetivo deste observatório é produzir dados sobre os impactos sociais da pandemia nas favelas e na população negra.

Com essa temática em mente, nesse post vamos discutir como utilizar dados do Painel da Covid-19 do ES para mostrar como podemos utilizar essas informações para produzir algumas análises importantes nesse momento.

Primeiramente vamos carregar alguns pacotes que iremos utilizar:

library(readr)
library(forcats)        # trabalhar com fatores
library(ggthemes)       # temas para gráficos
library(dplyr)          # transformar dados
library(ggplot2)        # fazer gráficos lindos
library(stringr)        # para trabalhar com textos

Após carregar os pacotes, iremos carregar o conjunto de dados. Uma forma de ler diretamente essa informação no R pode ser feita da seguinte forma.

dados <- read.csv("https://bi.static.es.gov.br/covid19/MICRODADOS.csv",
                  sep = ";",
                  fileEncoding = "ISO-8859-1")
dados <- read.csv("MICRODADOS.csv",
                  sep = ";")

Outra maneira de obter a planilha, é baixando-a diretamente pelo site e importando do seu computador, substituindo o caminho https://bi.static.es.gov.br/covid19/MICRODADOS.csv pelo local onde o arquivo está salvo no seu computador. Agora podemos começar a organizar os dados para fazermos as análises. Para a análise desse post, iremos utilizar a base de dados utilizada obtida no dia 16/11/2020.

Preparando a base de dados

Como queremos fazer a análise baseada nos casos confirmados, podemos começar aplicando um filtro para selecionarmos apenas esses casos. Depois disso, usaremos o pacote forcats para mudarmos os níveis da variável “Sexo”. Em seguida, vamos criar uma nova variável chamada “Idade” que vai receber apenas os dois primeiros dígitos da varíavel “IdadeNaNotificacao”.

dados <- filter(dados, Classificacao == "Confirmados")
dados <- dados %>% 
  mutate(Sexo = fct_recode(Sexo, 
                    Masculino ="M",
                    Feminino = "F",
                    Ignorados = "I"))

dados <- dados %>% 
  mutate(Idade = str_sub(IdadeNaDataNotificacao, end = 2))

Com essas filtragens, já podemos começar a gerar alguns gráficos interessantes como, por exemplo, a quantidade de casos confirmados separados por faixa etária, a quantidade de casos confirmados separados por Raça/Cor e um histograma de frequência separado por sexo. Vale ressaltar, que para gerar o histograma é necessário mudarmos a varíavel “Idade” para o tipo numeric do R, utilizando a função as.numeric.

Analisando a variável idade

ggplot(dados) +
  geom_bar(aes(x = FaixaEtaria), fill = "purple") +
  labs(y = "Frequência",
       x = "Faixa Etária",
       title = "Gráfico de frequência ") +
  scale_y_continuous(breaks = seq(0, 100000, 2500)) +
  theme_calc()

Neste gráfico podemos observar a frequência de casos confirmados de acordo com faixas etárias. Observamos que as faixas etárias de 30 a 39 anos, 20 a 29 anos e 40 a 49 anos foram as 3 faixas etárias com mais casos, respectivamente. Podemos notar também, que conforme a faixa etária vai aumentando, a frequência de casos confirmados vai diminuindo. Nota-se também que as faixas etárias entre 0 a 19 possui uma frequência menor, mas podemos observar um salto quando entramos no grupo de pessoas entre 20 e 29 anos.

Para o próximo gráfico, aplicamos um filtro na variável sexo que removeu os dados classificados como “Ignorados”, para melhorar a visualização e a comparação entre os sexos “Masculino” e “Feminino”, já que existia uma quantidade pequena de ignorados.

# Retirando as observações com Sexo == "Ignorados"
dados <- filter(dados, Sexo != "Ignorados")

Neste gráfico de histograma podemos comparar os sexos masculino e o feminino. Podemos notar que as duas distribuições de idade parece ser bem semelhantes entre os dois grupos.

dados <- dados %>% 
  mutate(Idade = as.numeric(Idade))

ggplot(dados, aes(x = Idade, y = ..density..)) +
  geom_histogram(color = "white", bins = 50, fill = 'purple') +
  facet_wrap(~ Sexo) +
  theme_bw() +
  ylab("Densidade") +
  scale_fill_viridis_d()

Analisando por raça/cor

ggplot(dados) +
  geom_bar(aes(x = RacaCor, fill = RacaCor)) +
  scale_y_continuous(breaks = seq(0, 200000, 10000)) +
  labs(y = "Frequência",
       x = "Raça/Cor",
       title = "Gráfico de frequência") +
  theme_bw() +
  scale_fill_viridis_d(name = "Raça/Cor")

Ao observarmos esse gráfico, observamos que pessoas brancas e pardas tem uma presença muito grande na base de dados e possuem uma frequência bem proxima uma da outra. Nota-se também que existe uma grande quantidade de pessoas que tiveram sua raça/cor não preenchida e considerada então como “Ignorada”. A raça/cor indígena é a que possui a menor frequência dentre as presentes.

Análise por região

Uma análise interessante a ser feita é considerarmos os casos nas diferentes regiões do Espírito Santo. Seguimos a divisão feita pelo Governo do Estado que pode ser encontrada clicando aqui, onde o Estado foi dividido nas seguintes regiões: Metropolitana, Central, Norte e Sul. Esta divisão pode ser vista na figura a seguir.

Usamos uma função para atribuirmos cada cidade a sua devida região.

classifica_regiao <- function(Municipio){
  reg_metropolitana <- c(
  'VITORIA',
  "DOMINGOS MARTINS" ,
  "SANTA LEOPOLDINA" ,
  "MARECHAL FLORIANO" ,
  'FUNDAO' ,
  'SERRA' ,
  'VILA VELHA' ,
  'CARIACICA' ,
  'VIANA' ,
  'GUARAPARI' ,
  "SANTA LEOPOLDINA" ,
  "DOMIGOS MARTINS" ,
  "MARCHAL FLORIANO" ,
  "SANTA TERESA" ,
  "SANTA MARIA DO JETIBA" ,
  "ITAGUACU" ,
  "LARANJA DA TERRA" ,
  "ITARANA" ,
  "AFONSO CLAUDIO" ,
  "VENDA NOVA DO IMIGRANDE" ,
  "BREJETUBA" ,
  "CONCEICAO DO CASTELO"
 )
  reg_norte <- c(
    "AGUIA BRANCA " ,
    "VENDA NOVA DO IMIGRANTE" ,
    "SANTA MARIA DE JETIBA" ,
    "MANTENOPOLIS" ,
    "JAGUARE" ,
    "SAO MATEUS" ,
    "NOVA VENECIA" ,
    "BARRA DE SAO FRANCISCO" ,
    "VILA PAVAO" ,
    "BOA ESPERANCA" ,
    "AGUA DOCE DO NORTE" ,
    "CONCEICAO DA BARRA" ,
    "PINHEIROS" ,
    "PEDRO CANARIO" ,
    "MONTANHA" ,
    "MUCURICI" ,
    "PONTO BELO" ,
    "ECOPORANGA"
  )
  
  reg_central <- c(
    "ARACRUZ" ,
    "IBIRACU" ,
    "JOAO NEIVA" ,
    "SAO ROQUE DO CANAA" ,
    "BAIXO GUANDU" ,
    "COLATINA" ,
    "MARILANDIA" ,
    "LINHARES" ,
    "RIO BANANAL" ,
    "PANCAS" ,
    "SOORETAMA" ,
    "GOVERNADOR LINDENBERG" ,
    "SAO DOMINGOS DO NORTE" ,
    "ALTO RIO NOVO" ,
    "SAO GABRIEL DA PALHA" ,
    "VILA VALERIO"
  )
  
  reg_sul <- c(
    'PRESIDENTE KENNEDY'    ,
    "MUQUI" ,
    'MARATAIZES'    ,
    'ITAPEMIRIM'    ,
    'MIMOSO DO SUL' ,
    'APIACA' ,
    'BOM JESUS DO NORTE' ,
    'SAO JOSE DO CALCADO' ,
    "MUQI" ,
    "ATILIO VIVACQUA" ,
    "PIUMA " ,
    "RIO NOVO DO SUL" ,
    "CACHOEIRO DE ITAPEMIRIM" ,
    "JERONIMO MONTEIRO" ,
    "ALEGRE" ,
    "GUACUI" ,
    "DORES DO RIO PRETO" ,
    "DIVINO DE SAO LOURENCO" ,
    "IBITIRAMA" ,
    "IUNA" ,
    "IBATIBA" ,
    "IRUPI" ,
    "MUNIZ FREIRE" ,
    "CASTELO" ,
    "VARGEM ALTA" ,
    "ALFREDO CHAVES" ,
    "ANCHIETA" ,
    "ICONHA" ,
    "RIO NOVO DO SUL" ,
    "PIUMA" ,
    "ICONHA"
  )
  regiao <- 
    ifelse(any(Municipio == reg_metropolitana),
           "Região Metropolitana", 
           ifelse(any(Municipio == reg_norte), 
                  "Região Norte", 
                  ifelse(any(Municipio == reg_central), 
                         "Região Central", 
                         ifelse(any(Municipio == reg_sul), 
                                "Região Sul", "Outro Estado")
                         )
                  )
           )
  return(regiao)
}
dados$regiao <- sapply(dados$Municipio, classifica_regiao)

Agora conseguimos observar construir um gráfico para observar a quantidade de casos por região:

ggplot(dados) + geom_bar(aes(x = regiao, fill = regiao)) +
  #scale_y_continuous(breaks = seq(0, 1000000, 10000)) +
  labs(y = "Frequência",
       x = "Regiões do Espirito Santo",
       title = "Gráfico de frequência") +
  theme_bw() +
  scale_fill_viridis_d() +
  facet_grid(scales = "free")

Podemos notar o quanto a região metropolitana se destaca em relação às outras, pois possui mais casos confirmados do que as outras 4 regiões juntas. Porém, deve-se ressaltar que tal região essa região é a mais populosa do Estado. A região norte, considerando as observações somente do Espírito Santo, foi a que menos registrou casos. Uma análise interessante que poderia ser feita, porém que não adicionaremos nesse post para não nos alongarmos, é comparar o número de confirmados pela população da região, o que nos daria um índice de incidência da doença. Isso ajudaria a entender melhor a diferença entre as regiões, porém isso não será analisado aqui nesse post.

Agora, iremos analisar em cada uma dessas regiões, os casos confirmados separados por sexo e raça/cor. Para essa análise, retiramos as observações de outros Estados. Utilizamos a função facet_wrap para separar os gráficos por região.

dados %>% 
  filter(regiao != "Outro Estado") %>% 
  ggplot() +
  geom_bar(aes(RacaCor, fill = Sexo), position = "dodge") +
  labs(y = "Frequência", x = "Raça/Cor") +
  facet_wrap(~ regiao, ncol = 2, scales = "free") +
  theme_bw() + 
  scale_fill_viridis_d() +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))

De forma geral, ao olharmos para a variável sexo, o número de casos para o sexo feminino é maior em relação ao sexo masculino em quase todas as situações. Se olharmos agora para a variável raça/cor, é visível que as classificações branca e parda têm uma frequência muito maior em relação às outras, enquanto que a raça indígena, apesar de presente nas 4 regiões, tem uma frequência maior na região central.

Podemos observar também a distribuição dos casos separados por sexo, ao longo do tempo.

dados <- dados %>%
  mutate(DataNotificacao = as.Date(DataDiagnostico)) %>% 
  filter(DataNotificacao > as.Date("2020-01-01")) # retirando erro da base

casos_t <- dados %>%
  group_by(Sexo, DataNotificacao) %>%
  summarise(n_casos = n()) %>%
  tidyr::complete(
    tidyr::nesting(Sexo),
    DataNotificacao = seq.Date(min(dados$DataNotificacao),
                               max(dados$DataNotificacao),
                               by = "day"),
    fill = list(n_casos = 0)
  ) %>%
  mutate(casos_acumulados = cumsum(n_casos))

ggplot(casos_t) +
  theme_minimal() +
  aes(x = DataNotificacao, y = casos_acumulados, color = Sexo) +
  geom_line() +
  scale_color_viridis_d() +
  labs(y = "Número de casos acumulados",
       x = "Data Diagnóstico",
       title = "Casos acumulados por sexo")

Observando o gráfico de casos acumulados separado por sexo, podemos ver de forma mais clara o que foi apontado anteriormente. O sexo femino tem uma frequência consideravelmente maior em relação ao sexo masculino, o que pode ser obervador por todo o intervalo de tempo analisado.

Por último, uma última análise interessante a ser feita, é calcular a taxa de letalidade da COVID-19. Para fazer isso precisamos calcular esse índice, podendo separar essa informação considerando algumas variáveis de interesse.

Para fazer essa tarefa criamos um data.frame chamado casos agrupando as variáveis “RacaCor” e “Sexo”, fazendo a contagem de casos confirmados. Depois, criamos um outro data.frame com as mesmas variáveis, porém esse objeto vai contar o número de mortes pela COVID-19. Por último, utilizamos a função inner.join para gerar o data.frame chamado “letalidade”, onde calculamos a taxa de letalidade da COVID-19. Vale ressaltar que a taxa de letalidade é a proporção entre o número de óbitos por uma doença em relação ao número de indivíduos acometidos por essa doença.

casos <- dados %>%
  group_by(RacaCor, Sexo) %>%
  summarise(n_casos = n())

mortes <- dados %>%
  filter(Evolucao ==  "Óbito pelo COVID-19") %>%
  group_by(RacaCor, Sexo) %>%
  summarise(n_mortes = n()) %>% 
  tidyr::complete(RacaCor, Sexo,
                  fill = list( n_mortes = 0))

letalidade <- inner_join(casos, mortes) %>%
  mutate(taxa_l =   ifelse(n_casos == 0, 0,
                           round(100 * n_mortes / n_casos, 1)))

Por último podemos fazer o gráfico dessa informação:

ggplot(letalidade) + 
  geom_col(aes(x = RacaCor, y = taxa_l, fill = Sexo), position = "dodge") +
  labs(x = "Pessoas",
       y = "Letalidade (%)",
       title = "Taxa de letalidade da COVID-19 no ES") +
  scale_fill_viridis_d() +
  theme_bw() 

Ao observamos o gráfico, notamos que a taxa de letalidade do sexo masculino é sempre maior em relação ao sexo feminino em todas as raças. É possível notar também que para raça “Indígena” só observamos valores para o sexo “Masculino”. As maiores taxas para ambos os sexos foi observada na raça “Amarela”.

Existem diversas outras variáveis no banco de dados além daquelas que utilizamos aqui. A ideia desse post foi apenas ilustrar como utilizar algumas informações e como fazer alguns gráficos descritivos. Outras ideias de análise desse banco de dados também podem ser vistas no site do OCOFA.

Atualizado em: