Projeto

1. Introdução

A pandemia da COVID-19 representou uma das maiores crises globais do século XXI, afetando profundamente saúde pública, economia e estruturas sociais em todas as regiões do planeta. Mais do que um evento sanitário, a pandemia expôs fragilidades preexistentes, aprofundou desigualdades e deixou impactos que ainda são sentidos até hoje, mesmo após a redução dos casos e mortes em muitos países.

Do ponto de vista social, a pandemia provocou interrupção de rotinas, fechamento de escolas e mudanças bruscas no mercado de trabalho, atingindo de forma desigual grupos vulneráveis. Diversas populações enfrentaram perda de renda, insegurança alimentar, precarização do trabalho e desafios de saúde mental, efeitos que permanecem visíveis no período pós-pandemia.
Economicamente, governos e empresas lidaram com rompimentos de cadeias produtivas, retração de consumo, endividamento, inflação e aumento da pobreza, configurando um cenário de recuperação lenta e heterogênea entre continentes e países.

Anos após o pico da crise, a pandemia e seus desdobramentos continuam a influenciar políticas públicas, decisões de investimento e debates sobre desigualdade global e capacidade de resposta dos sistemas de saúde. Nesse sentido, estudar a pandemia com apoio em dados estruturados e comparáveis continua sendo fundamental. A compreensão dos padrões epidemiológicos observados entre regiões do mundo permite identificar lições importantes para futuras emergências sanitárias, além de gerar evidências para aprimorar vigilância epidemiológica, alocação de recursos e estratégias de mitigação.

Diante desse contexto, este projeto busca responder à pergunta central:

Como os continentes se diferenciaram em termos de casos e mortes por COVID-19 ao longo do tempo, e que padrões emergem em relação à intensidade da transmissão e à letalidade (proporção mortes/casos)?

A relevância dessa investigação está associada a diversos públicos:

  • Órgãos de saúde pública que necessitam compreender a evolução da pandemia e comparar o impacto entre regiões.
  • Pesquisadores interessados em relacionar pandemia, demografia e condições socioeconômicas.
  • Gestores e formuladores de políticas, que dependem de evidências para planejar ações de prevenção, fortalecimento de sistemas de saúde e preparação para futuras crises.

Para isso, utilizamos o conjunto de dados consolidado Our World in Data (OWID), reconhecido internacionalmente pela qualidade e abrangência de suas informações sobre COVID-19. A abordagem metodológica inclui:

  • importação, limpeza e padronização dos dados;
  • consolidação de indicadores em base mensal, reduzindo oscilações diárias e facilitando comparações;
  • construção de visualizações que permitam:
    • comparar continentes em casos e mortes por milhão;
    • analisar a participação percentual no total global;
    • observar trajetórias ano a ano de cada região;
    • identificar países que mais registraram mortes em anos recentes;
    • examinar a letalidade aproximada via proporção mortes/casos;
    • explorar uma tabela hierárquica interativa, permitindo navegação de continente → país → mês/ano.

O objetivo final é construir uma análise exploratória coerente e informativa, capaz de evidenciar como a pandemia se manifestou de forma heterogênea e desigual ao redor do mundo, e por que compreender essas diferenças permanece essencial para o fortalecimento das respostas globais a crises sanitárias.

2. Pacotes

2.1 Pacotes utilizados

library(dplyr)      # Manipulação de dados
library(tidyr)      # Transformações em formato longo/largo
library(ggplot2)    # Visualizações gráficas
library(readr)      # Leitura do CSV
library(knitr)      # Tabelas formatadas
library(lubridate)  # Manipulação de datas
library(reactable)  # Tabela hierárquica interativa
library(plotly)     # Interatividade nos gráficos (tooltips)

Os pacotes acima permitem:

  • ler e limpar o conjunto de dados de forma eficiente (readr, dplyr, tidyr);
  • trabalhar corretamente com datas (lubridate);
  • construir gráficos claros e customizáveis (ggplot2) e torná-los interativos (plotly);
  • criar tabelas estáticas (knitr) e uma tabela hierárquica no estilo de matriz expansível (reactable).

3. Preparação dos dados

3.1 Fonte dos dados

Os dados utilizados são derivados do repositório Our World in Data – COVID-19 Dataset, disponível em:

https://ourworldindata.org

O arquivo compact.csv fornecido para o projeto corresponde a um subconjunto dessa base, contendo variáveis centrais de casos, mortes, população e identificação geográfica (país e continente).

3.2 Descrição da base original

A base do OWID tem como propósito acompanhar diariamente indicadores epidemiológicos e demográficos relacionados à COVID-19 para praticamente todos os países do mundo. Entre as variáveis disponíveis, destacam-se:

  • casos novos e acumulados;
  • mortes novas e acumuladas;
  • indicadores populacionais (por exemplo, população total);
  • variáveis associadas a testagem e vacinação (nem todas presentes no subconjunto utilizado).

A atualização da base é contínua e depende dos dados reportados por governos e instituições, o que implica:

  • presença de valores ausentes, especialmente em países com menor capacidade de coleta;
  • séries temporais incompletas em alguns casos;
  • diferenças na data de início e na qualidade da notificação entre países.

Neste projeto, o foco recai sobre:

  • new_cases (novos casos diários);
  • new_deaths (novas mortes diárias);
  • population (população total);
  • country (nome do país);
  • continent (continente associado);
  • date (data de referência).

3.3 Importação e limpeza

