1.1 语言抉择

行业内可以做统计分析和建模的软件汗牛充栋,比较顶级的收费产品有 SAS 和 SPSS,在科学计算领域的 Matlab 和 Mathematica 也有相当强的统计功能,而用户基数最大的是微软 Excel,抛开微软公司的商业手段不说,Excel 的市场份额却是既成事实。 Brian D. Ripley 20 多年前的一句话很有意思,放在当下也是适用的。

Let’s not kid ourselves: the most widely used piece of software for statistics is Excel.

— Brian D. Ripley (Ripley 2002)

有鉴于 Excel 在人文、社会、经济和管理等领域的影响力,熟悉 R 语言的人把它看作超级收费版的 Excel,这实在是一点也不过分。事实上,我司就是一个很好的明证,一个在线教育类的互联网公司,各大业务部门都在使用 Excel 作为主要的数据分析工具。然而,Excel 的不足也十分突出,工作过程无法保存和重复利用,Excel 也不是数据库,数据集稍大,操作起来愈发困难,对于复杂的展示,需要借助内嵌的 VBA,由于缺乏版本控制,随着时间的推移,几乎不可维护。所以,我们还是放弃 Excel 吧,Jenny Bryan 更在 2016 年国际 R 语言大会上的直截了当地喊出了这句话2。Nathan Stephens 对 Excel 的缺陷不足做了全面的总结3

Some people familiar with R describe it as a supercharged version of Microsoft’s Excel spreadsheet software.

— Ashlee Vance4

另一方面,我们谈谈开源领域的佼佼者 — R (https://cran.r-project.org/),Python (https://www.python.org/) 和 Octave (http://www.gnu.org/software/octave/)。Python 号称万能的胶水语言,从系统运维到深度学习都有它的广泛存在,它被各大主流 Linux 系统内置,语言风格上更接近于基数庞大的开发人员,形成了强大的生态平台。 Octave 号称是可以替代 Matlab 的科学计算软件,在兼容 Matlab 的方面确实做的很不错,然而,根据 Julia 官网给出的各大编程语言的测试 https://julialang.org/benchmarks/,性能上不能相提并论。

R 语言扩展包生态系统

图 1.1: R 语言扩展包生态系统

R 提供了丰富的图形接口,包括 Tcl/Tk , Gtk, Shiny 等,以及基于它们的衍生品 rattle(RGtk2)、Rcmdr(tcl/tk)、radiant(shiny)。更多底层介绍,见 John Chamber 的著作《Extending R》。

TikZ 在绘制示意图方面有很大优势,特别是示意图里包含数学公式,这更是 LaTeX 所擅长的方面

JASP https://jasp-stats.org 是一款免费的统计软件,源代码托管在 Github 上 https://github.com/jasp-stats/jasp-desktop,主要由阿姆斯特丹大学 E. J. Wagenmakers 教授 https://www.ejwagenmakers.com/ 领导的团队维护开发,实现了很多贝叶斯和频率统计方法,相似的图形用户界面使得 JASP 可以作为 SPSS 的替代,目前实现的功能见 https://jasp-stats.org/current-functionality/,统计方法见博客 https://www.bayesianspectacles.org/

国内可视化分析平台,比如 hiplot 基于 R 语言实现可视化分析,各类图形的介绍见文档,极大地降低数据分析人员探索分析的门槛,节省了时间,同时非专业内的人也可借助其完成分析探索的过程,只需明白各类图形的含义即可。美团也建设了自己的可视化分析平台帮助运营人员,详见文档

Patrick Burns 收集整理了 R 语言中奇葩的现象,写成 The R Inferno 直译过来就是《R 之炼狱》。这些奇葩的怪现象可以看做是 R 风格的一部分,对于编程人员来说就是一些建议和技巧,参考之可以避开某些坑。 Paul E. Johnson 整理了一份真正的 R 语言建议,记录了他自己从 SAS 转换到 R 的过程中遇到的各种问题 http://pj.freefaculty.org/R/Rtips.html。Michail Tsagris 和 Manos Papadakis 也收集了 70 多条 R 编程的技巧和建议,力求以更加 R 范地将语言特性发挥到极致 (Tsagris and Papadakis 2018),Martin Mächler 提供了一份 Good Practices in R Programming。 Python 社区广泛流传着 Tim Peters 的 《Python 之禅》,它已经整合进每一版 Python 软件中,只需在 Python 控制台里执行 import this 可以获得。

  1. Beautiful is better than ugly.
  2. Explicit is better than implicit.
  3. Simple is better than complex.
  4. Complex is better than complicated.
  5. Flat is better than nested.
  6. Sparse is better than dense.
  7. Readability counts.
  8. Special cases aren’t special enough to break the rules.
  9. Although practicality beats purity.
  10. Errors should never pass silently.
  11. Unless explicitly silenced.
  12. In the face of ambiguity, refuse the temptation to guess.
  13. There should be one– and preferably only one –obvious way to do it.
  14. Although that way may not be obvious at first unless you’re Dutch.
  15. Now is better than never.
  16. Although never is often better than right now.
  17. If the implementation is hard to explain, it’s a bad idea.
  18. If the implementation is easy to explain, it may be a good idea.
  19. Namespaces are one honking great idea – let’s do more of those!

— The Zen of Python

总之,编程语言到一定境界都是殊途同归的,对美的认识也是趋同的,道理更是相通的,Python 社区的 Pandas https://github.com/pandas-dev/pandas 和 Matplotlib https://github.com/matplotlib/matplotlib 也有数据框和图形语法的影子。Pandas https://github.com/pandas-dev/pandas 明确说了要提供与 data.frame 类似的数据结构和对应统计函数等,而 Matplotlib 偷了 ggplot2 绘图样式 https://matplotlib.org/3.2.2/gallery/style_sheets/ggplot.html

参考文献

Ripley, Brian D. 2002. “Statistical Methods Need Software: A View of Statistical Computing.” Opening Lecture Royal Statistical Society. Plymouth. https://www.stats.ox.ac.uk/~ripley/RSS2002.pdf.
Tsagris, Michail, and Manos Papadakis. 2018. “Taking r to Its Limits: 70+ Tips.” PeerJ Preprints 6: e26605v1. https://doi.org/10.7287/peerj.preprints.26605v1.