こんにちは、麗(うらら)です。

AIの力を借りながら個人開発をしている、非エンジニアです。

今回は、新しく公開したツール「X投稿タイムヒートマップ」を紹介します。

このツールは、自分のX投稿データを読み込むと、

「私は何曜日の何時ごろに投稿すると、反応を得やすいのか?」

ヒートマップとランキング で確認できるツールです。

ただ、実際に作ってみると、単に平均値を並べるだけでは、かなり怪しい結果が出てきました。

この記事では、ツールの使い方と制作記録(開発中に見つかった「数字の罠」と、それをどう処理したのか)についてお届けします。

X投稿タイムヒートマップとは

x-time-heatmap.png

「X投稿タイムヒートマップ」は、その名のとおり、Xの投稿時間と投稿実績を分析するツールです。

Xプレミアムで取得できる「コンテンツCSV」を画面にドラッグ&ドロップすると、投稿データを読み込み、曜日×時間帯のヒートマップを作成します。

さらに、過去の実績をもとにした「ベスト投稿時間帯」もランキング形式で表示されます。

「火曜日の朝が強い」

「平日より日曜日のほうが反応されている」

「なんとなく夜に投稿していたけれど、実は昼のほうが伸びている」

といった、自分では気づきにくい投稿傾向を確認できるのです。

読み込んだCSVデータは、すべてブラウザの中だけで処理されます。サーバーなど外部の場所へ送信されることはありません。

※「X投稿タイムヒートマップ」を利用するには、Xプレミアム以上のプランで取得できるコンテンツCSVが必要です。無料プランでは分析用データを取得できないため、現在のところ利用できません。

開発のきっかけは、Fable 5だった

このツールを開発するきっかけになったのは、AnthropicのAIモデル「Claude Fable 5」のリリースでした。

Fable 5は、長時間にわたる複雑な作業やソフトウェア開発などを得意とするモデルとして登場しました。

リリース直後、その性能の高さを見た私は、

「このAIに私自身を分析してもらい、その結果をもとにツールを作ってみよう」

と考えました。

そこで、これまでの活動や制作物、考えていることなどをまとめた資料をFable 5に渡し、さまざまな角度から分析してもらったのです。

そのときに出てきたアイデアのひとつが、「X分析ツールの開発」 でした。

以前公開したX-analyzerをそのまま改良するのではなく、分析の仕組みから新しく作り直す計画です。

全体としては複数の機能を持つ大きなX分析ツールを作る予定で、そのSTEP1にあたる機能が、今回の「X投稿タイムヒートマップ」でした。

ところが・・・・・・。

このツールが完成した直後、Fable 5が米政府の指導によって一時的に利用できなくなってしまいました。

開発を一緒に進めていたAIが、完成と同時にいなくなるという、まさかの展開です(笑)

そのため、予定していたX分析ツール全体のプロジェクトはいったん中断。

すでに完成していた「X投稿タイムヒートマップ」だけを、独立したツールとして公開することにしました。

開発手順をざっくり紹介

このツールの初期開発で使ったAIは、Claude CodeのFable 5です。

公開前のチェックをするころにはFable 5が使えなくなっていたため、最終確認や修正にはCodexとClaude Opusも使いました。

開発の流れは、次のようなものでした。

  1. Fable 5に自己分析用の資料を渡す
  2. X分析ツールの開発を提案される
  3. プロジェクト全体の構成を企画する
  4. X投稿タイムヒートマップを実装する
  5. 実際のデータで動作を確認し、集計方法を修正する
  6. CodexとClaude Opusで公開前チェックを行う

Fable 5による最初の実装は、驚くほどあっさり終わりました。

あまりにも早かったので、実装の様子を見守りながら食べようと思っていたご飯を、食べるタイミングごと失いました(笑)

「長時間の開発になるかもしれない」と身構えていたのに、気づいたら動くものができていたのです。

しかし、完成した画面に実際の投稿データを入れてみると、見過ごせない問題が見つかりました。

実装そのものは動いているし、計算も間違っていないんです。

