Во второй части кода мы погружаемся в серверную логику приложения R Shiny. Этот раздел обрабатывает загрузку данных, обработку данных и создание желаемых выходных данных на основе пользовательского ввода. Разберем код шаг за шагом:

Шаг 1. Загрузка и подготовка данных

accessory <- reactive({
 if(input$dataset == "accessories") {
 accessories <- read_csv("accessories.csv", na = c("", "NA"))
 accessories <- accessories %>% 
 mutate(discount_price = (raw_price * (100 - discount)) / 100)
 
 # Convert the subcategory and currency variables to factors
 accessories$subcategory <- as.factor(accessories$subcategory)
 accessories$currency <- as.factor(accessories$currency)
 
 # Remove any missing values or outliers from the dataset
 accessories <- accessories %>% 
 drop_na() %>% # Remove rows with missing values
 filter(likes_count < quantile(likes_count, 0.99)) # Remove the top 1% of likes_count values
 
 return(accessories)
 }
})

На этом шаге реактивное выражение `accessory` загружает и обрабатывает данные на основе выбранного набора данных. Если выбран набор данных "accessories", он считывает CSV-файл"accessories.csv" с помощью `read_csv()` из пакета `readr`. Затем он вычисляет `discount_price`, применяя формулу скидки на основе `raw_price` и `discount`.

Затем он преобразует переменные `subcategory` и `currency` в факторы с помощью функции `as.factor()`. Этот шаг гарантирует, что эти переменные будут рассматриваться как категориальные факторы в дальнейшем анализе.

Наконец, код удаляет все отсутствующие значения и выбросы из набора данных. Он использует `drop_na()` для удаления строк с отсутствующими значениями и `filter()` для удаления верхних 1% значений `likes_count`.

Шаг 2. Создание сводной таблицы

output$summary_table <- DT::renderDataTable({
 if(!is.null(accessory())) {
 skimr::skim(accessory())
 }
})

Этот код создает сводную таблицу с помощью функции `renderDataTable()` из пакета `DT`. Он проверяет, не является ли реактивный объект `accessory` нулевым, а затем создает сводную таблицу с помощью функции `skimr::skim()` из пакета `skimr`. В этой таблице представлен обзор набора данных, включая статистику и информацию о каждой переменной.

Шаг 3. Создание гистограммы количества лайков

output$likes_count_hist <- renderPlotly({
 if(!is.null(accessory())) {
 ggplotly(ggplot(accessory(), aes(x = likes_count)) +
 geom_histogram(bins = 20, fill = "lightblue", color = "black") +
 xlab("Likes Count") +
 ylab("Frequency") +
 ggtitle("Distribution of Likes Count")
 )
 }
})

Этот код создает гистограмму переменной `likes_count` с помощью функции `renderPlotly()`. Сначала он проверяет, не является ли реактивный объект `accessory` нулевым. Затем он создает объект ggplot с помощью `ggplot()` и указывает ось X как `likes_count`. Гистограмма настроена с помощью 20 бинов, светло-голубого цвета заливки и черных рамок. Метки осей и заголовок добавляются с помощью функций `xlab()`, `ylab()` и `ggtitle()` соответственно. Наконец, `ggplotly()` из пакета `plotly` преобразует объект ggplot в интерактивный объект plotly.

Шаг 4. Создание диаграмм рассеяния для выбранных переменных

output$scatterplots <- renderPlot({
 if(!is.null(input$variables) && length(input$variables) > 0 && !is.null(accessory())) {
 p_list <- lapply(input$variables, function(var) {
 ggplot(accessory(), aes_string(x = var, y = "likes_count")) +
 geom_point() +
 ggtitle(paste0("Scatterplot of ", var, " vs. likes_count"))
 })
 grid.arrange(grobs = p_list)
 } else {
 NULL
 }
})

Этот код создает диаграммы рассеяния для выбранных переменных с помощью функции `renderPlot()`. Он проверяет, не является ли `input$variables` нулевым значением, содержит ли хотя бы одну выбранную переменную, а реактивный объект `accessory` не является нулевым.

Внутри функции `lapply()` создается диаграмма рассеяния для каждой выбранной переменной. Функция `ggplot()` используется для создания диаграммы рассеяния, при этом i позволяет передавать имена переменных в виде строк. Функция `geom_point()` добавляет точки данных на график. Заголовок каждой диаграммы рассеяния генерируется динамически с использованием `paste0()` для объединения имени переменной и «likes_count».

Наконец, точечные диаграммы упорядочиваются с помощью функции `grid.arrange()` из пакета `gridExtra`, которая объединяет несколько графиков в сетку. Если переменные не выбраны, возвращается `NULL`.

