Análise Exploratória de Dados Relacionados ao COVID-19
- Vinicius Goia
- 6 de set. de 2023
- 15 min de leitura
Atualizado: 8 de set. de 2023
Relembrar é viver: Afinal, o que é o COVID-19?
Transmitida pelo vírus Coronavírus da Síndrome Aguda Grave (SARS-CoV-2), COVID-19 é uma doença infecciosa que já está sendo considerada uma das mais mortais da história, devido ao seu alto grau de transmissão e difícil contenção e controle. Foi diagnosticada pela primeira vez em Wuhan, na China, em dezembro de 2019 e, logo em março de 2020, a OMS declarou pandemia. Seu contágio se dá pela respiração de ar contaminado e seus sintomas comuns são febre, tosse seca e fadiga, sendo que, em casos mais graves, há a necessidade de ventilação assistida por meio de respiradores mecânicos em ambientes hospitalares.
Devido a fase de transmissão durar entre 10 e 14 dias após a contaminação, e havendo pacientes assintomáticos, o rastreio da doença se tornou uma tarefa difícil, uma vez que pessoas sem sintomas não tomavam as medidas cabíveis de prevenção. Estas, aliás, englobavam o distanciamento social, uso de máscaras e lavagem das mãos.
Desde dezembro de 2020, há a disponibilização de vacinas que ajudam no combate da doença, porém nenhuma cura foi desenvolvida e os testes de verificação, como o PCR, continuam sendo utilizados. O que vivenciamos hoje em dia são os resquícios da doença, com focos de novas cepas se espalhando em algumas regiões, exigindo da população medidas mais rígidas de prevenção. Impactos na economia de todo o mundo obrigam as pessoas a aceitarem um novo começo não tão agradável assim. E o principal intuito desta análise é evidenciar os estragos que essa doença causou na humanidade para que possamos cada vez mais nos conscientizarmos que nossas atitudes podem salvar a vida do próximo. Ao final, uma abordagem voltada ao Brasil será aplicada, com geração de insghts voltados aos setores da economia e saúde.
Obtenção dos Dados
Os dados que serão analisados aqui são disponibilizados pela Our World in Data, organização fundada por Max Roser, onde equipes de pesquisadores trabalham em conjunto para obter dados confiáveis e informativos sobre um tópico específico.
Suas fontes de pesquisa baseiam-se em institutos especializados, como o Peace Research Institute Oslo (PRIO); artigos de pesquisa; instituições internacionais ou agências estatísticas, como a OCDE, o Banco Mundial e as instituições da ONU; e dados oficiais de fontes governamentais.
Mesmo com tantas fontes confiáveis, o levantamento de dados se torna uma tarefa difícil devido as proporções que a doença atingiu e vem atingindo. A padronização de diagnóstico, a distribuição de testes e a superlotação de hospitais foram alguns dos motivos que "minimizaram" certas contagens. Sem padronização de diagnóstico e falta testes para serem feitos, os infectados podem ser enviados para casa apenas com a orientação de isolamento social. Se os hospitais estão superlotados, os infectados serão orientados a ficarem em casa, esperando pelo pior. E esses casos não são contabilizados. Sem contar em regiões onde o acesso a infraestrutura básica são tão escassos, que não há outra opção além de esperar.
O fato de muitos contaminados serem assintomáticos é outro fator que dificulta a contabilização e diagnóstico, aumentando ainda mais as transmissões.
Porém, o que se espera desse dataset são dados recentes e confiáveis dos casos de COVID-19 no mundo, detalhados por países. As informações disponibilizadas não giram em torno apenas de número de infectados e mortes, mas contextualizam diversas variáveis que nos trarão mais clareza sobre a real situação da pandemia atualmente.
Obs: Esse artigo foi baseado em um notebook criado no Google Colab. As saídas dos comandos em Python referentes à textos e tabelas não serão exibidos. Apenas gráficos, vídeos e outras imagens serão mostradas.
Dicionário de Variáveis
Como a relação das variáveis presentes no dataset foram disponibilizadas através de um arquivo .csv, serão realizadas algumas etapas para extração e formatação do texto de maneira coerente a este notebook.
Primeiramente, importou-se a biblioteca Pandas, a qual nos auxiliará nesse processo.
# importação biblioteca pandas
import pandas as pd
Com a biblioteca importada, definiu-se a variável df_variáveis como sendo a transformação de nosso arquivo csv em um dataframe.
O arquivo csv pode ser encontrado no link https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv .
# Leitura do arquivo .csv em um dataframe
df_variaveis = pd.read_csv("https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-codebook.csv")
A principal ideia aqui é acessar o nome das variáveis e suas descrições, adicionar alguns caracteres que servirão para formatação do texto neste notebook, eliminar colunas que não serão utilizadas e agrupar tudo em um arquivo .txt para cópia do texto.
# Adição de caracteres de formatação na coluna 'column'
df_variaveis.column = "*" + " " + "`" + df_variaveis.column + "`"
# Eliminação de colunas que não serão utilizadas
df_variaveis = df_variaveis.drop(columns=['source','category'])
# Agrupamento das colunas com inserção de caracteres no formato de listas
variaveis = df_variaveis.column + " " + ":" + " " + df_variaveis.description + "\n"
# Agrupamento das listas em uma única variável
descrição = "\n".join(s for s in variaveis)
# Criação de um arquivo txt com as descrições das variáveis para inserir neste notebook
with open ('variáveis.txt','w') as texto:
texto.write(descrição)
Após o criação do arquivo, as descrições das variáveis foram traduzidas para melhor entendimento.
iso_code: ISO 3166-1 alpha-3 – Norma para representação de países através de 3 letras;
continent: Continente;
location: País;
date: Data da Observação;
total_cases: Total de casos confirmados de COVID-19. As contagens podem incluir casos prováveis, quando relatados;
new_cases: Novos casos confirmados de COVID-19. As contagens podem incluir casos prováveis, quando relatados. Em casos raros em que nossa fonte relata uma mudança diária negativa devido a uma correção de dados, definimos essa métrica como NA;
new_cases_smoothed: Novos casos confirmados de COVID-19 (suavização de 7 dias). As contagens podem incluir casos prováveis, quando relatados;
total_deaths: Total de mortes atribuídas à COVID-19. As contagens podem incluir mortes prováveis, quando relatadas;
new_deaths: Novas mortes atribuídas à COVID-19. As contagens podem incluir mortes prováveis, quando relatadas. Em casos raros em que nossa fonte relata uma alteração diária negativa devido a uma correção de dados, definimos essa métrica como NA.
new_deaths_smoothed: Novas mortes atribuídas ao COVID-19 (suavização de 7 dias). As contagens podem incluir mortes prováveis, quando relatadas;
total_cases_per_million: Total de casos confirmados de COVID-19 por 1.000.000 de pessoas. As contagens podem incluir casos prováveis, quando relatados;
new_cases_per_million: Novos casos confirmados de COVID-19 por 1.000.000 de pessoas. As contagens podem incluir casos prováveis, quando relatados.
new_cases_smoothed_per_million: Novos casos confirmados de COVID-19 (suavização de 7 dias) por 1.000.000 de pessoas. As contagens podem incluir casos prováveis, quando relatados;
total_deaths_per_million: Total de mortes atribuídas ao COVID-19 por 1.000.000 de pessoas. As contagens podem incluir mortes prováveis, quando relatadas;
new_deaths_per_million: Novas mortes atribuídas ao COVID-19 por 1.000.000 de pessoas. As contagens podem incluir mortes prováveis, quando relatadas;
new_deaths_smoothed_per_million: Novas mortes atribuídas ao COVID-19 (suavização de 7 dias) por 1.000.000 de pessoas. As contagens podem incluir mortes prováveis, quando relatadas;
reproduction_rate: Estimativa em tempo real da taxa efetiva de reprodução (R) do COVID-19. Veja https://github.com/crondonm/TrackingR/tree/main/Estimates-Database;
icu_patients: Número de pacientes com COVID-19 em unidades de terapia intensiva (UTIs) em um determinado dia;
icu_patients_per_million: Número de pacientes com COVID-19 em unidades de terapia intensiva (UTIs) em um determinado dia por 1.000.000 de pessoas;
hosp_patients: Número de pacientes com COVID-19 internados em um determinado dia;
hosp_patients_per_million: Número de pacientes com COVID-19 hospitalizados em um determinado dia por 1.000.000 de pessoas;
weekly_icu_admissions: Número de pacientes com COVID-19 recém-admitidos em unidades de terapia intensiva (UTIs) em uma determinada semana (data do relatório e os 6 dias anteriores);
weekly_icu_admissions_per_million: Número de pacientes com COVID-19 recém-admitidos em unidades de terapia intensiva (UTIs) em uma determinada semana por 1.000.000 de pessoas (data do relatório e os 6 dias anteriores);
weekly_hosp_admissions: Número de pacientes com COVID-19 recém-admitidos em hospitais em uma determinada semana (data do relatório e os 6 dias anteriores);
weekly_hosp_admissions_per_million: Número de pacientes com COVID-19 recém-admitidos em hospitais em uma determinada semana por 1.000.000 de pessoas (data do relatório e os 6 dias anteriores);
total_tests: Total de testes para COVID-19;
new_tests: Novos testes para COVID-19 (calculados apenas para dias consecutivos);
total_tests_per_thousand: Total de testes para COVID-19 por 1.000 pessoas;
new_tests_per_thousand: Novos testes para COVID-19 por 1.000 pessoas;
new_tests_smoothed: Novos testes para COVID-19 (7 dias suavizados). Para os países que não relatam dados de testes diariamente, assumimos que os testes mudaram igualmente diariamente em todos os períodos em que nenhum dado foi relatado. Isso produz uma série completa de números diários, cuja média é calculada em uma janela contínua de 7 dias;
new_tests_smoothed_per_thousand: Novos testes para COVID-19 (7 dias suavizados) por 1.000 pessoas;
positive_rate: A parcela de testes positivos para COVID-19, dada como uma média contínua de 7 dias (este é o inverso de tests_per_case)
tests_per_case: Testes realizados por novo caso confirmado de COVID-19, dados como uma média contínua de 7 dias (este é o inverso de Positive_rate);
tests_units: Unidades usadas pelo local para relatar seus dados de teste. Um arquivo de país não pode conter unidades mistas. Todas as métricas relativas aos dados de teste usam a unidade de teste especificada. As unidades válidas são 'pessoas testadas' (número de pessoas testadas), 'testes realizados' (número de testes realizados. uma única pessoa pode ser testada mais de uma vez em um determinado dia) e 'amostras testadas' (número de amostras testadas. Em alguns casos, mais de uma amostra pode ser necessária para realizar um determinado teste.);
total_vaccinations: Número total de doses de vacinação contra COVID-19 administradas;
people_vaccinated: Número total de pessoas que receberam pelo menos uma dose de vacina;
people_fully_vaccinated: Número total de pessoas que receberam todas as doses prescritas pelo protocolo inicial de vacinação;
total_boosters: Número total de doses de reforço da vacinação contra COVID-19 administradas (doses administradas além do número prescrito pelo protocolo de vacinação);
new_vaccinations: Novas doses de vacinação COVID-19 administradas (calculadas apenas para dias consecutivos);
new_vaccinations_smoothed: Novas doses de vacinação COVID-19 administradas (suavização de 7 dias). Para países que não relatam dados de vacinação diariamente, assumimos que a vacinação mudou igualmente diariamente em todos os períodos em que nenhum dado foi relatado. Isso produz uma série completa de números diários, cuja média é calculada em uma janela contínua de 7 dias;
total_vaccinations_per_hundred: Número total de doses de vacinação contra COVID-19 administradas por 100 pessoas na população total;
people_vaccinated_per_hundred: Número total de pessoas que receberam pelo menos uma dose de vacina por 100 pessoas na população total;
people_fully_vaccinated_per_hundred: Número total de pessoas que receberam todas as doses prescritas pelo protocolo inicial de vacinação por 100 pessoas na população total;
total_boosters_per_hundred: Número total de doses de reforço da vacinação contra COVID-19 administradas por 100 pessoas na população total;
new_vaccinations_smoothed_per_million: Novas doses de vacinação contra COVID-19 administradas (suavizadas em 7 dias) por 1.000.000 de pessoas na população total;
new_people_vaccinated_smoothed: Número diário de pessoas que receberam a primeira dose da vacina (7 dias suavizados);
new_people_vaccinated_smoothed_per_hundred: Número diário de pessoas que receberam a primeira dose da vacina (suavização de 7 dias) por 100 pessoas na população total;
stringency_index: Índice de Severidade de Resposta do Governo: medida composta com base em 9 indicadores de resposta, incluindo fechamento de escolas, fechamento de locais de trabalho e proibições de viagens, reescalonados para um valor de 0 a 100 (100 = resposta mais rigorosa);
population: População (últimos valores disponíveis). Veja https://github.com/owid/covid-19-data/blob/master/scripts/input/un/population_latest.csv para lista completa;
population_density: Número de pessoas dividido por área de terra, medida em quilômetros quadrados, ano mais recente disponível;
median_age: Idade média da população, projeção da ONU para 2020;
aged_65_older: Parcela da população com 65 anos ou mais, ano mais recente disponível;
aged_70_older: Proporção da população com 70 anos ou mais em 2015;
gdp_per_capita: Produto interno bruto em paridade de poder de compra (dólares internacionais constantes de 2011), ano mais recente disponível;
extreme_poverty: Parcela da população que vive em extrema pobreza, ano mais recente disponível desde 2010;
cardiovasc_death_rate: Taxa de mortalidade por doenças cardiovasculares em 2017 (número anual de mortes por 100.000 pessoas);
diabetes_prevalence: Prevalência de diabetes (% da população de 20 a 79 anos) em 2017;
female_smokers: Proporção de mulheres que fumam, ano mais recente disponível;
male_smokers: Parcela de homens que fumam, ano mais recente disponível;
handwashing_facilities: Parcela da população com instalações básicas de lavagem das mãos nas instalações, ano mais recente disponível;
hospital_beds_per_thousand: Leitos hospitalares por 1.000 pessoas, ano mais recente disponível desde 2010;
life_expectancy: Expectativa de vida ao nascer em 2019;
human_development_index: Um índice composto que mede o desempenho médio em três dimensões básicas do desenvolvimento humano – uma vida longa e saudável, conhecimento e um padrão de vida decente. Valores de 2019, importados de http://hdr.undp.org/en/indicators/137506
excess_mortality: Diferença percentual entre o número relatado de mortes semanais ou mensais em 2020–2021 e o número projetado de mortes para o mesmo período com base nos anos anteriores. Para mais informações, veja https://github.com/owid/covid-19-data/tree/master/public/data/excess_mortality
excess_mortality_cumulative: Diferença percentual entre o número acumulado de mortes desde 1º de janeiro de 2020 e as mortes projetadas cumulativas para o mesmo período com base nos anos anteriores. Para mais informações, veja https://github.com/owid/covid-19-data/tree/master/public/data/excess_mortality
excess_mortality_cumulative_absolute: Diferença cumulativa entre o número relatado de mortes desde 1º de janeiro de 2020 e o número projetado de mortes para o mesmo período com base nos anos anteriores. Para mais informações, veja https://github.com/owid/covid-19-data/tree/master/public/data/excess_mortality
excess_mortality_cumulative_per_million: Diferença cumulativa entre o número relatado de mortes desde 1º de janeiro de 2020 e o número projetado de mortes para o mesmo período com base nos anos anteriores, por milhão de pessoas. Para mais informações, veja https://github.com/owid/covid-19-data/tree/master/public/data/excess_mortality
A tradução da descrição das variáveis foi um trabalho a parte. Fica aqui a sugestão de utilizar uma API da Google para essa tarefa. Finalmente, iremos importar nosso dataset através do link https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv e salvar em uma variável de nome df.
# importaçao do dataset COVID-19 para um DataFrame
df = pd.read_csv("https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv")
Análise Exploratória dos Dados
Nesta etapa, iremos analisar o nosso dataset quanto a sua estrutura, verificando seu tamanho, quantidade de variáveis, os tipos dessas variáveis, a presença de valores nulos, e verificar a presença de insights dentro de toda essa informação.
Análise Exploratória Inicial
Primeiramente, visualizou-se as 5 primeiras entradas do dataset para uma verificação inicial.
# Visualização das 5 primieras entradas do dataset
df.head()
Com essa visualização, verificou-se a existência de valores numéricos e strings distribuídas pelas 67 colunas. Também notou-se a presença de valores ausentes.
Será verificado agora o tamanho do dataset, bem como os tipos de dados que se tem em cada coluna.
# Verificação do tamanho e dos tipos de dados em cada coluna
df.info()
Com 238934 entradas, confirma-se que a maioria dos dados são numéricos. Porém, observa-se uma grande quantidade de valores ausentes em cada coluna. Deste modo, verificou-se a porcentagem desses dados ausentes por coluna. Para isso, realizou-se a divisão da quantidade de dados ausentes pelo número total de entradas.
# Verificação do tamanho do dataset
df.shape
# Verificação da porcentagem de dados ausentes
(df.isnull().sum() / df.shape[0]).sort_values(ascending=False)
Apesar de algumas colunas possuírem um número elevado de dados ausentes, manteve-se todos eles para uma análise futura, caso seja necessário.
O próximo passo será a organização desses dados para uma análise mais profunda, com impressão de gráficos e geração de insghts. Para isso, primeiramente, importou-se uma biblioteca para auxílio nas montagens dos plots e posteriormente, transformou-se a coluna 'date', atualmente uma string, em formato de data para correto manuseio.
# Importação biblioteca Matplotlib
import matplotlib.pyplot as plt
# Tranformação de String para Date Time
df.date = pd.to_datetime(df.date)
# Verificar qual a data mais atual
(df.date.sort_values(ascending=False))
Como o intuito aqui é analisar os dados do COVID-19 por países, criou-se uma nova variável contendo apenas os dados pertinentes à análise.
# Criação de dataframe apenas com países
df_paises = df.loc[df.continent.isnull() == False]
Sendo assim, através do filtro executado abaixo, verificou-se os países com o maior número de mortes por COVID-19 até a data do dia 30/11/2022.
Obs: Como a fonte de dados é atualizada diariamente, dependendo do dia da execução deste notebook, as datas podem alterar.
# Verificação dos países com mais mortes pela data mais recente
df_paises.loc[df.date=='2022-11-30'].sort_values(by="total_deaths", ascending=False)
Tem-se:
Estados Unidos, com 98.788.140 de casos e 1.080.444 mortes;
Brasil, com 35.227.599 de casos e 689.665 mortes;
Índia, com 44.673.863 de casos e 530.622 mortes.
Nota-se que a Índia possui mais casos de infecções por COVID-19 porém menos mortes se comparada ao Brasil.
# Criação de Dataframe com o filtro utilizado anteriormente
df_grafico = df_paises.loc[df.date=='2022-11-30'].sort_values(by="total_deaths", ascending=False)
Criação e Análise de Gráficos
Quais os 5 países com maior número de óbitos?
Com estas informações, gerou-se um gráfico de barras para melhor visualização.
# Criação do plano do gráfico
fig, ax = plt.subplots(figsize=(8,8))
# Geração do gráfico e customização de elementos
df_grafico.head().plot(x='location', y='total_deaths', kind='bar', ax=ax)
ax.set_title('Grafico de Barras: Total de Óbitos por Países')
ax.set_xlabel ('$Países$')
ax.set_ylabel ('$Óbitos$')
plt.tight_layout()