dados_raw <- read_csv("compact.csv")
## Rows: 535365 Columns: 61
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr   (3): country, code, continent
## dbl  (56): total_cases, new_cases, new_cases_smoothed, total_cases_per_milli...
## lgl   (1): human_development_index
## date  (1): date
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
dados_clean <- dados_raw %>%
  # Remover colunas totalmente vazias
  select(where(~ !all(is.na(.)))) %>%
  # Converter data para o tipo Date
  mutate(date = as.Date(date)) %>%
  # Manter apenas países com população conhecida
  filter(!is.na(population)) %>%
  # Manter apenas registros com continente definido
  filter(!is.na(continent))

As principais decisões de limpeza foram:

  • remoção de colunas sem qualquer informação;
  • conversão da coluna date para o tipo Date, o que facilita agregações mensais e anuais;
  • filtragem de países sem informação de população, já que a padronização por milhão de habitantes depende dessa variável;
  • exclusão de linhas sem continente, já que o foco é a comparação entre continentes e países claramente atribuídos a cada um.

3.4 Estrutura final dos dados

glimpse(dados_clean)
## Rows: 493,022
## Columns: 60
## $ country                                    <chr> "Afghanistan", "Afghanistan…
## $ date                                       <date> 2020-01-01, 2020-01-02, 20…
## $ total_cases                                <dbl> NA, NA, NA, 0, 0, 0, 0, 0, …
## $ new_cases                                  <dbl> NA, NA, NA, 0, 0, 0, 0, 0, …
## $ new_cases_smoothed                         <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ total_cases_per_million                    <dbl> NA, NA, NA, 0, 0, 0, 0, 0, …
## $ new_cases_per_million                      <dbl> NA, NA, NA, 0, 0, 0, 0, 0, …
## $ new_cases_smoothed_per_million             <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ total_deaths                               <dbl> NA, NA, NA, 0, 0, 0, 0, 0, …
## $ new_deaths                                 <dbl> NA, NA, NA, 0, 0, 0, 0, 0, …
## $ new_deaths_smoothed                        <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ total_deaths_per_million                   <dbl> NA, NA, NA, 0, 0, 0, 0, 0, …
## $ new_deaths_per_million                     <dbl> NA, NA, NA, 0, 0, 0, 0, 0, …
## $ new_deaths_smoothed_per_million            <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ excess_mortality                           <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ excess_mortality_cumulative                <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ excess_mortality_cumulative_absolute       <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ excess_mortality_cumulative_per_million    <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ hosp_patients                              <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ hosp_patients_per_million                  <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ weekly_hosp_admissions                     <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ weekly_hosp_admissions_per_million         <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ icu_patients                               <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ icu_patients_per_million                   <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ weekly_icu_admissions                      <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ weekly_icu_admissions_per_million          <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ stringency_index                           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ reproduction_rate                          <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ total_tests                                <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ new_tests                                  <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ total_tests_per_thousand                   <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ new_tests_per_thousand                     <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ new_tests_smoothed                         <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ new_tests_smoothed_per_thousand            <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ positive_rate                              <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ tests_per_case                             <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ total_vaccinations                         <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ people_vaccinated                          <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ people_fully_vaccinated                    <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ total_boosters                             <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ new_vaccinations                           <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ new_vaccinations_smoothed                  <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ total_vaccinations_per_hundred             <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ people_vaccinated_per_hundred              <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ people_fully_vaccinated_per_hundred        <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ total_boosters_per_hundred                 <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ new_vaccinations_smoothed_per_million      <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ new_people_vaccinated_smoothed             <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ new_people_vaccinated_smoothed_per_hundred <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ code                                       <chr> "AFG", "AFG", "AFG", "AFG",…
## $ continent                                  <chr> "Asia", "Asia", "Asia", "As…
## $ population                                 <dbl> 40578847, 40578847, 4057884…
## $ population_density                         <dbl> 62.21555, 62.21555, 62.2155…
## $ median_age                                 <dbl> 16.752, 16.752, 16.752, 16.…
## $ life_expectancy                            <dbl> 65.617, 65.617, 65.617, 65.…
## $ gdp_per_capita                             <dbl> 1516.273, 1516.273, 1516.27…
## $ extreme_poverty                            <dbl> NA, NA, NA, NA, NA, NA, NA,…
## $ diabetes_prevalence                        <dbl> 10.9, 10.9, 10.9, 10.9, 10.…
## $ handwashing_facilities                     <dbl> 48.21469, 48.21469, 48.2146…
## $ hospital_beds_per_thousand                 <dbl> 0.39, 0.39, 0.39, 0.39, 0.3…

3.5 Resumo das principais variáveis

summary_table <- dados_clean %>%
  summarise(
    total_linhas    = n(),
    min_date        = min(date),
    max_date        = max(date),
    num_paises      = n_distinct(country),
    num_continentes = n_distinct(continent),
    media_casos     = mean(new_cases, na.rm = TRUE),
    media_mortes    = mean(new_deaths, na.rm = TRUE)
  )

kable(summary_table, caption = "Resumo geral do conjunto de dados limpo")
Resumo geral do conjunto de dados limpo
total_linhas min_date max_date num_paises num_continentes media_casos media_mortes
493022 2020-01-01 2025-12-31 237 6 1613.269 14.69961

4. Análise exploratória dos dados

Nesta seção, desenvolvo a análise exploratória em diferentes níveis:

  • primeiro, em escala continental, com agregação mensal;
  • depois, com comparativos percentuais globais;
  • em seguida, com séries separadas por ano;
  • por fim, com uma medida aproximada de letalidade, rankings por país e uma tabela hierárquica detalhada.

4.1 Evolução mensal de casos e mortes por continente

