什么是 POI 数据?什么样的 POI 数据集才真的能用?
一条 POI 记录就是一个名称、一个类别、一组坐标。POI 数据全部的难处,都藏在这三个字段里。
- 作者
- HuiTu Technology
- 发布时间
- 更新时间
POI 是 point of interest 的缩写,中文叫兴趣点。一个 POI 就是一个以坐标形式记录、并挂上属性的具体地点:一家餐厅、一间药店、一所学校、一台 ATM、一个公交站、一根充电桩。POI 数据集就是这些地点组成的一张表。乍看之下,它是最简单的一类地理空间数据。
但实际上,POI 数据造成的分析事故比几乎任何其他数据集都多,因为它的错误在地图上看不出来。重复的门店看起来就是一家门店。被错分类的咖啡馆看起来就是一家餐厅。已经关掉的店看起来还在营业。等到同一个市场的两份分析结论对不上、又没人说得清哪份才对,你才会发现问题。
一条 POI 记录到底包含什么
一条最小可用的记录需要三样东西:标识符、位置、类别。其余都算属性增强——不过恰恰是其中一部分增强,决定了这份数据有没有商业价值。
| 字段 | 类型 | 为什么重要 |
|---|---|---|
| poi_id | string | 稳定主键。没有它,你无法跨批次追踪同一个地点。 |
| name | string | 给人看的名称,同时也是多数去重键的一半。 |
| category | string | 它决定了你之后用这份数据算出的每一个数字。 |
| source_category | string | 原始标签。保留它,类别判定才可复查。 |
| latitude / longitude | float | WGS 84 十进制度数。小数点后超过六位的部分是噪声。 |
| address components | string | 分列存储而非拼成一串,关联与校验才做得起来。 |
| status | enum | 营业中、暂停营业、永久关闭。缺了它,计数必然是错的。 |
| collected_at | date | 新鲜度。没有日期的 POI 数据集,只是一句没有时效的断言。 |
类别问题
向三个来源要同一座城市的咖啡店,你会拿到三个不同的数字,有时相差超过三分之一。差异不是来自覆盖范围,而是来自:一个来源把它叫咖啡馆,另一个叫咖啡店,第三个把它归进餐厅、再打上一个咖啡标签。
凡是涉及计数的事,这一点都足以致命:市场规模测算、竞争密度、人均渗透率。解决办法不是挑一个数字最好看的来源,而是自己定一套类别体系,把每一个来源标签都显式映射上去,并把映射表随数据一起交付。
- 按你要做的决策来定义类别,而不是照抄来源恰好公布的分法。
- 永远把原始来源标签单独留一列。
- 映射表随数据集一起交付,任何一次判定都可以复查,也可以回退。
- 确实模糊的标签,抽样人工看一遍再定,不要硬套规则。
重复记录,以及它为什么不显眼
把两个 POI 来源合起来,大约会有 15% 到 30% 的记录重复。重复很少是完全一致的:同一家店会以「Joe's Coffee」「Joes Coffee Co」「Joe's Coffee - Main St」几种写法出现,坐标还相差 20 米——因为一个来源打的是入口,另一个打的是楼体中心。
一套能用的去重规则,是文本归一化匹配加空间阈值:先把名称转小写、去标点、去掉常见后缀完成归一化,然后只有落在距离阈值以内的记录才进入合并候选,而阈值要按当地的密度来定。
-- Candidate duplicate pairs: similar names within 50 m
SELECT a.poi_id, b.poi_id,
similarity(a.name_normalised, b.name_normalised) AS name_score,
ST_Distance(a.geom::geography, b.geom::geography) AS metres
FROM poi a
JOIN poi b
ON a.poi_id < b.poi_id
AND ST_DWithin(a.geom::geography, b.geom::geography, 50)
WHERE similarity(a.name_normalised, b.name_normalised) > 0.6
ORDER BY name_score DESC;50 米对密集的市中心是个合理的默认值,对零售园区就太紧了——同一家店可能被记在一栋建筑的两端。阈值是一个决定,而这项工作里的每一个决定,都该写进文档。
信任一份 POI 数据集之前的五项检查
- 坐标合理性:没有零值,没有经纬度颠倒,没有落在研究范围外接矩形之外的点。
- 坐标堆叠:统计坐标完全相同的记录数。大量记录挤在同一个点,说明地理编码退化成了邮编或行政区的中心点。
- 类别分布:和一个已知基准比对。如果某一个类别占了 60% 的记录,映射大概是错的。
- 重复率:要测,也要报。不公布去重率,跨市场比较就没有意义。
- 状态字段覆盖率:有多少记录带关停状态?把永久关闭的门店算成在营,下游每一个指标都会虚高。
- 餐厅 · 34
- 咖啡馆 · 22
- 零售 · 26
POI 数据真正擅长回答什么
数据一旦干净,POI 就能回答一些换别的办法很难回答的问题:某个品类里一共有多少经营者、分布在哪;相对人口规模,一个市场的供给密度如何;哪些片区有需求却没有供给;以及只要按固定节奏重新采集,上面这些又是怎么随时间变化的。
它不擅长告诉你这些生意做得好不好。评分和评价数量是有用的热度代理指标,但终究只是代理,而且偏向那些顾客恰好爱写评价的店。把它们当信号看,不要当成营收。