0
保存
共有

Hacker NewsのShow HN投稿1万件をPythonで分析した結果、最も「浮上」しやすいのは火曜の朝だった

「Show HN、いつ投稿すればバズる?」を生データで確かめた

自作プロダクトを Show HN に出すとき、誰もが一度は思います。「結局、何曜日の何時に投げればいいの?」と。

Twitter の噂や経験則はたくさんあるのに、生データを13ヶ月分まとめて検証した記事が見つからない。だったら自分で取って確かめよう、というのがこの記事です。

先に、この記事で言いたいことを3つにまとめます。

  1. 投稿量がもっとも多い時間帯と、スコア中央値がもっとも高い時間帯は一致しない
  2. 「火曜の朝が最強」は ほぼ 正しい。ただし 条件付き
  3. Show HN のスコア分布は対数正規ではなく、べき乗則の右裾を持つ

そして本音を先に言っておくと、「いつ投稿するか」より「どんな書き出しか」のほうが効きそうだ、という示唆も見えてきました。

使ったデータと取得方法

Hacker News の公式 Algolia API は無料で叩けます。tags=show_hn と日時フィルタを組み合わせれば、過去の投稿をまとめて取得できます。レート制限はゆるく、hitsPerPage=1000 で回しても安定して動きました。

下のスクリプトで、新しい順にページングしながら過去投稿を JSONL に書き出します。

fetch_show_hn.pyPYTHON
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 本社のタイムゾーン)に正規化して、「曜日 × 時刻」のヒートマップを作りました。左が投稿数、右がスコア中央値です。

Show HN posts heatmap by day-of-week and PT hour
投稿数(左)と中央スコア(右)の曜日×時刻分布

ぱっと見の特徴はこの3つです。

  • 投稿数のピークは月〜水の PT 8:00〜10:00。火曜9時台が最多
  • スコア中央値のピークは火曜・水曜の PT 8:30〜10:30。投稿数のピークとほぼ重なるが、月曜は弱く、木曜は急落する
  • 週末は別世界。土日は投稿数もスコア中央値も平日の半分以下

つまり「火曜朝が強い」という経験則は だいたい正しい。ただしあくまで「中央値の話」です。

具体的にどのスロットが効くのか、数字で確かめます。下のクエリで、投稿数が50件以上あるセルだけに絞って中央スコア上位を出します(サンプルが少ないセルはノイズなので除外)。

analyze.pyPYTHON
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時刻中央スコアサンプル数
Tue096.0187
Wed096.0162
Tue105.5158
Wed105.0141
Tue085.0143

全体の中央スコアは 3.5。上位スロットはその 1.42倍で、冒頭の結論が再現できました。

結果2: スコア分布は対数正規ではない

スコア分布は重い右裾を持っています。横軸を log にしても完全には対称にならず、500点以上は明らかな外れ値群(41件、全体の0.46%)として浮きます。

ここが大事なポイントです。火曜朝に投稿すれば「中央値」は上がる。でも、ごく一部の大バズり(右裾)は時刻だけでは説明できません。冒頭で触れた「最高スコア上位40件のうち火曜朝は5件だけ」というのは、この右裾の話です。

結果3: 時刻より「トピック」のほうが効く

タイトル先頭の Show HN: 以降のテキストを軽くトピック分類し、それぞれの中央スコアと「100点超え率」(スコア100以上の割合)を出しました。

トピックサンプル数中央スコア100点超え率
Developer Tools1,84256.4%
AI / LLM1,51444.1%
Browser-side / WASM48779.0%
Privacy / Self-hosted61268.3%
Games / Creative coding40857.6%
SaaS / B2B1,20132.5%
Hardware / Maker22468.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.ipynbjupyter lab で開けば、データ取得 → クリーニング → ヒートマップ生成まで一気に走ります。

BASH
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・広告を含みます)。

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

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

高橋 涼
コンテナ・マイクロサービスのアーキテクト。複雑性を増やさない設計判断について書いています。