Objetivo

Este relatório1 pretende mostrar um panorama completo e atualizado a respeito da campanha de vacinação contra a COVID19 no Brasil e em uma das unidades da federação, o estado de São Paulo, a partir de dados oficiais. Ela apresenta detalhes tais como os quantitativos e proporções de aplicação de primeiras e segundas doses, diferenciando vacinas que só necessitam de dose única.

Terá, também, a evolução diária de aplicação de doses, permitindo vislumbrar tendências e traçar médias móveis, de forma a eliminar o efeito de variações naturais esperadas nos totais reportados ao longo dos dias da semana.




Contextualização

A pandemia da COVID19 tem representado um desafio considerável para cientistas e jornalistas de dados, tanto pela aparente, mas enganadora, abundância de fontes de dados, quanto pela dificuldade de consolidar e fazer sentido de dados produzidos usando metodologias e métricas muitas vezes incompatíveis. No Brasil isso tem se revelado de maneira ainda mais pronunciada. Na ausência de um protagonismo do Ministério da Saúde na organização e compilação dos dados produzidos em mais de 5500 municípios nos 27 estados da Federação sem uma orientação centralizada consistente, muitas vezes tem sido necessário recorrer aos esforços de coletivos de cientistas de dados voluntários.

Embora já seja razoavelmente simples ter acesso a análises e dashboards prontos, ainda há pouca transparência acerca das metodologias utilizadas e raramente as fontes brutas de dados são disponibilizadas. Se isso já se verifica em relação ao conjunto mais amplo de dados da pandemia (novos casos, óbitos, etc.), quando voltamos nossa atenção para o avanço das campanhas de vacinação isso fica mais gritante. Simplesmente não há um repositório central de dados brutos de vacinação seja nas páginas do Ministério, do DataSUS, ou mesmo do CONASS (Conselho Nacional de Secretários de Saúde).

Praticamente a única fonte de dados brutos a respeito da vacinação regularmente atualizada disponível abertamente é a compilada pelos colaboradores do coletivo @coronavirusbra1, em especial pelo Dr. Wesley Cota, pesquisador do programa de pós-doutorado em Física e Sistemas Complexos da Universidade Federal de Viçosa. Tais dados coincidem com aqueles rotineiramente divulgados pelos veículos de imprensa. Estão disponíveis no endereço abaixo:

https://github.com/wcota/covid19br/

# IMPORTACAO DE DADOS ---------------------------------------------------------
# Carregando versão mais recente da base de dados brutos a partir do repositório original

url_base <- "https://raw.githubusercontent.com/wcota/covid19br/master/cases-brazil-states.csv"
baseBruta <- read_csv(url(url_base), 
                      col_types = cols(epi_week = col_integer(), 
                                       date = col_date(format = "%Y-%m-%d"), 
                                       recovered = col_double(), 
                                       suspects = col_integer(), 
                                       tests = col_integer(), 
                                       tests_per_100k_inhabitants = col_double(), 
                                       vaccinated = col_integer(), 
                                       vaccinated_per_100_inhabitants = col_double(), 
                                       vaccinated_second = col_integer(), 
                                       vaccinated_second_per_100_inhabitants = col_double(), 
                                       vaccinated_single = col_integer(), 
                                       vaccinated_single_per_100_inhabitants = col_double()))

data_atual <- format(as.Date(max(baseBruta$date)), "%d %b %Y")

Essa base de dados não é exclusiva de vacinação, mas traz dados nacionais, estaduais e mesmo municipais referentes às mais diferentes variáveis de interesse (24 no total), como semana epidemiológica, dados de casos, óbitos, recuperados e estatísticas populacionais diversas. Abaixo podemos visualizar uma amostra dos dados mais recentes (28 últimas linhas de quase 15 mil), conforme constam na base de dados em estado bruto. Ela está atualizada até o dia 12 ago 2021.