Pode-se melhorar o gráfico acima com algumas técnicas relacionadas à visualização de dados, organizando as informações de uma maneira mais limpa e objetiva, sem deixar de lado a parte artística.
Para isso, importou-se duas bibliotecas para auxilio da manipulação dos dados e plotagens.
# Importação de novas bibliotecas
import numpy as np
import seaborn as sns
# definindo cores do gráfico
CINZA1, CINZA2, CINZA3= "#CFCDCE", "#A2A1A3", "#787878"
AZUL1, AZUL2 = "#8db7eb", "#253760"
# configurar a visualização
width_bar = 0.0
# criação do plano do gráfico
fig, ax = plt.subplots(figsize=(10, 6))
# labels do eixo
x = np.arange(len(df_grafico.location.head(5)))
# parametro para plotagem
rects1 = ax.bar(x - width_bar/2, df_grafico.total_deaths.head(5), width_bar)
# parametro para plotagem
sns.barplot(x="location", y="total_deaths", data=df_grafico.head(5), palette="Blues_d")
plt.xticks(rotation=45)
ax.set_xlabel('')
# remover grids e eixos
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['bottom'].set_visible(False)
# remover eixo y
plt.gca().axes.get_yaxis().set_visible(False)
# remover xticks do eixo x
plt.tick_params(
axis='both',
which='both',
bottom=False,
top=False,
labelbottom=True)
# criar função para dar labels automaticamente
def autolabel(rects):
for rect in rects:
height = rect.get_height()
ax.annotate(
'{}'.format(height),
xy=(rect.get_x() + rect.get_width()/2, height),
xytext=(1, -25), # offset
textcoords="offset points",
ha='center',
va='bottom',
fontsize=10,
color="white",
)
# # # plotar labels dentro das barras
autolabel(rects1)
# plotar título
plt.text(-0.35, 1350000, 'Total de Óbitos COVID-19',
verticalalignment="top",
fontsize=16,
color=CINZA3,
weight='bold')
# plotar subtitulo
plt.text(-0.35, 1280000,
"Total de mortes causada pelo"
" COVID-19 por países",
verticalalignment="top",
fontsize=12,
color=CINZA2)
# plotar anotações do resultado da campanha
plt.text(4.5, 1000000,
"$\\bf{RESULTADO}$\n"
"Estados Unidos lidera nos\n"
"números, seguido pelo\n"
"Brasil e índia\n"
"$(Fonte: Our World in Data)$",
verticalalignment="top",
fontsize=12,
color=AZUL2)
# plotar o gráfico
fig.tight_layout()
plt.show()

