同一篇帖子分别连接到公开数据卡片和账号所有者报表卡片。
先核对来源的统计口径,再比较计数值。

一次读数是指在某一时间从某一来源取得的一个数值。核对是指记录哪些内容一致、哪些内容的统计口径不同,以及哪些内容仍然未知。统计口径是指一个数字包含哪些内容,包括指标、帖子和时间窗口。时间窗口是指一段时间的起点和终点。

公开数据快照无法重建缺失的账号月报。快照是指在某一时间读取的一组公开计数值。请区分能够解释的统计口径差异与无法解释的差异。

对比步骤

1. 明确报表需求。

公开帖子台账可以记录你已知且目前能够读取的帖子。台账中每篇帖子占一行。它无法填满非公开报表中的所有列,也无法补出你没有保存过的往月数据。

用一行文字写明你的需求。如果你需要过去某个月的完整账号报表,请到此停止,并说明公开数据快照无法提供这份报表。如果你已经持有导出文件,可以继续。该文件必须涉及已知的公开帖子。

2. 先读取一篇已知的公开帖子。

Actor 是托管运行的数据采集程序。Task 是为该 Actor 保存的一组输入预设。X Post Metrics Actor 负责采集公开数据行。对比工作由你完成。Actor 不会判定结果类别。已保存的 Task 只是起始输入,并不能证明对比过程会自动完成。

这些字段规则以公开版本 1.0.4 为依据。该版本通过 `startUrls` 接受 1 至 1,000 个已知的公开帖子状态 URL。状态 URL 是一篇帖子的网页地址。本文所说的帖子,是指一条拥有独立状态 URL 的公开 X 消息。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 都是示例。请将它们替换为你已知的公开帖子。小规模试运行是你的首次小范围运行。试运行只用 1 个 URL,以控制测试规模。

该 Actor 不会搜索个人主页时间线,不会生成指定日期范围的账号报表,也不会访问非公开分析数据。它无法恢复你没有保存过的历史记录,也不采集受保护的帖子。受保护的帖子不属于公开帖子。它不使用账号凭据。凭据是密码或其他登录机密信息。

每个输入 URL 都会生成一条记录采集尝试的数据行。即使缺少有用信息,数据行也会包含 `status` 和 `statusReason`。`status` 表示该行的最终状态。`statusReason` 简要说明原因。计数值缺失不等于零。零是实际返回的数字。null 表示该值无法获取。

