大数据时代教学、科研、出版的新范式

以数据分析为中心的全场景生态建设探索

汤银才

华东师范大学

2024-11-18

自我介绍 — 主要工作与兴趣

  • 从教40年(1985-现在)

  • 研究兴趣

    • 贝叶斯统计与
    • 可靠性分析
  • R 与\TeX的深度玩家与推广者,中国 R 会议(上海)的发起人之一

  • 管理二本期刊

    • 统计理论及其应用(STARF),执行主编
    • 应用概率统计(APS), 编辑部主任

  • 17年国际创刊, 21年国内创刊
  • 19年入选《中国科技期刊卓越行动计划》高起点新刊项目
  • 被Scopus,CSCD, DOAJ,ESCI收录
  • 入选数学领域高质量科技期刊分级目录(T3)

  • 1985年创刊
  • 被CSCD,北大核心等收录
  • 入选数学领域高质量科技期刊分级目录(T3)

自我介绍 — 教材

  • 国内第一本R语言教材
  • 第二版(2023)有大幅更新

  • 可靠性统计教材

  • 贝叶斯统计教材
  • 新版即将完成

自我介绍 — 译著

  • INLA系列从书
  • 更多译著正在推进中
    • Bayesian Modeling using WinBUGS
    • Statistical Methods for Reliability Data, 2E

I. 一些思考与想法

1.1. 引言

思考: 大数据时代我们学习与科研的效率如何?

我们在学习、教学、科研过程中会

  • 与各类知识打交道,浏览许多资料

    • pdf 文档
    • html 文档
    • 电子书
  • 与数据打交道,查看图表

  • 与程序打交道,做可视化和数据分析

  • 目标: 完成各类任务

    • 写报告
    • 写学术论文
    • 撰写毕业论文
    • 出版学术专著
  • 用什么工具?

    • Word/WPS
    • \LaTeX
    • … ?
  • 怎么提高生产率?

场景1: 大数据时代如何打造一个高效的教学与科研生态?

目标: 赋能教学与科研

  • 通过标准化与个性化的权衡

  • 建立教学与科研的生态

  • 提升教学与科研的效率

  • 标准化,要?

  • 个性化,怎么做?

  • 标准化基础上个性化,可落地?

答案:文学化统计编程

  • 编程与写作融合 (knitr)

    • 编程(code)

    • 写作(prose)

  • 标准化定制

    • CSS/SCSS 定制

    • \TeX 定制

场景2: 如何打造一个高效的数据科学写作/出版系统?

  • 目标: 赋能期刊与图书出版
  • 通过Quarto平台

    • 使编程与写作融为一体

    • 建立作者与出版社的桥梁

    • 为读者提供良好的阅读场景

  • 多格式出版

    • PDF

    • HTML

    • ePub

    • Word

1.2. 编程语言的选择?

编程/分析工具应具备的品质

  • 极易入门(基本功能简单)

  • 费用低廉(免费)

  • 代码开放/开源(共享)

  • 无平台限制(共享)

  • 求助方便

  • 良好生态与社区

  • 数据分析高效(工具包)

  • 可视化容易而强(工具包)

  • 编程能力强(可扩展性)

  • 有卓越的IDE

过去现在的统计软件

  • Excel

  • SAS (好贵,好重)

  • Matlab

  • SPSS

  • Minitab

  • Fortran

  • Eviews

  • Stata

  • R

  • Python

  • Julia

  • Shiny/Observable—动态可视化

三大开源语比较: R, Python, Julia

图 1: 编程语言性能比较(相对于C=1.0)

R与Python的比较

R: - 倚天剑

  1. 一种解释性程序语言,专注于统计建模与数据分析
  2. 拥有丰富的统计计算数据可视化
  3. 良好的社区和开源生态系统非常活跃,已经大量R包(超过2万)
  4. 轻松地处理大型数据集和矩阵(借助R包)
  5. 可实现和Python的pandas媲美的高速数据处理能力
  6. 缺点: 效率相对较低
  7. 主要是统计学院的选择