A evolução das mortes em comparação com a China
Uma outra maneira de representar os dados acima é pela corrida de gráfico de barras. Baseado em uma animação, os dados interagem entre si, mostrando a evolução das entradas.
Para utilizar esse gráfico, instalou-se e importou-se as bibliotecas pertinentes. Logo após, manipulou-se o dataframe para deixá-lo de maneira coerente para a leitura dos dados.
# Instalação da biblioteca
!pip install bar_chart_race -q
!pip3 install ffmpeg-python -q
import bar_chart_race as bcr
import ffmpeg
# Organização do dataframe por data crescente
df_paises = df_paises.sort_values(by='date')
# Transformação da coluna date em index
df_paises.set_index('date', inplace=True)
# Criação de variável com os nomes dos paises
colunas = df_paises['location'].value_counts().keys()
# Criação de variável com as informações apenas de mortes por paises
df_paises_run = df_paises[['location','total_deaths']]
# Criação de dataframe com a formatação correta para alimentar o gráfico, porem sem dados
df_temp=pd.DataFrame(index = df_paises_run.index.value_counts().keys(), columns = df_paises['location'].value_counts().keys())
# Visualização das primeiras linhas
df_temp.head()
# Iteração para adicionar os dados no novo dataframe
for i in colunas:
pais = df_paises_run.loc[df_paises_run.location==i]['total_deaths']
df_temp[i] = pais
Como a corrida de gráficos de barras não trabalha corretamente com valores NaN, substituiu-se todos esses valores por 0.
# Substituição de valores NaN por 0
df_temp = df_temp.fillna(0)
A corrida de gráfico de barras utiliza certa quantidade de processamento. Para facilitar a execução da mesma, limitou-se os países a serem exibidos, bem como as datas do evento.
Para este caso, além dos países com o maior número de mortes, incluiu-se os dados da China, onde a doença originou-se, para verificar a evolução.
# Definição de dataframe com limitações
df_race = df_temp[['United States','Brazil','India','Russia','Mexico','China']].loc[df_temp.index[0:1065:10].sort_values()]
# Geração do Gráfico
bcr.bar_chart_race(df=df_race, filename = None,n_bars=6,title='COVID-19 Deaths by Country')
Percebe-se que a China, mesmo sendo o local onde a doença se originou, conseguiu conter o alastramento do vírus. Isso provavelmente se deu devido a rígida política de contenção, que, consequentemente, afetou as vidas das pessoas, tanto financeiramente como socialmente. Questões culturais, como o uso de máscaras devido a poluição, também podem ser apontadas como um fator que favoreceu o controle, uma vez que as pessoas não transpareceram indícios de resistência ao uso, o que aconteceu em diversos outros países.
E as mortes em todo o globo?
Abaixo, criou-se um gráfico de linhas para verificação da evolução dos óbitos por COVID-19 no mundo. Observa-se um reta crescente sem indícios de formação de platô, o que indicaria o fim das mortes. Porém, a inclinação suave da reta a partir de Julho/2022 indica que estaremos próximos de uma estabilização.
# Criação do plano do gráfico
fig, ax = plt.subplots(figsize=(10, 6))
# Geração do gráfico e customização de elementos
df.loc[df.location == "World"].plot(x='date', y='total_deaths', color='r', ax=ax)
plt.title('Evolução de Mortes por COVID-19 no Mundo', fontsize=15)
ax.set_xlabel('Data')
ax.set_ylabel('Mortes (x 1,000,000)')
plt.legend(["Total de Mortes"])
plt.xticks(rotation=45)
# plotar o gráfico
fig.tight_layout()

