使用 Tidyverse
Tidyverse 是数据科学家常用于处理日常数据分析的 R 包集合。 其中包括用于数据导出 (readr
)、数据可视化 (ggplot2
)、数据操作(dplyr
、tidyr
)、函数编程 (purrr
) 以及建模 (tidymodels
) 等的包。 tidyverse
中的包旨在实现无缝协同工作,并遵循在一套一致的设计原则。
Microsoft Fabric 每一次运行时发布时都会分发 tidyverse
的最新稳定版。 导入并开始使用熟悉的 R 包。
先决条件
获取 Microsoft Fabric 订阅。 或者注册免费的 Microsoft Fabric 试用版。
登录 Microsoft Fabric。
使用主页左下侧的体验切换器切换到 Fabric。
打开或创建笔记本。 请参阅如何使用 Microsoft Fabric 笔记本,了解如何操作。
通过将语言选项设置为 Spark (R) 来更改主要语言。
将笔记本附加到湖屋。 选择左侧的“添加”以添加现有湖屋或创建湖屋。
加载 tidyverse
# load tidyverse
library(tidyverse)
数据导入
readr
是一个 R 包,可提供工具读取 CSV、TSV 和固定宽度文件等矩形数据文件。 readr
提供快速好用的方法来读取数据文件,例如提供“read_csv()
”和“read_tsv()
”函数来分别读取 CSV 和 TSV 文件。
让我们先来创建一个 R data.frame,使用 readr::write_csv()
将其写入湖屋,并使用 readr::read_csv()
将其读出。
注意
若要使用 readr
访问湖屋文件,需要使用“文件 API 路径。 在湖屋资源管理器中,右键单击想要访问的文件或文件夹,然后从上下文菜单中复制其“文件 API 路径”。
# create an R data frame
set.seed(1)
stocks <- data.frame(
time = as.Date('2009-01-01') + 0:9,
X = rnorm(10, 20, 1),
Y = rnorm(10, 20, 2),
Z = rnorm(10, 20, 4)
)
stocks
接下来,让我们使用“文件 API 路径”将数据写入湖屋。
# write data to lakehouse using the File API path
temp_csv_api <- "/lakehouse/default/Files/stocks.csv"
readr::write_csv(stocks,temp_csv_api)
从湖屋读取数据。
# read data from lakehouse using the File API path
stocks_readr <- readr::read_csv(temp_csv_api)
# show the content of the R date.frame
head(stocks_readr)
数据整理
tidyr
是一个 R 包,提供工具来处理杂乱的数据。 tidyr
中的主函数旨在帮助你将数据重塑为整洁的格式。 整洁的数据具有特定结构,其中每个变量是一列,每个观察是一行,从而更容易与 R 中的数据以及其他工具一起使用。
例如,gather()
中的“tidyr
”函数可用于将宽数据转换为长数据。 下面是一个示例:
# convert the stock data into longer data
library(tidyr)
stocksL <- gather(data = stocks, key = stock, value = price, X, Y, Z)
stocksL
函数编程
purrr
是一个 R 包,通过提供用于处理函数和矢量的完整且一致的工具集来增强 R 的函数编程工具包。 purrr
入门的最佳方式是 map()
函数系列,此系列允许将许多 for 循环替换为更简洁、更容易看懂的代码。 以下示例展示如何使用 map()
将某个函数应用于列表中的每个元素:
# double the stock values using purrr
library(purrr)
stocks_double = map(stocks %>% select_if(is.numeric), ~.x*2)
stocks_double
数据操作
dplyr
是一个 R 包,可提供一系列一致的谓词,帮助解决最常见的数据操作问题,例如,根据名称选择变量、根据值选取事例、将多个值减少到单个摘要,以及更改行的顺序等。以下是一些示例:
# pick variables based on their names using select()
stocks_value <- stocks %>% select(X:Z)
stocks_value
# pick cases based on their values using filter()
filter(stocks_value, X >20)
# add new variables that are functions of existing variables using mutate()
library(lubridate)
stocks_wday <- stocks %>%
select(time:Z) %>%
mutate(
weekday = wday(time)
)
stocks_wday
# change the ordering of the rows using arrange()
arrange(stocks_wday, weekday)
# reduce multiple values down to a single summary using summarise()
stocks_wday %>%
group_by(weekday) %>%
summarize(meanX = mean(X), n= n())
数据可视化
ggplot2
是一个 R 包,用于以声明的形式基于图形的语法创建图形。 你提供数据,告诉 ggplot2
如何将变量映射到美学、要使用哪些图形基元,以及它负责的详细信息。 下面是一些示例:
# draw a chart with points and lines all in one
ggplot(stocksL, aes(x=time, y=price, colour = stock)) +
geom_point()+
geom_line()
# draw a boxplot
ggplot(stocksL, aes(x=time, y=price, colour = stock)) +
geom_boxplot()
模型构建
tidymodels
框架是一系列包,用于采用 tidyverse
原则来建模和进行机器学习。 它涵盖用于处理进行各种建模任务的一系列核心包,例如 rsample
用于训练/测试数据集示例拆分、parsnip
用于模型规范、recipes
用于数据预处理、workflows
用于建模工作流、tune
用于超参数优化、yardstick
用于模型评估、broom
用于整理模型输出,以及 dials
用于管理优化参数。 可以访问 tidymodels 网站详细了解各个包的功能。 以下示例演示如何构建一个线性回归模型,来根据车重 (wt) 来预测一辆车的油耗,即每加仑跑多少英里 (mpg):
# look at the relationship between the miles per gallon (mpg) of a car and its weight (wt)
ggplot(mtcars, aes(wt,mpg))+
geom_point()
从散点图来看,关系大致呈线性关系,方差看起来是常量。 让我们尝试使用线性回归对此进行建模。
library(tidymodels)
# split test and training dataset
set.seed(123)
split <- initial_split(mtcars, prop = 0.7, strata = "cyl")
train <- training(split)
test <- testing(split)
# config the linear regression model
lm_spec <- linear_reg() %>%
set_engine("lm") %>%
set_mode("regression")
# build the model
lm_fit <- lm_spec %>%
fit(mpg ~ wt, data = train)
tidy(lm_fit)
应用线性回归模型来预测测试数据集。
# using the lm model to predict on test dataset
predictions <- predict(lm_fit, test)
predictions
让我们看一下模型结果。 我们可以将模型绘制为折线图,将测试地面真实数据绘制为同一图表上的点。 模型看起来不错。
# draw the model as a line chart and the test data groundtruth as points
lm_aug <- augment(lm_fit, test)
ggplot(lm_aug, aes(x = wt, y = mpg)) +
geom_point(size=2,color="grey70") +
geom_abline(intercept = lm_fit$fit$coefficients[1], slope = lm_fit$fit$coefficients[2], color = "blue")