Python: - 屠龙刀

  1. 一种通用的编译语言,可用于机器学习
  2. 拥有丰富的机器学习、深度学习
  3. 社区和开源生态系统也非常活跃,有大量的开源库(12万)
  4. 支持多线程和分布式计算,可更好地处理大规模数据集
  5. 拥有更多的库(如NumPy和Pandas等),可以实现更加高效的编程
  6. 缺点: 统计计算/建模能力偏弱
  7. 主要是工程类学院的选择

1.3. 写作工具的选择?

写作工具的选择?

  • Word/WPS
  • Markdown
  1. 一种轻量级标记语言

  2. 目标:实现“易读易写”

  3. 转换成结构化的HTML(超文本标记语言)

  4. 语法简单易懂易学

  5. 主流的平台几乎都使用/支持

  • ChatGPT/Kimi/ChatGLM/…

  • Github

  • Jupyter Notebook

  • Typora (推荐使用)

  • … …

1.4. 我们要感谢的人!

Donald Knuth (高德纳)

  • \TeX的鼻祖

  • 美国科学院院士, 美国工程院院士, 英国、法国、挪威和德国科学院的外籍院士. 斯坦福大学荣誉退休教授

  • 通常写作与编程是分离的,整个过程会涉及大量繁琐的复制和粘贴

  • 观点: 文章应该是由文本与代码(chunks)组成的流构成

    • 代码对结果(图、表格等)格式化
    • 文本解释所发生的
    • 两者编织(knitr)形成人与机器可读的文章

R的创始人

Hardley Wickham

  • 著有R数据可视化畅销书ggplot2 (3E)

Hardley Wickham: packages created

Guido van Rossum

  • Python 之父,见他的故事
  • 荷兰程序员,曾供职于google,现任职于dropbox
  • 1982年,在阿姆斯特丹大学获得数学和计算机科学硕士学位
  • 2001年度自由软件进步奖
  • 2006年,ACM认定为著名工程师
  • 1989年12月, 为了打发圣诞节的空余时间,编写一个以ABC语言作为基础的电脑程式语言,并以Python命名
  • Python 亦为称为「胶水语言」(glue language),因为它提供了丰富的API和工具

  • 2016年, 在语言编程排行中,Python升至第五名
  • 2017年, Python首次超越R成为数据分析、数据科学和机器学习领域的No.1

Wes McKinney

  • 成就Python在AI中的地位, 见主页
  • 毕业于MIT,杜克大学的数学和统计学两个博士学位
  • 曾供职于Ursa Labs, Cloudera, DataPad, AQR等公司
  • Pandas的创建者, 并借助AI的风力,青云直上
  • Apache Arrow的创建者,是跨语言共享科学数据主要格式

文学化编程的践行者

  • 谢益辉: 2009年 John M. Chambers奖获得者
  • knitr, animation, bookdown, blogdown, pagedown, xaringan, tinytex 等R包的作者
  • 自我评价: 随机漫步十八年的傻瓜

II. 文学化统计编程的实现

2.1. 文学化统计编程的核心工具/技术

核心工具/技术

  1. IDE: Rstudio/VS Code/Jupyter nootbook

    • 语法高亮显示
    • 代码自动补全
    • 支持UTF-8编码
    • 支持Rmd/Qmd
  2. R/Quarto Markdown

    • 几乎万能的(文学化写作)工具
    • 完美整合R,TeX 和 Markdown
  1. knitr

    • 支持
      • 多种编程语言, 如 R, Python, Julia, Observable
      • markup语言, 如TeX, HTML, Markdown
  2. Pandoc

    • 万能格式转换器(瑞士军刀)

Quarto IDE

  • Rstudio: Rstudio/Posit (2022年) 推出了一个基于R的数据分析平台
  • VS Code: Erich Gamma推出,微软维护
  • Jupyter notebook: 支持超过40种编程语言的交互式计算

图 2: Rstudio到Posit

Rstudio介绍

  • 开源免费,优秀的代码编辑器

  • 成倍成倍提高数据分析的效率

  • 最好的跨平台IDE

  • 集成多个R/Quarto Markdown文档类型/模板

  • Visual 与 Source 两种编辑模式自由切换

图 3: Rstudio界面

VS Code介绍

  • 开源免费,优秀的跨平台IDE

  • 可.red[成倍成倍]提高编程的效率

  • 优秀的跨平台TeX/R/Python/… IDE

  • 海量的插件

  • 灵活方便的个性化定制

  • Visual 与 Source 两种编辑模式自由切换

