R语言Shiny数据应用开发

数据科学的关键方面之一是数据可视化,无论是探索原始数据、分析模型结果还是尝试调整模型,视觉化都有助于更容易地解释结果。传统上,这些视觉化效果是通过插件或库生成的,并在允许最终用户交互和解释结果的Web应用程序中呈现。这些视觉化可以是静态的,也可以是部分交互的。那么,是否有可能将数据可视化和Web技术的优势结合在一起呢?是的,这是可能的,这些应用程序被称为数据应用。

数据应用使得主题专家、商业决策者或消费者能够与数据进行交互,无论数据大小。它们与静态的BI报告不同,因为它们通过为特定用例量身定制的直观界面提供临时交互。它们也与自动化的ML驱动分析不同,因为它们是为“人在循环中”设计的,而不是自动化决策。这使得它们非常适合需要数据和直觉结合的分析。这些应用程序促进了数据调查和数据探索。数据调查是针对特定事件或异常的反应。用户将事件数据与其他数据源和历史数据结合起来,以确定根本原因并采取行动。这导致了成百上千的小洞察,总体上产生了巨大的差异。

在R(Shiny)和Python(Plotly Dash、Streamlit、Wave等)中有许多库可以构建数据应用。在本文中,将探讨如何使用R Shiny构建一个应用程序,使用户可以将数据集分割为训练/测试集,构建多个模型,生成模型指标,可视化结果,并即时做出决策。

将使用mtcars数据集来构建这个应用程序。一旦测试并确保UI和服务器功能按预期工作,可以更改数据集,应用程序应该可以很好地工作,如果需要的话,只需进行最小的数据处理。

首先,让安装并加载shiny。Shiny应用程序主要有UI和服务器两个文件:

install.packages("shiny") library("shiny")

用户界面(UI):这是定义布局的地方——占位符将在运行时从服务器处理的数据/图表中填充。服务器:这是编写大部分逻辑的地方,数据处理、绘图等。大部分繁重的工作都在这里完成。

接下来,将添加两个下拉字段,一个用于独立变量,另一个用于选择目标变量。

dashboardBody( fluidPage( box( selectInput( "SelectX", label = "选择变量:", choices = names(mtcars), multiple = TRUE, selected = names(mtcars) ), solidHeader = TRUE, width = "3", status = "primary", title = "X变量" ), box( selectInput("SelectY", label = "选择预测变量:", choices = names(mtcars)), solidHeader = TRUE, width = "3", status = "primary", title = "Y变量" ) ) )

接下来,将在侧边栏添加一个滑块控件,根据用户选择将数据集分割为训练和测试集。

dashboardSidebar( sliderInput( "Slider1", label = h3("训练/测试集分割百分比"), min = 0, max = 100, value = 75 ), textOutput("cntTrain"), textOutput("cntTest") )

现在,将创建多个标签,每个标签都有特定的功能,如下所述:

数据 - 以表格形式查看原始数据,数据摘要 - 查看数据集的基本统计信息,图表 - 在这种情况下,将只创建一个相关性图表,但如果需要,可以添加更多相关的图表。模型 - 根据用户选择的X、Y变量和训练/测试集分割构建线性回归模型,预测 - 在测试集上进行预测。

现在已经构建了UI,将进行服务器逻辑的实现,根据用户选择填充UI - 交互性。

填充数据标签:使用mtcars数据框架,并将其保存在一个名为InputDataset的对象中,然后使用renderDT()函数填充UI。请注意,在对象InputDataset()的末尾使用大括号。这是因为它是一个反应式对象,这意味着对这个对象的任何更改都会影响应用程序中引用它的地方。

InputDataset <- reactive({ mtcars }) output$Data <- renderDT(InputDataset())

类似地,可以使用summary()和correlation()函数填充数据摘要和相关性图表标签。可以从GitHub访问服务器端代码。

现在已经了解了如何填充数据,让构建一个线性回归模型,并查看变量重要性。

f <- reactive({ as.formula(paste(input$SelectY, "~.")) }) Linear_Model <- reactive({ lm(f(), data = trainingData()) }) output$Model <- renderPrint(summary(Linear_Model())) output$Model_new <- renderPrint( stargazer( Linear_Model(), type = "text", title = "模型结果", digits = 1, out = "table1.txt" ) )

让实现预测标签的逻辑,将使用前一节中的模型在测试数据集上进行预测,并生成残差图。

actuals_preds <- reactive({ data.frame(cbind(actuals = tmp(), predicted = price_predict())) }) Fit <- reactive({ ( plot( actuals_preds()$actuals, actuals_preds()$predicted, pch = 16, cex = 1.3, col = "blue", main = "最佳拟合线", xlab = "实际", ylab = "预测" ) ) }) output$Prediction <- renderPlot(Fit()) output$residualPlots <- renderPlot({ par(mfrow = c(2, 2)) # 更改面板布局为2 x 2 plot(Linear_Model()) par(mfrow = c(1, 1)) # 更改回1 x 1 })
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485