Skip to content
知识

/knowledge/reproducibility

可复现性与分析流水线

你发布一个数字六个月后,有人问你是怎么得出它的。可复现性就是你能否回答——这份分析能否被重跑、被审计、被信任,无论是你还是任何其他人。在一个有问责的环境里,它并非可选。

学于
可复现性与分析流水线实务 · 可信赖的分析
时间
政府分析 · 持续进行
应用于
可辩护、可审计的工作
阅读 / 复习
约 14 分钟阅读2026-06-26

有一个测试,悄悄地把好的分析与脆弱的分析区分开来:如果一年后有人把同样的原始数据递给你,你能 复现出你那个确切的结果吗——同样的数字、同样的图表、同样的结论?对数量惊人的真实世界工作而言, 诚实的答案是「不能」,因为结果活在一团手工步骤、手工编辑过的电子表格,以及一个乱序运行、今天 没人能重跑的笔记本之中。

可复现性是确保你的那门学科——确保一份分析是一个可重复、可审计的过程, 而非一次性的手艺。它是整个板块中最不光鲜的主题,而在任何工作必须被辩护的环境里,又是最重要的 之一。这一页是抵达那里的实用工具包。

01

你能重跑它吗?

把两个相关的概念分开会有帮助。可复现性意味着:同样的数据、同样的代码、同样的 结果——任何人都能重跑你的分析、得到你所得到的。(更强的可重复性意味着一项全新的 研究得出同样的结论。)可复现性是那个可达成的、基础性的,它一次买给你好几样东西:

  • 信任——一个能被重跑的结果是一个能被检查的结果,而一个不能的,只是一个 断言。
  • 可审计——当有人问「你是怎么得出这个的?」,你能展示从原始数据到数字的确切 路径。
  • 可维护——当数据下个季度刷新时,你是重跑,而非凭记忆重建。
  • 协作——包括与你未来的自己,他不会记得今天任何未被记录的决定。

02

为什么这是个真问题

这不是一个假设性的担忧。在整个科学界,有一个公认的可复现性危机——很大一部分 已发表的发现无法被复现,有时连其原作者都不能,往往是因为确切的数据与代码没有以可运行的状态 保存下来。重跑已发表的分析笔记本的研究发现,许多笔记本干脆无法从头到尾执行。

常见的元凶平庸而完全可避免:一个单元格被乱序运行的笔记本、一处没人记录的手工编辑、一个悄悄 更新了的依赖、一个只在一台笔记本电脑上存在的文件路径。没有一个是戏剧性的;合在一起它们就让 工作无法被重建。好消息是,修法同样平庸——下面那一小撮习惯,能去掉其中几乎全部。

03

版本控制:地基

版本控制(Git 是标准)随时间追踪你代码的每一次改动:改了什么、何时、由谁、为 什么。它是这份清单里单一价值最高的习惯,因为它把「这份分析」从一堆可变的文件,变成一段你 可以回到其任何一点的、被记录的历史。

04

环境:打败「在我机器上能跑」

代码不在真空里运行——它依赖于一个特定的 Python 或 R 版本、以及特定的包版本,而这些会变。一份 去年能跑的分析,在一个库更新之后可能损坏,或更糟,悄悄产生不同的数字。「在我机器上 能跑」是一份不可复现的分析发出的声音。

修法是捕获环境:锁定确切的依赖版本(一个 requirements.txtenvironment.yml,或一个锁文件),好让任何人都能重建同样的设置;而要完全隔离, 就用一个容器(Docker),把整个计算环境打包起来。这样,「同样的代码」才真的意味着同样的代码、 以同样的方式运行。

05

流水线,而非手工步骤

最深的转变,是不再把分析想成一连串你做的事,而开始把它想成一条流水线——一条从原始数据到最终输出的、编码的、自动化的路径,其中每一步都是一个脚本,没有任何东西被 手动触碰。原始数据进,报告出,一条命令,无人工干预。

手工——隐藏的决定原始手工编辑微调?数字流水线——每一步都是代码原始clean.pymodel.pyreport.py输出一条命令 · 同样的输入 → 同样的输出
运行一份分析的两种方式。手工:手工编辑的步骤,带着隐藏的、未记录的决定——脆弱且不可重复。流水线:每个阶段都是代码,端到端串起来,能从同样的原始输入用一条命令重跑。

这是可复现分析流水线(RAP)背后的想法,一场恰恰始于政府、为让官方统计可审计、 可重跑的运动。一条好的流水线也是幂等的——跑它两次你得到同样的结果,没有上一次 留下的残余状态搅乱下一次运行。

06

种子与确定性

许多方法使用随机性——一次训练/测试拆分、一次 k-means 初始化、一次自助、一个神经网络的初始权重。 跑它们两次你会得到略有不同的答案,而这悄悄地破坏了可复现性。修法是一个随机种子: 固定种子,那「随机」的序列每次运行都变得完全相同,于是结果完全可重复,同时仍在统计上有效。 设定它一次、记录它,整整一类「数字为什么变了?」的谜团便消失了。

07

文档与数据血缘

最后,能跑的代码与可被理解的代码不是一回事。最后一公里是让那些决定变得可读:

  • 一个 README——这做什么、如何运行它、它期待什么。你未来的自己第一个要找的 东西。
  • 一本数据字典——每个字段是什么意思、它的单位、它的有效值。这里的含糊,正是 误解悄悄溜进来之处。
  • 数据血缘 / 溯源——数据从何而来、以及施加于它的每一次转换。这是分析师的保管链,它直接连到数据治理:一个你 能追溯的数字,是一个你能辩护的数字。

08

它在我工作中的体现

09

60 秒回顾

可复现性危机的取景、笔记本的告诫、环境锁定,以及可复现分析流水线(RAP),反映了当前关于 可复现研究与政府分析的参考文献,以及亲身的工作。