Análise dos Dados da Pesquisa Nacional de Amostras por Domicílios (PNAD) COVID 2020

Author

Lucca Nielsen

Published

Invalid Date

Introdução

Este documento apresenta a análise dos dados da PNAD COVID 2020, conforme solicitado no processo seletivo do Hospital Albert Einstein. Opto por utilizar SQL diretamente no R para essa análise, pois sou proficiente nesta linguaguem de programação e ela proporciona uma integração eficiente entre manipulação de dados e execução de consultas SQL e outras ferramentas importantes de manipulação e visualização de dados como o pacote tidyverse. O pacote sqldf será usado para este fim, permitindo executar comandos SQL diretamente em data frames no R. A documentação do pacote sqldf pode ser acessada aqui.

Configuração e Leitura dos Dados

Primeiro, instalamos e carregamos os pacotes necessários, caso ainda não estejam instalados.

# Define um mirror do CRAN
options(repos = c(CRAN = "https://cloud.r-project.org"))

# Instala e carrega o pacote pacman - gerenciador de pacotes 
if (!require("pacman")) {
  install.packages("pacman")
}

#Instala e carrega outros pacotes utlizados de maneira eficiente
pacman::p_load(
        sqldf,
        gt,
        sf,
        tmap,
        tidyverse
)

Depois importaremos os arquivos de dados da PNAD COVID 2020 de maio a novembro e combinaremos todos em um único dataframe

# Obtém a lista de todos os arquivos CSV na pasta
arquivos_csv <- list.files(path = "dados", pattern = "\\.csv$", full.names = TRUE)

# Inicializa uma lista vazia para armazenar os dados de cada arquivo CSV
lista_dados <- list()

# Loop através de cada arquivo CSV e lê os dados
for (arquivo in arquivos_csv) {
  # Lê o arquivo CSV e adiciona à lista de dados
  dados <- read.csv(arquivo, sep = ",", header = TRUE)
  lista_dados <- append(lista_dados, list(dados))
}

# Combina todos os dataframes em um único dataframe
dados <- bind_rows(lista_dados)

Análise da Positividade de Testes de COVID-19

Para calcular a positividade dos testes de COVID-19, avaliamos as variáveis que contêm os resultados dos exames. Um indivíduo foi considerado positivo se tivesse obtido um resultado positivo em qualquer um dos testes realizados (SWAB, sangue de furo no dedo ou sangue de veia do braço). A taxa de positividade foi calculada dividindo o número de indivíduos positivos pelo total de indivíduos testados. Em seguida, esse valor de positividade foi estratificado por diferentes variáveis, como Unidade Federativa (UF), raça/cor, sexo e escolaridade. O objetivo é identificar possíveis disparidades e padrões relevantes na distribuição dos resultados positivos entre esses diferentes grupos demográficos

Seleção das variáveis de interesse e recodificação de sexo, raça/cor e escolaridade

# Query para selecionar colunas e filtrar linhas
library(sqldf)