Шаг 5. Вычисление матрицы корреляции и создание графика корреляции

cor_matrix <- reactive({
 selected_vars <- accessory()[, input$variables, drop = FALSE]
 cor(selected_vars)
})
output$correlation_plot <- renderPlot({
 corrplot(cor_matrix(), method = "number", type = "upper", order = "hclust",
 tl.col = "black", col = colorRampPalette(c("white", "deepskyblue", "blue4"))(100))
})

На этом шаге код вычисляет матрицу корреляции для выбранных переменных с помощью функции `reactive()` для создания реактивного объекта `cor_matrix`. Он извлекает столбцы, соответствующие выбранным переменным, из реактивного объекта `accessory`, используя `accessory()[, input$variables, drop = FALSE]`. Аргумент `drop = FALSE` гарантирует, что результирующий фрейм данных сохранит свои исходные размеры, даже если выбрана только одна переменная.

Затем функция `cor()` применяется к выбранным переменным для вычисления корреляционной матрицы.

Затем функция `renderPlot()` создает график корреляции, используя `corrplot()`. Он принимает реактивный объект `cor_matrix()` в качестве входных данных и устанавливает для `метода` значение «число», чтобы отображать значения корреляции на графике. Для параметра `type` установлено значение «upper», чтобы отображать только верхний треугольник корреляционной матрицы, а для параметра `order` установлено значение «hclust», чтобы упорядочить переменные на основе иерархической кластеризации.

Дополнительные параметры настройки включают установку черного цвета текста (`tl.col`) и цветовой палитры (`col`) с помощью функции `colorRampPalette()` для создания диапазона цветов от белого до темно-синего и синего4. Результирующий график представляет собой корреляционную матрицу с цветными ячейками, представляющими силу корреляции между переменными.

Шаг 6. Оценки максимального правдоподобия для нормального распределения

output$mle_normal_output <- renderPrint({
 fit <- fitdistr(accessory()$likes_count, "normal")
 mean_est <- fit$estimate[1]
 sd_est <- fit$estimate[2]
 
 # Print the estimated parameter values
 cat("Maximum likelihood estimates for Normal distribution:\n")
 cat("Mean:", mean_est, "\n")
 cat("Standard deviation:", sd_est, "\n")
})

На этом шаге функция `renderPrint()` генерирует оценки максимального правдоподобия для нормального распределения, используя функцию `fitdistr()` из пакета `MASS`. Он соответствует переменной `likes_count` из реактивного объекта `accessory` для нормального распределения.

Расчетное среднее значение и стандартное отклонение извлекаются из вектора `fit$estimate`. Затем эти значения выводятся с помощью функции `cat()`, предоставляя информацию об оценках максимального правдоподобия для нормального распределения.

Шаг 7. Соотношение среднего и дисперсии

output$mean_var_output <- renderPlot({
 mean_var_df <- accessory() %>% group_by(subcategory) %>% 
 summarise(mean_likes = mean(likes_count), var_likes = var(likes_count))
 
 ggplot(mean_var_df, aes(x = mean_likes, y = var_likes)) +
 geom_point() +
 scale_x_continuous(name = "Mean likes count") +
 scale_y_continuous(name = "Variance of likes count") +
 ggtitle("Mean-Variance Relationship for Likes Count")
})

Этот код создает график, показывающий отношение среднего значения к дисперсии для переменной `likes_count`, сгруппированной по переменной `subcategory`. Он использует функцию `renderPlot()`.

Во-первых, кадр данных `mean_var_df` создается с помощью функций `group_by()` и `summarise()` из пакета `dplyr`. Он вычисляет среднее значение и дисперсию `likes_count` для каждого значения `subcategory`.

Затем функция `ggplot()` используется для создания графика, при этом `aes()` указывает ось X как `mean_likes`, а ось Y как `var_likes`. Функция `geom_point()` добавляет точки на график. Метки осей задаются с помощью `scale_x_continuous()` и `scale_y_continuous()`, а заголовок добавляется с помощью `ggtitle()`.

Шаг 8. Разработка реактивного входного переключателя для выбора модели

model_choice <- reactive({
 if (input$model_type == "poisson") {
 return("poisson")
 } else if (input$model_type == "negbin") {
 return("negbin")
 } else {
 stop("Invalid model type specified.")
 }
})

Этот код создает реактивный входной переключатель для выбора между двумя типами моделей: «пуассон» или «негбин». Он использует функцию `reactive()` для определения реактивного объекта `model_choice`.

