

# Xの公開カウンターと手元の分析エクスポートを照合する方法

2つの取得値を不一致と判断する前に、投稿、定義、時間的な対象範囲、観測時刻をそろえてください。

取得値とは、ある時点に1つの情報源から取得した1つの値です。照合とは、何が一致し、何の対象範囲が異なり、何が不明のままなのかを記録することです。対象範囲とは、その数値に何が含まれるかを示すものです。指標、投稿、集計期間が対象範囲に含まれます。集計期間には開始と終了があります。

公開データのスナップショットから、欠けている月次アカウントレポートを復元することはできません。スナップショットとは、ある時点で公開カウンターを1回取得した記録です。説明できる対象範囲の違いと、説明できない差を分けて扱ってください。

## 比較の手順

### 1. 必要なレポートを明確にします。

公開投稿の台帳には、把握している投稿のうち、今読み取れるものを記録できます。台帳は、投稿ごとに1行を設けた表です。非公開レポートのすべての列を埋めることはできません。保存していない過去の月のデータも作れません。

必要な内容を1行で書いてください。過去の月について完全なアカウントレポートが必要なら、ここで止めてください。公開データのスナップショットでは、そのレポートを作成できないと明記します。すでにエクスポートを保有している場合は、続けられます。そのエクスポートは、把握している公開投稿を対象としている必要があります。

### 2. まず、把握している公開投稿を1件読み取ります。