# Tabela - dados brutos por estado
datatable (tail(baseBruta, 28), 
          rownames = FALSE, 
          caption = htmltools::tags$caption(
            style = 'caption-side: bottom; text-align: center;', 
            htmltools::strong('Dados brutos por estado')),
          class = 'display nowrap', 
          options = list (dom = 'ltip', 
                         scrollX = TRUE, 
                         fixedColumns = FALSE, 
                         lengthMenu = c(10, 28)))




Preparação dos dados e primeira análise

De forma a tornar mais fácil a análise e leitura dos dados, precisamos aplicar diversas transformações à nossa base bruta. Uma vez que só nos interessam dados referentes à campanha de imunização, eliminamos todas as variáveis que não dizem respeito a esse tópico, assim como estabelecemos um ponto de corte temporal iniciando em 17 de janeiro de 2021, quando foram aplicadas as primeiras doses no País. Com essa primeira limpeza, nossos dados atingem um décimo de seu volume original.

Note-se que, até agora, os valores para as doses nesta base de dados representam sempre o total acumulado desde o início da vacinação.

# Limpeza dos dados, eliminando colunas indesejadas, filtrando janela temporal
# alvo, apos 17 de janeiro de 2021, e trocando NAs por zero

baseLimpa <- baseBruta %>% 
  select(date, state, vaccinated, vaccinated_second, vaccinated_single, 
         vaccinated_per_100_inhabitants, vaccinated_second_per_100_inhabitants, 
         vaccinated_single_per_100_inhabitants) %>% 
  filter(date >= "2021-01-17") %>% 
  rename(data = date,
         estado = state, 
         primeira_dose = vaccinated, 
         segunda_dose = vaccinated_second,
         dose_unica = vaccinated_single,
         primeira_dose_porcentagem = vaccinated_per_100_inhabitants,
         segunda_dose_porcentagem = vaccinated_second_per_100_inhabitants,
         dose_unica_porcentagem = vaccinated_single_per_100_inhabitants) 

baseLimpa[is.na(baseLimpa)] <- 0
# Tabela - dados atualizados de vacinas por estado
datatable(tail(baseLimpa, 28), 
          caption = htmltools::tags$caption(
            style = 'caption-side: bottom; text-align: center;', 
            htmltools::strong('Dados atualizados de vacinas por estado')),
          rownames = FALSE, 
          colnames = c("Data", "Estado", "D1", "D2", "DÚnica", "% D1", "% D2", "% DÚnica"), 
          class = 'display nowrap', 
          options = list (dom = 'ltip', 
                         scrollX = TRUE, 
                         fixedColumns = FALSE, 
                         lengthMenu = c(10, 28)))


A tabela acima, uma vez que é dotada de ferramentas de classificação e filtragem, já permite por si só descobrir que estados estão mais avançados em suas campanhas de vacinação, com uma proporção maior da população contemplada. No entanto, podemos fazê-lo de uma forma mais visual e extrair alguns insights extras desses dados. Nas abas abaixo, podemos ver quais unidades da federação têm se destacado na aplicação de primeiras doses, segundas doses, doses únicas e na imunização completa (segundas doses + doses únicas), e como isso se compara à média nacional atual.


Ranking D1

rd1 <- baseLimpa %>% 
  tail (28) %>% 
  #mutate (imunizados_porcentagem = segunda_dose_porcentagem + dose_unica_porcentagem) %>% 
  arrange(desc(primeira_dose_porcentagem)) 

porc_nacional <- rd1 %>% 
  filter(estado == 'TOTAL')

d1_nacional <- porc_nacional %>% 
  select(primeira_dose_porcentagem) %>% 
  round(2) %>% 
  as.double()
  
