Информирование населения России о Covid-19
Тип проекта: исследовательский
Данные:
Ссылка на приложение: Интерфейс
Данные берутся из официального источника России по регионам с Роскомнадзор, которые интегрируются в GoogleSheets.В таблице есть такие переменные, как дата,выздоровел,фатальные случаи, активные случаи,восстановление,смертность, подтверждено скончалось на 1000 человек и т.д. Далее на основе них составляется статистика и строиются прогнозы, модель ARIMA.
Для описательной части проекта, также были взяты данные с Kaggle “COVID-19 World Vaccination Progress”. В этом файле были собраны данные о вакцинации на уровне страны. В таблице есть такие переменные, как страна, день (с начала марта 2020 по апрель 2022), количество вакцинации в стране по датам, количество вакцинаций, проведенных за один день и др. Так как проект фокусируется на пандемии COVID-19 в России, данные были отфильтрованы именно по этой стране. Для того, чтобы понять, как рос процент вакцинированного населения было построено два линейных графика с датами по оси Х: динамика по количеству полностью привитых с начала пандемии и динамика совершенных вакцинаций за один день. Наглядная демонстрация этих данных позволила увидеть, в какое время были пики с наименьшим и наибольшим уровнем вакцинированного населения, а также отследить, как менялось количество совершенных прививок в день.
Пользователи: Целевой аудиторией является группа пользователей, заинтересованных в мониторинге ситуации по заболеваемости и распространению Covid-19 в своем регионе, которые хотят получать актуальную информацию в одном источнике.Типов пользователей нет.
Мы использовали статистические самообновляемые данные с указанных источников.при сборе данных мы не меняли исходные значения, а лишь корректировали тип данных для визуализации.
Среди методов машинного обучения, примененных в проекте были прогнозы, автоматически подбирающие параметры для каждого временного ряда.Так использовалась модель AUTO-ARIMA()
Наше приложение использует входные данные и преодразует их в графики и таблицы.При этом пользователь может настроить фильтры, выбрать интересующий его период и получить прогноз по городам.Пользователь может ознакомится с данными с возможным скачиванием графиков по интересующим его городам свободно.
Мы решили визуализировать, во-первых, основные данные по определенным городам и областям,так как мы считаем что пользователям будет интересно изучить статистику которая обнавляется ежедневно, во-вторых, прогнозы для тех же городов, так как это является основной задачей, информировать а что будет условно “завтра”.
Входные данные: Выбор из списка город
Выходные данные: Интерактивный график, который можно
приблежать, выберать период и нужный показатель, если потребителю это
необходимо. Скрин интерфейса: ##
Examples of DataTables Входные данные: Выбор
необходимого города (во вкладках), выбор необходимых показателей, а так
же по необходимости фильтры(сортировка по возрастанию/убыванию)
Выходные данные: таблица по заданным параметрам
Скрин интерфейса: ## Covid
disease forecasts 2019 for cities Входные данные: Выбор
вкладки с названием города
Выходные данные: график прогноза
Скрин интерфейса: ##
Vaccinations Входные данные: выбор между вкладками
Dynamics of vaccinated people in Russia и Dynamics of vaccinations
carried out per day in Russia
Выходные данные: график с описанием
Скрин интерфейса: ## About
Входные данные: нет
Выходные данные: информация о проекте и о данных
Скрин интерфейса:
Код интерфейса:
# здесь код только для интерфейса
ui <- fluidPage(
navbarPage(
"COVID-2019",
tabPanel("Plot",
sidebarLayout(
sidebarPanel(selectInput("dataset", "Choose a dataset:",
choices = c("Moscow", "Piter", "Tomsk","Moscow Oblast","Leningrad Oblast","Omsk","Murmansk","Tula")),
actionButton("update", "Update View")
),
mainPanel(
plotlyOutput("plot"),
)
)
),
tabPanel(
title = "Examples of DataTables",
sidebarLayout(
sidebarPanel(
conditionalPanel(
'input.dataset === "Moscow"',
checkboxGroupInput("show_vars", "Columns in Moscow to show:",
names(Moscow), selected = names(Moscow))
),
conditionalPanel(
'input.dataset === "Piter"',
checkboxGroupInput("show_vars_1", "Columns in Piter to show:",
names(Piter), selected = names(Piter))
),
conditionalPanel(
'input.dataset === "Omsk"',
checkboxGroupInput("show_vars_2", "Columns in Omsk to show:",
names(Omsk), selected = names(Omsk))
),
conditionalPanel(
'input.dataset === "MoscowOblast"',
checkboxGroupInput("show_vars_3", "Columns in Moscow Oblast to show:",
names(MoscowOblast), selected = names(MoscowOblast))
),
conditionalPanel(
'input.dataset === "LeningradOblast"',
checkboxGroupInput("show_vars_4", "Columns in Leningrad Oblast to show:",
names(LeningradOblast), selected = names(LeningradOblast))
),
conditionalPanel(
'input.dataset === "Murmansk"',
checkboxGroupInput("show_vars_5", "Columns in Murmansk to show:",
names(Murmansk), selected = names(Murmansk))
),
conditionalPanel(
'input.dataset === "Tula"',
checkboxGroupInput("show_vars_6", "Columns in Tula to show:",
names(Tula), selected = names(Tula))
),
conditionalPanel(
'input.dataset === "Tomsk"',
checkboxGroupInput("show_vars_7", "Columns in Tomsk to show:",
names(Tomsk), selected = names(Tomsk))
)
),
mainPanel(
tabsetPanel(
id = 'dataset',
tabPanel("Moscow", DT::dataTableOutput("mytable1")),
tabPanel("Piter", DT::dataTableOutput("mytable2")),
tabPanel("Omsk", DT::dataTableOutput("mytable3")),
tabPanel("MoscowOblast", DT::dataTableOutput("mytable4")),
tabPanel("LeningradOblast", DT::dataTableOutput("mytable5")),
tabPanel("Murmansk", DT::dataTableOutput("mytable6")),
tabPanel("Tula", DT::dataTableOutput("mytable7")),
tabPanel("Tomsk", DT::dataTableOutput("mytable8"))
)
)
)),tabPanel(
title = "Covid disease forecasts 2019 for cities",
mainPanel(
tabsetPanel(
id = 'dataset',
tabPanel("Moscow", plotOutput("plot_1")),
tabPanel("Piter", plotOutput("plot_2")),
tabPanel("Omsk", plotOutput("plot_3")),
tabPanel("MoscowOblast", plotOutput("plot_4")),
tabPanel("LeningradOblast", plotOutput("plot_5")),
tabPanel("Murmansk",plotOutput("plot_6")),
tabPanel("Tula", plotOutput("plot_7")),
tabPanel("Tomsk", plotOutput("plot_8"))
)
)
),
tabPanel(
title = "Vaccinations",
mainPanel(
tabsetPanel(
tabPanel("Dynamics of vaccinated people in Russia", plotOutput("plot_n_1"),
p("In 2020, on March 11, the World Health Organization (WHO) declared the COVID-19 outbreak a pandemic. In August of the same year, the Sputnik coronavirus vaccine was officially registered in Russia. The graph below shows the dynamics of changes in the number of fully vaccinated against coronavirus among the Russian population.
The graph shows that a year after the announcement of the pandemic and on the 7th month of the official registration of the Sputnik vaccine, which is used in Russia, about 25% of the country's population was fully vaccinated. Since the vaccine has two components, and the vaccination with only one is considered incomplete, the number of fully vaccinated people begins to decline, reaching 17% in August 2021. Since the beginning of 2022, almost half of the population of Russia has been fully vaccinated: the number is kept at about 45%.")),
tabPanel("Dynamics of vaccinations carried out per day in Russia", plotOutput("plot_n_2"),
p("The graph below shows the dynamics of the number of vaccinations carried out per one day in Russia. It can be seen that in March 2021, about 125,000 people were vaccinated per day. It was clear from the previous graph that the number of fully vaccinated people was at its lowest point in August 2021. And it was after the mark of 17% of the vaccinated population that the Russians began to actively vaccinate. The graph below shows that the number of vaccinations given in one day begins to grow rapidly in late summer - early autumn, reaching a peak of 1 million vaccinations per day. After that, in the fall of 2021, the vaccination rate decreased, when the percentage of the vaccinated population again became above 25%. This spring, in April, vaccination rates are about the same as a year ago - about 125,000 per day, but already with more than 45% fully vaccinated against COVID-19.")
)
)
)),
tabPanel(
"About",
# Various tabs.
tabsetPanel(
# General info.
tabPanel(
"Overview",
tags$h1("Aim of the project"),
tags$p(HTML("The aim of this project to inform the citizens of the most populated in Russia.")),
tags$p(HTML("Coronovirus infection is one of the most dangerouse for people lives and heaths' infection that shoud be under detection.")),
tags$h1("To inform people we created the interface with main metrics to observe"),
tags$p(HTML("Amoung main variebles that we used to inform are:")),
tags$ul(
tags$li(HTML("Confiremed cases ")),
tags$li(HTML("Recovered")),
tags$li(HTML("Fatal- (those who are under big pressure)")),
tags$li(HTML("Active- (those who are in hospitals now)")),
tags$li(HTML("Mortality- (rate)")),
tags$li(HTML("Affected- those who are ill? but not in hospitals"))
),
tags$p(HTML("The DataSet was taken from oficial Russian source:")),
tags$h1("Роскомнадзор"),
tags$p(HTML("Source is available at <a href=\"https://covid.observer\">https://covid.observer/</a>."))
)))
))
server <- function(input, output) { # updated when the user clicks the button
datasetInput <- eventReactive(input$update, {
switch(input$dataset,
"Tomsk" = Tomsk,
"Moscow" = Moscow,
"Piter" = Piter,
"Moscow Oblast"=MoscowOblast,
"Leningrad Oblast"=LeningradOblast,"Omsk"=Omsk,"Murmansk"=Murmansk,"Tula"=Tula)
}, ignoreNULL = FALSE)
output$plot <- renderPlotly({
my_data <- datasetInput()
fig<-plot_ly(datasetInput(), type = 'scatter', mode = 'lines')%>%
add_trace(x = ~Date, y = ~(my_data$Recovered), name = 'Recovered')%>%
add_trace(x = ~Date, y = ~(my_data$Fatal), name = 'Fatal')%>%
add_trace(x = ~Date, y = ~(my_data$Active), name = 'Active')%>%
add_trace(x = ~Date, y = ~(my_data$Died), name = 'Died') %>%
layout(showlegend = T, title='City you chose',
xaxis = list(rangeslider = list(visible = T)),yaxis = list(title ='Number of people'))
fig <- fig %>%
layout(
xaxis = list(zerolinecolor = '#ffff',
zerolinewidth = 2,
gridcolor = 'ffff'),
yaxis = list(zerolinecolor = '#ffff',
zerolinewidth = 2,
gridcolor = 'ffff'),
plot_bgcolor='#e5ecf6') %>% layout(height = 400, width = 880)
fig
})
output$plot_1 <- renderPlot({
autoplot(forecast(auto.arima(log(xts(Moscow$Confirmed...2, Moscow$Date)),seasonal = FALSE),h=200),main="Prediction for Moscow",xlab="Period", ylab="Count of Confurmed cases")
})
output$plot_2 <- renderPlot({
autoplot(forecast(auto.arima(log(xts(Piter$Confirmed...2, Piter$Date)),seasonal = FALSE),h=200),main="Prediction for Piter",xlab="Period", ylab="Count of Confurmed cases")
})
output$plot_3 <- renderPlot({
autoplot(forecast(auto.arima(log(xts(Omsk$Confirmed...2, Omsk$Date)),seasonal = FALSE),h=200),main="Prediction for Omsk",xlab="Period", ylab="Count of Confurmed cases")
})
output$plot_4 <- renderPlot({
autoplot(forecast(auto.arima(log(xts(MoscowOblast$Confirmed...2, MoscowOblast$Date)),seasonal = FALSE),h=200),main="Prediction for MoscowOblast",xlab="Period", ylab="Count of Confurmed cases")
})
output$plot_5 <- renderPlot({
autoplot(forecast(auto.arima(log(xts(LeningradOblast$Confirmed...2, LeningradOblast$Date)),seasonal = FALSE),h=200),main="Prediction for LeningradOblast",xlab="Period", ylab="Count of Confurmed cases")
})
output$plot_6 <- renderPlot({
autoplot(forecast(auto.arima(log(xts(Murmansk$Confirmed...2, Murmansk$Date)),seasonal = FALSE),h=200),main="Prediction for Murmansk",xlab="Period", ylab="Count of Confurmed cases")
})
output$plot_7 <- renderPlot({
autoplot(forecast(auto.arima(log(xts(Tula$Confirmed...2, Tula$Date)),seasonal = FALSE),h=200),main="Prediction for Tula",xlab="Period", ylab="Count of Confurmed cases")
})
output$plot_8 <- renderPlot({
autoplot(forecast(auto.arima(log(xts(Tomsk$Confirmed...2, Tomsk$Date)),seasonal = FALSE),h=200),main="Prediction for Tomsk",xlab="Period", ylab="Count of Confurmed cases")
})
# choose columns to display
Moscow2 = Moscow[sample(nrow(Moscow), 100), ]
output$mytable1 <- DT::renderDataTable({
DT::datatable(Moscow2[, input$show_vars , drop = FALSE])
})
Piter2 = Piter[sample(nrow(Piter), 100), ]
output$mytable2 <- DT::renderDataTable({
DT::datatable(Piter2[, input$show_vars_1 , drop = FALSE])
})
Omsk2 = Omsk[sample(nrow(Omsk), 100), ]
output$mytable3 <- DT::renderDataTable({
DT::datatable(Omsk2[, input$show_vars_2, drop = FALSE])
})
# choose columns to display
MoscowOblast2 = MoscowOblast[sample(nrow(MoscowOblast), 100), ]
output$mytable4 <- DT::renderDataTable({
DT::datatable(MoscowOblast2[, input$show_vars_3 , drop = FALSE])
})
LeningradOblast2 = LeningradOblast[sample(nrow(LeningradOblast), 100), ]
output$mytable5 <- DT::renderDataTable({
DT::datatable(LeningradOblast2[, input$show_vars_4 , drop = FALSE])
})
# choose columns to display
Murmansk2 = Murmansk[sample(nrow(Murmansk), 100), ]
output$mytable6 <- DT::renderDataTable({
DT::datatable(Murmansk2[, input$show_vars_5 , drop = FALSE])
})
Tula2 = Tula[sample(nrow(Tula), 100), ]
output$mytable7 <- DT::renderDataTable({
DT::datatable(Tula2[, input$show_vars_6 , drop = FALSE])
})
Tomsk2 = Tomsk[sample(nrow(Tomsk), 100), ]
output$mytable8 <- DT::renderDataTable({
DT::datatable(Tomsk2[, input$show_vars_7, drop = FALSE])
})
output$plot_n_1 <- renderPlot({
ggplot(data = bymonth, aes(x = Date, y = result)) +
geom_line(color = "green", size = 1) +
theme(axis.text.x = element_text(angle = 45)) +
ylab('Number of fully vaccinated per 100 people') +
xlab('Month, year') +
scale_y_continuous(limits = c(0, 50), breaks = seq(0, 50, 10)) +
scale_x_continuous(breaks=as.numeric(bymonth$Date), labels=format(bymonth$Date,"%m-%Y"))
})
output$plot_n_2 <- renderPlot({
ggplot(data = russia, aes(x = date, y = daily_vaccinations)) +
geom_line(colour = "green") +
theme(axis.text.x = element_text(angle = 45)) +
ylab('Number of vaccinations per day, thousand') +
xlab('Date')
})
}
shinyApp(ui, server)
<Опишите, как проводилось оценивание приложения, какие результаты получены. Для исследовательского проекта – какие основные результаты и выводы>
<Ссылка на приложение на внешнем сервере, например, shinyapps или на папку с приложением>
<Ответы на полученные в процессе peer review вопросы (зеленый столбец), рассмотрение предложенные там примеров (синие столбцы). Если вопросы похожи, то можно объединять их в группы. Если вопрос совсем не в тему или в ваших данных нет тех параметров, на которые он ссылается, то вставляете вопрос в отчет, и прямо пишете комментарий. Если пример, который предлагают проверить, нереализуем (например, у вас нет таких данных), то тоже просто прямо об этом пишете>
Вопрос: Какие сложности возникли при реализации проекта? Ответ: Во-первых, сложность с объединением таблиц. У каждого города по России своя отдельная таблица с данными. Изначально мы хотели объеденить все таблицы в одну, чтобы построить прогноз, но возникла сложность с объединением. Во-вторых,возникли сложности с формированием карты- изначально планировалось представить карту.
Вопрос: Что представляют параметры на основе, которых были построены модель ARIMA для каждого города? Ответ: Параметры представляют собой прошлые лаги – значения, на основе которых и строентся прогноз. Количество выбранных лагов выбирает сам алгоритм на основе минимизации информационного критерия и ошибки предсказания. Вопрос: То, что в презентации были показаны города Москва, СПб, Тула, и еще несколько связано с тем, что для всех остальных городов не было данных, или это связано с невозможностью построить модель ARIMA? Не понятен принцип отбора городов и областей для приложения: почему именно эти? Ответ: В начале представления мы говорим, что именно эти города являются городами с наивысшей скоростью заражения и мы обращаем на них особое внимание, к тому же ограниченное количество город и выбор именно представленных в проекте не отходит от изначальной идеи проекта – проанализировать заражение в России, а суммарная численность населения в этих города около 45%. Вопрос: В таблицах последние актуальные данных за 14 мая - это означает, что они не обновляются автоматически? Подгружаются ли действительно данные в режиме реального времени? Ответ: Да, они подгружаются, но мы обнаружили, что нам все равно приходится обновлять интерфейс. Вопрос: Как проводилось оценивание проекта? Что именно предсказывает модель, ведь выбор конкретного класса не предоставлен? Почему в источниках указан Роскомнадзор, а ссылка направляет на другой сайт? Ответ: Ссылка ведет на сайт, данные на котором публикует Роспотребнадзор. На сайте есть объяснение. Оценка проводилась с помощью встроенной функции auto-Arima(), главной целью которой является минимизация ошибки предсказания.(см теории про временные ряды).
##Про визуализацию:
Вопрос: Как правильно читать график предсказаний? Правильно ли, что через 1000 дней в Москве будет менее 20 подтвержденных случаев ковида? И что означает синее выделение (можно добавить легенду)? Что означает фиолетовый канал на графике в предсказании?
Ответ: Не совсем так, прогноз пересчитывается и меняется на основе полученных новых реальных данных, а прогнозный промежуток, доступный для пользователей в пределах 2-3 дней. Это вид краткосрочного прогнозирования
Вопрос: Почему не сделали таблицу поприятнее? Ответ: Спасибо за замечание, но всегда у приложений есть не достатки для каждого, но наш взгляд, таблица выглядит презентабельно. Вопрос: В шайни осталось много названий переменных как они записаны в данных, что выглядит некрасиво. Что такое confirmed..2 и …10? Что значат числа (не дата) в обозначении period в предсказании? Почему «Piter»? Ответ: Да, это действительно так, но мы не видим в этом ничего категоричного. confirmed..2- это confirmed caces, f confirmed..10- это confirmed per 1000. Эти числа значат период в днях.
Мы гордимся нашим приложением по нескольким причинам: во первых, оно выполняет Социально полезную функцию информирования о распространении инфекции. Во вторых позволяет получить редкие для наших сайтов данные-прогноз заболеваемости. Мы постарались охватить все города миллионники и усовершенствовать информирование населения Страны.