ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从数据源到可视化:省级行政区面积排行榜的工程化做法

从数据源到可视化:省级行政区面积排行榜的工程化做法

做数据整理这行久了,最怕接到的需求不是"帮我写个爬虫",而是"帮我做个排行榜"。前者难在技术,后者难在你以为它简单。前阵子就有朋友找我,说要做一份"中国各省市自治区面积排行榜",发到社群里做科普,问我半天能不能搞定。我当时回他一句:搞定不难,难的是你发出去之后,会有一堆人拿着自己看到的另一个版本过来跟你对线。他不信,觉得面积这种东西,白纸黑字摆在那儿,能有什么争议?结果三份不同的资料摆上桌,前三名的顺序居然不一样,他当场就愣住了。

这件事挺有代表性。省级行政区的面积排行,看着是一个纯事实罗列的工作,实际上它同时踩在了数据口径、统计年份、行政区划变迁、展示方式这四块地雷上。你随手抄一份网上的表格发出去,大概率是错的,或者是"半对"的——数字本身没错,但口径混着用,拼在一起就错。我后来花了两个晚上把这件事重新捋了一遍,从数据源分级、字段设计、处理链路一直做到可视化呈现和校验清单,也算把这个"看着很水"的项目做出了点工程味道。下面就把整个过程拆开讲,尤其是那些文档里不会写、只有真动手做过才会撞上的细节。

不管你是在做地理科普、做数据可视化练手、写教学案例,还是单纯想搞一份靠谱的参考资料存档,这套流程都能直接拿去用。基础要求不高,会用表格软件就行;如果你想做得更规范一点,能跑几行 Python 会舒服很多。

1. 排行榜类项目的第一道关卡:数据源怎么分级

很多人以为做排行榜的起点是"找数据",其实起点是"判断你找到的数据属于哪一级"。我一般把这类数据源分成三级,这个分级习惯是从做行业报告时带过来的,用在面积榜单上同样合适。

1.1 一手数据与三手数据的本质差异

一手数据指的是由统计或测绘的主管部门直接发布、带有明确统计口径说明和统计年份的资料。这类资料的特点是:有出处、有年份、有口径注释,通常还附带着"本数据包含/不包含某某水域"这类脚注。缺点是获取门槛稍高,需要在正式出版物或者公开数据平台里翻。

二手数据是别人已经整理过一轮的汇总表,比如各类年鉴的附录表、教科书附表。这类数据通常可信,但你必须接受整理者的取舍——他可能把某个特殊行政区的数据单列了,也可能把水域面积并进了总面积,而你从表头看不出来。

三手数据就是各种转载、百科条目、自媒体文章里的数字。这类数据最大的问题是断链:数字在传播过程中被反复复制,口径说明在某一环被丢掉了,最后你看到的只是一个孤零零的数字。它不是不能用,但只能作为"交叉验证的参考值",绝对不能作为主数据源。

我朋友那次翻车,就是因为他把一份二手表和一份三手表混着用了:主表用的是含水域的统计,补充的几个数据点来自一篇没写口径的文章,结果就是总量对不上,个别排名还被挤位了。

有个特别实用的判断方法:拿到一张表,先看它有没有"数据年份"和"口径说明"这两栏。两个都没有,直接降级为参考值,别往主表里塞。

1.2 为什么我坚持"单一主源 + 多源校验"

做这类榜单,最稳的做法是只认一个主数据源,其余所有资料只用来校验,不用来补值。

原因很实在:不同来源之间的差异,绝大多数不是"谁错了",而是"口径不同"。你把口径 A 的数字和口径 B 的数字拼在一起排出来的榜,数学上没问题,逻辑上是错的。而读者不会去看你的脚注,他只会看到"这两个数据打架"。

所以我的处理原则是三条:

  • 主数据源只选一个,且必须带年份和口径说明;
  • 主源缺失的个别行政区,宁可标注"数据待补",也不从别的源硬填;
  • 所有校验源只做两件事:检查主源有没有明显笔误、检查量级是否合理。

这三条听起来保守,但它能保证你的榜单在被人质疑时,你能一句话说清楚:"我这份数据统一采用某某年份、某某口径的公开统计,未做跨源拼接。"这句话的说服力,比多凑齐几个数字强得多。

