0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiitaで何が読まれるかを3,478本から探した ― 106通り掃いて、残ったのは6つだけだった

0
Posted at

自分の記事が読まれなかったので、Qiita の記事3,478本を集めて、何が読まれる記事の特徴なのかを数えました。

先に結論から書きます。

掃いたセル        106
ヌル較正・多重補正・時期分割を通過   **6**

**100通り試せば、効果がゼロでも「有意」は必ず出ます。**だから通す関門を先に決めてから掃きました。この記事は、その手順と、残った6つと、残らなかったものの話です。

私はこの分析をした本人で、フォロワー0・記事5本の書き手です。
記事は現時点で累計1,173ビュー、LGTM は0です。うまくいっている人間の話ではありません。

まず、母集団の実力を知る

何かを語る前に、比較対象が要ります。「LGTM 0 は悪いのか」が分からないと、何も判定できません。

2026-08-11 に公開された記事100本を、3週間経った時点で測りました。

LGTM 0件         72%
LGTM 1件以下     86%
中央値           0
p90 4 / p95 8 / p99 606
ストック 0件     83%

**3週間経っても7割が0です。**中央値は0。0は異常ではなく最頻値でした。

自分の記事が0だったとき、私は「内容が悪い」と考えました。その判断には比較対象がありませんでした。

集め方 ―― 希少事象はケース・コントロール

「広がった記事」を ストック20超と定義します。母集団での発生率は約2%です。

**この稀さだと、無作為に数百本集めても当たりが十数本しか入りません。**106セルを多重補正で掃くには足りない。そこで、当たりを全数集めて対照と比べる形にしました。

ケース    stocks:>20 を 2026-03-01〜08-25 で全数取得(736本)
          → 対象タグ圏に該当 324本
コントロール  同期間・同タグ圏から 3,154本

対象は「Claude Code / AIエージェント圏」の12タグに限定しました。

ClaudeCode / AIエージェント / 生成AI / LLM / MCP / AgentSkills /
Cursor / claude / ChatGPT / OpenAI / RAG / プロンプトエンジニアリング

全体平均を見ないのは、「題材そのものの人気度」という最大の交絡が混ざるからです。
同じプールの中で何が違ったかを問わないと、操作可能な結論になりません。

標本の偏りを補正する

コントロールはタグごとに約300本ずつ取りました。ここに罠があります。

ClaudeCode              5,936本中 300本 → 抽出確率 0.051
プロンプトエンジニアリング   529本中 300本 → 抽出確率 0.567

**11倍違います。**生の割合をそのまま母集団の割合として読むと誤ります。

抽出確率の逆数を重みにして補正しました。記事 i が対象タグ集合 S を持つとき、標本に入る確率は

π_i = 1 - Π_{t ∈ S} (1 - p_t)      p_t = そのタグでの取得数 / 期間内の全記事数
w_i = 1 / π_i

検算として、タグごとに Σw が API の返す総件数に一致するかを見ました。一致比 0.85〜1.03(12タグすべて)。

レート制限の中でどう集めたか

Qiita API は認証なしで 60回/時です(Rate-Limit / Rate-Remaining ヘッダで確認できます)。
今回は 54回で収まりました。

ケース       stocks:>20 を per_page=100 で8ページ  → 736本を全数
             タグを指定せず全数を取り、**ローカルで対象タグに絞った**
             (タグごとに12回投げるより request 数が少なく、取りこぼしもない)
コントロール  タグごとに page=1 を取って総件数を読み、
             **1 / N/3 / 2N/3 の位置の3ページ**を取る

**ページを 1,2,3 と連番で取ってはいけません。Qiita の検索結果は新しい順なので、
先頭ページだけ取ると
その期間の最後のほうに偏ります。**位置を散らして期間全体から拾います。

そして、残り回数が0になったら待たずに打ち切り、そこまでの結果を保存して記録に残す
実装にしました。待つ実装だと、止まっているのか進んでいるのかが分からなくなります。

掃く前に、通す関門を決める

ここを先に書かないと、後から条件を足してしまいます。

指標    P(ストック >= 20)。**零過剰なので二値化する**(平均は外れ値1本に支配される)
族      106セル。**1つの族としてまとめて補正する**(タグだけ別枠、はしない)
検定1   ラベルを並べ替えて最大|z|の分布を作る(ヌル較正)
検定2   BH-FDR q = 0.10
検定3   前半(3〜6月中旬)と後半で**符号が一致**すること
再抽出  重みに比例させて対照を取り直し、**5回まわす。1回の生存は発見と呼ばない**
主結果  **著者フォロワー100未満の層**(私と同じ母集団)

セルの中身はこうです。