plot_rd1 <- ggplot(head(rd1, 5), aes(reorder(estado, primeira_dose_porcentagem), primeira_dose_porcentagem)) +
  geom_col(width = 0.9, fill = c("#1c4475", "#426194", "#6480b3", "#86a0d4", "#a9c1f6")) +
  geom_text(aes(label = paste0(as.character(round(primeira_dose_porcentagem, 2)), '%')),
            hjust = -0.1,
            position = position_dodge(width = 1),
            inherit.aes = TRUE
            ) +
  labs (title = paste0('Top 5, Primeira dose (', data_atual, ')\n'), 
        x = NULL, 
        y = '% população vacinada') +
  ylim (0,100) +
  
  theme_classic() +
  theme(axis.text.y = element_text(size = 12, color = "black"))
plot_rd1 + coord_flip() + 
  geom_hline (aes(yintercept = d1_nacional, linetype = paste0(d1_nacional, '%')), 
              color = "gold", size = 1.2, show.legend = TRUE) +
  scale_linetype_discrete(name = '% nacional') 





Ranking D2

rd2 <- baseLimpa %>% 
  tail (28) %>% 
  arrange(desc(segunda_dose_porcentagem)) 

d2_nacional <- porc_nacional %>% 
  select(segunda_dose_porcentagem) %>% 
  round(2) %>% 
  as.double()
  
plot_rd2 <- ggplot(head(rd2, 5), aes(reorder(estado, segunda_dose_porcentagem), segunda_dose_porcentagem)) +
  geom_col(width = 0.9, fill = c("#2f6d75","#3f848e","#4f9da7","#5fb5c1","#70cfdc")) +
  geom_text(aes(label = paste0(as.character(round(segunda_dose_porcentagem, 2)), '%')),
            hjust = -0.1,
            position = position_dodge(width = 1),
            inherit.aes = TRUE
            ) +
  labs (title = paste0('Top 5, Segunda dose (', data_atual, ')\n'), 
        x = NULL, 
        y = '% população vacinada') +
  ylim (0,100) +
  
  theme_classic() +
  theme(axis.text.y = element_text(size = 12, color = "black"))
plot_rd2 + coord_flip() + 
  geom_hline (aes(yintercept = d2_nacional, linetype = paste0(d2_nacional, '%')), 
              color = "gold", size = 1.2, show.legend = TRUE) +
  scale_linetype_discrete(name = '% nacional') 





Ranking DÚnica

rdu <- baseLimpa %>% 
  tail (28) %>% 
  arrange(desc(dose_unica_porcentagem)) 

du_nacional <- porc_nacional %>% 
  select(dose_unica_porcentagem) %>% 
  round(2) %>% 
  as.double()
  
plot_rdu <- ggplot(head(rd2, 5), aes(reorder(estado, dose_unica_porcentagem), dose_unica_porcentagem)) +
  geom_col(width = 0.9, fill = c("#755444","#926b58","#b0826c","#cf9b81","#efb497")) +
  geom_text(aes(label = paste0(as.character(round(dose_unica_porcentagem, 2)), '%')),
            hjust = -0.1,
            position = position_dodge(width = 1),
            inherit.aes = TRUE
            ) +
  labs (title = paste0('Top 5, Dose única (', data_atual, ')\n'), 
        x = NULL, 
        y = '% população vacinada') +
  ylim (0,100) +
  
  theme_classic() +
  theme(axis.text.y = element_text(size = 12, color = "black"))
plot_rdu + coord_flip() + 
  geom_hline (aes(yintercept = du_nacional, linetype = paste0(du_nacional, '%')), 
              color = "gold", size = 1.2, show.legend = TRUE) +
  scale_linetype_discrete(name = '% nacional') 





Ranking Imunizados

rimun <- baseLimpa %>% 
  tail (28) %>% 
  mutate (imunizados_porcentagem = segunda_dose_porcentagem + dose_unica_porcentagem) %>% 
  arrange(desc(imunizados_porcentagem)) 

imun_nacional <- porc_nacional %>%
  mutate (imunizados_porcentagem = segunda_dose_porcentagem + dose_unica_porcentagem) %>%
  select(imunizados_porcentagem) %>%
  round(2) %>%
  as.double()

