GitHub上のJupyterノートブック:特徴とコードクローン

The Art, Science, and Engineering of Programming 5(3):15 (2021)(2021) · 論文 · kallen2021clones

📅 この論文を見た日

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

AI解説

情報源: 本文全文を精読(arXiv プレプリント版 PDF https://arxiv.org/pdf/2007.10146v2、本文・付録A〜D・全図・全表まで)。本誌オープンアクセス版(https://doi.org/10.22152/programming-journal.org/2021/5/15、Programming Journal 5(3):15、全31ページ)と同一内容。図は PDF の該当ページをレンダリングして切り出したもの(R で描かれたプロット)。以下は論文そのものの記述のみに基づく。

一言でいうと

GitHub 上で公開されている 約270万(2 739 464)件の Jupyter ノートブックを静的に分析し、(1) ノートブックの基本的な特徴(サイズ・コードセル数・言語分布)と、(2) セル(スニペット)単位のコードクローンの蔓延度を、これまでで最大規模かつ初めてリポジトリ間(inter-project)クローンまで含めて測った研究。結果として、スニペットの 70 %超が他のスニペットの完全コピーであり、ノートブックの約半数(約50 %)は一意なスニペットを1つも持たない。Python ノートブックでは少なくとも約 80 % のスニペットが近似クローン(near-miss clone)であった。

ここで強調しておきたいのは、本研究は GitHub に置かれた .ipynb ファイルのソース(JSON)を読んで集計する静的分析であって、ノートブックを実行して資源(メモリ・実行時間・CPU/GPU)を測ったものではない点である。測っているのは「コードがどれだけ重複しているか」という静的な構造的特徴である。

問題(problem)と課題(task)の区別

なお「課題」を「解くべき問題」と取り違えないこと——本論文の主目的は測定・記述(characterisation)であって、クローン削減ツールを作ることではない。

コーパスの規模(§4・付録A)

データは 2019 年春に、Rule らの GitHub API スクリプト(リポジトリ言語が「Jupyter Notebook」に分類され、サフィックス .ipynb のファイルを探す)で取得された。最終的なコーパスは次のとおり。

ノートブック自体は概して小さい。中央値で 13 kB / コードセル9個 / 約47〜53行だが、分布は極端に右に歪んでおり、最大は 1433 コードセル・約46万行という外れ値もある(表2)。

Figure 1

Figure 1: ノートブックサイズの分布((a)コードセル数 (b)バイト数 (c)行数 (d)空行除く行数)。y軸は対数。ゼロ件は省略、外れ値1件を(c)(d)から除外。いずれも強く右に歪む。

言語分布(§4.2・付録B)

言語は metadata.language_info.namemetadata.languagemetadata.kernelspec.language → 各コードセルの言語、の順に最初に見つかった値で判定(付録B)。複数フィールドを見ることで先行研究より多くのノートブックで言語を特定できた(言語不明は 2.19 %、Rule らや Pimentel らの手法だと 6.8〜6.9 % が不明になっていたはず)。

分析対象 2 719 378 件の言語分布(表3):

つまりコーパスはほぼ Python であり、全体の傾向は Python の傾向にほぼ等しい。

クローン分析の方法(§5)

スニペット(=コードセルに入ったコード)単位で、2種類のクローンを別々に測った。ファイル単位・関数単位ではなく「セル(スニペット)単位」で測るのが本研究の特徴。著者ら自作の NotebookAnalyzer / SccOutputAnalyzer と後処理スクリプト(GitHub fxpl/notebooks で公開、付録D)を用いる。

  1. CMW クローン(Copy Modulo White space、§5.1) = 空白(改行含む)以外が完全一致するクローン。type 1 クローンに近いが、コメントの違いは許さない点が type 1 と異なる(多言語のためコメント除去が困難だから)。手順: 各スニペットから空白を全除去 → MD5 ハッシュを計算 → ハッシュ一致を CMW クローンとみなす。
  2. 近似クローン(near-miss clone、§5.2) = type 3 寄り。クローン検出器 SourcererCC(Sajnani ら)を使用。SourcererCC はコメント区切りが言語依存なので1言語に絞る必要があり、コーパスの 95 %超を占める Python のみを対象とした。閾値はデフォルトの 80 % 類似度(threshold=8)。128コアサーバで6週間超かけて実行し、報告されたクローンペアは 180億超。なお SourcererCC は1トークン以下のスニペットを無視する(後述の過小評価要因)。

両方について、ノートブックごとの クローン頻度(そのノートブックのスニペットのうちクローンである割合)と、ノートブック間の コネクション数(クローン関係にあるスニペットを持つノートブック対に辺を張ったグラフの次数)を計算。コネクションを intra(同一リポジトリ内)inter(別リポジトリ間) に分け、Wilcoxon 符号順位検定で intra と inter の大小を比較した。言語間のクローン頻度差は Kruskal-Wallis 検定+Wilcoxon 事後検定(Hochberg 補正)で評価。

CMW クローン(完全コピー)の結果(§5.1.2)

Figure 2

Figure 2: (a)スニペットのクローン出現回数の分布、(b)ノートブックのクローン出現回数の分布。y軸は対数。強く右に歪み、ほとんどのスニペットは200回未満しか出現しない。

Figure 3

Figure 3: (a)クローンのサイズ(中央値LOC)分布、(b)クローングループのサイズ分布。小さなクローンが圧倒的に多く、小さいスニペットほどクローンされやすい

クローンのサイズは小さい(表4)。クローンの行数は中央値2行・平均5.83行、90パーセンタイルでも14行。クローングループの行数は中央値3・平均7.48。

ノートブック単位で見ると(極めて重要な数字):

Figure 4

Figure 4: (a)CMW クローン頻度の分布。頻度は「とても低い(<5 %)」か「とても高い(>95 %)」に二極化し、高頻度側が多い。(b)クローン頻度 vs コードセル数。明確な相関は見えないが Spearman で有意(ρ=0.2383, p<2.2e-16)の弱い正相関。

クローン頻度は 平均 64.53 %・中央値 98.91 %(表4)。

言語間の差

Figure 5

Figure 5: 言語別クローン頻度の箱ひげ図(JULIA / OTHER / PYTHON / R / SCALA)。クローン頻度は Python が最も高く、次いで Scala。最も低いのは雑多な OTHER 群

Kruskal-Wallis 検定で言語間に有意差(χ²=3748, p<2.2e-16)。事後比較(表5)でも Python–Scala と Julia–R を除く全組合せが 0.001 水準で有意。Python と Scala でクローン率が高い理由は著者らも「困惑している(perplexing)」とし、Python の「やり方は一つ(one obvious way to do it)」哲学が偶発クローンを生みやすい可能性を挙げつつ、Scala は説明できないと正直に書いている(§6)。

コネクション(intra vs inter)

Figure 6

Figure 6: ノートブックあたりのコネクション数の分布。(a)絶対数、(b)正規化(スニペット数で割った値)。y軸対数で強く右に歪む。最大コネクション数は 2 170 917(コーパス全体数に匹敵)。

Figure 7

Figure 7: 各ノートブックの intra リポジトリコネクション数(縦軸 C0)と、inter リポジトリコネクションの平均(左、IC)/合計(右、SC)の比較。赤線は C0=IC, C0=SC。C0 は IC より大きいが SC より小さい

ここがこの論文の鍵となる発見:

近似クローン(near-miss、Python のみ)の結果(§5.2.2)

Figure 8

Figure 8: (a)近似クローンの行数分布(CMW と類似、小さいものが多い)、(b)Python ノートブックの近似クローン頻度分布(CMW より「低頻度<5 %」が少ない)、(c)近似クローン頻度 vs コードセル数。

近似クローン頻度は 平均 72.88 %・中央値 96.00 %(表8)。コードセル数との相関は Spearman で ρ=0.1233(CMW より弱い正相関)。

Figure 9

Figure 9: Python ノートブックの近似クローンコネクション数分布((a)絶対数 (b)正規化)。y軸対数。CMW(Figure 6)より総じてコネクション数が多い。

Figure 10

Figure 10: 近似クローンでの intra(C0)対 inter(左:平均IC / 右:合計SC)コネクション比較。赤線は等値線。CMW と同様に C0>IC, C0<SC

近似クローンでも結論は CMW と同じ: 大半は inter-project クローンだが、最も多く共有する単一リポジトリは自分自身

定性的な観察(付録C・§6)

最頻クローンを目視確認した結果(CMW についてのみ。near-miss はクローン関係が推移的でないため目視に不向き):

考察・含意(§6・§7)

自分用メモ(位置づけ)

Q&A

(まだなし)

自分のコメント

(まだなし)