数据科学的关键方面之一是数据可视化,无论是探索原始数据、分析模型结果还是尝试调整模型,视觉化都有助于更容易地解释结果。传统上,这些视觉化效果是通过插件或库生成的,并在允许最终用户交互和解释结果的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
})