plot_rimun <- ggplot(head(rimun, 5), aes(reorder(estado, imunizados_porcentagem), imunizados_porcentagem)) +
  geom_col(width = 0.9, fill = c("#482b75","#694c91","#8a6eaf","#ac92cc","#cfb7eb")) +
  geom_text(aes(label = paste0(as.character(round(imunizados_porcentagem, 2)), '%')),
            hjust = -0.1,
            position = position_dodge(width = 1),
            inherit.aes = TRUE
            ) +
  labs (title = paste0('Top 5, Imunização completa: D2 ou Dose única (', data_atual, ')\n'),
        x = NULL,
        y = '% população vacinada') +
  ylim (0,100) +

  theme_classic() +
  theme(axis.text.y = element_text(size = 12, color = "black"))
plot_rimun + coord_flip() +
  geom_hline (aes(yintercept = imun_nacional, linetype = paste0(imun_nacional, '%')),
              color = "gold", size = 1.2, show.legend = TRUE) +
  scale_linetype_discrete(name = '% nacional')





Evolução da vacinação em nível nacional

Ao analisarmos a organização da base de dados bruta original produzida pelo coletivo de cientistas de dados, vemos que, por uma escolha particular no que diz respeito à modelagem por eles desejada, estão apenas registrados os totais cumulativos a cada dia.

Se quisermos ter acesso aos números adicionais de vacinas aplicadas a cada dia, eles precisam ser inferidos subtraindo o total do dia anterior daquele do dia em questão. Com as ferramentas à nossa disposição, tal operação se torna trivial e podemos, assim, chegar à versão final de nossa base de dados de vacinação, adequada aos objetivos deste relatório. Podemos, também, eliminar a distração dos demais estados e nos concentrarmos em como a vacinação evoluiu desde o início no país como um todo e no estado de São Paulo, em particular.

# BASES FILTRADAS -------------------------------------------------------------
# Criacao das bases de dados filtradas nacional e de SP
vacinaTotalNacional <- baseLimpa %>% 
  filter(estado == "TOTAL")

vacinaTotalSP <- baseLimpa %>% 
  filter(estado == "SP")

# TRANSFORMACAO DOS DADOS -----------------------------------------------------
# Calculando numero diario de doses a partir dos totais consolidados
vacinaDiariaNacional <- vacinaTotalNacional %>% 
  mutate(primeira_dose_diaria = append(.$primeira_dose[1], diff(primeira_dose)),
         segunda_dose_diaria = append(.$segunda_dose[1], diff(segunda_dose)),
         dose_unica_diaria = append(.$dose_unica[1], diff(dose_unica)))

vacinaDiariaSP <- vacinaTotalSP %>% 
  mutate(primeira_dose_diaria = append(.$primeira_dose[1], diff(primeira_dose)),
         segunda_dose_diaria = append(.$segunda_dose[1], diff(segunda_dose)),
         dose_unica_diaria = append(.$dose_unica[1], diff(dose_unica)))

# Reordenando colunas para melhorar legibilidade
vacinaDiariaNacional <- vacinaDiariaNacional %>% 
  select(data, 
         primeira_dose, primeira_dose_diaria, primeira_dose_porcentagem,
         segunda_dose, segunda_dose_diaria, segunda_dose_porcentagem, 
         dose_unica, dose_unica_diaria, dose_unica_porcentagem, estado)

vacinaDiariaSP <- vacinaDiariaSP %>% 
  select(data, 
         primeira_dose, primeira_dose_diaria, primeira_dose_porcentagem,
         segunda_dose, segunda_dose_diaria, segunda_dose_porcentagem, 
         dose_unica, dose_unica_diaria, dose_unica_porcentagem, estado)