图 4: VS Code界面

Quarto Markdown

根据 Posit (前身为 RStudio):

  • 全新打造: 下一代的RMarkdown,与R Markdown类似, 于2021年1月开始开发,2022年12月发布第一版

  • 基于 Pandoc 构建的开源的出版系统

  • 功能更加强大和灵活: 适用于数据分析和机器学习等领域

  • 支持代码块执行: R, Python,Julia,JavaScript Observable

  • 支持多格式输出: PDF、HTML、\LaTeX、Word等

  • 支持自定义: CSS、JavaScript和\LaTeX模板

  • 支持优秀的IDE: VS Code, Rstudio (具备可视化编程)及Jupyter notebook

从技术的角度来看 (Mock, 2022):

一个命令行界面(CLI),将混合格式文件(.ipynb/Jupyter 笔记本)或纯文本文件(.qmd.rmd.md以不同的格式(PDF/Word/HTML等)渲染(render)成不同的输出(报告、书籍、网站、演示文稿等).

2.2. 文学化统计编程的要素

数学公式

通过\TeX/MathJax/KaTeX 实现

$$
\frac{\partial C}
     { \partial t} 
     + \frac{1}{2}\sigma^2 S^2
\frac{\partial^2 C}
     {\partial C^2}
     + r S 
       \frac{\partial C}
            {\partial S}
      \ = r C 
$$ {#eq-black-scholes}

\frac{\partial C} { \partial t} + \frac{1}{2}\sigma^{2} S^{2} \frac{\partial^{2} C} {\partial C^2} + r S \frac{\partial C} {\partial S} \ = r C \tag{1}

执行R代码

par(mar = c(4, 4, 1, .1))
fit = lm(dist ~ 1 + speed, 
         data = cars)
plot(cars, pch = 19, 
     col = 'blue', las = 1)
abline(fit, lwd = 2)
图 5: R图形: 回归分析

执行Python代码

library(reticulate)
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)
plt.grid(True)
plt.show()
plt.close("all")
图 6: Python图形

表格输出: kable

require('knitr')
kable(head(iris,8), format = "html", caption = "鸢尾花数据")
表 1: 鸢尾花数据
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5.0 3.6 1.4 0.2 setosa
5.4 3.9 1.7 0.4 setosa
4.6 3.4 1.4 0.3 setosa
5.0 3.4 1.5 0.2 setosa

常用chunk选项

表 2: Chunk选项
选项 取值 含义
eval TRUE; FALSE 执行或不执行代码
echo TRUE; FALSE 显示/隐藏源代码
warning TRUE; FALSE 显示/隐藏警告文本
error TRUE; FALSE 错误消息
emssage TRUE; FALSE 是否保留message()给出的消息
tidy TRUE; FALSE 代码重排, 由formatR包支持
prompt TRUE; FALSE 是否在R代码中添加代码
comment ‘##’; 字符串 在R代码前添加注释符
fig.width 数字, 英寸 设置图形的宽度与高度
fig.height 数字, 英寸 设置图形的宽度与高度

代码块选项设置

  • knitr对代码的处理通过其中的选项控制

提示

  • rmarkdown中的设置
label=fig-regression,
echo=false, 
eval=true, 
out.width = "99%",
fig.cap = "R图形: 回归分析", 
fig.align = 'center'
par(mar = c(4, 4, 1, .1))
fit = lm(dist ~ 1 + speed, data = cars)
plot(cars, pch = 19, col = 'blue', las = 1)
abline(fit, lwd = 2)

注释

  • quarto中的设置
#| label: fig-regression2
#| echo: false
#| eval: true
#| out.width: "99%"
#| fig.cap: "R图形: 回归分析"
#| fig.align: 'center'
par(mar = c(4, 4, 1, .1))
fit = lm(dist ~ 1 + speed, data = cars)
plot(cars, pch = 19, col = 'blue', las = 1)
abline(fit, lwd = 2)

2.3. Quarto 介绍

调用 quarto: Rstudio/Jupyter nootbook/VS Code) 上运行

A screenshot of a Quarto document rendered inside RStudio

