跳到正文
LinkProfit

地理定向与国家维度分析:诚实地读懂位置数据

LinkProfit Team阅读约 10 分钟
  • geo-targeting
  • analytics
  • traffic-quality
本页内容

国家维度的图表,是每一款链接工具最先摆出来的东西,也是最后才真正改变一个决定的东西。一场营销活动有 38% 的量来自某一个国家——这句话既没说清那些人是不是真的在那个国家,也没说清是哪个网络把他们送来的,更没说清他们站着的地方当时是几点。

本文讲的是国家维度图表底下那一层:国家、地区和城市这些答案究竟从哪里来,精度半径意味着什么,为什么访客来自的那个网络和他来自的那个地方是两条彼此独立的轴,按访客当地小时统计的活跃度和按你的报表时区统计有什么不同,按国家和语言分流能做到什么、又到哪里为止,以及哪三个错误会稳定地把位置数据变成一个自信的错误答案。

国家、地区和城市这些答案从哪里来

同一个问题有两个数据源在回答,精细程度各不相同——而知道是谁回答的,比那个答案本身更要紧。

先回答的是网络本身

每一个抵达 edge 网络上跳转的请求,到达时就已经带着网络自己解析出来的那些字段:国家、地区、城市、大致坐标、时区、自治系统号,以及持有它的那家机构的名称。这些字段一分钱不花——不读数据库,不多跑一次往返——而对任何只需要知道国家的判断来说,它们已经够用了,快速分流跑的正是这一层。

有授权的数据库答得更细

一份商业地理数据库,离线重新打包成专为 edge 上单次读取而设计的格式,补上了网络层答案带不了的东西:城市的精度半径、地区和城市背后的 GeoNames 标识符、八种语言里稳定的地名、该地址段的代理类型,以及在网络没给出自治系统号时补上的那个号。地理分布与流量质量的各项拆分,正是建在这一层上的。

真正有意思的是它出故障时的样子。如果数据包读不出来,跳转照常工作,数据分析照常记录:解析器退回到网络层的答案,并在这一行上标明是哪个数据源给出的,于是一张图表绝不会悄悄把精确数据和近似数据混在一起。走兜底路径的行没有城市标识符,也没有精度半径,而界面会直接把这件事写出来,不用你自己去猜。

存的是标识符,不是名称

点击事件里存的是标识符,从不存本地化之后的地名。这听上去像个实现细节,实际上决定的是一行还是两行:「Bavaria」和「Bayern」对应的是同一个 GeoNames 标识符,而一份存字符串的报表,会把它们永远当作两个不同的地区来排名——这两个拼法说的其实是德国的同一个州。

名称是在报表被读取的那一刻,从读者所用语言的词典里解析出来的:控制台的十种语言里有八种带地名词典,剩下两种回退到英文,而不是留下一个空单元格。语言取自读者自己的账号设置,而不是某个请求参数——若取自参数,一个人就能把自己的语言钉进整个工作区共享的那份缓存里。

精度半径让地图保持诚实

一条城市记录不是一个位置。它是一个点加一个半径,而告诉你这个点值多少的,恰恰是那个半径。20 公里描述的是运营商在那一带某处分配出去的一段地址范围;它描述不了一个人、一个街区,也描述不了一家门店的辐射范围。

由此引出两个设计选择。坐标按万分之一度的整数存储,因为多出来的小数位只会制造源数据本来就没有的精度。还有,半径为 0 的意思是「未知」,不是「精确」——在有人拿导出数据去画地图之前,这一点值得先确认一下。

落到操作上的规则是:城市数据用来比较市场、发现聚集,不要拿寥寥几条记录去下任何结论,走兜底路径的那些行则干脆别用。

城市和网络是两条不同的轴

一次点击来自哪个地方,和它借道哪个网络,是两个不同的问题;只回答前一个,正是媒体采买方花钱买下永远不可能转化的流量的方式。网络这一项列出自治系统号、运营商名称、该地址段的代理类型,以及真正干活的那一列——把真人点击和总点击并排放着。在某一家运营商上,这两列之间的差额,通常就是全部的结论。