Если выбранный входной параметр `model_type` имеет значение «пуассон», он возвращает «пуассон». Если это «негбин», возвращается «негбин». В противном случае выдается сообщение об ошибке с использованием `stop()` для недопустимого типа модели.

Шаг 9. Проверка предположения о линейности и построение графика линейности

output$linearity <- renderPlot({
 set.seed(123)
 train_indices <- sample(nrow(accessory()), 0.7 * nrow(accessory())) # 70% for training
 train_data <- accessory()[train_indices, ]
 test_data <- accessory()[-train_indices, ]
 
 if (model_choice() == "poisson") {
 poisson_model <- glm(likes_count ~ current_price + raw_price + discount, 
 data = train_data, family = "poisson")
 poisson_aug <- augment(poisson_model)
 
 ggplot(data = poisson_aug, aes(x = .fitted, y = .resid)) +
 geom_point() +
 geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
 xlab("Fitted values") +
 ylab("Residuals")
 } else if (model_choice() == "negbin") {
 negbin_model <- glm.nb(likes_count ~ subcategory + current_price + raw_price + discount + discount_price, 
 data = train_data)
 negbin_aug <- augment(negbin_model)
 
 ggplot(data = negbin_aug, aes(x = .fitted, y = .resid)) +
 geom_point() +
 geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
 xlab("Fitted values") +
 ylab("Residuals")
 }
})

Этот код проверяет предположение о линейности для выбранного типа модели (пуассоновской или негбиновой) с помощью функции `renderPlot()`.

Во-первых, он случайным образом разбивает данные на наборы для обучения и тестирования. 70% данных используется для обучения путем выбора случайной выборки строк.

Затем он проверяет выбор модели с помощью `model_choice()`. Если выбрана модель «пуассона», она создает модель регрессии Пуассона (`glm()`) с использованием обучающих данных. Функция `augment()` из пакета `broom` применяется к модели для получения расширенного фрейма данных (`poisson_aug`).

Предположение о линейности проверяется путем создания диаграммы рассеяния остатков (`y =.resid`) по сравнению с подобранными значениями (`x =.fitted`). Функция `geom_point()` добавляет точки на график, а `geom_hline()` добавляет пунктирную красную линию при y = 0, чтобы указать ожидаемое поведение. Метки осей задаются с помощью `xlab()` и `ylab()`.

Аналогичный процесс выполняется для модели «negbin», где создается модель отрицательной биномиальной регрессии (`glm.nb()`) и проверяется предположение о линейности.

Шаг 10. Проверка предположения о независимости и создание графика независимости

output$independence <- renderPlot({
 set.seed(123)
 train_indices <- sample(nrow(accessory()),
0.7 * nrow(accessory())) # 70% for training
 train_data <- accessory()[train_indices, ]
 test_data <- accessory()[-train_indices, ]
 
 if (model_choice() == "poisson") {
 poisson_model <- glm(likes_count ~ current_price + raw_price + discount, 
 data = train_data, family = "poisson")
 poisson_aug <- augment(poisson_model)
 
 ggplot(data = poisson_aug, aes(x = 1:nrow(poisson_aug), y = .resid)) +
 geom_point() +
 geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
 xlab("Observation order") +
 ylab("Residuals")
 } else if (model_choice() == "negbin") {
 negbin_model <- glm.nb(likes_count ~ subcategory + current_price + raw_price + discount + discount_price, 
 data = train_data)
 negbin_aug <- augment(negbin_model)
 
 ggplot(data = negbin_aug, aes(x = 1:nrow(negbin_aug), y = .resid)) +
 geom_point() +
 geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
 xlab("Observation order") +
 ylab("Residuals")
 }
})

Этот код проверяет предположение о независимости для выбранного типа модели (пуассоновой или негбиновой) с помощью функции `renderPlot()`.

Подобно предположению о линейности, он случайным образом разбивает данные на обучающую и проверочную выборки, при этом 70% приходится на обучающую выборку.

Затем он проверяет выбор модели с помощью `model_choice()`. Если выбрана модель «пуассона», она создает модель регрессии Пуассона (`glm()`) с использованием обучающих данных. Функция `augment()` из пакета `broom` применяется к модели для получения расширенного фрейма данных (`poisson_aug`).

Предположение о независимости проверяется путем создания диаграммы рассеяния остатков (`y = .resid`) в зависимости от порядка наблюдений (`x = 1:nrow(poisson_aug)`). Функция `geom_point()` добавляет точки на график, а `geom_hline()` добавляет пунктирную красную линию при y = 0, чтобы указать ожидаемое поведение. Метки осей задаются с помощью `xlab()` и `ylab()`.