Será que o número de óbitos está relacionado com renda, idade e outras doenças?
Avaliou-se, através de um gráfico de dispersão, se o PIB per capita correlacionaria com o número de mortes. Nota-se que há uma concentração de mortes até a metade dos valores mostrados no gráfico, porém não há indícios de uma correlação forte. Entende-se que nessa faixa de valores há mais pessoas, portanto, maiores chances de mortes.
# Criação do plano do gráfico
fig, ax = plt.subplots(figsize=(10,6))
# Geração do gráfico e customização de elementos
sns.scatterplot(x=df.gdp_per_capita.loc[df.date=='2022-11-30'], y=df.total_deaths.loc[df.date=='2022-11-30'],ax=ax)
plt.title('PIB per Capita (Dólar) x Total de Óbitos', fontsize=15)
ax.set_xlabel('PIB per Capita')
ax.set_ylabel('Mortes (x 1,000,000)')
plt.xticks(rotation=45)
# plotar o gráfico
fig.tight_layout()

Testou-se também a correlação entre o número total de mortes e outros fatores, como doenças cardiovasculares, diabetes, fumantes, idosos e pessoas totalmente vacinadas, através de um pairplot. Exceto o último ponto, esperava-se um crescimento proporcional entre mortes e os outros fatores, contudo, não se observou correlação, sendo que a quantidade de mortes manteve-se teoricamente estável entre os grupos.
# Plotagem de gráfico para análise de correlação
sns.pairplot(df[['total_deaths','cardiovasc_death_rate','diabetes_prevalence','female_smokers','male_smokers','aged_65_older','people_fully_vaccinated_per_hundred']])
Análise Exploratória dos Dados para o Brasil:
Análise Exploratória Inicial
Agora, focaremos nosso estudo para o Brasil. Para isso, utilizaremos nosso dataset principal com filtros, limitando a coluna location.
# Limitando o dataset principal com entradas apenas para o Brasil
df_br = df.loc[df.location == 'Brazil']
# Visualizando as primeiras entradas, colocando em ordem crescente a partir do primeiro caso
df_br.sort_values(by='total_cases').head()
Nota-se que o primeiro caso registrado aconteceu na data 26-02-2020.
# Visualizando as primeiras entradas, colocando em ordem crescente a partir da primeira morte
df_br.sort_values(by='total_deaths').head()
Nota-se também que a primeira morte registrada aconteceu na data 17-03-2020. Com esses dados, consegue-se verificar qual foi o tempo entre o diagnóstico do primeiro caso e a primeira morte.
Para isso, importou-se uma biblioteca específica para conversão das strings em datas. Filtrou-se os caracteres para atender a formatação da função e subtraiu-se os valores.
# Importação de biblioteca
from datetime import date
# Conversões e cálculos
dias = datetime.date(day=int((df_br.date.loc[29154])[8:]), month=int((df_br.date.loc[29154])[5:7]), year=int((df_br.date.loc[29154])[0:4])) - datetime.date(day=int((df_br.date.loc[29134])[8:]), month=int((df_br.date.loc[29134])[5:7]), year=int((df_br.date.loc[29134])[0:4]))
print('A primeira morte ocorreu após {} dias do primeiro caso.'.format(dias.days))
Criação e Análise de Gráficos
A coisa é séria!
Para finalizar, iremos plotar alguns gráfico de linhas para analisar a evolução da doença no Brasil.
Para isso, transformamos a coluna date em DateTime e passamos ela para index.
# Tranformação de String para Date Time
df_br.date = pd.to_datetime(df_br.date)
# Transformação da coluna date em index
df_br.set_index('date', inplace=True)
Vamos dar uma olhada no gráfico abaixo:
# Plotar gráficos de linha em escalas linear para os casos totais e mortes totais.
fig, ax = plt.subplots(figsize=(9, 7))
ax.set_title('Casos e Mortes no Brasil')
ax.set_xlabel('Dias')
df_br.loc['2020-02-26':'2022-11-30','total_cases'].plot(kind='line', ax=ax)
df_br.loc['2020-02-26':'2022-11-30','total_deaths'].plot(kind='line', ax=ax)
plt.legend(['Total de casos','Total de Mortes'])
plt.tight_layout()

