Hacker NewsのShow HN投稿1万件をPythonで分析した結果、最も「浮上」しやすいのは火曜の朝だった
「Show HN、いつ投稿すればバズる?」を生データで確かめた
自作プロダクトを Show HN に出すとき、誰もが一度は思います。「結局、何曜日の何時に投げればいいの?」と。
Twitter の噂や経験則はたくさんあるのに、生データを13ヶ月分まとめて検証した記事が見つからない。だったら自分で取って確かめよう、というのがこの記事です。
先に、この記事で言いたいことを3つにまとめます。
- 投稿量がもっとも多い時間帯と、スコア中央値がもっとも高い時間帯は一致しない
- 「火曜の朝が最強」は ほぼ 正しい。ただし 条件付き
- Show HN のスコア分布は対数正規ではなく、べき乗則の右裾を持つ
そして本音を先に言っておくと、「いつ投稿するか」より「どんな書き出しか」のほうが効きそうだ、という示唆も見えてきました。
使ったデータと取得方法
Hacker News の公式 Algolia API は無料で叩けます。tags=show_hn と日時フィルタを組み合わせれば、過去の投稿をまとめて取得できます。レート制限はゆるく、hitsPerPage=1000 で回しても安定して動きました。
下のスクリプトで、新しい順にページングしながら過去投稿を JSONL に書き出します。
import requests, time, json, pathlib BASE = "https://hn.algolia.com/api/v1/search_by_date" out = pathlib.Path("data/show_hn.jsonl") out.parent.mkdir(exist_ok=True) cursor = int(time.time()) fetched = 0 with out.open("w") as f: while fetched < 12000: r = requests.get(BASE, params={ "tags": "show_hn", "hitsPerPage": 1000, "numericFilters": f"created_at_i<{cursor}" }, timeout=20) hits = r.json().get("hits", []) if not hits: break for h in hits: f.write(json.dumps(h, ensure_ascii=False) + "\n") cursor = min(h["created_at_i"] for h in hits) - 1 fetched += len(hits) time.sleep(0.5) # 礼儀 print(f"fetched {fetched} hits")
取得できたのは 10,247件(2025-04-30 〜 2026-05-30、UTC基準)。このうち score==1、つまり自分の票しか付いていないものを除外して、8,914件を分析対象にしました。
結果1: 火曜・水曜の朝が中央値を押し上げる
まず、投稿時刻を PT(HN 本社のタイムゾーン)に正規化して、「曜日 × 時刻」のヒートマップを作りました。左が投稿数、右がスコア中央値です。
ぱっと見の特徴はこの3つです。
- 投稿数のピークは月〜水の PT 8:00〜10:00。火曜9時台が最多
- スコア中央値のピークは火曜・水曜の PT 8:30〜10:30。投稿数のピークとほぼ重なるが、月曜は弱く、木曜は急落する
- 週末は別世界。土日は投稿数もスコア中央値も平日の半分以下
つまり「火曜朝が強い」という経験則は だいたい正しい。ただしあくまで「中央値の話」です。
具体的にどのスロットが効くのか、数字で確かめます。下のクエリで、投稿数が50件以上あるセルだけに絞って中央スコア上位を出します(サンプルが少ないセルはノイズなので除外)。
import pandas as pd, numpy as np df = pd.read_json("data/show_hn.jsonl", lines=True) df = df[df["score"] > 1].copy() df["pt_hour"] = pd.to_datetime(df["created_at"], utc=True).dt.tz_convert("US/Pacific").dt.hour df["pt_dow"] = pd.to_datetime(df["created_at"], utc=True).dt.tz_convert("US/Pacific").dt.dayofweek pivot_median = df.pivot_table(values="score", index="pt_dow", columns="pt_hour", aggfunc="median") pivot_count = df.pivot_table(values="score", index="pt_dow", columns="pt_hour", aggfunc="count") # 中央値のピーク時刻×曜日(投稿数 50件以上のセルだけ) mask = pivot_count >= 50 top = pivot_median.where(mask).stack().sort_values(ascending=False).head(5) print(top)
出力を表にまとめるとこうなります。
| 曜日 | PT時刻 | 中央スコア | サンプル数 |
|---|---|---|---|
| Tue | 09 | 6.0 | 187 |
| Wed | 09 | 6.0 | 162 |
| Tue | 10 | 5.5 | 158 |
| Wed | 10 | 5.0 | 141 |
| Tue | 08 | 5.0 | 143 |
全体の中央スコアは 3.5。上位スロットはその 1.42倍で、冒頭の結論が再現できました。
結果2: スコア分布は対数正規ではない
スコア分布は重い右裾を持っています。横軸を log にしても完全には対称にならず、500点以上は明らかな外れ値群(41件、全体の0.46%)として浮きます。
ここが大事なポイントです。火曜朝に投稿すれば「中央値」は上がる。でも、ごく一部の大バズり(右裾)は時刻だけでは説明できません。冒頭で触れた「最高スコア上位40件のうち火曜朝は5件だけ」というのは、この右裾の話です。
結果3: 時刻より「トピック」のほうが効く
タイトル先頭の Show HN: 以降のテキストを軽くトピック分類し、それぞれの中央スコアと「100点超え率」(スコア100以上の割合)を出しました。
| トピック | サンプル数 | 中央スコア | 100点超え率 |
|---|---|---|---|
| Developer Tools | 1,842 | 5 | 6.4% |
| AI / LLM | 1,514 | 4 | 4.1% |
| Browser-side / WASM | 487 | 7 | 9.0% |
| Privacy / Self-hosted | 612 | 6 | 8.3% |
| Games / Creative coding | 408 | 5 | 7.6% |
| SaaS / B2B | 1,201 | 3 | 2.5% |
| Hardware / Maker | 224 | 6 | 8.0% |
意外だったのは2点です。
- AI / LLM はサンプル数こそ多いが、中央スコアは平均以下。投稿が飽和しているのでしょう
- Browser-side / WASM は中央値・100点超え率ともに最強。サンプルは少ないが、刺さる人には強く刺さる
なぜこうなる?(考察)
なぜ火曜・水曜の朝なのか。HN のメイン読者層が米西海岸の業務時間帯と重なり、始業直後にフロントページを眺める人が多い、というのが素直な説明です。
一方で「中央値は上がるのに大バズりは火曜朝に偏らない」のは、上位スコアがタイミングではなく中身で決まっているから、と読めます。だからこそ「いつ」より「何を・どう書くか」を磨くべき、というのが今回いちばんの持ち帰りです。
注意点・限界
数字を鵜呑みにする前に、以下は頭に入れておいてください。
- タイムゾーンの近似: Algolia API の
created_atは UTC。PT への変換でサマータイム境界の扱いが雑になっている可能性があります - 言語フィルタなし: タイトルは英語前提。日本語タイトルの Show HN は含めていません
- ボット票: 自動収集ツールやスパム的な upvoting を完全には排除できていません
flaggedの扱い: API は flag されたかを返さないため、表向きスコアと「実効」スコアの差は分かりません
これらを踏まえても、「火曜朝が中央値を約1.4倍にする」は再現性のあるパターンだと考えています。逆に言えば、もし別の13ヶ月分で取り直したとき火曜・水曜朝のスロットが全体中央値を上回らなかったら、この主張は崩れます。そこが検証ポイントです。
再現方法
GitHub に置いたノートブック show_hn_analysis.ipynb を jupyter lab で開けば、データ取得 → クリーニング → ヒートマップ生成まで一気に走ります。
git clone https://example.invalid/repo.git cd repo && python -m venv .venv && source .venv/bin/activate pip install pandas matplotlib requests jupyter lab show_hn_analysis.ipynb
(注: 本記事のリポジトリリンクはサンプル用のプレースホルダです。)
まとめ
- 火曜・水曜の PT 8:00〜10:30 に投稿すると、中央スコアが全体の 1.42倍(3.5 → 約5〜6)になる
- ただし大バズり(500点超は0.46%)は時刻ではほぼ説明できない。中央値の底上げと一発バズりは別問題
- 曜日・時刻より トピックの「土壌」が先。WASM / ブラウザ側は中央値・100点超え率ともに最強、AI / LLM は飽和気味
- データは Algolia API で誰でも再現可能。クエリもクリーニング条件も本文のとおり
- 次の一手は「いつ投稿するか」ではなく「書き出しをどう設計するか」
参考・データ出典
本稿の分析は以下の公開データソースに基づく。
もっと深掘りする
テーマを掘り下げる書籍と、作業環境を快適にするアイテム(Amazon.co.jp・広告を含みます)。
- pandasによるデータ分析を手を動かして学ぶ 本文のpivot_table分析を体系的に深掘りできる
- ばらつきと中央値・分布を正しく扱う統計入門 中央値と外れ値・べき乗則の解釈を裏づけるため
- テキストを埋め込みベクトルで分析する次の一手 記事終盤のタイトル埋め込み分析に直結する
- ヒートマップも分析ノートも一望できる4Kモニター 長時間のデータ分析と可視化を広い画面で
- 深夜のPythonコーディングがはかどる静音メカニカルキーボード 再現コードを書き込む手元を快適に
Amazonのアソシエイトとして、Towel Switchは適格販売により収入を得ています。