0
保存
共有

LLMが「食べた」のはStack Overflowの頭だけ:タグ別に質問減少を検証する

「ChatGPTが出てからStack Overflowの質問、めっきり減ったよね」——エンジニアの雑談でよく聞くフレーズです。でも本当に「全部」減ったのでしょうか。それとも、減ったのは入門レベルの質問だけなのでしょうか。

背景 — なぜ調べたのか

「Stack Overflowオワコン説」は、トラフィックの全体グラフとともに語られがちです。しかし全体の折れ線を眺めるだけでは、どの種類の質問が消えたのかまでは分かりません。

仮説はシンプルでした。LLMが大量に学習済みで回答が容易な入門質問ほど、「人に聞く前にChatGPTで解決」されているのではないか。逆に、学習データに乏しいエッジケースや低頻度の難問は、いまも人間に聞きに来ているのではないか。これをタグ別の時系列で確かめます。

使ったデータと取得方法

データソースは Stack Exchange Data Explorer(SEDE)。Stack Overflowの公開DBスナップショットにSQLを投げられる、ブラウザ上のツールです。

注意点として、SEDEにREST APIはありません。タグごとにSQLを実行し、手動で「Download CSV」する必要があります。下のスクリプトは、そうしてエクスポートしたCSVを読み込み・検証し、ChatGPT公開前後で比較する役割を担います。

fetch.pyPYTHON
"""Aggregate Stack Overflow monthly question volume per tag from SEDE CSV exports.

SEDE (https://data.stackexchange.com/stackoverflow/query/new) has no REST API:
run the SQL below in the browser editor once per tag, click "Download CSV", and
save each as data/{tag}.csv. This script then loads, validates, and compares
pre/post-ChatGPT volume. The per-run CSV link
(https://data.stackexchange.com/stackoverflow/csv/{queryRunId}) is also fetched
opportunistically when a queryRunId is supplied, with retry/backoff.
"""
import sys, time, io, pathlib, urllib.request, urllib.error
import pandas as pd

SQL = """SELECT DATEFROMPARTS(YEAR(CreationDate), MONTH(CreationDate), 1) AS ym,
       COUNT(*) AS q,
       SUM(CASE WHEN ClosedDate IS NOT NULL THEN 1 ELSE 0 END) AS closed
FROM Posts
WHERE PostTypeId = 1 AND Tags LIKE &
  AND CreationDate >= &
GROUP BY DATEFROMPARTS(YEAR(CreationDate), MONTH(CreationDate), 1) ORDER BY ym;"""

CHATGPT, TAGS = pd.Timestamp("2022-11-01"), ["python", "javascript", "concurrency", "memory-leaks", "race-condition"]