タグ12 / 小分類9 / 題名の型6 / 題名長4分位 / 本文長4分位 /
コードブロック数4分位 / 時刻6 / 曜日7 / 交互作用(小分類×題名型)54

小分類は題名の語で機械的に判定しました。判定に使った語を全部残してあります(再現のため)。

CATEGORY_WORDS = {
    'コスト課金': ['トークン', 'コスト', '料金', '課金', '節約', '安く', '高い', '無料枠'],
    'セキュリティ事故': ['セキュリティ', '脆弱', 'インシデント', '漏洩', '事故', '危険', '攻撃', '権限'],
    '機能解説': ['スキル', 'サブエージェント', 'フック', 'hooks', 'MCP', 'コマンド', '設定'],
    '運用自動化': ['運用', '自動化', '監視', 'CI', 'Actions', '常時', '24時間', 'cron'],
    '導入初心者': ['入門', '初心者', 'はじめて', '始め方', '使い方', '導入', 'インストール'],
    'ツール比較': ['比較', 'vs', '対決', 'どっち', '違い', '使い分け'],
    '失敗談': ['失敗', 'やらかし', '溶かし', '壊れ', 'ハマ', '後悔', '反省', '地獄'],
    '新機能速報': ['リリース', '新機能', 'アップデート', '登場', '発表', '追加され'],
    '業務適用': ['業務', '現場', '実務', 'チーム', '導入事例', '社内', '本番'],
}

探索するのは「操作できるもの」だけ

セルを決めるとき、自分が変えられないものは入れませんでした。

探索する    タグ / 題名の型 / 題名の長さ / 本文の長さ / コード数 / 時刻 / 曜日
探索しない  著者の知名度 / 題材そのものの流行 / 運

「有名な人の記事は読まれる」と分かっても、明日の行動が変わりません。
探索空間を操作可能なものに絞ると、掃くセル数も減り、多重補正で通りやすくなります。
探さないことを決めるのも設計のうちです。

検定1 ―― 偶然だけでどこまで出るか

結果ラベルを並べ替えて、**106セルの中の最大|z|**がどこまで行くかを見ます。

実測の最大|z|          5.1 〜 5.7(再抽出5回)
並べ替えの95%点        3.9 〜 4.3

**実測が偶然の上限を超えています。**ここで超えなければ、その日の探索は「何も無かった」で終わりでした。

この関門が要る理由は単純です。106個も見れば、効果がゼロでも|z|が3を超えるセルは普通に出ます。「z=3.2 だった」だけでは何も言えません。

何も残らなかったときに何をやめるか、を先に決めた

事前登録には、結果を見る前にこう書いてあります。

タグが生き残った      → 次の3本でそのタグを使う
タグが生き残らない    → タグ選定に時間をかけない。以後は題材と鮮度に寄せる
題名の型が生き残った  → 既存記事の改題を実行する
何も生き残らない      → 「操作可能な要因は無い」と記録し、探索を打ち切る

これを先に書いておくと、結果を見てから条件を足す誘惑が消えます。

実際にはタグが生き残ったので、私は自分の記事のタグを差し替えました。
Python・統計・ABテスト・データ分析 を外し、ClaudeCode・AIエージェント・生成AI を入れました。
この記事のタグも、その結果です。

残った6つ

フォロワー100未満の層(ケース116本 / 対照2,234本)。5回の再抽出すべてで BH-FDR を通り、時期分割でも符号が一致したものです。

セル                    平均z    向き          前半z / 後半z
タグ:ClaudeCode         +5.30   ケースに多い   +5.81 / +5.14
本文長Q1(最短)         -4.62   ケースに少ない  -4.09 / -2.28
本文長Q4(最長)         +3.95   ケースに多い   +2.35 / +3.65
コードブロック数Q4       +3.44   ケースに多い   +2.84 / +1.47
タグ:LLM                -3.00   ケースに少ない  -2.95 / -1.75
小分類:セキュリティ事故   +2.85   ケースに多い   +1.91 / +2.49

中央値で見るとこうです。

本文長      広がった記事 7,670字  /  そうでない記事 5,235字
コード数    広がった記事    5個   /  そうでない記事     3個

**本文長は Q1が負・Q4が正で、量反応の形になっています。**単発の当たりではなく、長さに沿って向きが揃っている。偶然の可能性はその分下がります。

落ちたもの ―― こちらのほうが役に立つ

本文長Q3は BH を通ったのに、時期分割で落ちました。

前半 z = +3.42   後半 z = -0.69   → **符号が逆転。棄却**

「中くらいの長さも効く」と言えそうな数字が出ていましたが、期間を割ると消えました。

そして、主結果の層で1つも生き残らなかったものがあります。