1.3 数据源登记表:一个被大多数人跳过的步骤

我现在做任何榜单项目,第一步都不是打开表格,而是先建一张"数据源登记表"。字段大概是:来源名称、发布形式、数据年份、统计口径、覆盖范围、可信等级、备注。

这张表的价值在于可追溯。项目做完可能过几个月才有人来问"你这个数字哪来的",那时候你早就忘了。有了登记表,你三十秒能答上来。

实测下来,这张表还能帮你提前发现坑。比如你会发现主源只覆盖了部分行政区,或者主源的口径里明确写了"不含某类水域",而你原本打算拿它跟另一份含水域的数据做对比——这种冲突在登记表阶段就能看见,不至于做到一半推翻重来。

2. 同一个行政区,为什么会有三个不同的面积数字

这是整个项目里最反直觉的部分,也是我建议所有做这类内容的人必须搞清楚的一节。因为如果你自己都解释不了"为什么网上有三个数字",你面对读者的质疑就会很被动。

2.1 陆地面积、总面积、管辖范围不是一回事

日常说的"面积",在正式统计里至少有三种常见含义,彼此的数值能差出一截:

口径类型大致包含内容常见差异来源适用场景
陆地面积仅陆域不含内陆水域、不含滩涂地理教材、地形分析
土地调查面积陆域 + 内陆水域等与调查技术、年份有关资源管理类引用
含管辖海域的面积陆域 + 毗邻海域海域范围界定方式不同沿海地区的综合口径

关键在于:这三种口径都不是错的,它们回答的是不同的问题。你在做榜单时,必须在标题或脚注里明确写清楚"本榜单采用陆地面积口径",否则读者拿另一份含海域的数据来对照,就会觉得你在瞎编。

我见过不少做得挺用心的科普图文,就栽在这一步:图做得漂亮,排序也对,但通篇没写口径,评论区直接变成口径辩论现场。

至于具体某个行政区用哪个口径,这属于数据源本身的规定,你不需要自己去测算,但你必须在引用时把它抄下来。这一点很重要——口径说明是数据的一部分,不是可有可无的装饰。

2.2 行政区划调整会让历史数据"漂移"

第二个差异来源更隐蔽:行政区划本身是在变的。

一个地区的范围如果发生过调整,那么调整前后的面积数据就不能直接放在同一张榜里比。你从一份十年前的资料里抄来的数字,和今年新发布的数据,很可能不是同一个空间范围。

这在做"跨年对比"或者"历史变迁"类内容时尤其要小心。我的处理办法是:

  • 榜单只用一个年份的数据,全表统一,不做跨年混排;
  • 如果要做变迁展示,就明确标出"某年数据"和"某年数据",中间用箭头连接,而不是混在一张表里排序;
  • 涉及范围调整的条目,加一条脚注说明"该数据对应调整前的范围"。

这一步做起来有点枯燥,但它是区分"随手抄一份"和"认真做一份"的分水岭。我个人的经验是,只要你的榜单里出现了年份标注和范围说明,读者对你的信任度会明显不一样,哪怕数字本身和别处有小差异。

2.3 单位与精度:小学问题,成年人的坑

面积数据的量级跨度极大,从千级平方公里到百万级平方公里都有。这就带来一个很实际的问题:单位怎么统一。

我一般统一用"万平方公里"作为展示单位,原始数据保留"平方公里"作为计算单位。理由很简单:用平方公里展示时,最大值那一栏会是一长串数字,读者一眼扫过去根本没法比较;用万平方公里,整数位就能拉开区分度,视觉上更直观。

精度上,我的习惯是保留两位小数。为什么不是一位?因为一位小数在某些相邻排名之间会造成"看起来一样"的错觉,而两位小数能保住差异。为什么不是三位?因为原始数据的精度本身就到不了那个级别,多加一位是虚假精确。

这里有个特别容易忽略的点:先排序,后四舍五入。如果你先把数据四舍五入再做排序,会出现两个原本有差距的条目显示成同一个数字,排名却一前一后,读者一眼就看出不对劲。