それなのに……。

「水曜日の19時が最強」という結果が出た

曜日と時間別の投稿実績を表示したX投稿タイムヒートマップの画面
X投稿タイムヒートマップの分析画面

動作確認のため、私は自分の約3か月分のデータを読み込ませてみました。

すると、ランキングの1位に表示されたのは、

水曜日・19時台 平均インプレッション:1,693

という結果でした。

「なるほど。私は水曜日の夜に投稿すると伸びやすいのか」

一瞬そう思ったのですが、念のため、その数字のもとになった投稿を確認してみることにしたのです。

すると、水曜日の19時台に投稿していたポストは、たったの1件 でした

つまり、

水曜日の夜が伸びやすかったのではなく、水曜日の夜に投稿した唯一のポストが、たまたま伸びていただけ

だったのです。

投稿が1件で、そのインプレッションが1,693なら、平均インプレッションも1,693です。

数学的には正しい。

けど、これを「おすすめの投稿時間」として1位に表示してよいのかというと、かなり怪しいところです。

私は「1件しかないものを、平均と呼んでいいのだろうか?」と考えました。

数字は正しくても、結論が正しいとは限らない

投稿数1件の枠もランキングに含めると、たまたま大きく伸びたポストが簡単に1位になります。

しかし、投稿数が十分にある時間帯は、さまざまな結果が平均化されるため、突出した数字になりにくくなります。

つまり、データが多く信頼しやすい時間帯よりも、データが少なく偶然に左右されやすい時間帯のほうが上位に出てしまいます。

そこで、投稿数の少ない枠はランキングの対象から外すことにしました。

「数字は嘘をつかない」 という言葉があります。

しかし、数字そのものが正しくても、どの数字を採用し、どのように並べるかによって、見える結論は大きく変わる。

そんなことを感じました。

そもそも、データがまったく足りていなかった

そもそも、なぜ投稿数1件の枠ができてしまったのでしょうか。

その理由は単純でした。

曜日と時間を1時間単位で組み合わせると、マスの数は全部で168個あります。

7日×24時間=168マス

しかし、私の約3か月分の投稿データは、リプライを除くと72件しかなかったのです。

72件の投稿を168個のマスに分ければ、多くのマスが0件か1件になるのは当然です。

完全に、データが足りていません。

だからといって、投稿数1件の枠まで積極的にランキングへ入れてしまえば、偶然の結果を「ベストな投稿時間」として紹介することになります。

では、データが少ない人には何も表示できないツールにするしかないのでしょうか。

ここでFable 5が出した結論は、とてもシンプルなものでした。

件数が足りないマスは、ランキングから外す。そのルールは崩さない。代わりに、分析する単位を少しずつ粗くする。

データ量に合わせて、分析の細かさを変える

最初のランキングは、「曜日×時間」の組み合わせだけで集計していました。

しかし、それでは168個もの枠にデータが分散。投稿数の少ない人は「投稿数1件」の枠をとりいれない限り、分析ができなくなってしまいます。

そこで、ランキングを次の4種類に分けることにしたのです。

  • 曜日×時間
  • 曜日×時間帯
  • 時間帯(全曜日)
  • 曜日(全時間帯)

もっとも細かいのは「曜日×時間」です。

たとえば「水曜日の19時台」のように、曜日と1時間単位の時間を組み合わせて比較します。

投稿数が多い人なら、ここまで細かく分けても十分なデータが集まるかもしれません。

「曜日×時間帯」では、朝・昼・夕方・夜など、複数の時間をまとめて集計します。

「時間帯(全曜日)」では曜日をまとめ、「曜日(全時間帯)」では時間をまとめます。

もっとも分析単位の粗い「曜日(全時間帯)」なら、枠は7個だけです。

これなら投稿数の少ない人でも、何らかの結果を確認できるはずです。

また、投稿数が足りず信頼できる集計ができない場合は、無理に順位を表示せず、

「データが少ないため集計できません」

と表示するようにしました。

見栄えよりも、正直な結果を優先した

スクリーンショット 2026-07-28 072134.png

