生物医学論文のJupyterノートブックの計算再現性

GigaScience 13 (2024) giad113(2024) · 論文 · samuel2024reproducibility

📅 この論文を見た日

初回 2026-06-16 / 最終 2026-06-16 / 計 1 回更新

AI解説

情報源: 本文・図表とも arXiv プレプリント版(GigaScience 採択版とほぼ同一内容)を全文精読。PDF https://arxiv.org/pdf/2308.07333(arxiv:2308.07333)。OUP の出版版 https://doi.org/10.1093/gigascience/giad113 は本文 HTML がボット保護で取得できず、数値の突き合わせには arXiv 版テキストと PDF を用いた。図はすべて arXiv 版 PDF をページごとにラスタライズして切り出した(OUP からの図ファイル直取得はできなかった)。本文中で「( )」内に併記されている小さい数字は 2021 年の初回実行時の対応値(再掲)で、本ノートの主数値は 2023 年再実行版を採用する。

一言で

PubMed Central に索引される生物医学論文が GitHub で公開している Jupyter ノートブックを、全自動で集めてそのまま再実行し、エラーなく走るか・出力が原著と一致するかを大規模に測った実証研究。結論は厳しく、再実行を試みた 15,817 本の Python ノートブックのうち、最後までエラーなく走ったのはわずか 1,203 本(7.6%)原著と同じ結果を再現できたのは 879 本(5.6%)にとどまった。失敗の最大要因は依存関係(モジュール)まわりである。

この論文が測るのは「再実行できるか」「出力が一致するか」という再現性であって、実行時間・メモリ・CPU/GPU といったランタイム資源プロファイルは測っていない(資源として記録されているのはパイプライン全体の総実行時間と環境フットプリント推定だけ。後述)。

問題(problem)と課題(task)を分ける

注意: この研究はノートブックを手で直して再現を試みることはしていない(手動修正は系統的にはやらない方針)。あくまで「公開された状態のまま自動で再実行したらどうなるか」を測っている。

パイプライン(収集 → 環境構築 → 再実行 → 差分)

Figure 1 概念ワークフロー

Figure 1: 全自動ワークフローの概念図。PMC を検索 → 全文 XML から論文メタデータと GitHub リンクを抽出 → SQLite に格納 → 有効な GitHub リポジトリをクローン → conda 環境を用意して依存をインストール → ノートブックを再実行 → nbdime で原著出力との差分を計算 → flake8nb でスタイルもチェック、という流れ。

具体的な手順は以下の通り。

  1. 収集: 2023年3月27日に PMC を (ipynb OR jupyter OR ipython) AND github で検索。全文 XML から GitHub リンクを抽出。
  2. リポジトリ検証: GitHub API で情報取得 → クローン → 有効な Jupyter ノートブックの有無を確認。
  3. 依存の検出: requirements.txt / setup.py / pipfile(および pipfile.lock)から依存情報を抽出。
  4. 環境構築: ノートブックに宣言された Python バージョンに基づいて conda 環境を用意し、上記ファイルの依存をその中にインストール。依存ファイルが無いリポジトリについては、anaconda の標準データサイエンスパッケージ群(scikit-learn, numpy, matplotlib, pandas など)を入れて実行を試みる。
  5. 再実行: ノートブックを再実行し、nbdime ライブラリで原著に記録された出力との差分を取る。コードは先行研究(Pimentel らの大規模研究、および可視化ツール ReproduceMeGit)のパイプラインを改変したもの。
  6. 解析: 例外の種類・頻度、再現成功率、ノートブック構造などを集計。

依存インストールが成功しても実行で失敗するものが多数ある点に注意(インストール成功 ≠ 実行成功)。

計算環境と総実行時間(ここが「資源」に触れる唯一の箇所)

これらはパイプライン全体の壁時計時間であって、個々のノートブック/セルの実行時間・メモリ・CPU/GPU 使用量を計測したものではない。セル粒度のランタイム資源プロファイルはこの論文には無い

データセットの規模(数を正確に)

Figure 2 パイプライン各段の実数

Figure 2: PRISMA フロー図に倣ったパイプライン各段の実数。各ボックスにステップの説明・通過したエンティティ数・対応スクリプト名が書かれている(括弧内は 2021年初回実行時の値の再掲)。左上の PMC 検索から右下の「再現成功ノートブック 1,203(うち一致 879・不一致 324)」まで、漏斗状に数が絞られていく様子が一目で分かる。

Figure 9 ノートブックの言語

Figure 9: ノートブックのカーネル言語の分布(対数軸)。Python 22,578 が圧倒的で、Unknown 3,112、R 891、Julia 295、Matlab 134 と続く。「Unknown」はカーネル言語が標準的な形で記されていなかったもの。

中心的な結果: 再実行率・成功率・一致率

再実行を試みた 15,817 本を起点に絞り込むと次のようになる。

段階 本数 割合(15,817 基準)
再実行を試みた Python ノートブック 15,817 100%
依存インストールに失敗 5,429 34.32%
依存インストールに成功し実行へ 10,388 65.68%
実行したが例外で失敗 9,100 87.6%(10,388 基準)
エラーなく最後まで走った 1,203 7.61%
└ 原著と同一の結果 879 5.56%
└ 原著と異なる結果 324 2.05%

失敗の内訳: 例外の種類と頻度

Figure 19 例外の種類別頻度

Figure 19: コーパス全体で発生した例外の種類別頻度(対数軸)。ModuleNotFoundError 5,562 が突出し、FileNotFoundError 1,102、ImportError 1,026、NameError 390、IOError 147、AttributeError 94、ValueError 91、TypeError 85、KeyError 71、CalledProcessError 68 と続く。

本文の数値(実行 10,388 本に対する割合):

失敗要因が依存 → ファイル/パス → 名前の順という構図は、再現性を上げるには「依存を正しくピン留めし、データを同梱し、セルを上から順に実行できる形にする」ことが効く、という示唆につながる。論文は付録の Table 5 に各例外の性質と直し方(例: ModuleNotFoundError はモジュールがリポジトリに含まれるか/環境に入っているか確認、FileNotFoundError はパスとファイル存在の確認、NameError は定義箇所のドキュメント確認・先行セルの実行)を整理している。

ノートブックの中身の特徴(再現性の文脈で)

Figure 13 ノートブック構造の分布

Figure 13: コーパス全体のノートブック構造の分布(4パネル)。各パネルはヒストグラム+箱ひげ図(IQR と外れ値)。(a) コードセル数(中央値15、Q3=27、最大987)、(b) 出力付きコードセル数(中央値3、最大382)、(c) Markdown セル数(中央値7、最大383)、(d) 最大実行番号(中央値21、最大4,173)。

切り口別の再現性

Figure 28 一致/不一致の結果分布(研究分野別)

Figure 28(a): エラーなく走った 1,203 本について、MeSH 分野ごとに原著と一致(青)/不一致(赤)の本数を示す。identical/(identical+different) 比は Mathematical Concepts と Amino Acids, Peptides, and Proteins で約0.77 と最も高く、Genetic Phenomena で約0.64 と最も低い。

限界と位置づけ

Q&A

(まだなし)

自分のコメント

(まだなし)