dados_cont_mensal_base <- dados_clean %>%
  mutate(mes_ano = floor_date(date, "month")) %>%
  group_by(continent, mes_ano) %>%
  summarise(
    casos     = sum(new_cases,  na.rm = TRUE),
    mortes    = sum(new_deaths, na.rm = TRUE),
    populacao = sum(population, na.rm = TRUE),
    casos_milhao  = ifelse(populacao > 0, casos  / populacao * 1e6, NA_real_),
    mortes_milhao = ifelse(populacao > 0, mortes / populacao * 1e6, NA_real_),
    .groups = "drop"
  )

Casos por milhão (mensal)

p_casos_mensal_cont <- ggplot(dados_cont_mensal_base,
           aes(x = mes_ano, y = casos_milhao, color = continent)) +
  geom_line(size = 0.9, alpha = 0.9) +
  theme_minimal(base_size = 12) +
  labs(
    x = "Mes/Ano",
    y = "Novos casos por milhao (mensal)",
    color = "Continente"
  )
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Remover título antes do plotly para evitar problemas de encoding
p_casos_mensal_cont$labels$title <- NULL

g_casos_mensal <- ggplotly(
  p_casos_mensal_cont,
  tooltip = c("continent", "x", "y")
) %>%
  layout(title = list(text = "Evolucao mensal de novos casos por milhao de habitantes"),
         margin = list(t = 70))

g_casos_mensal

Mortes por milhão (mensal)

p_mortes_mensal_cont <- ggplot(dados_cont_mensal_base,
           aes(mes_ano, mortes_milhao, color = continent)) +
  geom_line(size = 0.9, alpha = 0.9) +
  theme_minimal(base_size = 12) +
  labs(
    x = "Mes/Ano",
    y = "Novas mortes por milhao (mensal)",
    color = "Continente"
  )

p_mortes_mensal_cont$labels$title <- NULL

g_mortes_mensal <- ggplotly(
  p_mortes_mensal_cont,
  tooltip = c("continent", "x", "y")
) %>%
  layout(title = list(text = "Evolucao mensal de novas mortes por milhao de habitantes"),
         margin = list(t = 70))

g_mortes_mensal

Principais insights – 4.1

  • As séries mensais deixam evidente que a pandemia não ocorreu de forma sincronizada entre os continentes.
    Enquanto regiões como Europa e América do Norte apresentaram picos de casos por milhão logo nos primeiros meses de 2020, outros continentes, como América do Sul e África, tiveram ondas mais tardias, refletindo dinâmicas diferentes de mobilidade, testagem e velocidade de transmissão.

  • A análise dos casos por milhão mostra que continentes com maior densidade populacional, urbanização avançada e forte circulação internacional (especialmente Europa) concentraram as primeiras grandes ondas da pandemia. Já continentes com características socioeconômicas e demográficas distintas registraram crescimento mais gradual ou ondas espaçadas ao longo do tempo.

  • Ao observar as mortes por milhão, nota-se que elas acompanham o comportamento geral dos casos, mas com diferenças relevantes entre continentes. Em algumas regiões, mesmo com números menores de casos por milhão, a mortalidade relativa é maior, o que sugere limitações estruturais nos sistemas de saúde, menor capacidade de detecção precoce (subnotificação) ou desafios no acesso a cuidados intensivos.

  • A comparação temporal entre casos e mortes permite identificar momentos em que determinados continentes enfrentaram pressão intensa sobre a rede hospitalar, evidenciada por picos de mortalidade mesmo sem crescimento proporcional no número de casos. Isso indica possíveis cenários de colapso, gargalos logísticos ou circulação de variantes mais agressivas.

  • De modo geral, a evolução mensal evidencia que a pandemia teve caráter heterogêneo e assimétrico no mundo: cada continente vivenciou fases críticas em momentos diferentes, com intensidade variável e capacidade distinta de resposta, o que reforça a importância de análises comparativas padronizadas como esta.

4.2 Comparativos percentuais entre continentes

Aqui, o objetivo é comparar a participação de cada continente nos totais globais mensais de casos e mortes.

dados_global_mensal <- dados_cont_mensal_base %>%
  group_by(mes_ano) %>%
  summarise(
    casos_globais  = sum(casos,  na.rm = TRUE),
    mortes_globais = sum(mortes, na.rm = TRUE),
    .groups = "drop"
  )

dados_share_mensal <- dados_cont_mensal_base %>%
  left_join(dados_global_mensal, by = "mes_ano") %>%
  mutate(
    pct_casos  = ifelse(casos_globais  > 0, casos  / casos_globais  * 100, NA_real_),
    pct_mortes = ifelse(mortes_globais > 0, mortes / mortes_globais * 100, NA_real_)
  )

Participação percentual nos casos globais (mensal)

p_pct_casos_mensal <- ggplot(dados_share_mensal,
           aes(mes_ano, pct_casos, fill = continent)) +
  geom_area(alpha = 0.85, position = "stack") +
  theme_minimal(base_size = 12) +
  labs(
    x = "Mes/Ano",
    y = "% dos casos globais",
    fill = "Continente"
  )

p_pct_casos_mensal$labels$title <- NULL

g_pct_casos_mensal <- ggplotly(
  p_pct_casos_mensal,
  tooltip = c("continent", "x", "y")
) %>%
  layout(title = list(text = "Participacao dos continentes nos casos globais (%) - base mensal"),
         margin = list(t = 70))
## Warning: Removed 18 rows containing non-finite outside the scale range
## (`stat_align()`).
g_pct_casos_mensal

Participação percentual nas mortes globais (mensal)

p_pct_mortes_mensal <- ggplot(dados_share_mensal,
           aes(mes_ano, pct_mortes, fill = continent)) +
  geom_area(alpha = 0.85, position = "stack") +
  theme_minimal(base_size = 12) +
  labs(
    x = "Mes/Ano",
    y = "% das mortes globais",
    fill = "Continente"
  )