Parece que esse gráfico está incorreto. Não faz sentido o número de casos aumentar e o número de mortes ficar próximo à zero. Mas cuidado. Vamos verificar os valores máximos desses dados.
print("O número total de casos é {}.".format(df_br.total_cases.max()))
print("O número total de mortes é {}.".format(df_br.total_deaths.max()))
Nota-se que a diferença entre os números é muito grande e o tipo de plotagem nos leva a uma conclusão errada. Nas plotagens abaixo verificamos o avanço da doença no Brasil de uma maneira diferente.
# Plotar gráficos de linha em escalas linear e logarítmica para os casos totais e mortes totais.
x = df_br.index
z = df_br['total_cases']
z2 = df_br['total_deaths']
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(9, 7))
ax1.set_title('Casos no Brasil')
ax1.set_xlabel('Dias')
ax1.set_ylabel('Casos')
ax1.plot(x, z)
ax1.tick_params(rotation=45)
ax2.set_title('Casos no Brasil (Escala logarítmica)')
ax2.set_xlabel('Dias')
ax2.set_ylabel('Casos')
ax2.set_yscale('log')
ax2.plot(x, z)
ax2.tick_params(rotation=45)
ax3.set_title('Mortes no Brasil')
ax3.set_xlabel('Dias')
ax3.set_ylabel('Mortes')
ax3.plot(x, z2)
ax3.tick_params(rotation=45)
ax4.set_title('Mortes no Brasil (Escala logarítmica')
ax4.set_xlabel('Dias')
ax4.set_ylabel('Mortes')
ax4.set_yscale('log')
ax4.plot(x, z2)
ax4.tick_params(rotation=45)
plt.tight_layout()

Conclusão
Com todos esses insights, conclui-se que a COVID-19 é uma doença que ainda está presente na população e ainda possui potencial para matar. A doença se manifesta nas pessoas de maneiras diferentes, o que dificulta uma padronização de diagnóstico e a torna ainda mais perigosa, por ser confundida com outras doenças de sintomas parecidos. Mesmo com a distribuição das vacinas, deve-se manter a atenção para novas cepas e novos contágios.
O principal ponto aqui é salientar que existe vários órgãos sérios e competentes monitorando todos os avanços da doença e que as medidas tomadas são baseadas em fatos juntamente com os principais órgãos mundiais.
Comments