# Tabela - totais nacionais diários e cumulativos de vacinas
datatable(tail(vacinaDiariaNacional, 30), 
          caption = htmltools::tags$caption(
            style = 'caption-side: bottom; text-align: center;', 
            htmltools::strong('Totais diários e cumulativos de vacinas em nível nacional')),
          rownames = FALSE, 
          colnames = c("Data", "D1 total", "D1 diário", "% D1", "D2 total", "D2 diário", "% D2", "DÚnica total", "Dúnica diário", "% DÚnica", "Estado"), 
          class = 'display nowrap', 
          options = list (dom = 'ltip', 
                         scrollX = TRUE, 
                         fixedColumns = FALSE, 
                         lengthMenu = c(10, 20, 30)))

Com a base pronta para o nível nacional, exemplificada na tabela logo acima com os dados mais atualizados, podemos traçar um panorama da evolução da campanha de imunização e verificar tendências. Traçamos, assim, dois gráficos: o primeiro retratando o ritmo de aplicação de primeiras doses, e o segundo ilustrando quantos a cada dia atingem a imunidade completa, seja com a aplicação da segunda dose, ou de uma vacina de dose única.

O formato dos gráficos indica que existe um padrão recorrente de diminuição drástica da vacinação durante os fins de semana. De forma a suavizar essa distorção cíclica e prover um panorama mais realista do ritmo efetivo de vacinação e de sua evolução ao longo do tempo, aplicamos uma média móvel com janela igual a 7 dias.

Os gráficos nas abas abaixo são dotados de diversas ferramentas dinâmicas. É possível selecionar datas de interesse (no slider abaixo do gráfico ou desenhando uma área de zoom com o mouse) e saber os valores exatos diários passando o cursor sobre as curvas.



Primeira dose

d1NacionalMedia <- vacinaDiariaNacional %>% 
  mutate(D1_mediaMovel = round(rollmean(.$primeira_dose_diaria, k = 7, align = 'right', fill = NA))) %>% 
  select(data, primeira_dose_diaria, D1_mediaMovel) 


tsNacionalD1=as.xts(x=d1NacionalMedia[,-1], order.by=d1NacionalMedia$data)

p <- dygraph(tsNacionalD1, main = 'Primeira dose, Brasil') %>%
  dySeries('primeira_dose_diaria', label = 'D1', color = 'blue') %>% 
  dySeries('D1_mediaMovel', label = "médiaMóvel", color = 'red') %>% 
  dyAxis("y", label = "Doses", valueRange = c(0, 2400000), axisLabelFontSize = 11) %>%
  dyCrosshair(direction = "vertical") %>% 
  dyRangeSelector(height = 35) %>%
  dyLimit(1000000, label = '1 milhão de doses', color = 'coral') %>% 
  dyHighlight(highlightSeriesOpts = list(strokeWidth = 1.5)) %>% 
  dyUnzoom() %>%
  dyOptions(drawGrid = FALSE, maxNumberWidth = 9)
p
d1max <- d1NacionalMedia %>% 
  filter(primeira_dose_diaria == max(.$primeira_dose_diaria, na.rm = TRUE))
d1max_data <- format(d1max$data, '%d de %B')
d1max_valor <- format(d1max$primeira_dose_diaria, big.mark = ".")

d1mediamax <- d1NacionalMedia %>% 
  filter(D1_mediaMovel == max(.$D1_mediaMovel, na.rm = TRUE))
d1mediamax_data <- format(d1mediamax$data, '%d de %B')
d1mediamax_valor <- format(d1mediamax$D1_mediaMovel, big.mark = ".")

Como se pode verificar do gráfico acima, o pico de aplicação de D1 ocorreu no dia 17 de junho, com 2.118.821 doses alcançando a população. No tocante à média móvel, o valor máximo de 1.260.346 doses corresponde ao dia 23 de junho.


Imunização completa

imunNacionalMedia <- vacinaDiariaNacional %>% 
  mutate(imun_diaria = segunda_dose_diaria + dose_unica_diaria) %>% 
  replace(.==0, NA) %>% 
  mutate(imun_mediaMovel = round(rollmean(.$imun_diaria, k = 7, align = 'right', fill = NA))) %>% 
  select(data, imun_diaria, imun_mediaMovel) 