Actorとは、ホスト環境で動くデータ収集プログラムです。Taskとは、そのActor用に保存した入力設定です。[X Post Metrics](https://apify.com/chronometrica/x-post-metrics) Actorは、公開データを行として収集します。比較は自分で行います。Actorは結果の分類を行いません。保存済みのTaskは、入力の出発点です。比較が自動で行われることの証拠ではありません。

これらのフィールドの扱いは、公開バージョンのビルド1.0.4に基づいています。このビルドでは、把握している公開投稿のstatus URLを1〜1,000件、`startUrls`に指定できます。status URLとは、1件の投稿のウェブアドレスです。ここでいう投稿は、独自のstatus URLを持つ、X上の1件の公開メッセージです。Xは、x.comで公開されているサイトです。

実行結果は次の順序で確認してください。保存済みのTaskから始めます。サンプルを試行用のURLに置き換えます。次に、行に元から含まれるフィールドを確認します。その後、指標ごとに`postMetricStatus`を確認します。最後に、実行サマリーを確認します。実行サマリーを投稿の行に混ぜないでください。

現在保存されているTaskの入力はサンプルです。

```json
{
  "startUrls": [
    "https://x.com/OpenAI/status/2074907025537224840",
    "https://x.com/OpenAI/status/2074907027378511884",
    "https://x.com/OpenAI/status/2074907031862190406"
  ]
}
```

比較の手順

その3件のURLはサンプルです。把握している公開投稿に置き換えてください。試行とは、最初に行う小規模な実行です。試行にはURLを1件だけ使います。URLを1件にすると、小規模な検証にできます。

このActorは、プロフィールのタイムラインを検索しません。期間を指定したアカウントレポートも作成しません。非公開の分析データにはアクセスしません。保存していない履歴も復元しません。非公開設定の投稿は収集しません。非公開設定の投稿は、公開データではありません。アカウントの認証情報は使用しません。認証情報とは、パスワードなど、ログインに使う秘密情報です。

入力URLごとに、取得を試みた結果として1行が生成されます。有用な情報が欠けている場合でも、その行には`status`と`statusReason`が含まれます。`status`は、その行の処理がどのような状態で終了したかを示します。`statusReason`は、その理由を短く示します。取得できなかったカウンターはゼロではありません。ゼロは、数値として返された値です。nullは、値を取得できなかったことを意味します。

試行で得た行を信頼する前に、四つの点を確認してください。`postId`と`postUrl`が、指定した投稿と一致することを確認します。`status`を確認します。`observedAt`を確認します。使用する指標ごとに`postMetricStatus`を確認します。`observedAt`は観測時刻です。観測時刻とは、カウンターを読み取った時刻です。公開時刻とは、投稿が公開された時刻です。これらの時刻を取り違えないでください。

行に元から含まれるフィールドは、`inputUrl`、`postUrl`、`postId`、`profileId`、`views`、`likes`、`replies`、`reposts`、`quotes`、`bookmarks`、`profileFollowers`、`postMetricStatus`、`status`、`statusReason`、`observedAt`です。

`inputUrl`は、送信したURLです。`postUrl`は、その行に記載された投稿URLです。`postId`は投稿IDです。`profileId`はアカウントIDです。カウンターとは、その投稿またはアカウントについて保持されている数値です。`views`は、公開されている表示回数を数えます。この行には、`likes`、`replies`、`reposts`、`quotes`、`bookmarks`も含まれます。いいねは、投稿を気に入ったことを示す反応です。返信は、投稿に対する返答です。リポストは、投稿の共有です。引用は、文章を添えて行う共有です。ブックマークは、投稿の保存です。ここでは、これらのカウンターを合計しないでください。この方法では、これらを使った率の計算は行いません。

`profileFollowers`は、`observedAt`時点で公開されている、そのアカウントのフォロワー数です。フォロワーとは、そのプロフィールをフォローしているアカウントです。`profileFollowers`を投稿の表示回数として使わないでください。

精度は、その数値が正確な値か、丸められた値か、不明かを示します。`postMetricStatus`は、返された指標ごとにその精度を示します。数値と精度は一緒に保持してください。指標が欠損している場合は、欠損のままにします。欠損を埋めるために0を書き込まないでください。

対照実行とは、どのフィールドが返されるかを調べるために確認した、公開データの取得実行です。現在の公開データを使った対照実行では、指定した投稿の識別情報と時刻のフィールドが返されました。これらには、`postId`、`postUrl`、`profileId`、公開時刻、`observedAt`が含まれます。`views`、`likes`、`replies`、`reposts`、`quotes`、`bookmarks`、`profileFollowers`も返されました。その`status`はokでした。

返された各指標の`postMetricStatus`は、present/exact/public_postでした。

| 返された指標 | 対照実行のpostMetricStatus |
| --- | --- |
| views | present/exact/public_post |
| likes | present/exact/public_post |
| replies | present/exact/public_post |
| reposts | present/exact/public_post |
| quotes | present/exact/public_post |
| bookmarks | present/exact/public_post |

presentは、その行に指標が含まれていたことを意味します。exactは、その対照実行の値が正確だったことを意味します。`public_post`は、情報源が公開投稿だったことを意味します。この対照実行は、公開カウンターを収集できることを示しています。公開カウンターが非公開のエクスポートと等しいことを示すものではありません。自分の実行では結果が異なる場合があります。自分の行を確認してください。対照実行で読み取っていない投稿に、その対照実行の状態をコピーしないでください。

実行サマリーは、投稿の行ではありません。そのフィールドは、`inputCount`、`datasetRows`、`usefulRows`、`billableRows`、`failedRows`、`statusCounts`、`stopReason`です。

`inputCount`は、入力URLの件数です。`datasetRows`は、書き込まれた行数です。`usefulRows`は、有用な情報を含む行数です。`billableRows`は、その実行で課金対象とされた行数です。`failedRows`は、失敗した行数です。`statusCounts`は、状態別の行数です。`stopReason`は、実行が停止した理由を示します。これらの値を、投稿の表示回数のセルに貼り付けないでください。この記事では、これらの件数を作り上げていません。料金も記載していません。

### 3. すでに保有している自分のエクスポートを記録します。

エクスポートとは、使用を許可された分析レポートから出力したファイルです。使用権限のあるレポートとは、使用を許可されているレポートです。エクスポートは、使用を許可されている場合に限って使ってください。この方法は、Xから非公開のエクスポートを取得しません。ダッシュボードを無料で代替するものではありません。アクセスに関する規則を回避するものでもありません。

過去の公開投稿から、現在のX Analyticsの料金やアクセス条件は判断できません。[Twitterアナリティクスの代替手段](https://www.reddit.com/r/Twitter/comments/1e5a688/alternatives_for_twitter_analytics/)と[X（Twitter）のアナリティクス](https://www.reddit.com/r/Twitter/comments/1abvw05/x_twitter_analytics/)を参照してください。レポートをまだ保有していない場合は、そちらの値は不明のままにします。

使用権限のあるレポートを保有している場合は、そのレポートから次の項目を転記します。投稿IDを転記します。指標名を転記します。レポート自体の注記から、指標の定義を転記します。日付範囲とタイムゾーンを転記します。抽出時刻を転記します。抽出時刻とは、レポートファイルを取り出した時刻です。有料施策またはオーガニックの対象範囲がレポートに明記されている場合は、それも転記します。有料施策の対象範囲には、プロモーションされた投稿が含まれます。オーガニックの対象範囲には、レポートでプロモーションされていないとされる投稿が含まれます。レポートにその区分が示されていない場合は、作り上げないでください。

impressionsという列が、公開の表示回数と一致すると思い込まないでください。アカウント全体の合計を、1件の投稿の合計として扱わないでください。レポートの定義を使います。定義が欠けている場合、比較結果は不明のままです。

### 4. 投稿IDで行を対応付けます。

`postId`を、エクスポートの投稿IDと対応付けます。タイトルや本文で対応付けないでください。異なる2件の投稿が、同じ文章を使うことがあります。キャプションが変更されても、投稿IDは同じ場合があります。IDをキーとして使います。

対応するレポートの行がない公開データの行も残してください。対応する公開データの行がないレポートの行も残してください。読み取れないIDは、不明のまま残します。対応する行がないことを0に置き換えないでください。

レポートには、アカウントと期間を単位とする行もあります。そのような行は、1つの集計期間について、多くの投稿をまとめたものです。その行を1件の投稿に結合しないでください。アカウント全体の数値を、その投稿の数値として扱わないでください。行に集計単位を記載します。集計単位は、その行が1件の投稿、1日、1つのアカウントのどれを表すかを示します。

### 5. 数値を比較する前に、対象範囲を対応付けます。

比較する値の組に、対象範囲のラベルを一つ付けます。

`same_metric_scope`は、指標の定義、投稿、時間的な対象範囲が一致していることを意味します。

`different_metric_scope`は、定義または期間が異なることを示せる場合に使います。

`definition_unknown`は、必要な定義が欠けていることを意味します。

公開の累積カウンターは、読み取り時点の合計を示します。累積とは、公開時刻から`observedAt`までの事象を加算することです。期間を指定したレポートは、その集計期間内に発生したものを示します。昨日で終わる集計期間の数値は、今日読み取った合計と異なることがあります。この2つの数値は、異なる問いに答えています。

公開の表示回数は、表示が発生した回数です。Xによると、同じ人による繰り返しの表示や、投稿者自身による表示が含まれる場合があります。重複を除いた人数ではありません。`views`を使う前に、現在の[表示回数に関するヘルプ](https://help.x.com/en/using-x/view-counts)を読んでください。そのページは、`views`がエクスポートのあらゆる指標と等しいことを示すものではありません。エクスポートで別の定義が使われている場合は、エクスポートの表現を使います。エクスポートの定義を確認できない場合は、`definition_unknown`を使います。

更新が遅れる場合があります。更新の遅れとは、後の時点で読み取った値にも、直近の事象がまだ反映されていないことです。証拠がない限り、更新の遅れを原因としないでください。推測は証拠ではありません。

### 6. 比較条件が許す場合に限り、差を計算します。

定義と期間が比較に十分な程度にそろっていれば、表示されている値の差を計算できます。単純な引き算を使います。

```text
displayed difference = public value - owned value
observed counter delta = later saved public value - earlier saved public value
```

比較の手順

計算結果の隣に精度を記載してください。`postMetricStatus`がexactでない場合、結果を正確な値と呼ばないでください。公開の値が丸められている場合、完全な一致を確認できないことがあります。どちらかの値が欠けている場合は、差を計算しないでください。

[保存した公開データのスナップショットが2つ](/ja/articles/facebook%E6%8A%95%E7%A8%BF%E6%8C%87%E6%A8%99%E3%81%AE%E6%8E%A8%E7%A7%BB%E8%A8%98%E9%8C%B2/)あれば、その保存時点間の変化だけを示せます。観測されたカウンターの差分とは、その変化です。保存した時点についてのみ算出できます。それ以前の基準値を作り上げないでください。基準値とは、開始時点で読み取った値です。開始値を推測しても、欠けている月のデータは復元できません。

Xがカウンターを修正すると、数値が下がることがあります。負の変化が実際に起きる場合もあります。数値の低下をすべてファイルの読み取り不良と決めつけないでください。

対象範囲がそろっていなくても、単なる計算として引き算を示すことはできます。その場合は、単なる計算であると明記します。原因を示すものとはしないでください。

### 7. 結果を分類します。

根拠を示せる比較結果に、結果の分類を1つ付けます。

`explained_scope_difference`は、既知の対象範囲の違いを示せることを意味します。この分類は、数値の差の大きさ全体を説明するものではありません。

`timing_or_precision_limit`は、時刻が異なるか、精度の制約によって完全な一致を確認できないことを意味します。その制約を示せる場合に限って使ってください。

`comparable_values`は、投稿、定義、時間的な対象範囲が、2つの数値を比較できる程度にそろっていることを意味します。1行で値が一致しても、レポート全体が完全である証拠にはなりません。

`unresolved_difference`は、理由を裏付けられないことを意味します。理由は不明のままにします。

不正とは、数値が捏造されたことを指します。差があるだけでは、不正の証拠になりません。数値の差分が有料施策によるものだという証拠にもなりません。分析ツールが故障している証拠にもなりません。Xが投稿を隠した証拠にもなりません。両方の証拠記録が裏付ける場合に限り、理由を残してください。証拠記録とは、手元にある公開データの行、または自分のレポートの行です。定義が欠けている場合、理由は不明のままです。

### 8. 投稿単位の表と短い注記を提出します。

投稿ごとに1行を使います。投稿IDと両方の情報源を示します。公開時刻と観測時刻は、別々のセルに記載します。指標名、定義、集計期間、精度を示します。欠損値は欠損として示します。対象範囲のラベルと結果の分類を示します。数値の差を説明できない場合は、そのことを注記に記載します。

公開データの行しかない場合は、その行と上記の制約を報告してください。月間インプレッションだと主張しないでください。重複を除いたリーチだと主張しないでください。非公開のエンゲージメント合計だと主張しないでください。キャンペーンの投資収益だと主張しないでください。カウンターから率を算出しないでください。

注記の最後に、1件の投稿の1つの指標を示します。その行は、比較可能か、未解決かのいずれかです。不明な差を、原因が判明したものとして扱わないでください。

## 架空の投稿台帳

以下の5件の投稿は、説明用に作成した架空のものです。製品の実行結果ではありません。Actorから取得した行でもありません。この架空例では、ダッシュボードは代替していません。非公開のエクスポートも取得していません。公開時刻は示されていません。観測時刻を公開時刻のセルにコピーしないでください。表示回数を、重複を除いた人数に置き換えないでください。

P1〜P5は架空の投稿IDです。これらの投稿は、いずれも実際のエクスポートに由来するものではありません。

| 投稿 | 公開時刻 | 公開データの指標 | 公開データの値 | 公開データの観測時刻 | 公開データの定義 | 公開データの集計期間 | 公開データの精度 | 自分のレポートの指標 | 自分のレポートの値 | 自分のレポートの時刻 | 自分のレポートの定義 | 自分のレポートの集計期間 | 対象範囲 | 計算 | 結果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| P1 | 記載なし | views | 1,500 | 10月13日10:00 UTC | 公開されている表示の発生回数 | 観測時刻までの累積 | 明記なし | impressions | 1,200 | 記載なし | 記載された集計期間について、定義が明記されたインプレッション | 10月1〜12日。タイムゾーンの記載なし | different_metric_scope | 1,500 - 1,200 = 300 | 対象範囲についてのみexplained_scope_difference。300の差は完全には説明されていない |
| P2 | 記載なし | views | 1,000、その後1,200 | 10月13日10:00 UTCと10月13日12:00 UTC | 公開の累積表示回数の正確な値 | 保存した各取得時点までの累積 | 正確 | 自分のレポートの行なし | 自分のレポートの行なし | 自分のレポートの行なし | 自分のレポートの行なし | 自分のレポートの行なし | 保存した2時点で、公開の表示回数の定義は同じ | 1,200 - 1,000 = 200 | 保存したその2時点間に限った、観測されたカウンターの差分 |
| P3 | 記載なし | views | null。0ではない | 記載なし | 公開の表示回数を取得できなかった | 取得不可 | 該当なし | 記載なし | 500 | 記載なし | 記載なし | 記載なし | 公開データの値が欠損しているため、対象範囲は対応付けない | 計算しない | 公開データとの比較は不可。-500の差ではない |
| P4 | 記載なし | 記載なし | 2,000 | 記載なし | 記載なし | 記載なし | 不明 | 記載なし | 記載なし | 記載なし | 定義が欠けている | 記載なし | definition_unknown | 計算しない | unresolved_difference |
| P5 | 記載なし | 定義が明記されたカウンター | 250 | 自分のレポートの取得値と同じ時刻。具体的な時刻の記載なし | 自分のレポート側と同じ、定義が明記されたカウンター | 自分のレポート側と同じ集計期間。日付の記載なし | 250という値以外に精度の明記なし | 定義が明記されたカウンター | 250 | 公開データの取得値と同じ時刻。具体的な時刻の記載なし | 明記されたカウンターの対象範囲が同じ | 公開データ側と同じ集計期間。日付の記載なし | same_metric_scope | 250 - 250 = 0 | このカウンターについてのみcomparable_values |

P1とP2では、時刻の基準にUTCを使っています。UTCには、各地域の夏時間は適用されません。

P1には、既知の対象範囲の違いがあります。公開データのセルは、10月13日10:00 UTCに読み取った累積表示回数です。自分のレポートのセルは、10月1〜12日のインプレッションです。表示回数と、集計期間内のインプレッションは同じ指標ではありません。10月13日までの合計と、10月12日で終わる集計期間も同じ期間ではありません。そのため、対象範囲のラベルは`different_metric_scope`です。結果の分類である`explained_scope_difference`は、その対象範囲に関する事実だけを示します。

1,500 - 1,200 = 300という引き算は、単なる計算です。300件のインプレッションの欠落が確認されたわけではありません。収集エラーの証拠でもありません。この2つの証拠記録から、300の内訳を分けることはできません。10月13日に何回の表示があったかは不明です。そのうち何回が繰り返しの表示や投稿者自身による表示だったかも不明です。その300の中で、インプレッションの集計ルールがどのように異なるかも不明です。その部分は説明できないまま残してください。

P2には、公開の累積表示回数を2回読み取った正確な値があります。10月13日10:00 UTCのカウンターは1,000です。10月13日12:00 UTCには1,200です。観測されたカウンターの差分は、1,200 - 1,000 = 200です。これは、保存した2時点間で表示値が変化した分です。重複を除いた200人ではありません。復元した月次レポートでもありません。この架空例には、P2について自分のレポートの行はありません。10:00より前の開始値を作り上げないでください。この2つの時刻の間に、値がどのように推移したかを説明しないでください。その間の取得値は保存していません。

P3の公開の表示回数はnullで、レポートの値は500です。nullは、公開の表示回数カウンターを取得できなかったことを意味します。表示回数がゼロだったという意味ではありません。公開データの値が欠損しているため、引き算はしません。500 - 0は誤った式です。0 - 500も誤りです。-500の差があるわけではありません。レポートの値は、レポート側に残します。公開の表示回数の合計ではありません。この結果は、公開データとの比較ができない状態です。不一致の分類を完了した状態ではありません。

P4には、精度不明の公開値2,000があります。レポートには定義がありません。指標名、時刻、集計期間も示されていません。対象範囲のラベルは`definition_unknown`です。原因を裏付けることはできません。結果は`unresolved_difference`です。丸め処理を推測しないでください。更新の遅れを推測しないでください。もう一方の指標名を推測しないでください。

P5は、両側で同じ定義が明記されたカウンターを使い、対象範囲も時刻も同じです。どちらの値も250です。表示されている値の差は、250 - 250 = 0です。対象範囲のラベルは`same_metric_scope`です。結果は`comparable_values`です。この結果は、この1つのカウンターだけを対象とします。レポート内のすべての投稿を確認したことは示しません。P5のほかのすべての指標が一致することも示しません。レポートが完全であることも示しません。

## 次に行うこと

把握している1件の投稿について、1つの指標を対応付けてください。同じ投稿ID、定義、時間的な対象範囲を使います。差を説明できない場合は、未解決のまま残します。[X Post Metrics Actor](https://apify.com/chronometrica/x-post-metrics)で公開データ側を収集します。[X Post Analytics Snapshot Task](https://apify.com/chronometrica/x-post-metrics/examples/x-post-analytics-snapshot)から始めてください。サンプルURLを、把握している公開投稿1件のURLに置き換えます。

## 出典と参考資料

- [X Post Metrics Actor](https://apify.com/chronometrica/x-post-metrics)
- [X Post Analytics Snapshot Task](https://apify.com/chronometrica/x-post-metrics/examples/x-post-analytics-snapshot)
- [表示回数](https://help.x.com/en/using-x/view-counts)
- [Twitterアナリティクスの代替手段](https://www.reddit.com/r/Twitter/comments/1e5a688/alternatives_for_twitter_analytics/)
- [X（Twitter）のアナリティクス](https://www.reddit.com/r/Twitter/comments/1abvw05/x_twitter_analytics/)