p_pct_mortes_mensal$labels$title <- NULL

g_pct_mortes_mensal <- ggplotly(
  p_pct_mortes_mensal,
  tooltip = c("continent", "x", "y")
) %>%
  layout(title = list(text = "Participacao dos continentes nas mortes globais (%) - base mensal"),
         margin = list(t = 70))
## Warning: Removed 18 rows containing non-finite outside the scale range
## (`stat_align()`).
g_pct_mortes_mensal

Resumo percentual no período completo

share_resumo_mensal <- dados_share_mensal %>%
  group_by(continent) %>%
  summarise(
    casos_totais   = sum(casos,   na.rm = TRUE),
    mortes_totais  = sum(mortes,  na.rm = TRUE),
    casos_globais  = sum(casos_globais,  na.rm = TRUE),
    mortes_globais = sum(mortes_globais, na.rm = TRUE),
    pct_casos_total  = casos_totais  / casos_globais  * 100,
    pct_mortes_total = mortes_totais / mortes_globais * 100,
    .groups = "drop"
  )

kable(share_resumo_mensal, digits = 1,
      caption = "Participacao percentual de cada continente nos casos e mortes globais (agregado mensalmente)")
Participacao percentual de cada continente nos casos e mortes globais (agregado mensalmente)
continent casos_totais mortes_totais casos_globais mortes_globais pct_casos_total pct_mortes_total
Africa 13065161 258295 778682809 7108232 1.7 3.6
Asia 302238403 1638085 778682809 7108232 38.8 23.0
Europe 254640783 2109528 778682809 7108232 32.7 29.7
North America 124513873 1709673 778682809 7108232 16.0 24.1
Oceania 15033097 33279 778682809 7108232 1.9 0.5
South America 69191492 1359372 778682809 7108232 8.9 19.1
share_long <- share_resumo_mensal %>%
  select(continent, pct_casos_total, pct_mortes_total) %>%
  pivot_longer(-continent, names_to = "tipo", values_to = "percentual") %>%
  mutate(tipo = recode(tipo,
                       pct_casos_total  = "% Casos",
                       pct_mortes_total = "% Mortes"))

p_share_bar <- ggplot(share_long,
           aes(x = continent, y = percentual, fill = tipo)) +
  geom_col(position = position_dodge(width = 0.8)) +
  geom_text(aes(label = paste0(round(percentual, 1), "%")),
            position = position_dodge(width = 0.8),
            vjust = -0.2, size = 3) +
  theme_minimal(base_size = 12) +
  labs(
    x = "Continente",
    y = "Percentual (%)",
    fill = "Indicador"
  )

p_share_bar$labels$title <- NULL

g_share_bar <- ggplotly(
  p_share_bar,
  tooltip = c("continent", "tipo", "y")
) %>%
  layout(title = list(text = "Participacao percentual no total global (casos vs. mortes)"),
         margin = list(t = 70))

g_share_bar

Principais insights – 4.2

  • A análise da participação percentual dos continentes nos casos ao longo do tempo evidencia que o epicentro da pandemia não foi fixo, mas sim móvel. Em diferentes meses, observa-se a dominância alternada de regiões como Europa, América do Norte, América do Sul e Ásia, refletindo tanto a dinâmica própria de transmissão quanto diferenças na rapidez de detecção e notificação de casos em cada local.

  • Em vários momentos, determinados continentes apresentam uma proporção de mortes globais maior do que a sua proporção de casos, o que indica possíveis diferenças de letalidade. Esse descompasso pode sugerir:

    • maior vulnerabilidade populacional (como idade média elevada ou maior prevalência de comorbidades);
    • limitações de infraestrutura hospitalar, que ampliam a chance de evolução para casos graves;
    • subnotificação mais acentuada de casos leves ou moderados, distorcendo a taxa de mortalidade aparente;
    • circulação de variantes mais agressivas em períodos específicos.
  • A comparação entre casos e mortes como percentual do total global permite identificar regiões que, ao longo do período completo analisado, suportaram maior carga da pandemia. Esses continentes apresentaram tanto elevada participação nos casos detectados quanto proporção significativa das mortes, o que reforça pressões importantes sobre seus sistemas de saúde e indica maior impacto epidemiológico.

  • O comportamento das áreas empilhadas (gráficos de área) mostra que, mesmo quando um continente perde protagonismo em termos de casos, ele pode continuar respondendo por uma fração relevante das mortes. Isso ajuda a revelar onde a pandemia teve impacto prolongado, mesmo após redução na taxa de infecção.

  • O resumo consolidado ao final da subseção confirma essas diferenças estruturais, revelando como a distribuição global de casos e mortes não foi proporcional entre continentes. Em suma, algumas regiões concentraram mais transmissão, enquanto outras concentraram mais fatalidades, destacando desigualdades sanitárias e socioeconômicas importantes.

4.3 Séries temporais mensais por ano

Nesta subseção, separo as séries mensais por ano, o que ajuda a comparar o comportamento da pandemia em diferentes períodos dentro de cada continente.

dados_cont_mensal_ano <- dados_cont_mensal_base %>%
  mutate(ano = year(mes_ano))

Casos mensais por milhão (dividido por continente)

p_casos_mensal_ano <- ggplot(dados_cont_mensal_ano,
           aes(mes_ano, casos_milhao, color = factor(ano), group = ano)) +
  geom_line(size = 0.9) +
  facet_wrap(~ continent, scales = "free_y") +
  theme_minimal(base_size = 11) +
  labs(
    x = "Mes/Ano",
    y = "Casos por milhao (mensal)",
    color = "Ano"
  )

p_casos_mensal_ano$labels$title <- NULL