dados_filtrados <- sqldf("
  SELECT 
    UF, -- Unidade Federativa
    V1013, -- Mês da pesquisa
    CASE 
      WHEN A003 = 1 THEN 'Homem'
      WHEN A003 = 2 THEN 'Mulher'
    END AS Sexo,
    CASE 
      WHEN A004 = 1 THEN 'Branca'
      WHEN A004 = 2 THEN 'Preta'
      WHEN A004 = 3 THEN 'Amarela'
      WHEN A004 = 4 THEN 'Parda'
      WHEN A004 = 5 THEN 'Indígena'
      WHEN A004 = 9 THEN 'Ignorado'
    END AS Cor_ou_raca,
    CASE 
      WHEN A005 = 1 THEN 'Sem instrução'
      WHEN A005 = 2 THEN 'Fundamental incompleto'
      WHEN A005 = 3 THEN 'Fundamental completo'
      WHEN A005 = 4 THEN 'Médio incompleto'
      WHEN A005 = 5 THEN 'Médio completo'
      WHEN A005 = 6 THEN 'Superior incompleto'
      WHEN A005 = 7 THEN 'Superior completo'
      WHEN A005 = 8 THEN 'Pós-graduação, mestrado ou doutorado'
    END AS Escolaridade,
    B009A, -- Fez o exame coletado com cotonete na boca e/ou nariz (SWAB)?
    B009B, -- Qual o resultado do exame SWAB
    B009C, -- Fez o exame de coleta de sangue através de furo no dedo?
    B009D, -- Qual o resultado do exame de furo no dedo
    B009E, -- Fez o exame de coleta de sangue através da veia do braço?
    B009F -- Qual o resultado do exame de veia no braço
  FROM dados
")

####Criação de variáveis adicionais Utilizando a função mutate do pacote tidyverse, criamos uma nova variável chamada testou_covid para aqueles que responderam Sim para pelo menos uma das perguntas B009A, B009C ou B009E. Também criamos uma variável chamada positivou_covid para quem teve o resultado de pelo menos um dos testes positivo.

# Pipeline usando tidyverse para criar as novas variáveis
dados_filtrados <- dados_filtrados %>%
  mutate(
    testou_covid = ifelse(B009A == 1 | B009C == 1 | B009E == 1, "Sim", "Não"),
    positivou_covid = ifelse((B009A == 1 & B009B == 1) | 
                              (B009C == 1 & B009D == 1) | 
                              (B009E == 1 & B009F == 1), "Sim", "Não")
  )

Taxa de positividade geral

tbl1 <- sqldf("
  SELECT 
    COUNT(*) AS Total_Observacoes,
    SUM(CASE WHEN testou_covid = 'Sim' THEN 1 ELSE 0 END) AS Total_Testou,
    SUM(CASE WHEN positivou_covid = 'Sim' THEN 1 ELSE 0 END) AS Total_Positivos,
    (SUM(CASE WHEN positivou_covid = 'Sim' THEN 1 ELSE 0 END) * 100.0) /
    SUM(CASE WHEN testou_covid = 'Sim' THEN 1 ELSE 0 END) AS Taxa_Positividade
  FROM dados_filtrados
")

Temos um total de 2.650.459 observações, das quais 185.921 pessoas responderam que realizaram pelo menos um teste para COVID-19. Dentre esses indivíduos, 45.888 testaram positivo, resultando em uma taxa de positividade geral de aproximadamente 24,7%. O próximo passo será estratificar essa taxa de positividade por variáveis demográficas, como Unidade Federativa (UF), raça/cor, sexo e escolaridade, para identificar possíveis disparidades e padrões na distribuição dos resultados positivos

Taxa de positividade por escolaridade

resultado_escolaridade <- sqldf("
  SELECT 
    Escolaridade,
    COUNT(*) AS Total_Observacoes,
    SUM(CASE WHEN testou_covid = 'Sim' THEN 1 ELSE 0 END) AS Total_Testou,
    SUM(CASE WHEN positivou_covid = 'Sim' THEN 1 ELSE 0 END) AS Total_Positivos,
    (SUM(CASE WHEN positivou_covid = 'Sim' THEN 1 ELSE 0 END) * 100.0) /
    SUM(CASE WHEN testou_covid = 'Sim' THEN 1 ELSE 0 END) AS Taxa_Positividade
  FROM dados_filtrados
  GROUP BY Escolaridade
  ORDER BY Taxa_Positividade DESC
")

resultado_escolaridade_df <- as.data.frame(resultado_escolaridade)

# Cria uma tabela mais bonita usando o pacote gt
resultado_escolaridade_df %>%
  gt() %>%
  tab_header(
    title = "Taxa de Positividade de COVID-19 por Escolaridade",
    subtitle = "Dados da PNAD COVID-19 2020"
  ) %>%
  cols_label(
    Escolaridade = "Escolaridade",
    Total_Observacoes = "Total de Observações",
    Total_Testou = "Total que Testou",
    Total_Positivos = "Total de Positivos",
    Taxa_Positividade = "Taxa de Positividade (%)"
  ) %>%
  fmt_number(
    columns = vars(Taxa_Positividade),
    decimals = 2
  ) %>%
  data_color(
    columns = vars(Taxa_Positividade),
    colors = scales::col_numeric(
      palette = c("white", "coral"),
      domain = NULL
    )
  )
Taxa de Positividade de COVID-19 por Escolaridade
Dados da PNAD COVID-19 2020
Escolaridade Total de Observações Total que Testou Total de Positivos Taxa de Positividade (%)
Médio incompleto 248591 14003 3715 26.53
Médio completo 592808 51600 13488 26.14
Fundamental completo 176349 10409 2714 26.07
Superior incompleto 137862 15667 3874 24.73
Fundamental incompleto 891585 37464 9113 24.32
Sem instrução 284766 9059 2152 23.76
Superior completo 249901 35600 8244 23.16
Pós-graduação, mestrado ou doutorado 68597 12119 2588 21.35

Observamos que as taxas de positividade de COVID-19 foram maiores entre indivíduos com ensino médio incompleto e menores entre aqueles com pós-graduação, mestrado ou doutorado.

Agora vamos ver se existem diferenças na taxa de positividade por escolaridade entre os sexos

Taxa de positividade por escolaridade e sexo

# Realiza a query para calcular a positividade por escolaridade e sexo
resultado_escolaridade_sexo <- sqldf("
  SELECT 
    Escolaridade,
    SUM(CASE WHEN Sexo = 'Homem' AND positivou_covid = 'Sim' THEN 1 ELSE 0 END) * 100.0 /
    SUM(CASE WHEN Sexo = 'Homem' AND testou_covid = 'Sim' THEN 1 ELSE 0 END) AS Taxa_Positividade_Homens,
    SUM(CASE WHEN Sexo = 'Mulher' AND positivou_covid = 'Sim' THEN 1 ELSE 0 END) * 100.0 /
    SUM(CASE WHEN Sexo = 'Mulher' AND testou_covid = 'Sim' THEN 1 ELSE 0 END) AS Taxa_Positividade_Mulheres
  FROM dados_filtrados
  GROUP BY Escolaridade
  ORDER BY Escolaridade
")

# Converte o resultado em um data frame
resultado_escolaridade_sexo_df <- as.data.frame(resultado_escolaridade_sexo)

# Cria uma tabela mais bonita usando o pacote gt
resultado_escolaridade_sexo_df %>%
  gt() %>%
  tab_header(
    title = "Taxa de Positividade de COVID-19 por Escolaridade e Sexo",
    subtitle = "Dados da PNAD COVID-19 2020"
  ) %>%
  cols_label(
    Escolaridade = "Escolaridade",
    Taxa_Positividade_Homens = "Taxa de Positividade (%) - Homens",
    Taxa_Positividade_Mulheres = "Taxa de Positividade (%) - Mulheres"
  ) %>%
  fmt_number(
    columns = vars(Taxa_Positividade_Homens, Taxa_Positividade_Mulheres),
    decimals = 2
  ) 
Taxa de Positividade de COVID-19 por Escolaridade e Sexo
Dados da PNAD COVID-19 2020
Escolaridade Taxa de Positividade (%) - Homens Taxa de Positividade (%) - Mulheres
Fundamental completo 25.17 26.91
Fundamental incompleto 23.47 25.17
Médio completo 25.16 27.00
Médio incompleto 25.75 27.36
Pós-graduação, mestrado ou doutorado 20.28 22.03
Sem instrução 23.45 24.04
Superior completo 23.01 23.26
Superior incompleto 23.09 26.09

As taxas de positividade foram mais altas entre as mulheres em todos os níveis de escolaridade. Isso pode indicar uma maior exposição ao vírus no início da pandemia, uma vez que uma parte significativa da força de trabalho na área da saúde é composta por mulheres.

Estratificação por Unidade Federativa

Inicialmente, é necessário importar um arquivo shapefile das Unidades Federativas do Brasil, disponível no site do IBGE. Em seguida, juntamos esse shapefile com um data frame que contém as taxas de positividade de COVID-19 agrupadas por UF

resultado_uf <- sqldf("
  SELECT 
    UF,
    COUNT(*) AS Total_Observacoes,
    SUM(CASE WHEN testou_covid = 'Sim' THEN 1 ELSE 0 END) AS Total_Testou,
    SUM(CASE WHEN positivou_covid = 'Sim' THEN 1 ELSE 0 END) AS Total_Positivos,
    (SUM(CASE WHEN positivou_covid = 'Sim' THEN 1 ELSE 0 END) * 100.0) /
    SUM(CASE WHEN testou_covid = 'Sim' THEN 1 ELSE 0 END) AS Taxa_Positividade
  FROM dados_filtrados
  GROUP BY UF
  
")

resultado_uf_df <- as.data.frame(resultado_uf)

# Carrega o shapefile das Unidades Federativas do Brasil
shape_uf <- st_read("dados/BR_UF_2022.shp")
Reading layer `BR_UF_2022' from data source 
  `C:\projetos\processoSeletivo_Einstein\dados\BR_UF_2022.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 27 features and 5 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -73.99045 ymin: -33.75118 xmax: -28.84764 ymax: 5.271841
Geodetic CRS:  SIRGAS 2000
# Realiza o join entre o shapefile e a tabela resultado_uf_df
shape_uf <- shape_uf %>%
        mutate(CD_UF = as.integer(CD_UF)) %>% 
        left_join(resultado_uf_df, by = c("CD_UF" = "UF"))

Com o arquivo shapefile contendo as informações de positividade, é possível criar um mapa interativo. Este mapa facilitará a consulta e a visualização dos dados de COVID-19 por Unidade Federativa, permitindo uma análise mais detalhada e intuitiva das variações regionais na taxa de positividade.

# Cria um mapa interativo com o tmap
tmap_mode("view")

mapa_interativo <- tm_shape(shape_uf) +
  tm_polygons("Taxa_Positividade", 
              style = "quantile", 
              palette = "-RdYlGn", 
              title = "Taxa de Positividade (%)",
              popup.vars = c("NM_UF", "Taxa_Positividade")) +
  tm_layout(title = "Taxa de Positividade de COVID-19 por UF")

# Exibe o mapa interativo
mapa_interativo