| 地址段标签 | 这类地址段是什么 | | --- | --- | | 数据中心 | 托管、云和主机托管的地址空间 | | 公共代理 | 任何人都能借道的开放代理 | | VPN | 商业 VPN 的出口地址段 | | 搜索引擎爬虫 | 搜索引擎公开的爬虫地址段 | | TOR | TOR 网络的出口节点 | | 网页匿名器 | 基于浏览器的代理服务 |

不属于以上任何一类的地址段就是普通地址,而被标注出来的类别里,体量最大的远不是消费级 VPN,而是数据中心。这个标签会和别的信号合在一起——已验证爬虫清单、对不公开清单的爬虫做反向 DNS、user agent 匹配模式、请求行为——得出一个访客类型,以及一个从 0 到 100、附带理由的质量评分。评分本身不拦截任何东西:拦截是你在流量规则里配置出来的,评分的作用是解释一个结论并喂给报表。分类的具体机制写在流量过滤规则里。

有一处不对称是刻意留下的:有三块面板——「已过滤」「流量质量」和「网络」——即便打开了「排除机器人」开关,也照样包含自动化流量,因为在这里排除机器人,等于把你专门为了看机器人才打开的那几块面板清空。其他地方过滤器照常生效,而自动化流量从不消耗套餐里的可统计点击额度。

按访客自己的钟表看活跃度

一份报表只能按一个时区渲染。而每一次点击都有它自己的时区。把存下来的时间戳统一换算到工作区时区,三个市场各自的晚间高峰就会被抹平成一条横线,看上去像是你的受众根本没有作息。

所以当地小时是在点击被写入的那一刻算出来的,用的是为这位访客解析出来的时区,并且直接存在这一行上——那是整条流水线里最后一个还知道访客自己时区的位置。它换来的是一个能在多市场营销活动里站得住的发送时间答案:你的受众真正会去打开东西的那个小时,而不是你的服务器最忙的那个小时。

诚实地说,代价是位置答案的那些限定条件会一路传导下去。一次经由别国出口节点的点击,带的是那个国家的小时;而一行走兜底路径得到的答案,带的是网络当时报出来的那个时区。当地小时的图表值得和网络这一项对照着读——理由和城市图表完全一样。

按国家和语言分流

一个短地址,多个目标:来自德国的访客落在德国商店,说法语的比利时访客落在法语页面,其余所有人落在主站。定向规则是一份有序清单,一条规则内部的多个条件以「与」相连,第一条完整命中的规则胜出。用手工排序而不是用一套具体度评分,是一次有意的取舍:有序清单可以照着念出来,而一张优先级表一旦超过三条,就根本没法调试了。

语言匹配有一条值得背下来的规则:en 覆盖所有地区变体,因此 en-GBen-US 都能命中它;而 en-GB 要求精确匹配,抓不到美式英语。你指的是一门语言时就写宽的那条,指的是一个市场时就写具体的那条。

缺数据永远不会变成一次拦截。如果一个条件无法判定——国家未知、数据包不可用——这条规则就是不命中,访客继续走向基础目标地址。在流量规则里,同一条原则被写得更明确:每个条件都是三值的,成立、不成立或者无法回答;带着无法回答的条件的规则整条被跳过;而取反只在确定的数据上生效,所以一条「只放行这几个国家」的规则,不会在一次查询失败时把全世界都关在门外。

流水线的顺序是固定的:先是流量规则,因为它们回答的是「这个请求到底该不该被应答」;然后是定向;然后是可能存在的分流实验;最后是基础目标地址。轮换器里逐目标地址的国家筛选,是地理条件收窄选择的第四个位置:定向决定一个市场去哪里,轮换器决定这个市场的流量怎么分。

分流不是替换页面内容

这个区别比看上去要紧得多。分流决定的是把一个人送去哪一个真实存在的目标地址,而每一个目标地址都是任何人都能打开、并且完整看到的页面。替换页面内容则是同一个地址按来访者的不同渲染出不同的东西——而搜索引擎反对的那一种做法,是给爬虫看一份真人永远看不到的版本。