g_casos_mensal_ano <- ggplotly(
  p_casos_mensal_ano,
  tooltip = c("continent", "mes_ano", "ano", "y")
) %>%
  layout(title = list(text = "Novos casos por milhao (media mensal) por continente e ano"),
         margin = list(t = 80))

g_casos_mensal_ano

Mortes mensais por milhão (dividido por continente)

p_mortes_mensal_ano <- ggplot(dados_cont_mensal_ano,
           aes(mes_ano, mortes_milhao, color = factor(ano), group = ano)) +
  geom_line(size = 0.9) +
  facet_wrap(~ continent, scales = "free_y") +
  theme_minimal(base_size = 11) +
  labs(
    x = "Mes/Ano",
    y = "Mortes por milhao (mensal)",
    color = "Ano"
  )

p_mortes_mensal_ano$labels$title <- NULL

g_mortes_mensal_ano <- ggplotly(
  p_mortes_mensal_ano,
  tooltip = c("continent", "mes_ano", "ano", "y")
) %>%
  layout(title = list(text = "Novas mortes por milhao (media mensal) por continente e ano"),
         margin = list(t = 80))

g_mortes_mensal_ano

Principais insights – 4.3

  • A separação das séries mensais por ano permite visualizar de forma clara qual foi o período mais crítico da pandemia para cada continente. Enquanto alguns continentes concentraram suas maiores ondas logo nos primeiros anos (2020–2021), outros apresentaram picos tardios, indicando uma dinâmica própria de disseminação ou resposta mais lenta em termos de detecção e notificação.

  • Em regiões como Europa e América do Norte, observamos que os picos de casos e mortes são mais intensos em anos específicos, frequentemente alinhados com períodos de maior circulação de variantes preocupantes. Já em outros continentes, como América do Sul, Ásia e África, o padrão tende a ser mais fragmentado, com ondas sucessivas distribuídas ao longo de diferentes anos, refletindo realidades epidemiológicas e sociais distintas.

  • A análise ano a ano evidencia também que a pandemia teve intensidade e duração desiguais, mesmo entre continentes com populações semelhantes. Isso sugere que a evolução da COVID-19 em cada região foi influenciada não apenas pela transmissibilidade do vírus, mas também por fatores estruturais, como:

    • capacidade hospitalar, que afeta diretamente a mortalidade quando há sobrecarga do sistema de saúde;
    • velocidade e abrangência das políticas de restrição, que podem retardar ou suavizar picos epidemiológicos;
    • acesso a testagem, que determina o grau de detecção de casos leves e moderados;
    • cobertura vacinal, responsável por reduzir a probabilidade de evolução para casos graves e mortes.
  • Em determinados continentes, percebem-se anos em que a curva de casos cresce fortemente sem aumento proporcional de mortes, sugerindo impacto positivo de medidas de controle, melhoria no manejo clínico ou avanços tecnológicos como antivirais e vacinas. Por outro lado, há continentes em que o aumento das mortes acompanha ou supera proporcionalmente o crescimento dos casos, revelando momentos de maior vulnerabilidade ou de insuficiência da capacidade de resposta.

  • De forma geral, as séries temporais por ano ajudam a entender que a pandemia não foi apenas um surto pontual, mas sim um fenômeno que envolveu múltiplas fases com intensidade variável. Esse padrão reforça que a evolução da COVID-19 dependeu de um conjunto complexo de fatores biológicos, sociais, econômicos e políticos, o que torna as comparações entre continentes especialmente úteis para identificar padrões e desigualdades estruturais.

4.4 Proporção mortes/casos (letalidade aproximada)

Aqui, calculo uma medida aproximada de letalidade a partir dos dados mensais:

letalidade ≈ mortes / casos, em nível de continente e mês.

dados_cfr_mensal <- dados_cont_mensal_base %>%
  mutate(
    cfr = ifelse(casos > 0, mortes / casos, NA_real_)
  )

Letalidade mensal por continente

p_cfr_mensal <- ggplot(dados_cfr_mensal,
           aes(mes_ano, cfr, color = continent)) +
  geom_line(alpha = 0.8, size = 0.9) +
  coord_cartesian(ylim = c(0, 0.10)) +
  theme_minimal(base_size = 12) +
  labs(
    x = "Mes/Ano",
    y = "Mortes / Casos (ate 10%)",
    color = "Continente"
  )

p_cfr_mensal$labels$title <- NULL

g_cfr_mensal <- ggplotly(
  p_cfr_mensal,
  tooltip = c("continent", "x", "y")
) %>%
  layout(title = list(text = "Proporcao mortes/casos (letalidade aproximada) - base mensal"),
         margin = list(t = 80))

g_cfr_mensal

Distribuição da letalidade mensal por continente

p_cfr_box_mensal <- ggplot(dados_cfr_mensal %>% filter(cfr >= 0, cfr <= 0.10),
           aes(continent, cfr, fill = continent)) +
  geom_boxplot(outlier.alpha = 0.2) +
  theme_minimal(base_size = 12) +
  labs(
    x = "Continente",
    y = "Mortes / Casos"
  )

p_cfr_box_mensal$labels$title <- NULL

g_cfr_box_mensal <- ggplotly(
  p_cfr_box_mensal,
  tooltip = c("continent", "y")
) %>%
  layout(title = list(text = "Distribuicao da proporcao mortes/casos por continente (base mensal, ate 10%)"),
         margin = list(t = 80))

g_cfr_box_mensal