在信任试运行数据行之前,先检查 4 项内容。检查 `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
viewspresent/exact/public_post
likespresent/exact/public_post
repliespresent/exact/public_post
repostspresent/exact/public_post
quotespresent/exact/public_post
bookmarkspresent/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 分析的替代方案和 X(Twitter)分析。如果你尚未持有报表,就将报表一侧的信息保留为未知。

如果你持有获准使用的报表,请从中复制以下内容:帖子 ID、指标名称、报表自身注释中的指标定义、日期范围和时区,以及提取时间。提取时间是取得该报表文件的时间。如果报表说明了付费或自然统计口径,也要一并复制。付费口径涵盖推广帖子。自然口径涵盖报表标记为未推广的帖子。如果报表没有说明这种划分,不要自行编造。

不要假定名为 impressions 的列与公开浏览次数一致。不要将账号总数当作单篇帖子的总数。请使用报表中的定义。如果定义缺失,对比结论就仍然未知。

4. 按帖子 ID 匹配数据行。

将 `postId` 与导出文件中的帖子 ID 匹配。不要按标题或正文匹配。两篇不同的帖子可能使用相同文字。文案发生变化后,帖子 ID 仍可能相同。请以 ID 作为匹配键。

没有对应报表行的公开数据行也要保留。没有对应公开数据行的报表行也要保留。对于无法读取的 ID,保留为未知。不要把未匹配的情况改成 0。

有些报表行按账号和统计周期汇总,涵盖同一时间窗口内的多篇帖子。不要将这种数据行关联到单篇帖子,也不要将账号数值当作该帖子的数值。请在数据行中写明汇总层级。汇总层级说明该行代表单篇帖子、单日还是单个账号。

5. 比较数字前,先核对统计口径。

为这组对比数据指定一个统计口径标签。

`same_metric_scope` 表示指标定义、帖子和时间范围一致。

`different_metric_scope` 表示你能证明定义或统计周期存在差异。

`definition_unknown` 表示缺少对比所需的某项定义。

公开累计计数值表示读取时的总数。累计是指从帖子发布起到 `observedAt` 为止,将发生的事件累加。选定周期的报表则说明某个时间窗口内发生的事件。一个截至昨天的时间窗口,其数值可能与今天读取的总数不同。这两个数字回答的是不同的问题。

公开浏览次数统计的是浏览事件。X 表示,其中可能包括重复浏览和作者自己的浏览。它们并不是去重人数。使用 `views` 前,请阅读当前的浏览次数帮助说明。该页面并不能说明 `views` 等同于每一种导出指标。如果你的导出文件采用其他定义,请沿用导出文件的表述。如果你无法读取导出文件中的定义,请使用 `definition_unknown`。

更新可能有延迟。延迟是指较晚读取的数值仍未包含最近发生的某个事件。没有证据时,不要将延迟认定为原因。猜测不是证据。

6. 仅在具备对比条件时计算差值。

如果定义和统计周期足够一致,可以计算所显示数值的差值。使用简单的减法即可。

text
displayed difference = public value - owned value
observed counter delta = later saved public value - earlier saved public value
对比步骤

在结果旁保留精度信息。如果 `postMetricStatus` 并非精确状态,不要称结果为精确值。如果公开数值经过舍入,可能无法实现精确匹配。只要任一数值缺失,就不要计算差值。

保存的 2 份公开数据快照只能显示这 2 个已保存时点之间的变化。观测到的计数变化量就是这一变化。它只适用于你保存过的时点。不要编造更早的基线。基线是起始读数。你无法通过猜测起始值来恢复缺失月份的数据。

X 修正计数值时,数值可能下降。负向变化可能是真实的。不要将每次数值下降都归为文件读取错误。

如果统计口径不一致,你仍可以展示减法结果,但必须注明这只是算术计算。不要将其标为原因。

7. 对结果分类。

根据证据所能支持的对比结论,选择一个结果类别。

`explained_scope_difference` 表示你能指出已知的统计口径差异。该类别不能解释数值差距的全部大小。

`timing_or_precision_limit` 表示时间不同,或精度限制了精确匹配。只有当你能证明的就是这项限制时,才使用此类别。

`comparable_values` 表示帖子、定义和时间范围足够一致,可以比较这两个数字。某一行匹配,并不能证明整份报表完整。

`unresolved_difference` 表示你无法提供证据支持某个原因。请将原因保留为未知。

造假意味着数字被伪造。存在差距并不能证明造假,也不能证明多出的数值来自付费推广。它不能证明分析工具发生故障,也不能证明 X 隐藏了帖子。只有双方原始记录都支持某个原因时,才保留该原因。原始记录是指你持有的公开数据行或自有报表行。如果定义缺失,原因就仍然未知。

8. 交付逐帖核对表和简短说明。

每篇帖子使用一行。列出帖子 ID 和双方来源。将发布时间和观测时间放在不同单元格中。列出指标名称、定义、时间窗口和精度。缺失值应标为缺失。列出统计口径标签和结果类别。如果数值差距仍无法解释,请在说明中写明。

如果你只有公开数据行,请报告这些数据行及上述限制。不要声称这些数据是月度展示次数、去重触达人数、非公开互动总数或营销活动回报。不要将这些计数值换算成比率。

在说明末尾,用一篇帖子的一个指标作结。该行数据要么具备可比性,要么仍未解决。不要将原因未知的差距说成某种原因。

虚构帖子台账

以下 5 篇帖子均为原创虚构示例。它们不是产品运行结果,也不是 Actor 返回的数据行。在这个虚构示例中,没有任何分析面板被替代,也没有获取任何非公开导出文件。示例未提供发布时间。不要将观测时间复制到发布时间单元格中。不要将浏览次数换算成去重人数。

P1 至 P5 是虚构的帖子 ID。这些帖子都不代表真实导出数据。

虚构帖子台账
帖子发布时间公开指标公开数值公开数据观测时间公开指标定义公开数据时间窗口公开数值精度自有报表指标自有报表数值自有报表时间自有报表指标定义自有报表时间窗口统计口径算术计算结果
P1未提供views1,50010 月 13 日 10:00 UTC公开浏览事件次数截至观测时间的累计值未说明impressions1,200未提供所述时间窗口内有文档定义的展示次数10 月 1–12 日;未提供时区different_metric_scope1,500 - 1,200 = 300explained_scope_difference 仅说明统计口径差异;300 的差距尚未得到完整解释
P2未提供views先为 1,000,后为 1,20010 月 13 日 10:00 UTC 和 10 月 13 日 12:00 UTC精确的公开累计浏览次数分别截至每次已保存读数时点的累计值精确无自有报表行无自有报表行无自有报表行无自有报表行无自有报表行2 个已保存时点采用相同的公开浏览次数定义1,200 - 1,000 = 200仅表示这 2 个已保存时点之间观测到的计数变化量
P3未提供viewsnull,不是 0未提供无法获取公开浏览次数无法获取不适用未提供500未提供未提供未提供公开数值缺失,因此未核对统计口径不要计算无法进行公开数据对比;并非存在 -500 的差距
P4未提供未提供2,000未提供未提供未提供未知未提供未提供未提供定义缺失未提供definition_unknown不要计算unresolved_difference
P5未提供有文档定义的计数指标250与自有报表读数时间相同;未提供确切时刻与自有报表一侧相同、有文档定义的计数指标与自有报表一侧的时间窗口相同;未提供日期除数值 250 外,未说明精度有文档定义的计数指标250与公开读数时间相同;未提供确切时刻采用相同且有文档定义的计数口径与公开数据一侧的时间窗口相同;未提供日期same_metric_scope250 - 250 = 0comparable_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 次展示,也不能证明存在采集错误。仅凭这两份原始记录,你无法拆解这 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`。该结果仅适用于这一项计数指标。它不能说明报表中的每篇帖子都已检查,不能说明 P5 的其他每项指标都一致,也不能说明报表完整。

来源和延伸阅读

作者 Chronometrica · 更新日期

返回顶部 ↑