tsNacionalImun=as.xts(x=imunNacionalMedia[,-1], order.by=imunNacionalMedia$data)

p <- dygraph(tsNacionalImun, main = 'Totalmente imunizados (D2 + dose única), Brasil') %>%
  dySeries('imun_diaria', label = 'imunizados', color = 'darkgreen') %>% 
  dySeries('imun_mediaMovel', label = "médiaMóvel", color = 'darkorchid') %>% 
  dyAxis("y", label = "Doses", valueRange = c(0, 2400000), axisLabelFontSize = 11) %>%
  dyCrosshair(direction = "vertical") %>% 
  dyRangeSelector(height = 35) %>%
  dyLimit(1000000, label = '1 milhão de doses', color = 'coral') %>% 
  dyHighlight(highlightSeriesOpts = list(strokeWidth = 1.5)) %>% 
  dyUnzoom() %>%
  dyOptions(drawGrid = FALSE, maxNumberWidth = 9)
p
imunmax <- imunNacionalMedia %>% 
  filter(imun_diaria == max(.$imun_diaria, na.rm = TRUE))
imunmax_data <- format(imunmax$data, '%d de %B')
imunmax_valor <- format(imunmax$imun_diaria, big.mark = ".")

imunmediamax <- imunNacionalMedia %>% 
  filter(imun_mediaMovel == max(.$imun_mediaMovel, na.rm = TRUE))
imunmediamax_data <- format(imunmediamax$data, '%d de %B')
imunmediamax_valor <- format(imunmediamax$imun_mediaMovel, big.mark = ".")

O pico de aplicação de D2+dose única ocorreu no dia 04 de agosto, com 946.222 pessoas alcançando a imunidade completa. No tocante à média móvel, o valor máximo de 595.188 doses corresponde ao dia 04 de agosto.


Evolução da vacinação em São Paulo

Por fim, como fizemos com o recorte nacional no tópico anterior, concentremo-nos nos dados do maior e mais populoso estado da federação, lar de mais de um quinto da população do país. São Paulo tem se revelado, em paralelo a outros estados como Mato Grosso do Sul e Rio Grande do Sul, um exemplo de alocação mais eficiente de imunizantes, com um ritmo crescente de vacinação e índices que o destacam da média nacional.

# Tabela - totais nacionais diários e cumulativos de vacinas
datatable(tail(vacinaDiariaSP, 30), 
          caption = htmltools::tags$caption(
            style = 'caption-side: bottom; text-align: center;', 
            htmltools::strong('Totais diários e cumulativos de vacinas em São Paulo')),
          rownames = FALSE, 
          colnames = c("Data", "D1 total", "D1 diário", "% D1", "D2 total", "D2 diário", "% D2", "DÚnica total", "Dúnica diário", "% DÚnica", "Estado"), 
          class = 'display nowrap', 
          options = list (dom = 'ltip', 
                         scrollX = TRUE, 
                         fixedColumns = FALSE, 
                         lengthMenu = c(10, 20, 30)))

Os gráficos abaixo demonstram a evolução da campanha de vacinação em território paulistano, de maneira semelhante ao que fizemos acima com os dados nacionais.


Primeira dose SP

d1SPMedia <- vacinaDiariaSP %>% 
  mutate(D1_mediaMovel = round(rollmean(.$primeira_dose_diaria, k = 7, align = 'right', fill = NA))) %>% 
  select(data, primeira_dose_diaria, D1_mediaMovel) 


tsSPD1=as.xts(x=d1SPMedia[,-1], order.by=d1SPMedia$data)

