使用 Tidyverse

Tidyverse 是数据科学家常用于处理日常数据分析的 R 包集合。 其中包括用于数据导出 (readr)、数据可视化 (ggplot2)、数据操作(dplyrtidyr)、函数编程 (purrr) 以及建模 (tidymodels) 等的包。 tidyverse 中的包旨在实现无缝协同工作,并遵循在一套一致的设计原则。

Microsoft Fabric 每一次运行时发布时都会分发 tidyverse 的最新稳定版。 导入并开始使用熟悉的 R 包。

先决条件

  • 打开或创建笔记本。 请参阅如何使用 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 中的数据以及其他工具一起使用。

例如,tidyr 中的“gather()”函数可用于将宽数据转换为长数据。 下面是一个示例:

# 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()

Graph of plot line.

# draw a boxplot

ggplot(stocksL, aes(x=time, y=price, colour = stock)) + 
  geom_boxplot()

Graph of plot box.

模型构建

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()

Graph of mpg and wt.

从散点图来看,关系大致呈线性关系,方差看起来是常量。 让我们尝试使用线性回归对此进行建模。

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")

Graph of model result.