# 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
)Análise dos Dados da Pesquisa Nacional de Amostras por Domicílios (PNAD) COVID 2020
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.
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