3. 从原始表格到可发布榜单的处理链路

数据源定下来之后,接下来是把一堆散乱的数字变成一份能直接发布的榜单。这一步我通常会拆成四段:清洗、统一、排序、校验。

3.1 清洗阶段:先把"看不见的脏东西"干掉

原始表格里的脏数据,比你想的多。最常见的是这几类:

  • 数字里混入全角字符、空格、单位文字,比如"12.3万平方公里"直接粘进数值列;
  • 同一个行政区出现两种写法,导致去重失败;
  • 缺失值用"-""—""暂无"等不同符号表示,程序识别不了;
  • 数字被存成文本格式,排序时按字符顺序排,"9"排在"10"后面。

我用 Python 处理这类数据时,第一件事永远是做类型转换和规范化,而不是急着算。一个简化版的清洗片段大概是这样:

import pandas as pd import re df = pd.read_excel("area_raw.xlsx") def to_number(x): if pd.isna(x): return None s = str(x).strip() s = s.replace(",", "").replace(",", "") s = re.sub(r"[^\d.\-]", "", s) # 去掉单位和说明文字 try: return float(s) except ValueError: return None df["area_km2"] = df["原始数值"].apply(to_number) df = df.dropna(subset=["area_km2"]) df["area_wkm2"] = (df["area_km2"] / 10000).round(2)

这段代码没什么技术含量,但它解决了一个很实际的问题:把"看起来像数字"的东西变成"真的是数字"的东西。这一步不做,后面所有排序、求和、比较都是空中楼阁。

清洗完之后,我会立刻做一次分布检查——看看最大值、最小值、中位数是否落在常识范围内。如果发现有个值比第二名大了十倍,那基本可以确定是小数点错位或者单位没换算,这时候回头改比后面发现要省事得多。

3.2 统一阶段:让每一列都有明确含义

字段设计这块,我建议字段名直接体现口径,别用"面积"这种含糊的叫法。我常用的一套字段是:

字段名含义备注
code行政区代码用于排序稳定、去重
name名称统一写法,保留全称
area_km2陆地面积(平方公里)计算用原始值
area_wkm2陆地面积(万平方公里)展示用,两位小数
data_year数据年份必填
source数据来源标识对应登记表条目
note特殊说明口径、范围调整等

为什么要有 code?因为按名称排序会出现不规则顺序,而行政区代码本身有稳定的编码规则,用它做主键可以保证每次重跑结果一致,也方便和其他数据表做关联。

为什么 note 单独成列?因为那些"该数据不含某类水域""该数据对应调整前范围"的说明,是需要跟着数据一起走的。如果写在表格外面的文字里,下次维护的人根本看不到。

3.3 排序阶段:并列、分组与展示层级

排序本身一行代码就能搞定,但"怎么排"是有讲究的。

第一个问题:并列怎么处理。如果两个数据四舍五入后相同,你是给同一个名次,还是硬分先后?我的做法是:排序按原始精度排,展示按四舍五入后的值展示,名次不做并列处理,但在 note 里标注"与上一名数值接近"。这样既不误导,也不啰嗦。

第二个问题:要不要分组。省级行政区的面积跨度非常大,最高一级和最低一级差了两个数量级。如果直接排一条长龙,中间一大段会挤在一起,读者看不出层次。我的处理是分梯队展示:

bins = [0, 10, 30, 60, 100, 200] labels = ["10万以下", "10-30万", "30-60万", "60-100万", "100万以上"] df["tier"] = pd.cut(df["area_wkm2"], bins=bins, labels=labels)

分梯队的好处是,读者能快速建立"量级感",而不是只记住第一名是谁。这个思路在做任何长尾排行榜时都适用——排行榜的价值不在于第一名,而在于让读者理解分布。

第三个问题:名次编号从几开始。这个细节小到几乎没人提,但它影响阅读体验。我的习惯是从 1 开始连续编号,不加"第"字,不加圈号,纯数字加名称,扫读最快。

3.4 校验阶段:两把尺子交叉量

数据做完之后,我必做两道校验,一横一纵。

