数据科学和机器学习领域的一场伟大的现代战役是“Python vs. R”。毫无疑问,近年来两者都取得了巨大的进步,成为数据科学、预测分析和机器学习的顶级编程语言。事实上,根据最近一篇 IEEE 文章,Python 超过 C++ 成为顶级编程语言,而 R 牢牢占据了前 10 名的位置。
然而,这两者之间存在一些根本的区别。R 的开发最初是作为统计分析和数据分析问题快速原型设计的工具。另一方面,Python 的开发是一种通用的、现代的面向对象语言,与 C++ 或 Java 类似,但学习曲线更简单,态度更灵活。因此,R 继续在统计学家、定量生物学家、物理学家和经济学家中非常受欢迎,而 Python 已经慢慢成为日常脚本编写、自动化、后端 Web 开发、分析和通用机器学习框架的首选语言,并拥有广泛的支持基础和开源开发社区工作。
在 Python 环境中模仿函数式编程
R 作为一种函数式编程语言的本质,为用户提供了一个极其简单紧凑的界面,用于快速计算概率以及数据分析问题所需的基本描述性/推理性统计量。例如,如果能够仅通过一个简洁的函数调用来解决以下问题,岂不是很棒?
- 如何计算数据向量的均值/中位数/众数。
- 如何计算符合正态分布的事件的累积概率。如果分布是泊松分布呢?
- 如何计算一系列数据点的四分位距。
- 如何生成一些符合 Student's t 分布的随机数。
R 编程环境可以完成所有这些操作。
另一方面,Python 的脚本编写能力使分析师能够在各种分析管道中使用这些统计数据,具有无限的复杂性和创造性。
为了结合两者的优点,你只需要一个简单的基于 Python 的包装器库,其中包含以 R 风格定义的与概率分布和描述性统计相关的最常用函数。这使你能够非常快速地调用这些函数,而无需去查找适当的 Python 统计库并弄清楚所有方法和参数。
用于最便捷 R 函数的 Python 包装器脚本
我编写了一个 Python 脚本,用于在 Python 中定义简单统计分析中最方便和广泛使用的 R 函数。导入此脚本后,你将能够像在 R 编程环境中一样自然地使用这些 R 函数。
此脚本的目标是提供简单的 Python 子程序,模仿 R 风格的统计函数,用于快速计算重要概率分布的密度/点估计、累积分布和分位数,并生成随机变量。
为了保持 R 风格的精神,该脚本不使用类层次结构,文件中仅定义了原始函数。因此,用户可以导入这一个 Python 脚本,并在需要时通过单个名称调用来使用所有函数。
请注意,我使用了“模仿”这个词。在任何情况下,我都没有声称要模仿 R 真正的函数式编程范式,它包括深入的环境设置以及这些环境和对象之间复杂的关系。这个脚本允许我(并且我希望无数其他 Python 用户)快速启动一个 Python 程序或 Jupyter notebook,导入脚本,并立即开始进行简单的描述性统计。这就是目标,仅此而已。
如果你曾经用 R 编写过代码(可能在研究生院),并且刚刚开始学习和使用 Python 进行数据分析,你将会很高兴看到并使用一些相同的知名函数,在你的 Jupyter notebook 中以类似于你在 R 环境中使用它们的方式使用。
无论你的理由是什么,使用这个脚本都很有趣。
简单示例
首先,只需导入脚本并开始处理数字列表,就像它们是 R 中的数据向量一样。
from R_functions import *
lst=[20,12,16,32,27,65,44,45,22,18]
<more code, more statistics...>
假设你想从数据点向量中计算 Tuckey 五数概括。你只需调用一个简单的函数 fivenum,并将向量传递给它。它将以 NumPy 数组的形式返回五数概括。
lst=[20,12,16,32,27,65,44,45,22,18]
fivenum(lst)
> array([12. , 18.5, 24.5, 41. , 65. ])
也许你想知道以下问题的答案
假设一台机器平均每小时输出 10 件成品,标准差为 2。输出模式接近正态分布。机器在下一小时内至少输出 7 件但不超过 12 件的概率是多少?
答案本质上是这样的

你可以使用一行代码通过 pnorm 获得答案
pnorm(12,10,2)-pnorm(7,10,2)
> 0.7745375447996848
或者也许你需要回答以下问题
假设你有一枚灌铅的硬币,每次抛掷时正面朝上的概率为 60%。你正在玩一个抛掷 10 次的游戏。你如何绘制和映射出使用这枚硬币所有可能获胜次数(从 0 到 10)的概率?
你可以使用几行代码,仅使用一个函数 dbinom,获得一个漂亮的条形图
probs=[]
import matplotlib.pyplot as plt
for i in range(11):
probs.append(dbinom(i,10,0.6))
plt.bar(range(11),height=probs)
plt.grid(True)
plt.show()

用于概率计算的简单接口
R 为从基本概率分布进行快速计算提供了极其简单直观的接口。该接口如下:
- d{distribution} 给出点 x 处的密度函数值
- p{distribution} 给出点 x 处的累积值
- q{distribution} 给出概率 p 处的分位数函数值
- r{distribution} 生成一个或多个随机变量
在我们的实现中,我们坚持此接口及其关联的参数列表,以便你可以像在 R 环境中一样执行这些函数。
当前实现的函数
以下 R 风格的函数已在脚本中实现,以便快速调用。
- 均值、中位数、方差、标准差
- Tuckey 五数概括、IQR
- 矩阵的协方差或两个向量之间的协方差
- 以下分布的密度、累积概率、分位数函数和随机变量生成:正态分布、均匀分布、二项分布、泊松分布、F 分布、Student's t 分布、卡方分布、beta 分布和 gamma 分布。
正在进行中
显然,这是一个正在进行中的工作,我计划向此脚本添加其他便捷的 R 函数。例如,在 R 中,单行命令 lm 可以让你获得数值数据集的普通最小二乘拟合模型,其中包含所有必要的推理性统计量(P 值、标准误差等)。这非常简洁有力!另一方面,Python 中的标准线性回归问题通常使用 Scikit-learn 解决,这需要为此用途编写更多脚本,因此我计划使用 Python 的 statsmodels 后端来整合这种单函数线性模型拟合功能。
如果你喜欢并在你的工作中使用此脚本,请通过为其 GitHub 存储库加星标或 fork 来帮助其他人找到它。此外,你可以查看我的其他 GitHub 存储库,以获取 Python、R 或 MATLAB 中的有趣代码片段以及一些机器学习资源。
如果你有任何问题或想法要分享,请通过 tirthajyoti[AT]gmail.com 联系我。如果你像我一样对机器学习和数据科学充满热情,请在 LinkedIn 上添加我或在 Twitter 上关注我。
最初发布于 Towards Data Science。根据 CC BY-SA 4.0 重新发布。
2 条评论