A screenshot of a Quarto document rendered inside JupyterLab

A screenshot of a Quarto document rendered inside VSCode

quarto 能做更多

高度定制输出布局丰富的html, docx, pdf形式的文章及报告. 一些例子:

图片来源: Quarto gallery

图片来源: Quarto gallery

幻灯片:

Combine several *.qmd files + _quarto.yml with config (project type, structure, properties).

项目(Project)用 quarto render 生成,而不是 quarto preview

基于Quarto的文学化统计编程流程

图 7: Quarto 文学化统计编程流程

Quarto工作原理

Quarto工作原理

2.4. Quarto 代码的展示

代码美化

  • 超 20 种代码高亮主题
# Define a server for the Shiny app
function(input, output) {
  
  # Fill in the spot we created for a plot
  output$phonePlot <- renderPlot({
    # Render a barplot
  })
}

代码动画

# Define a server for the Shiny app
function(input, output) {
  
  # Fill in the spot we created for a plot
  output$phonePlot <- renderPlot({
    # Render a barplot
    barplot(WorldPhones[,input$region]*1000, 
            main=input$region,
            ylab="Number of Telephones",
            xlab="Year")
  })
}

代码逐行高亮

  • 高亮一些特定的行
  • 逐步突出显示额外的行
import numpy as np
import matplotlib.pyplot as plt
r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_rticks([0.5, 1, 1.5, 2])
ax.grid(True)
plt.show()

代码显示控制: 折叠

显示代码
library(ggplot2)
ggplot(mtcars, aes(hp, mpg, color = am)) +
  geom_point() +
  geom_smooth(formula = y ~ x, method = "loess")

面板(Tabsets) — R 代码

显示代码
library(ggplot2)
ggplot(mtcars, aes(hp, mpg, color = am)) +
  geom_point() +
  geom_smooth(formula = y ~ x, method = "loess")