纵向校验(总和法):把所有条目的面积加总,和该数据源给出的总量做对比。偏差超过一定比例(我一般设 1% 以内为正常,因为原始数据本身有舍入),就说明中间有遗漏或重复。

横向校验(极值法):检查最大值和最小值是否与多个独立来源的描述一致。注意这里是"描述一致",不是"数值完全一致"——只要量级和大致区间对得上,就可以认为主源没有大的笔误。

这两道校验的意义在于,它们能抓住绝大多数"结构性错误",比如漏掉一个条目、单位没换算、小数点位错。这类错误靠肉眼检查是看不出来的,但加总一次立刻暴露。

4. 排行榜的图形化:怎么排才不失真

数据对了,接下来是呈现。这一块我踩的坑最多,因为图形化最容易在"好看"和"准确"之间失衡。

4.1 条形图、色阶图与纯文字榜的适用边界

三种常见形式,我按用途分:

横向条形图最适合展示排名本身。长度直接对应数值,人眼对长度的判断精度远高于对面积的判断,所以它是最不容易误导的形式。缺点是条目多的时候图会拉得很长。

**分级设色图(色阶填充)**适合展示空间分布。它的优势是让读者一眼看出"哪一片区域整体偏大",但它的短板也很明显:色阶的划分方式会强烈影响观感,同一组数据用不同的分级方法,看起来的"差异感"能差出好几倍。

纯文字榜单(就是那种"第一名 xxx,第二名 xxx"的列表)适合嵌入文章,适合手机端阅读,也最适合做 SEO 友好的内容。它的缺点是缺乏视觉冲击。

我的建议是:以文字榜为主,配一张横向条形图或色阶图做辅助。文字榜负责可读性和可检索性,图形负责直观感受。两者互为补充,不要指望一张图解决所有问题。

用色阶图时,分级方式必须写出来。是等距分级还是分位数分级,观感差别巨大,不写清楚就是在偷偷做手脚。

4.2 长尾分布下,截断与合并怎么处理

省级行政区的面积分布是典型的长尾结构:头部几个特别大,尾部一大串差不多。这种情况下,全量展示会让图变成"一根长条加一串小方块"。

我一般用两种手法处理:

截断:只展示前若干名,其余合并成"其他"。这种做法适合做内容传播,因为读者注意力本来就有限。但一定要在图上标明"仅展示前 N 名",不要让人误以为是全部。

合并:按量级分组,每组用组内均值或者组内总和展示。这种做法适合做结构性分析,能看出梯队差异。

我个人的偏好是:做榜单用截断,做分析用合并。因为榜单的核心是"谁更靠前",而分析的核心是"整体呈现什么结构",目的不同,手法就该不同。

还有一个细节:排序方向。横向条形图如果按从小到大排,读者视线落在最下面才能看到最长条,会比较别扭;按从大到小排,视觉重心在顶部,读起来更顺。这一点在为移动端做图时尤其重要,因为屏幕小,视线移动成本高。

5. 我在这类项目上踩过的坑,以及一份可复用的校验清单

前面讲的多是"该怎么做",这一节讲"哪里最容易翻车"。这些都是实际做的时候撞出来的,写在这里省得你重新踩一遍。

5.1 三个最典型的翻车场景

场景一:单位混用导致排序错乱。原始表里一部分是"平方公里",一部分是"万平方公里",清洗时只去掉单位没做换算,结果万级的数据全部排到了前面。这种错误特别隐蔽,因为数字本身看着都合理,只有排完序才发现"小的比大的大"。

场景二:名称不统一导致重复条目。同一个行政区在表里出现两种写法,清洗时没合并,结果它占了两个名次,中间还夹着别人。这种错误在榜单里特别扎眼,因为懂行的人一眼就能发现某地出现了两次。

场景三:口径说明丢失导致结论被推翻。数据本身没问题,但发出去时把口径说明删了。读者拿另一份不同口径的数据来对照,得出"你的数据是错的"的结论。严格说不怪读者,因为你自己没把前提写清楚。