p <- dygraph(tsSPD1, main = 'Primeira dose, São Paulo') %>%
  dySeries('primeira_dose_diaria', label = 'D1', color = 'blue') %>% 
  dySeries('D1_mediaMovel', label = "médiaMóvel", color = 'red') %>% 
  dyAxis("y", label = "Doses", valueRange = c(0, 600000), axisLabelFontSize = 11) %>%
  dyCrosshair(direction = "vertical") %>% 
  dyRangeSelector(height = 35) %>%
  dyLimit(300000, label = '300 mil doses', color = 'coral') %>% 
  dyHighlight(highlightSeriesOpts = list(strokeWidth = 1.5)) %>% 
  dyUnzoom() %>%
  dyOptions(drawGrid = FALSE, maxNumberWidth = 9)
p
d1SPmax <- d1SPMedia %>% 
  filter(primeira_dose_diaria == max(.$primeira_dose_diaria, na.rm = TRUE))
d1SPmax_data <- format(d1SPmax$data, '%d de %B')
d1SPmax_valor <- format(d1SPmax$primeira_dose_diaria, big.mark = ".")

d1SPmediamax <- d1SPMedia %>% 
  filter(D1_mediaMovel == max(.$D1_mediaMovel, na.rm = TRUE))
d1SPmediamax_data <- format(d1SPmediamax$data, '%d de %B')
d1SPmediamax_valor <- format(d1SPmediamax$D1_mediaMovel, big.mark = ".")


O pico de aplicação de D1 em São Paulo ocorreu no dia 17 de junho, com 487.827 doses alcançando a população paulistana. Quanto à média móvel, o valor máximo de 351.564 doses corresponde ao dia 23 de junho.


Imunização completa SP

imunSPMedia <- vacinaDiariaSP %>% 
  mutate(imun_diaria = segunda_dose_diaria + dose_unica_diaria) %>% 
  replace(.==0, NA) %>% 
  mutate(imun_mediaMovel = round(rollmean(.$imun_diaria, k = 7, align = 'right', fill = NA))) %>% 
  select(data, imun_diaria, imun_mediaMovel) 


tsSPImun=as.xts(x=imunSPMedia[,-1], order.by=imunSPMedia$data)

p <- dygraph(tsSPImun, main = 'Totalmente imunizados (D2 + dose única), São Paulo') %>%
  dySeries('imun_diaria', label = 'imunizados', color = 'darkgreen') %>% 
  dySeries('imun_mediaMovel', label = "médiaMóvel", color = 'darkorchid') %>% 
  dyAxis("y", label = "Doses", valueRange = c(0, 600000), axisLabelFontSize = 11) %>%
  dyCrosshair(direction = "vertical") %>% 
  dyRangeSelector(height = 35) %>%
  dyLimit(300000, label = '300 mil doses', color = 'coral') %>% 
  dyHighlight(highlightSeriesOpts = list(strokeWidth = 1.5)) %>% 
  dyUnzoom() %>%
  dyOptions(drawGrid = FALSE, maxNumberWidth = 9)
p
imunSPmax <- imunSPMedia %>% 
  filter(imun_diaria == max(.$imun_diaria, na.rm = TRUE))
imunSPmax_data <- format(imunSPmax$data, '%d de %B')
imunSPmax_valor <- format(imunSPmax$imun_diaria, big.mark = ".")

imunSPmediamax <- imunSPMedia %>% 
  filter(imun_mediaMovel == max(.$imun_mediaMovel, na.rm = TRUE))
imunSPmediamax_data <- format(imunSPmediamax$data, '%d de %B')
imunSPmediamax_valor <- format(imunSPmediamax$imun_mediaMovel, big.mark = ".")


O pico de aplicação de D2+dose única em SP ocorreu no dia 29 de julho, com 309.820 paulistanos alcançando a imunidade completa. Por fim, no que concerne a média móvel, o valor máximo de 183.266 doses corresponde ao dia 12 de agosto.
________

  1. Trabalho de conclusão do curso “R para Ciência de Dados I” da trilha de DataSci da curso-r↩︎