跳转服务不渲染、也不改写目标页面;它只回一个跳转,页面由目标站点自己提供。唯一一处请求拿到的不是跳转的地方,是社交预览抓取程序:它拿到的是这条链接自己的预览元数据,好让一条被分享出去的链接无论抓取程序跑在哪里,都渲染出同一张卡片。那是一张预览,不是一个替身页面。

规则也可以对已验证爬虫另行处置:放它们通过、把链接关掉、送它们去一张占位页面。平台给你的是机制本身、一个在任何一次点击发生之前就能看清某个假想访客会触发哪条规则的预览,以及事后记录到底触发了什么的日志。爬虫该不该拿到和真人不一样的东西,是你自己拥有的决定,而日志正是让这个决定可被审计的那一半。

地理数据给出自信错误答案的三种方式

从根本不在那个市场的流量里读出一个市场。 一个国家在你的图表上往上爬,在你看清是什么把它送来之前,都不能算需求的证据。如果它的点击大多来自数据中心地址段或者商业 VPN 出口,你看到的是出口节点在哪里,不是买家在哪里。这是这份清单里最贵的一个错误,因为它会催生出一份计划:预算被挪走,创意被本地化,而这一切没有一样抵达真人。

给国家排名,却不给它们的体量排名。 一个有 90 次点击、转化率 4.4% 的市场,并没有跑赢一个有 9,000 次点击、转化率 3.9% 的市场;它只是一个多出四次事件就能把数字推动得比你正兴奋的那点差距还要大的市场。给「一个国家能否进入排名」设一个体量下限,并且把观测到的差距,和寥寥几次事件能带来的移动幅度作对比。这不是为了统计学上的纯洁,而是为了不围着噪声重组一个季度的工作。

数据只撑得起一个地区时,却相信了城市。 城市那些行都带着半径,而有些行根本没有城市。用半径覆盖半个国家的那些行,去为某一个都市圈搭一场营销活动,这份计划建在一个四舍五入的产物上。当问题确实需要城市粒度时——开一家店、办一场活动、做一次本地促销——先去看底层有多少行带着城市标识符、它们的半径是什么样,再定下来。当它们撑不起这个粒度时,就用地区:地区是稳定的,有标识符兜底,也远没有那么容易读错。

还有第四个习惯,能让上面三个不至于叠加起来:读地理拆分时,把链接点击跟踪里关于点击质量的那些限定条件放在旁边一起读;并且记住独立访客是一个按天计的指标——一份按月的国家对比,加总的是每天的独立数,而不是在数有多少个不同的人。

这些数据刻意不包含什么

访客的地址从不被存储。它只在一个函数内部存在片刻,刚好够生成一份当日加盐指纹、并查出所属地址段,而它到不了事件那一层。邮政编码由数据库解析出来,但刻意不记录:在密集住宅区里,一个邮政编码已经很接近一个门牌号了。

剩下的东西要存下多少,是一项工作区设置,在事件被写入时生效,而不是在它被读取时生效。

| 精细档位 | 存下来的内容 | | --- | --- | | 完整 | 国家、地区、城市、坐标、精度半径、时区、当地小时 | | 城市但不含坐标 | 国家、地区、城市、时区、当地小时 | | 仅国家 | 国家和大洲 |

访客的网络、完整的来源地址和流量类型识别,各有各自独立的开关。保留期以天数的形式写进每一条事件,这和套餐限制你能往回看多久是两回事;而改动会在几秒之内抵达已经上线的链接,不必等到下一次缓存过期。细节写在隐私模式地理数据指南里。

有一条输出边界很容易被想当然地弄错:一条链接的公开统计页面,从这一切里只展示国家和城市——没有网络,没有流量类型,没有质量评分,也没有坐标。这条边界由一个针对响应结构的测试来把守,而不是靠约定俗成。