还有一个我认为最值得警惕的:为了好看向数据妥协。比如为了让图上的色块分布更好看,手动调了分级边界;为了让排名更"整齐",把接近的数值强行拉开。这类操作短期看不出来,但它会毁掉整个项目的可信度。数据类内容最值钱的东西就是"我敢为这个数字负责",一旦掺了主观调整,这个价值就没了。

5.2 一份发布前必过的校验清单

我现在每次发数据类内容,都会过一遍这个清单,七八分钟能过完,但能挡掉九成的问题。

检查项具体做法不通过怎么办
数据年份是否统一逐条核对 data_year 列剔除或标注为异年
统计口径是否统一核对 source 对应的口径说明重新取数或加脚注
单位是否换算一致抽查最大值与最小值量级全部重算
加总是否接近总量求和后与源数据总量对比排查遗漏与重复
名称是否唯一按名称分组计数合并重复条目
排序是否与数值一致随机抽三行人工复算检查排序字段
口径说明是否随内容发布检查正文与图注补上
精度是否过度检查小数位是否超过源精度减少一位

这张表里我最重视的是最后两项。精度过度这件事特别容易被忽略,很多人觉得多保留几位显得专业,实际上是在给数据注水——你的源数据只精确到千位,展示到个位就是在编数字。而口径说明随内容发布,是区分专业和业余的分水岭。

6. 榜单做完之后,还能往上叠什么

一份面积排行榜如果只停在"排名"这一层,价值其实是有限的,因为读者看完就忘了。真正能让人记住的,是在榜单基础上再叠一层对照。

6.1 面积与其他指标的耦合,才是内容的灵魂

单看面积,读者记住的只是"谁大谁小"。但如果你把面积和其他公开指标并排放在一起,故事就出来了。

比如面积与人口的关系:把两个指标都做归一化,再看差异,你会发现有些面积靠前的地区人口并不多,而有些面积中等的地区人口密度极高。这种反差本身就是很好的内容切入点。

再比如面积与交通、资源、地形的关系。同样是面积相近的两个地区,如果地形差异大,实际可利用的空间完全不同。这时候"面积"这个数字的含义就变得丰富了,读者也会开始思考"面积大到底意味着什么"。

我做这类内容的一个心得是:单一指标负责吸引注意,交叉对照负责留住读者。排行榜把读者吸引进来,交叉对照让他觉得"这个内容有信息量",两者缺一不可。

具体操作上,我一般会做一张二维散点图来呈现两个指标的关系,或者做一张双轴对比表。前者适合发现异常点,后者适合逐条阅读。

6.2 更新机制:这类内容不是一次性的

行政区划会调整,统计数据会更新,所以面积榜不是一个"做完就封存"的东西。我建议一开始就把它做成可维护的结构。

我的做法是把数据、处理脚本、展示模板三者分开存放:

  • 数据放独立文件,一行一个行政区,字段固定;
  • 处理脚本只负责读数据、算派生字段、输出排序结果;
  • 展示模板负责排版和图形,不碰数据本身。

这样下次数据更新,我只需要换数据文件,跑一遍脚本,重新导出展示内容,整个过程半小时以内。如果一开始把数据和排版混在一起做,第二年更新的时候基本等于重做。

还有一个小习惯:在数据文件里保留一个版本号和更新日志。别看这在个人项目里显得有点小题大做,等你半年后回来看,会发现这两行小字能救你不少时间。

6.3 一个我个人的取舍:不追求"最全",追求"最清楚"

最后说说取舍。做这类内容,很容易陷入"我要把所有行政区、所有维度、所有口径都列全"的执念。我一开始也这样,结果做出来的东西又长又乱,读者看两屏就跑了。

后来我改了思路:宁可条目少一点,也要每一个数字都清楚来路。具体执行就是三条:

  • 主表只保留一个口径、一个年份;
  • 所有特殊说明用脚注而不是括号塞进单元格,保持主表可扫读;
  • 图只做一张,做最准确的那种,不做花哨的。

这套取舍原则是我做了几个数据类内容之后慢慢定下来的,一开始未必认同,但真做过几轮之后你会发现,读者对"清楚"的敏感度远高于对"全面"的敏感度。一份能让人三分钟内搞明白来龙去脉的榜单,比一份列了五十行但处处含糊的表要有价值得多。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进