Principais insights – 4.4

  • A análise da proporção mortes/casos (CFR) em escala mensal evidencia que, mesmo em meses com níveis semelhantes de transmissão entre continentes, o impacto em termos de mortalidade pode ser muito diferente. Essa discrepância mostra que o número de casos, por si só, não explica o efeito da pandemia em cada região, a qualidade e disponibilidade de serviços de saúde, assim como o perfil demográfico da população, são determinantes centrais.

  • Em alguns continentes observa-se, de maneira recorrente, letalidade mais elevada ao longo do período, indicando fatores estruturais como:

    • populações mais envelhecidas (maior proporção de grupos de risco),
    • menor acesso a diagnóstico precoce,
    • subnotificação significativa de casos leves (o que inflaciona artificialmente a letalidade),
    • menor capacidade de suporte hospitalar, especialmente para internações e tratamento intensivo.
  • A letalidade mais alta em certos picos mensais pode refleter ainda pressão extrema sobre o sistema de saúde, quando o aumento rápido de casos ultrapassa a capacidade de atendimento. Em tais cenários, um crescimento relativamente modesto no número de casos pode resultar em subida acentuada das mortes, ampliando a relação mortes/casos.

  • O boxplot reforça esse padrão ao mostrar grande variabilidade entre continentes, com alguns apresentando distribuição mais concentrada (baixa dispersão) e outros exibindo valores que se distanciam fortemente da mediana. Esses valores atípicos correspondem a momentos críticos, nos quais fatores como falta de leitos, dificuldade de acesso ao sistema de saúde ou circulação de variantes mais agressivas ampliaram de forma significativa a mortalidade relativa.

  • Ao combinar a linha temporal e a distribuição estatística, torna-se evidente que a letalidade da COVID-19 não foi constante, e sim altamente sensível às condições estruturais e conjunturais de cada continente. Isso reforça a ideia de que políticas públicas e capacidade hospitalar desempenharam papel fundamental na trajetória da pandemia, muitas vezes mais determinantes do que a própria velocidade de transmissão do vírus.

4.5 Top 10 países com mais mortes em 2023 e 2024

Nesta subseção, passo da escala continental para a escala nacional, identificando os 10 países com maior número de mortes em 2023 e 2024.

dados_ano <- dados_clean %>%
  mutate(ano = year(date)) %>%
  filter(ano %in% c(2023, 2024))

ranking_mortes <- dados_ano %>%
  group_by(ano, country, continent) %>%
  summarise(
    mortes = sum(new_deaths, na.rm = TRUE),
    casos  = sum(new_cases,  na.rm = TRUE),
    prop_mortes_casos = ifelse(casos > 0, mortes / casos, NA_real_),
    .groups = "drop"
  ) %>%
  group_by(ano) %>%
  slice_max(mortes, n = 10, with_ties = FALSE) %>%
  arrange(ano, desc(mortes))

2023

top_2023 <- ranking_mortes %>% filter(ano == 2023)

kable(top_2023 %>% select(country, continent, mortes, casos, prop_mortes_casos),
      digits = 3,
      caption = "Top 10 paises com mais mortes em 2023")
## Adding missing grouping variables: `ano`
Top 10 paises com mais mortes em 2023
ano country continent mortes casos prop_mortes_casos
2023 United States North America 82041 4025133 0.020
2023 China Asia 69411 14397685 0.005
2023 Japan Asia 17195 4698502 0.004
2023 United Kingdom Europe 15953 670731 0.024
2023 Italy Europe 10255 1493963 0.007
2023 Germany Europe 9241 1195820 0.008
2023 Brazil South America 8382 1209506 0.007
2023 Russia Europe 7647 1948043 0.004
2023 France Europe 6318 1007943 0.006
2023 Canada North America 5670 281456 0.020
p_top_2023 <- ggplot(top_2023,
           aes(reorder(country, mortes), mortes, fill = continent)) +
  geom_col() +
  geom_text(aes(label = format(round(mortes, 0),
                               big.mark = ".", decimal.mark = ",")),
            hjust = -0.1, size = 3) +
  coord_flip() +
  theme_minimal(base_size = 12) +
  labs(
    x = "Pais",
    y = "Total de mortes em 2023",
    fill = "Continente"
  ) +
  expand_limits(y = max(top_2023$mortes) * 1.1)

p_top_2023$labels$title <- NULL

g_top_2023 <- ggplotly(
  p_top_2023,
  tooltip = c("country", "continent", "y")
) %>%
  layout(title = list(text = "Top 10 paises com mais mortes em 2023"),
         margin = list(t = 80))

g_top_2023

2024

top_2024 <- ranking_mortes %>% filter(ano == 2024)

kable(top_2024 %>% select(country, continent, mortes, casos, prop_mortes_casos),
      digits = 3,
      caption = "Top 10 paises com mais mortes em 2024")
## Adding missing grouping variables: `ano`
Top 10 paises com mais mortes em 2024
ano country continent mortes casos prop_mortes_casos
2024 United States North America 48384 0 NA
2024 Italy Europe 3225 297198 0.011
2024 Russia Europe 2708 1085295 0.002
2024 Sweden Europe 1740 25177 0.069
2024 Greece Europe 1481 184843 0.008
2024 Portugal Europe 1154 31189 0.037
2024 Australia Oceania 892 139626 0.006
2024 New Zealand Oceania 888 224052 0.004
2024 Canada North America 841 44819 0.019
2024 Poland Europe 738 137628 0.005
p_top_2024 <- ggplot(top_2024,
           aes(reorder(country, mortes), mortes, fill = continent)) +
  geom_col() +
  geom_text(aes(label = format(round(mortes, 0),
                               big.mark = ".", decimal.mark = ",")),
            hjust = -0.1, size = 3) +
  coord_flip() +
  theme_minimal(base_size = 12) +
  labs(
    x = "Pais",
    y = "Total de mortes em 2024",
    fill = "Continente"
  ) +
  expand_limits(y = max(top_2024$mortes) * 1.1)