一套经得起追问的配置

  1. 凡是你花钱买的营销活动,先读网络这一项,再读国家维度的图表,并逐个运营商比较真人点击与总点击。
  2. 设一个最低点击体量,低于它的国家不进入排名,并且把这个数字写下来,免得每开一次会就被重新谈判一遍。
  3. 任何依赖城市的决定,先查精度半径;半径撑不起城市粒度时,退回到地区。
  4. 定向规则发布之前,先预览某个假想访客会拿到什么,而不是拿你自己的流量在生产环境里试。
  5. 地理精细档位要有意识地选:它决定的是什么会被写下来,而被关掉的东西日后无法找回。
  6. 每场营销活动做一次对账,把数据分析与目标站点那边的数据核对一遍,尤其是两边分歧最大的那些市场。

位置数据最好被拆成两个问题,而不是一个:这个请求看起来来自哪里,以及是什么把它送来的。只问前一个,永远都能得到一张图表;而让这张图表值得据此行动的,是后一个。媒体采买方最早撞上这件事,所以联盟营销方案倚重的是网络与质量这两条轴,而不是那张地图。

大家常问的问题

城市级别的位置数据有多准?

准到足以比较市场,不足以描述一个人——而这个问题的诚实答案是一个数字,不是一个形容词。每一条城市记录都带着精度半径,而几十公里的半径意味着:这条记录描述的是网络运营商在那一带某处分配出去的一段地址范围。移动运营商和企业网络经常把访客放在离他实际所在很远的地方,因为这个地址属于出口节点,而不属于他手里的那台设备。先读半径,再读城市名。

一次点击的国家,究竟是从哪里来的?

来自两个分工不同的数据源。承接请求的 edge 网络自己就能给出国家、地区、城市、坐标、时区和自治系统,不花一次查询、也不花一分成本,而快速分流的判断用的正是这个答案。有授权的地理数据库给的是更细的一层:精度半径、地区和城市背后的 GeoNames 标识符、八种语言里稳定的地名,以及该地址段的代理类型。每一行都记着是哪个数据源给出的答案,因此近似的行会被标注出来,而不是混进精确的行里。

VPN 会不会把地理数据分析搞坏?

它把访客搬到了出口节点上,而这正是访客要它做的事。应对办法不是更准的定位,而是第二条轴:网络这一项会把地址段标注为数据中心、商业 VPN、公共代理、TOR 出口节点或网页匿名器,并且把真人点击与总点击分开显示。被标注出来的那一部分要当作下限,而不是当作一次全量普查——识别依据的是已知地址段,而一个跑在普通家庭宽带地址上的代理,读起来就是普通流量。

按国家分流与替换页面内容有什么区别?

分流决定的是把访客送去哪一个真实存在的目标地址;每一个目标地址都是任何人都能打开、并且完整看到的页面。替换页面内容则是同一个地址按来访者的不同渲染出不同内容——当爬虫拿到的版本和真人拿到的版本不是同一个,这就成了一个政策问题。跳转服务从不渲染、也不改写目标页面:它只回一个跳转,页面由目标站点自己提供。唯一的例外是社交预览抓取程序,它拿到的是这条链接自己的预览元数据,好让一条被分享出去的链接始终渲染成同一张卡片——那是预览,不是另一个页面。

按当地小时统计的活跃度,为什么和按时区换算的不一样?

因为一份报表只能按某一个时区渲染,而每一次点击都有它自己的时区。把存下来的时间戳统一换算到工作区时区,三个市场各自的晚间高峰就会被抹平成一条没有起伏的横线。所以当地小时是在点击被写入的那一刻算出来的,用的是为这位访客解析出来的时区,并且直接存在这一行上。这个设计的代价是:位置答案的那些限定条件会一路传导下去——一次经 VPN 出口的点击,带的是出口节点那边的小时,不是那个人的。

出于隐私考虑,可以限制地理数据的精细程度吗?

可以,逐工作区设置,而且它在写入时生效,不是在读取时生效。完整精度会存下国家、地区、城市、坐标、精度半径、时区和当地小时;中间那一档保留城市,舍弃地图上的那个点;「仅国家」只留下大洲和国家。某一档关掉的东西根本不会被写下来,因此没有任何报表、导出或者日后的查询能把它找回来。访客的地址在任何一档下都不被存储,而邮政编码会在查询过程中被解析出来,但刻意不记录。