現在のヒートマップでは、投稿数が5件以下のマスをグレーで表示しています。

そのため、投稿数が少ない人の画面では、グレーのマスがかなり多くなることがあります。

その見た目は、正直、だいぶ地味です。

せっかくのヒートマップなのだから、すべてのマスに鮮やかな色が付いていたほうが、画面としてはきれいに見えます。

しかし、データが1件しかないマスまで強い色で表示してしまうと、そこに意味のある傾向があるように見えてしまいます。

見栄えを優先して、偶然の数字を拾うことはしたくありませんでした。

その結果、このツールは、

データが足りないときには、足りないと正直に表示するツール

になりました。

派手な結果を必ず返してくれるわけではなく、人によっては、グレーのマスばかりになるかもしれません。

それでも、投稿数1件の時間帯を「あなたのベスト投稿時間です」と自信満々にすすめるよりは、ずっと信用できるものになったと思っています。

実は、CSVに投稿日時がない

最後に、少し技術的なお話をしていきます。

ヒートマップを作るには、それぞれのポストが「何曜日の何時に投稿されたのか」という情報が必要。

ですが、

実はXから取得できるコンテンツCSVには、分析にそのまま使える投稿日時が含まれていないのです。

「これでは分析ができない」

一見すると、そう思うのですが、Fableが裏技を見つけてくれました。

ポストIDから投稿時間を算出するという方法です。

「Snowflake ID」という仕組み

このツールでは、ポストごとに付けられているポストIDから投稿日時を復元しています。

XポストのURLを見ると、末尾に次のような長い数字があります。

https://x.com/ユーザー名/status/1234567890123456789

この末尾の数字がポストIDです。

実は、このポストIDは、ただの連番ではないのです。

Xでは 「Snowflake ID」 と呼ばれる仕組みが使われており、ひとつの長い数字の中に、次のような情報が含まれています。

  • そのデータが作られた時刻
  • IDを発行したサーバーの情報
  • 同じ時刻に作られたデータを区別する番号

つまり、ポストIDの中には、実はそのポストが作成された時刻の情報も埋め込まれているのです。

このIDをSnowflake IDのルールに沿って分解し、埋め込まれている時刻を取り出します。

取り出した時刻はUTCなので、それを日本時間などの表示用タイムゾーンへ変換し、「水曜日の19時台」といった情報に直しています。

投稿日時が直接書かれていなくても、IDが残っていれば時間帯を推定できる。

ランダムに見える数字の中に投稿時間が入っているというのは、なかなか面白い仕組みですね。

ちなみに、FableX5いわく、

ポストIDは非常に大きな整数なので、JavaScriptでは、そのまま通常の数値として扱うと桁が丸められ、正しいIDではなくなってしまう可能性があります。そのため、このツールではIDを文字列として読み込み、BigIntを使って計算しています。

とのことです。

せっかく時間を復元できても、元のIDが途中で変わってしまっては意味がありません。

見た目にはほとんど分からない部分ですが、正しい投稿日時を取得するために重要な処理となっているのだそうです。

自分の投稿を振り返ってみませんか

よくおすすめの投稿時間帯に夜20時がベストなどと言われますが、私が試してみた体感としては、必ずしもベストだとは言えないのではないかと感じました。

たぶん、「何時に投稿すれば伸びるのか」という疑問に、誰にでも共通する正解はないんだと思っています。

そもそも、フォロワーの生活時間も、投稿する内容も、アカウントの使い方も、人によって違うから。

一般的におすすめされている時間帯より、自分自身の過去データを見たほうが、意外な発見があるかもしれません。

「X投稿タイムヒートマップ」は、そんな疑問をもったときに、自分の投稿を振り返るためのツールです。

XプレミアムのコンテンツCSVを持っている方は、ぜひ自分のデータを読み込ませてみてください。

X投稿タイムヒートマップを使う

▶ 関連ツール:X-analyzer

曜日と時間別の投稿実績を表示したX投稿タイムヒートマップの画面
X投稿タイムヒートマップの分析画面