p_top_2024$labels$title <- NULL

g_top_2024 <- ggplotly(
  p_top_2024,
  tooltip = c("country", "continent", "y")
) %>%
  layout(title = list(text = "Top 10 paises com mais mortes em 2024"),
         margin = list(t = 80))

g_top_2024

Principais insights – 4.5

  • A análise do ranking dos países com maior número de mortes em 2023 e 2024 evidencia que, mesmo na fase tardia da pandemia, o impacto da COVID-19 não foi uniformemente reduzido. Em vários países, os valores absolutos de mortes continuam elevados, indicando que a transição para um cenário de maior controle epidemiológico ocorreu de forma desigual entre as nações e que a pandemia deixou ciclos prolongados de transmissão e mortalidade em algumas regiões.

  • Os países que aparecem entre os maiores números de mortes nesses dois anos tendem a apresentar características estruturais semelhantes: populações amplas, grande densidade urbana, circulação interna e internacional intensa, e sistemas de saúde frequentemente pressionados por desigualdades no acesso. Esses fatores amplificam o risco de transmissão continuada, mesmo com níveis mais altos de vacinação e maior conhecimento sobre o manejo clínico da doença.

  • Além disso, a persistência de mortes elevadas em países específicos pode refletir diferentes ritmos de testagem, vigilância e notificação, bem como desafios na manutenção de campanhas de vacinação de reforço. Em muitos casos, a subnotificação de casos leves ou assintomáticos eleva a razão mortes/casos, destacando ambientes onde o vírus ainda encontra populações vulneráveis.

  • A comparação direta entre 2023 e 2024 permite identificar padrões importantes:

    • países com redução significativa de mortes indicam melhora na imunidade populacional, reforço vacinal ou menor circulação de variantes agressivas;
    • países com manutenção dos níveis de mortalidade sugerem estagnação na capacidade de resposta, circulação prolongada do vírus ou fragilidades estruturais persistentes;
    • países com aumento relativo de mortes em 2024 podem ter enfrentado surtos localizados, descontinuidade de políticas públicas ou dificuldades logísticas na ampliação da cobertura vacinal.
  • Esses rankings tornam explícito que a pandemia entrou em estágios diferentes dependendo do país, revelando um cenário em que a dinâmica pós-crise sanitária é heterogênea e ainda exige atenção, especialmente em regiões onde vulnerabilidades históricas e desigualdades internas amplificam os efeitos da COVID-19.

4.6 Tabela analítica hierárquica para análise geral

Por fim, apresento uma tabela hierárquica que organiza as informações de forma semelhante a uma matriz de BI:

  • primeiro nível: continente;
  • segundo nível: país;
  • linhas detalhadas: ano, mês e mês/ano;
  • colunas: casos, mortes e proporção mortes/casos.

Quando a tabela está consolidada em nível de continente, os valores são somas dos países e meses daquele continente. Ao expandir, é possível ver os agregados por país e, em seguida, os detalhes mensais.

dados_mensal_detalhe <- dados_clean %>%
  mutate(
    ano    = year(date),
    mes    = month(date),
    mes_ano = format(date, "%Y-%m")
  ) %>%
  group_by(continent, country, ano, mes, mes_ano) %>%
  summarise(
    casos  = sum(new_cases,  na.rm = TRUE),
    mortes = sum(new_deaths, na.rm = TRUE),
    prop_mortes_casos = ifelse(casos > 0, mortes / casos, NA_real_),
    .groups = "drop"
  ) %>%
  arrange(continent, country, ano, mes)