Аналогичный процесс применяется для модели «negbin», где создается модель отрицательной биномиальной регрессии (`glm.nb()`) и проверяется предположение о независимости.

Шаг 11. Резюме модели

output$model_summary <- renderPrint({
 set.seed(123)
 train_indices <- sample(nrow(accessory()), 0.7 * nrow(accessory())) # 70% for training
 train_data <- accessory()[train_indices, ]
 test_data <- accessory()[-train_indices, ]
 
 if (model_choice() == "poisson") {
 poisson_model <- glm(likes_count ~ current_price + raw_price + discount, 
 data = train_data, family = "poisson")
 poisson_aug <- augment(poisson_model)
 
 summary(poisson_model)
 } else if (model_choice() == "negbin") {
 negbin_model <- glm.nb(likes_count ~ current_price + raw_price + discount + discount_price, 
 data = train_data)
 negbin_aug <- augment(negbin_model)
 
 summary(negbin_model)
 } else {
 print("Invalid model choice specified.")
 }
})

Этот код генерирует сводку модели для выбранного типа модели (либо «пуассон», либо «негбин») с помощью функции `renderPrint()`.

Как и в предыдущих шагах, он случайным образом разбивает данные на обучающую и проверочную выборки, при этом 70% идет на обучение.

Сводка модели создается с помощью функции `summary()` для модели Пуассона.

Если выбрана модель «negbin», создается модель отрицательной биномиальной регрессии (`glm.nb()`), а сводка модели генерируется с использованием `summary()` для модели отрицательной биномиальной модели.

Если указан неверный выбор модели, выводится сообщение об ошибке.

На этом объяснение части 2 кода, посвященной серверной логике приложения R Shiny, завершено.

Как развернуть приложение?

🚀 После того как вы создали панель управления веб-приложением с помощью R Shiny, следующим шагом будет ее развертывание. Один из удобных вариантов — Shinyapps.io ☁️. Shinyapps.io — это облачная хостинговая платформа, разработанная специально для приложений Shiny. Он обеспечивает простой и оптимизированный процесс развертывания без необходимости сложной установки или настройки сервера. 💻📤
🔧 Чтобы развернуть приложение на Shinyapps.io, создайте учетную запись и загрузите приложение с локального компьютера или из интегрированной среды разработки, такой как RStudio. Shinyapps.io берет на себя управление серверной инфраструктурой, обеспечивая легкий доступ для пользователей. 🌐
⭐️ После развертывания Shinyapps.io предоставляет уникальный URL, по которому можно получить доступ к вашему веб-приложению. Вы даже можете настроить URL-адрес или назначить собственный домен для индивидуального подхода. 💫
💼 Shinyapps.io предлагает различные планы подписки с дополнительными функциями, такими как увеличенные лимиты приложений, повышенная безопасность и варианты частного развертывания. Выберите тот, который соответствует вашим потребностям. 💡
🌍 Shinyapps.io упрощает развертывание, делая ваше веб-приложение R Shiny доступным, масштабируемым и безопасным. Пользователи со всего мира могут легко взаимодействовать с вашей информационной панелью. Поделитесь своей работой без особых усилий! 🎉

Поздравляем! Вы успешно создали панель мониторинга веб-приложений с помощью R Shiny.

Мой вывод для справки:

Чтобы получить более ценную информацию и ресурсы в области науки о данных и передовых методов, я приглашаю вас связаться со мной на следующих платформах:

GitHub: ознакомьтесь с моими проектами и вкладом в области науки о данных на https://github.com/chdl17/

LinkedIn: будьте в курсе последних событий и общайтесь со мной на https://www.linkedin.com/in/maruthisai/

Medium: погружайтесь в подробные статьи и будьте в курсе, подписавшись на мой профиль Medium по адресу https://medium.com/@chadalapakam/subscribe

Вместе давайте отправимся в путешествие непрерывного обучения и исследуем огромные возможности науки о данных.

#DataScience #MachineLearning #DataAnalysis #ArtificialIntelligence #BigData #DataVisualization #DeepLearning #Statistics #Python #RStats #DataMining #DataDriven #DataAnalytics #Coding #Tech #Shiny #TechCommunity #DataScientists #AI #TechBlog #DataInsights #The_Chdl

#DataScience #MachineLearning #DataAnalysis #ArtificialIntelligence #BigData #DataVisualization #DeepLearning #Statistics #Python #RStats #DataMining #DataDriven #DataAnalytics #Coding #Tech #Shiny #TechCommunity #DataScientists #AI #TechBlog #DataInsights #The_Chdl