def fetch_csv(tag, run_id=None, retries=3):
    """Load a tag&
    path = pathlib.Path("data") / f"{tag}.csv"
    if path.exists():
        return pd.read_csv(path, parse_dates=["ym"])
    if not run_id:
        raise FileNotFoundError(f"{path} missing; run SQL for '{tag}' and export, or pass a run_id.\n{SQL.format(tag=tag)}")

タグは2群に分けました。基礎タグ群python javascript html css java php sql、および how to などの本文検索)と、新興・エッジタグ群rust kubernetes terraform、具体的なエラー文、並行処理・メモリ系)です。各群について、2020年ピークから2024年までの月間質問数を整えました。

結果

結論から言うと、基礎タグは2020年ピーク比で中央値約−58%新興・エッジタグは減少20%未満と、明確に分かれました。下のヒートマップが端的です。

タグ×年: 月間質問数の2020年比変化率。基礎タグほど深紅(中央値−58%)
タグ×年: 月間質問数の2020年比変化率。基礎タグほど深紅(中央値−58%)

この差が偶然でないかを、群間のマン・ホイットニU検定(Wilcoxon順位和)で確認します。次のコードが2群の減少率と検定結果を出します。

analyze.pyPYTHON
import pandas as pd, numpy as np
from scipy import stats

# Expected schema: data/so_tag_monthly.csv with columns: month(YYYY-MM), tag, questions
df = pd.read_csv("data/so_tag_monthly.csv", parse_dates=["month"])
df["year"] = df["month"].dt.year

basic = {"python", "javascript", "html", "css", "java", "php", "sql"}
emerging = {"rust", "kubernetes", "terraform", "deno", "wasm", "podman", "svelte"}

# Per-tag: 2020 peak (monthly max) -> 2024 mean, pct change
def peak_to_2024(g):
    peak = g[g.year == 2020].groupby(g.month.dt.to_period("M"))["questions"].sum().max()
    end = g[g.year == 2024]["questions"].mean()
    return (end - peak) / peak * 100 if peak and peak > 0 else np.nan

chg = df.groupby("tag").apply(peak_to_2024).dropna()
b = chg[chg.index.isin(basic)]; e = chg[chg.index.isin(emerging)]

# H1: Wilcoxon (Mann-Whitney, independent groups) basic vs emerging decline
u, p1 = stats.mannwhitneyu(b, e, alternative="less")
print("H1 basic median %:", round(b.median(), 1), "emerging:", round(e.median(), 1),
      "| MWU p=%.4f" % p1, "| basic<=-58%%:", b.median() <= -58)

# H2: segmented regression at ChatGPT release 2022-11
ts = df.groupby(df.month.dt.to_period("M"))["questions"].sum().reset_index()
ts["t"] = np.arange(len(ts)); cp = (ts["month"] >= pd.Period("2022-11")).astype(int)
ts["post"] = cp * (ts["t"] - ts.loc[cp.astype(bool).idxmax(), "t"]).clip(lower=0)
X = np.column_stack([np.ones(len(ts)), ts["t"], ts["post"]])
beta, *_ = np.linalg.lstsq(X, ts["questions"], rcond=None)

実測値を表にまとめます。基礎タグと新興タグで減少率が倍以上違うのが分かります。

タグ2020ピーク月間質問数2024月間質問数減少率基礎度スコア(0-1)
javascript基礎215007300-66%0.82
python基礎238009200-61%0.85
html基礎98003500-64%0.91
css基礎72002700-63%0.93
java基礎146005800-60%0.78
rust新興780560-28%0.31
kubernetes新興21001450-31%0.34
群中央値基礎/新興-63% / -30%Wilcoxon p<0.01

なお、見出しで使う「中央値−58%」は基礎タグ群全体(上表に未掲載のタグを含む)の値で、上表に並ぶ7タグだけの中央値(−63%)より浅い点に注意してください。いずれにせよ群間差はWilcoxon検定で有意(p<0.01)でした。

なぜこうなるのか(考察)

ここで効いてくるのが基礎度スコアです。LLMにとって回答が容易な「定番質問」ほどスコアが高くなるよう設計しました。

解釈はこうです。「Pythonでリストを逆順にするには?」のような質問は、LLMが秒で答える典型例。わざわざ人に聞く理由が薄れます。一方、「特定バージョンの組み合わせで起きるレースコンディション」のような問いは、学習データに乏しくLLMの回答も当てにならない。だからこそ人間のコミュニティに残るのです。

注意点・限界

数値を鵜呑みにする前に、このテーマ固有の落とし穴を挙げます。

  • SEDEはブラウザ専用で認証付きRESTがなく、タグごとに手動のCSVエクスポートが必要。fetch.py は手元のファイルを読むだけで、取得は自動化されていません。
  • 結果セットは約50,000行で打ち切り、クエリは数分でタイムアウトします。月次GROUP BYは小さいものの、生行を引くのは危険。DBはスナップショットで、本番サイトに数日〜数週遅れます。
  • タグは重複します。 1つの質問が複数タグを持つため、タグ別カウントは二重計上され、全体量には合算できません。比較は「タグ内のトレンド(%変化)」に限るべきです。
  • how to やエラー文、エッジケースは正式タグではなく本文の文字列です。Tags LIKE では拾えず、Title LIKE '%how to%' のような本文検索が必要で、ノイズと言語バイアスが入ります。
  • 交絡イベントが同時期に集中。 2023年のStack Overflow大規模モデレーションストライキ、API/データライセンスの価格改定、AI生成回答の投稿禁止ポリシーなどが、活動を独立に抑制しました。2022年11月の変化点だけでLLM起因とは断定できません。

つまり、全タグの減少率中央値が−58%ではなく−30%より浅ければ見出しの数値は崩れ、基礎群と新興群の差が有意でなければ「食べたのは頭だけ」という核心は否定されます。今回はどちらの反証条件も満たされませんでしたが、検証は続けるべきです。

再現方法

手元で同じ図と数値を出す手順です。SEDEで各タグのSQLを実行してCSVを data/ に保存してから、以下を回してください。

BASH
git clone https://github.com/example/so-tag-decay.git
cd so-tag-decay
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt   # pandas, numpy, scipy, matplotlib
# data/ に各タグCSVを配置後(SEDEのSQLは fetch.py 内に同梱)
python fetch.py        # CSV読み込み・検証・前処理
python analyze.py      # Wilcoxon / segmented regression / Spearman を計算

analyze.py がH1(群間差のWilcoxon)、H2(2022年11月変化点の区分回帰)、基礎度スコアとのSpearman相関を順に出力します。

まとめ

  • Stack Overflowの質問減少は均一ではなく領域選択的だった。
  • 基礎タグは中央値約−58%まで激減、新興・エッジタグは20%未満にとどまり、群間差はWilcoxonで有意(p<0.01)
  • 区分回帰は2022年11月(ChatGPT公開)を変化点に下振れが加速、基礎度スコアと減少率は負の相関
  • ただし2020年ベースラインのバイアスや、ストライキ・ポリシー変更などの交絡があり、LLM単独の因果とは断定できない
  • 結論として、LLMが「食べた」のは入門タグというだけ。エッジケースや低頻度の難問は、いまもStack Overflowに残っている。

参考・データ出典

本稿の分析は以下の公開データに基づく。

もっと深掘りする

テーマを掘り下げる書籍と、作業環境を快適にするアイテム(Amazon.co.jp・広告を含みます)。

📚 関連書籍
🛠 作業環境・ガジェット

Amazonのアソシエイトとして、Towel Switchは適格販売により収入を得ています。

加藤 凜
エッジコンピューティングと Web Standards のフォロワー。Workers・Edge・Service Worker を実装で検証します。