reactable(
  dados_mensal_detalhe,
  groupBy = c("continent", "country"),
  columns = list(
    continent = colDef(name = "Continente"),
    country   = colDef(name = "Pais"),
    ano       = colDef(name = "Ano"),
    mes       = colDef(name = "Mes"),
    mes_ano   = colDef(name = "Mes/Ano"),

    casos     = colDef(
      name      = "Casos",
      aggregate = "sum",
      format    = colFormat(
        separators = TRUE,
        locales = "pt-BR"
      )
    ),

    mortes    = colDef(
      name      = "Mortes",
      aggregate = "sum",
      format    = colFormat(
        separators = TRUE,
        locales = "pt-BR"
      )
    ),

    prop_mortes_casos = colDef(
      name      = "Proporcao Mortes/Casos",
      aggregate = htmlwidgets::JS("
        function(values, rows) {
          const totalMortes = rows.reduce((s, r) => s + (r.mortes || 0), 0);
          const totalCasos  = rows.reduce((s, r) => s + (r.casos  || 0), 0);
          return totalCasos > 0 ? totalMortes / totalCasos : null;
        }
      "),
      format = colFormat(
        percent  = TRUE,
        digits   = 2,
        locales  = "pt-BR"
      )
    )
  ),

  searchable = TRUE,
  sortable   = TRUE,
  resizable  = TRUE,
  highlight  = TRUE,
  striped    = TRUE,
  defaultPageSize = 20,
  defaultColDef = colDef(minWidth = 90),
  theme = reactableTheme(
    borderColor    = "#D3D3D3",
    highlightColor = "#f0f8ff",
    stripedColor   = "#f9f9f9"
  )
)

Principais insights – 4.6

  • A tabela hierárquica cumpre um papel essencial ao permitir uma navegação estruturada da informação: inicia-se com uma visão agregada por continente, oferecendo uma leitura macro da distribuição de casos e mortes, e avança para camadas mais detalhadas como país, ano, mês e mês/ano. Esse formato facilita a identificação de padrões tanto globais quanto locais, algo que gráficos sozinhos não conseguem evidenciar com a mesma precisão.

  • No nível consolidado por continente, torna-se imediatamente visível quais regiões carregaram maior peso epidemiológico ao longo da pandemia. Algumas regiões apresentam valores acumulados muito superiores às demais, revelando tanto sua maior população quanto a intensidade com que a COVID-19 circulou internamente. Esses totais elevados ajudam a contextualizar as ondas observadas nas subseções anteriores.

  • Ao expandir cada continente, a tabela evidencia quais países são os principais contribuintes para o volume de casos e mortes. Muitas vezes, poucos países com populações grandes ou com sistemas de vigilância robustos respondem por uma grande parcela do total continental. Outras vezes, países menores têm participação significativa devido a surtos localizados ou limitações na capacidade de resposta.

  • A medida de letalidade (proporção mortes/casos), recalculada em cada nível de detalhe, oferece uma forma de comparar a severidade relativa da pandemia entre continentes e países. Essa métrica ajuda a identificar regiões onde a COVID-19 teve impacto mais grave, seja pela circulação de variantes mais agressivas, seja por fragilidades no sistema de saúde, subnotificação de casos ou fatores socioeconômicos que dificultam o acesso ao cuidado.

  • A granularidade mensal permite observar variações internas dentro dos próprios países, destacando períodos em que certos países enfrentaram picos de letalidade ou aumentos súbitos de casos. Isso reforça que a pandemia não foi linear nem homogênea, mas marcada por oscilações que dependem do contexto local e das medidas implementadas ao longo do tempo.

  • De forma geral, a tabela hierárquica funciona como um painel analítico completo: resume o comportamento da pandemia em múltiplas escalas, facilita comparações verticais (continente → país → mês) e fornece uma leitura aprofundada sobre distribuição, intensidade e severidade da COVID-19 no mundo.

5. Conclusões

5.1 Retomada do problema

O projeto se propôs a investigar como os continentes se diferenciaram, ao longo do tempo, em termos de casos e mortes por COVID-19, com ênfase em medidas padronizadas (por milhão de habitantes) e em uma medida aproximada de letalidade (proporção mortes/casos).

5.2 Dados e metodologia

A análise utilizou a base pública Our World in Data (OWID), a partir de um subconjunto (compact.csv) com variáveis essenciais de casos, mortes, população, país, continente e datas. Os dados foram:

  • importados e limpos (remoção de colunas vazias, padronização de datas, filtragem de países sem população e de registros sem continente);
  • agregados em base mensal, tanto em nível de continente quanto em nível de país;
  • explorados por meio de gráficos de linha, gráficos de área, gráficos de barra e uma tabela hierárquica interativa.

Os gráficos foram tornados interativos com plotly, permitindo inspecionar com o mouse o valor associado a cada ponto ou barra, e a tabela hierárquica com reactable aproximou a experiência visual de uma matriz de BI com agregações em diferentes níveis.

5.3 Principais insights

Entre os principais resultados, destacam-se:

  • A evolução mensal de casos e mortes por milhão evidencia que a pandemia ocorreu em ondas não sincronizadas entre continentes, com períodos críticos em momentos diferentes para cada região.
  • A participação percentual de cada continente nos casos e mortes globais variou ao longo do tempo, e em alguns momentos determinados continentes concentraram mais mortes do que casos proporcionalmente, sugerindo diferenças em letalidade e/ou subnotificação de casos.
  • As séries mensais por ano, divididas por continente, mostraram claramente quais anos foram mais críticos em cada região e como a intensidade da pandemia se redistribuiu ao longo do tempo.
  • A análise da proporção mortes/casos (letalidade aproximada) na base mensal revelou que certos continentes mantiveram, de forma consistente, níveis mais altos de letalidade, apontando para possíveis desigualdades em infraestrutura de saúde, acesso a tratamento e capacidade de testagem.
  • O ranking de países com mais mortes em 2023 e 2024 evidenciou que, mesmo em anos recentes, alguns países seguiram fortemente impactados, tanto em termos absolutos quanto relativos.
  • A tabela hierárquica permitiu navegar de uma visão consolidada por continente até o nível mais detalhado de país e mês/ano, com a proporção mortes/casos recalculada em cada nível de agregação.

5.4 Implicações e limitações

Do ponto de vista de potenciais usuários (gestores, profissionais de saúde e pesquisadores), os resultados:

  • oferecem uma visão comparativa estruturada sobre o comportamento da COVID-19 nas diversas regiões do mundo;
  • podem servir de base para discussões sobre priorização de recursos, avaliação de respostas adotadas e planejamento de políticas futuras;
  • ajudam a identificar regiões e períodos que merecem investigação mais aprofundada, inclusive com outras bases de dados.

Por outro lado, há limitações importantes:

  • a medida de letalidade utilizada (mortes/casos) é apenas aproximada e altamente dependente da qualidade da notificação de casos e mortes;
  • a base OWID, embora ampla, está sujeita a subnotificação e diferenças metodológicas entre países;
  • não foram incorporadas variáveis explicativas adicionais, como cobertura vacinal, idade média da população, indicadores de renda ou mobilidade.

5.5 Possíveis extensões

Entre as extensões possíveis, destacam-se:

  • incorporar dados de vacinação, mobilidade e indicadores econômicos para explicar diferenças entre continentes e países;
  • aplicar modelos estatísticos ou de machine learning para classificar países por perfis de evolução ou para prever comportamentos futuros;
  • explorar mapas e outras visualizações interativas em nível de país, ampliando o potencial de comunicação dos resultados.

Mesmo com essas limitações, o projeto atinge o objetivo proposto de importar, limpar, organizar e explorar um conjunto de dados real e relevante, construindo uma narrativa consistente sobre a dinâmica global da COVID-19 e oferecendo subsídios concretos para investigações posteriores.