公開時刻   6区分すべて落選
曜日       7つすべて落選
題名の数字  単独では生存せず(記述統計でもリフト1.00)

**投稿時刻を最適化する必要はありませんでした。**曜日も同じです。
**「効かないと確認できた」ことのほうが、日々の判断には効きます。**そこに時間を使わなくてよくなるからです。

タグの拡散率も測りました。同じ努力でも置く場所で桁が変わります。

タグ            期間内の本数   ストック20超   拡散率
ClaudeCode          561          13         2.3%
AIエージェント       391           6         1.5%
生成AI              561           8         1.4%
AI                1,042          14         1.3%
Python              665           1         **0.15%**
統計                 25           0         **0%(母集団がいない)**

**私は最初、Python と統計のタグを付けていました。**5つのうち4つが、人のいないプールでした。

無名でも広がるのか ―― 広がります

一番知りたかったのはこれでした。8/15以降にストック20を超えた37本の著者を調べました。

                    広がった37本   ふつうの100本
著者フォロワー中央値      106            2
フォロワー100未満の割合   **46%**        89%
フォロワー10未満の割合    **16%**        66%
S128  フォロワー 12  記事数 4   【インシデント報告】…
S 85  フォロワー  7  記事数 5
S 51  フォロワー  2  記事数 5
S 40  フォロワー  0  記事数 8
S 34  フォロワー  2  記事数 1   ← **記事1本目**

記事1本・フォロワー2の著者がストック34を取っています。
「まず土台を作らないと」という前提は、少なくともこのデータでは要りませんでした。

正直に書く限界

① 観察データであり因果ではない
   「そのタグが効く」のか「それを選ぶ書き手が上手い」のかは分離できていない
② **フォロワー数は取得時点の値**。広がった記事の著者は、その結果として
   フォロワーが増えている。**層別そのものが逆因果に汚染されている**
③ コントロールは各タグ3ページ位置のクラスタ標本。真の無作為抽出ではない
④ 後半のケースが35本と少ない(新しい記事ほどストックが溜まっていない)
⑤ 測っているのは LGTM とストックであって、**ビューではない**
   ビューは著者本人にしか見えないため、外部からは分布を作れない

**②が一番重いと思っています。**この層別は「無名でも広がるか」を見るために置いたのに、
広がった結果フォロワーが増えた人は、層から抜けています。
つまりこの層は「広がったのにフォロワーが増えなかった人」に偏っている可能性があります。

手順のまとめ

1  母集団の基準率を先に知る(0 は異常か、最頻値か)
2  希少事象はケース・コントロール。当たりを全数集める
3  層別で取ったら、抽出確率の逆数で補正する
4  掃くセル数を数え、**1つの族として**多重補正する
5  ヌル較正 → BH-FDR → 時期分割 の3段を通す
6  1回の生存を発見と呼ばない。標本を取り直して繰り返す
7  自分と同じ母集団で層別する。全体平均は上位者に支配される
8  **落ちたものと、効かないと確認できたものを書き残す**

8 がいちばん実用的です。「時刻と曜日は効かない」と分かった日から、私はそこを考えなくなりました。

最後に。この分析をしても、私の記事の LGTM は 0 のままです。
到達(ビュー)は増えましたが、反応はまだ1件も出ていません。
何が読まれるかを数えることと、読まれた先で反応を得ることは、別の問題でした。


この連載は、実際に測った数字だけで書いています。
同じことを試す人の役に立ちそうなら、ストックしておいてください。

この連載

AIエージェントを実際に回して、かかった費用と壊れた箇所を測って書いています。推測は書きません。実測値だけです。

  1. Claude Code のトークン使用量を実測したら1ターン23万 ― 節約に効いたのは「セッションを切る」だった
    https://qiita.com/manabu49-ai/items/2598a30d5140e4445ab6
  2. 57分間、死んだジョブを誰も見ていなかった ― AIエージェントの見張りを機械に渡す
    https://qiita.com/manabu49-ai/items/5c7506c94b5be58c040e
  3. AIに100通り試させたら、効果ゼロなのに5個が「有意」だった
    https://qiita.com/manabu49-ai/items/397a018948e1ab7ef29e
  4. 仕様書は2日前から手元にあった ― 読まずに実装した対処が、データを永久に失う設計だった
    https://qiita.com/manabu49-ai/items/9b947604d3dc4958fa36
  5. 本記事 ― Qiitaで何が読まれるかを3,478本から探した

番外 ― Claude のモデル提供終了、猶予は告知から約60日 ― 過去9回を数えて、手元を検査するスクリプトを書いた
https://qiita.com/manabu49-ai/items/bc2a7be2a6ee4ceb6185

**無料記事は結論まで全部書きます。**出し惜しみはしません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?