显示代码
knitr::kable(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

交互变得简单

交互呈现示例 — Shiny

图 8: R Shiny gif 图-1
图 9: R Shiny gif 图-2

交互呈现示例 — Ovservable (Web可显示)

Palmer Penguins 数据集,观察企鹅体重随性别和物种的不同而变化.

交互呈现示例 — Plotly

交互呈现示例 — d3scatter

III. 基于Quarto 构建教学、科研、出版/写作的新范式

3.1. Quarto 幻灯片

Quarto 幻灯片的类型

Quarto 支持多种格式来创建演示文稿,包括:

  • revealjs — reveal.js (HTML), 本演讲稿

  • pptx — PowerPoint (MS Office), 华东师范大学模板

  • beamer — Beamer (LaTeX/PDF), 华东师范大学模板

这些格式各有优缺点。

  • Beamer 广为使用,特别适合数学类报告

  • revealjs 功能最强大,可以作为HTML幻灯片展示,也可以打印为PDF以便于分发

  • pptx 经模板定制后更亲民

Quarto Beamer 示例

revealjs 的片段类 {.scrollable}选项

名称 效果
fade-out 开始可见,淡出
fade-up 向上滑动的同时淡入
fade-down 向下滑动的同时淡入
fade-left 向左滑动的同时淡入
fade-right 向右滑动的同时淡入
fade-in-then-out 先淡入,然后在下一步淡出
fade-in-then-semi-out 淡入,然后在下一步变为半透明
grow 放大
semi-fade-out 淡出至半透明
shrink 缩小
strike 划掉
highlight-red 文本变为红色
highlight-green 文本变为绿色
highlight-blue 文本变为蓝色
highlight-current-red 文本变为红色,然后在下一步恢复原样
highlight-current-green 文本变为绿色,然后在下一步恢复原样
highlight-current-blue 文本变为蓝色,然后在下一步恢复原样

内容分列展示

将内容按不同宽度分列展示

  • Motor Trend汽车道路测试

  • 数据摘自1974年的《Motor Trend美国》杂志,包含了32款汽车的燃油消耗和10个设计及性能方面的数据.

代码
knitr::kable(head(mtcars)[,c("mpg", "cyl", "disp", "hp", "wt")])
mpg cyl disp hp wt
Mazda RX4 21.0 6 160 110 2.620
Mazda RX4 Wag 21.0 6 160 110 2.875
Datsun 710 22.8 4 108 93 2.320
Hornet 4 Drive 21.4 6 258 110 3.215
Hornet Sportabout 18.7 8 360 175 3.440
Valiant 18.1 6 225 105 3.460

列表内容分步展示

列表可以通过incremental环境逐步显示

  • 第一条
  • 第二条
  • 第三条
  1. 第一条
  2. 第二条
  3. 第三条

插入停顿(三个分开的点. . .),也可以实现逐步显示

按片段 (Fragments) 展示


淡入

向上滑动的同时淡入

向左滑动的同时淡入

先淡入,然后半透明淡出

删除

红色高亮

更换页面主题 (Themes)

Quarto提供10个内嵌的页面更换主题 (也可 自建合适的页面)

更换页面背景 (Backgrounds)

  • 属性参数 backgroundbackground-color可用于改变页面的背景颜色 (支持CSS设定的颜色)
  • 页面背景转换则通过选项 background-transition实现

Auto-Animate

通过auto-animate实现动画自动匹配

Auto-Animate

通过auto-animate实现动画自动匹配

更改页面过度方式 (Slide Transitions)

页面切换参数 描述
none 不切换 (默认)
fade 淡出到淡入
slide 水平切换
convex 以外凸的角度展示
concave 以凹进的角度展示
zoom 从中心开始放大

3.2. Quarto 书稿/分析报告

Quarto books

Quarto Books,新一代bookdown, 将多个文档以章节形式组合起来,并以不同的形式呈现出来

  • HTML
  • PDF
  • MS Word
  • EPUB

HTML和PDF是两种主要的形式, 支持章节、公式、图形、表格、参考文献等的交叉引用. 个性化定制分别通过CSS和\LaTeX实现. 可通过quarto publish命令发布到:

示例

3.3. Quarto 毕业论文

Quarto 毕业论文示例

3.4. Quarto 期刊

Quarto Journals

  • 期刊论文创建需要标准化与个性化的协调与统一, 以极大地方便期刊的集约化管理与作者针对不同期刊快速完成论文的创建.

  • Quarto支持创建自定义格式,以扩展基本格式(如pdf、html和docx), 从而灵活地适应各类专业期刊论文的创建.

  • Quarto支持“单一来源发布”,即相同的Quarto文档源能够生成HTML和\LaTeX输出,还能够创建适合多个期刊所需的\LaTeX输出。实现此功能的关键功能包括:

    • 配合Pandoc,能够灵活地适应期刊提供的本地\LaTeX模板;

    • 实现针对HTML输出通过CSS进行定制,针对PDF输出通过LaTeX宏/环境进行定制;

    • 根据各种期刊所需的样式自动格式化作者和隶属关系的标准化模式;

    • 借助引文样式语言(CSL),根据各种期刊所需的样式自动格式化引文和参考文献.

Quarto 期刊模板示例

Quarto 团队已经建立的期刊模板



Thank you!

Stanley Tang (汤银才)
github: tangyc8866
Homepage: Homepage
Email: yctang@stat.ecnu.edu.cn
Wechat: tangyincai

附录. Quarto revealjs 幻灯片的其他实用功能

超链接预览

  • 在不打断演讲流程的情况下导航到超链接

    • 使用 preview-links 选项可以在幻灯片上方打开链接

    • 点击右上角的X关闭预览

  • 示例(点击打开):

Matplotlib: Visualization with Python

轻松导航

  • 快速跳转到演示文稿的其他部分

使用菜单按钮(幻灯片左下角)切换幻灯片菜单,以访问其他幻灯片和演示工具

  • 您也可以按 m 键来打开和关闭菜单

黑板(chalkboard)

使用幻灯片左下角的黑板(chalkboard)按钮来切换黑板的显示, 也可使用按钮b来切换黑板

使用幻灯片左下角的笔记画布(notes canvas)按钮来切换在当前幻灯片上的绘图功能, 也可使用按钮c来切换笔记画布

概览模式

o 键切换到概览模式:

按住 Alt 键(或在Macbook中按 Ctrl 键),然后点击放大对应的幻灯片

演讲者视图

s 键(或使用演示菜单)打开演讲者视图