1. 这份夜间灯光数据到底能干什么第一次拿到1992-2022年各省夜间灯光数据这个标题的时候我脑子里冒出来的第一个念头不是数据真全而是这玩意儿终于有人整理成表格了。做过区域经济、城镇化、能源消费这类研究的人都知道夜间灯光数据在学界火了快二十年但真正让人头疼的从来不是有没有数据而是数据能不能直接用。原始遥感影像动辄几十GB投影不统一、年份不连续、行政边界对不上光是预处理就能耗掉一个课题组的半个月。所以当我看到这份数据同时提供Excel和Shapefile两种格式、覆盖三十一年、按省级行政单元组织的时候第一反应是这东西的价值不在于新而在于省事。先把话说清楚夜间灯光数据本质上是什么。简单讲就是卫星在夜间拍摄地球表面记录下人类活动产生的灯光亮度。城市越繁华、人口越密集、经济活动越活跃夜间的灯光就越亮、越连片。这个逻辑听起来朴素但它解决了一个长期困扰宏观研究的老问题——很多经济指标是按行政单位统计上报的存在口径变化、滞后、甚至失真而灯光是从天上看下来的不受人为填报影响。所以它常被用来做经济活动的代理变量、城镇化进程的度量、区域发展差距的观察窗口甚至灾后恢复评估、贫困识别这类场景也会用到。这份数据的具体形态我拆开来看是这样的时间跨度从1992年到2022年整整三十一年基本覆盖了中国经济高速增长到结构转型的完整周期空间粒度是省级行政单元也就是说每个省每一年会有一个或多个灯光统计值格式上给了Excel和SHP两套Excel适合做统计分析、画趋势图、跑回归SHP适合做空间可视化、叠加行政边界出图、做空间自相关分析。这个双格式设计其实很懂使用者的痛点——做计量的人不想碰GIS做空间分析的人不想对着表格调格式两拨人都能各取所需。适合谁来用我梳理了一下大概三类人最需要。第一类是高校里做区域经济、城市地理、资源环境的研究生和青年教师写论文需要面板数据这份东西能直接进Stata或者R第二类是规划院、智库里做区域评估的从业者需要快速出一张省域灯光对比图SHP格式拖进QGIS就能用第三类是对宏观数据感兴趣的独立分析者Excel格式降低了门槛不需要懂遥感也能上手。当然如果你要做的是县级、市级这种更细粒度的分析省级数据就不够用了这一点后面我会专门讲。需要提前打个预防针夜间灯光数据不是万能的它有自己的脾气。灯光饱和、云层遮挡、传感器更替带来的口径断裂这些问题在三十一年的长序列里一定会遇到。所以这份数据能用和用得好之间还隔着一层对数据特性的理解。接下来的内容我会把这份数据从设计逻辑到实操细节掰开揉碎讲一遍包括我自己踩过的坑和总结出来的处理套路。2. 数据整体设计与来源逻辑拆解2.1 为什么是省级粒度加三十一年跨度先聊一个很多人忽略的问题为什么这份数据选择省级而不是市级、县级这不是偷懒而是有现实考量的。夜间灯光原始影像的分辨率虽然能到公里级甚至更高但要把它聚合到行政单元上就需要一套稳定的行政边界。中国过去三十年里地级市、县级的行政区划调整非常频繁——撤县设区、合并拆分、更名改属这些变动会让长序列的面板数据出现边界对不上的致命问题。相比之下省级边界的调整要少得多三十一年里基本保持稳定这就保证了同一套边界可以贯穿整个时间序列做趋势分析时不会因为边界变化产生伪波动。再说过滤掉的那些细节。省级聚合意味着每个省每年得到一个统计值通常是区域内灯光像元的均值、总和或者阈值以上的像元占比。这种聚合会抹掉省内的空间异质性——比如一个省里既有灯火通明的核心城市也有大片暗区聚合后只剩一个平均数省内差距就看不出来了。所以用这份数据的时候要清楚它适合回答省与省之间谁更亮、谁增长更快这类问题不适合回答某省内部哪个市最亮。这个边界感很重要用错了场景结论就会站不住脚。三十一年的跨度也不是随便定的。1992年正好是DMSP-OLS系列传感器开始稳定提供全球夜间灯光影像的年份而2022年则接近当前可获取数据的末端。这中间经历了传感器从DMSP-OLS到NPP-VIIRS的切换两代传感器在分辨率、辐射定标、饱和特性上都不一样。一份跨越三十一年的数据集必然要做跨传感器的一致性处理否则2013年前后的数据会出现明显的台阶。这一点是判断数据质量的关键后面讲实操的时候我会展开。2.2 Excel和SHP双格式背后的使用场景分工很多人拿到双格式数据会犯选择困难症其实分工很清楚。Excel格式的本质是宽表或长表的面板数据一行可能是一个省一年列是各个统计指标这种结构天生适合统计软件读取。你把它读进Stata一个xtset命令就能设成面板跑固定效应、做描述性统计、画时间趋势线全程不用碰任何地理信息软件。对于做计量分析的人来说这是最省心的形态。SHP格式则是另一套逻辑。Shapefile是矢量地理数据的标准格式之一它把每个省的边界存成多边形属性表里挂着灯光统计值。这种格式的价值在于空间二字——你可以把它和行政区划底图叠加按灯光值做分级设色出一张直观的省域灯光分布图也可以计算空间权重矩阵做莫兰指数检验看灯光值在空间上是否聚集。做空间计量或者需要出图的研究SHP是刚需。我个人的习惯是两个都用先用Excel把数据清洗、对齐、算好增长率再把处理好的结果通过省份名称或行政代码关联回SHP的属性表这样既保证了统计口径的准确又保留了空间可视化的能力。这里有个细节要提醒Excel里的省份名称和SHP属性表里的名称必须严格一致才能关联成功而现实中内蒙古自治区和内蒙古、广西壮族自治区和广西这种差异非常常见关联前一定要做名称标准化否则会出现大量匹配失败。这个坑我踩过不止一次。2.3 长序列数据的一致性处理逻辑三十一年的数据放在一起最大的敌人是口径不一致。前面提到传感器更替具体来说DMSP-OLS在灯光很亮的城市核心区会出现饱和现象——亮度超过某个阈值后就不再增加导致特大城市的核心区灯光值被削平反映不出真实差距。而后续的NPP-VIIRS传感器动态范围更大饱和问题缓解了但两者的数值尺度不能直接比较。所以一份负责任的跨年数据集通常会做以下几种处理之一一是做传感器间的相互校准用重叠年份建立回归关系把两套数据拉到同一尺度二是做年内多传感器影像的合成减少单幅影像的噪声三是做时间序列的平滑或断点修正。作为使用者你不需要自己重做这些处理但你必须知道数据里可能残留什么问题。我的经验是拿到数据后先画一条全国灯光总值的时间序列曲线如果2013年前后出现明显的跳变或者断崖说明跨传感器校准做得不够好这时候做跨年比较就要谨慎最好在模型里加入年份虚拟变量吸收这种系统性偏移。这个检查动作只需要五分钟但能帮你避开一个可能导致结论完全错误的大坑。3. 核心指标解析与实操前的准备3.1 灯光统计值的几种常见口径省级灯光数据不是一个单一数字它通常包含多个统计口径理解每个口径的含义是正确使用的前提。最常见的几种是灯光总亮度区域内所有像元亮度值之和、平均灯光亮度总和除以像元数、灯光像元占比亮度超过某阈值的像元占区域总面积的比例、以及去除背景噪声后的有效灯光面积。这几个指标各有侧重选错了会直接影响结论。灯光总亮度适合衡量一个省的经济活动总量因为它把面积因素也算进去了大省天然占优平均亮度更适合比较强度剔除了面积影响反映单位面积上的活动密度灯光像元占比则更接近城镇化率的概念衡量的是有多少土地被点亮了。我做区域差距分析时通常会用平均亮度和像元占比两个指标交叉验证因为单看总量容易被面积大的省份带偏。这里有个容易被忽视的细节不同年份、不同传感器下这些指标的量纲和取值范围可能不同。比如DMSP-OLS的像元亮度值是0到63的整数DN值而VIIRS是浮点型的辐射值两者根本不在一个数量级。所以如果你拿到的Excel里不同年份的数值差异巨大先别慌先确认是不是传感器切换导致的而不是数据出错。3.2 拿到数据后的第一轮体检清单我习惯在正式分析前给数据做一次体检这套流程大概二十分钟但能省掉后面几天的返工。体检清单如下检查项具体操作异常信号年份完整性核对1992-2022是否每年都有记录某年整列缺失或全为0省份完整性核对省级单元数量是否稳定某年多出或少了省份数值范围看每年灯光值的最大最小值分布某年数值突然放大或缩小一个量级缺失值统计每列空值比例关键指标缺失超过10%名称一致性与标准行政区划名称比对简称、全称混用这套体检的核心目的是建立数据可信度基线。比如你发现某一年所有省份的灯光值都异常低那很可能是那年的影像覆盖不全或者云污染严重这一年做跨年比较就要打折扣。再比如省份数量在某年突然变化可能是行政区划调整或者数据录入问题需要单独核实。这些检查不需要任何高级工具Excel的排序、筛选、条件格式就能完成但它是后续所有分析的地基。3.3 投影与坐标系统的基础认知用SHP格式的人绕不开投影问题。地理数据有两种基本坐标体系地理坐标系用经纬度表示位置和投影坐标系把地球表面展开成平面用米或千米表示距离。Shapefile默认往往存的是地理坐标WGS84这种坐标下直接算面积会出错因为经纬度的度在不同纬度对应的实际距离不一样。如果你要做面积统计、密度计算、缓冲区分析必须先投影到一个合适的平面坐标系。国内常用的投影有Albers等面积投影它保证面积计算准确适合做区域统计还有各种高斯-克吕格投影适合做工程测量。对于省级尺度的分析我一般用Albers等面积投影因为它能保证各省面积比例不失真算灯光密度时不会因为投影变形产生偏差。在QGIS里操作很简单图层右键设置坐标系或者用重新投影图层工具选一个覆盖全国范围的Albers参数即可。这个步骤看起来技术性很强但实际操作就两三下关键是意识上要知道不投影就算面积是错的。4. 从Excel到分析结果的完整实操流程4.1 数据清洗与面板结构搭建拿到Excel后第一步不是急着跑模型而是把数据结构理顺。夜间灯光数据常见的存储形态有两种宽表每行一个省每列一个年份和长表每行一个省-年观测。统计软件大多偏好长表因为面板回归需要个体-时间的二维索引。如果你的Excel是宽表需要做一次宽转长的重塑。在Stata里宽转长用reshape long命令在R里用pivot_longer在Python的pandas里用melt。以pandas为例假设宽表列名是省份加年份如北京1992、北京1993可以这样处理import pandas as pd df pd.read_excel(nightlight_province.xlsx) # 假设第一列是省份名其余列是省名年份格式 long_df df.melt(id_vars[province], var_nameyear_raw, value_namelight_value) # 从列名中提取年份 long_df[year] long_df[year_raw].str.extract(r(\d{4})).astype(int) long_df long_df[[province, year, light_value]].sort_values([province, year])这段代码的关键在于年份提取的正则表达式因为列名格式不统一是常态用正则能兼容北京1992、北京_1992、1992北京等多种写法。处理完之后检查一下每个省是否都有31条记录缺年份的要标记出来。清洗阶段还有几个必做动作统一省份名称去掉省市自治区后缀或者统一保留关键是全表一致、处理缺失值是删除、插值还是标记取决于缺失比例和你的分析目的、检查异常值比如某省某年灯光值突然变成0或者暴涨十倍需要回溯原始数据确认。我一般会把清洗前后的记录数、缺失数、异常数记在一个小日志里方便后面写方法部分时交代数据处理过程。4.2 用SHP做省域灯光分布可视化可视化是让数据说话最快的方式。用SHP出图QGIS是最顺手的免费工具。流程大致是加载省级边界SHP打开属性表确认灯光字段名双击图层设置符号化方式为分级设色选择灯光值字段选一个合适的色带灯光数据我偏好黄到红的渐变符合亮的直觉设置分级方法自然断点或者分位数确定后出图。这里有几个提升出图质量的细节。第一加一个底图或者邻国边界作为参照避免图面太空第二图例要标清楚数值范围和单位别只写高低第三如果要对比多个年份务必用同一套分级断点否则不同年份的图没法直接比较——这一点特别重要我见过太多人每个年份单独分级结果图上颜色一样但实际数值差很远误导性极强。统一断点的做法是先算出所有年份的分位数手动设置分级边界。如果要做时间序列的动态图可以把每年的SHP导出成图片再用工具合成GIF或者视频。QGIS有时态控制器插件可以做简单的动画但更稳妥的方式是批量导出图片后用外部工具合成。批量导出可以用QGIS的Python控制台写脚本循环也可以用命令行工具。这个环节不复杂但能显著提升成果的展示效果尤其适合汇报和答辩场景。4.3 面板回归前的变量构造与平稳性检查如果你打算用这份数据做计量分析变量构造是绕不开的一步。最常用的是灯光增长率当年值减上年值除以上年值、灯光对数值取对数压缩量级差异、以及灯光基期比值某年相对基期的倍数。增长率适合看动态变化对数值适合进回归因为更接近正态分布基期比值适合做长期趋势对比。构造完变量别急着跑回归先做平稳性检查。三十一年的时间序列很多经济变量都是非平稳的直接回归容易出伪相关。面板单位根检验比如LLC检验、IPS检验能帮你判断序列是否需要差分。如果检验显示非平稳要么做一阶差分要么用协整方法。这一步在论文里是审稿人必看的跳过它等于给自己埋雷。还有一个实操建议把灯光数据和你要解释的经济指标比如GDP、人口、用电量先做个散点图或者相关系数矩阵看看相关性是否符合预期。如果灯光和GDP的相关性很低甚至为负那要么是数据口径有问题要么是这个省这个年份有特殊情况需要单独排查。这种先看再算的习惯能帮你及早发现数据层面的问题而不是等模型跑完才发现结果离谱。5. 常见问题排查与避坑经验实录5.1 数值跳变与传感器断点的识别处理前面反复提到传感器切换这里给一个具体的排查方法。把全国或某几个代表性省份的灯光值按年份画成折线图重点看2012到2014这一段。如果曲线在这里出现明显的台阶比如整体抬升或下降一个量级基本可以确认是DMSP-OLS向VIIRS切换带来的口径断裂。处理方式有几种一是在回归中加入年份虚拟变量让模型自己吸收这个系统性偏移二是只用切换前或切换后的数据做子样本分析三是如果数据提供方已经做了校准那就在方法部分说明并引用其校准方法。我个人的偏好是第一种因为年份虚拟变量简单直接而且不会损失样本量。但要注意如果断点恰好和你关心的政策冲击时间重合虚拟变量会吸收掉部分政策效应这时候就要谨慎可能需要用其他方法比如断点回归的思想来分离。这个判断没有标准答案取决于你的研究问题。5.2 省份名称匹配失败的批量修复Excel和SHP关联时名称对不上是最常见也最烦人的问题。表现是关联后大量记录灯光值为空。根因通常是简称全称混用、自治区后缀差异、以及个别历史名称残留。修复思路是建一张名称映射表把数据里的各种写法映射到标准名称。数据中的写法标准名称处理方式内蒙古内蒙古自治区补全后缀广西广西壮族自治区补全后缀宁夏宁夏回族自治区补全后缀新疆新疆维吾尔自治区补全后缀西藏西藏自治区补全后缀建好映射表后用VLOOKUP或者pandas的map函数批量替换再重新关联。这个映射表建议保存下来以后处理同类数据能直接复用。另外提醒一句有些SHP属性表里存的是行政代码而不是名称这时候用代码关联比用名称可靠得多因为代码是唯一的不会有一字之差的问题。5.3 灯光饱和导致的特大城市低估灯光饱和是个隐蔽的坑。DMSP-OLS在亮度很高的区域会封顶导致北京、上海这类核心城区的灯光值和中等城市差不多反映不出真实的经济密度差距。如果你用这份数据比较特大城市和普通城市结论可能被系统性低估。识别方法是看数据里灯光值的分布——如果最大值附近有大量省份扎堆比如很多省都接近63这个上限那就是饱和的迹象。应对策略一是优先使用后期VIIRS数据做城市间比较因为它的动态范围更大二是如果必须用全序列可以在模型中对特大城市加交互项或者用其他指标如建成区面积、夜间热红外做补充验证三是在结论表述上留有余地说明饱和可能带来的偏差方向。学术写作里主动交代数据局限比被审稿人指出来要好得多。5.4 数据年份与行政边界年份错配还有一个容易被忽略的问题SHP里的行政边界是哪一年的如果边界是2020年的而你要分析1992年的灯光那些后来才设立的省份比如重庆1997年才直辖在早期年份就没有对应边界或者边界范围和当年不一致。这种错配会导致早期数据缺失或者空间统计偏差。处理办法是先确认SHP边界的基准年份然后核对你的分析时段内是否有行政区划调整。如果有要么把调整后的单元回溯合并比如把重庆的数据并回四川要么在分析中排除受影响的年份或单元。这个工作有点繁琐但它是保证长序列分析严谨性的必要步骤。我在做跨省比较时一般会先列一张行政区划变动清单把1992年以来省级层面的调整都标出来分析时心里有数。5.5 常见问题速查表把上面这些坑整理成一张速查表方便随时对照问题现象可能原因排查动作解决方向某年数值整体异常影像覆盖不全或云污染看该年各省值分布标记该年或做插值2013年前后跳变传感器切换画时间序列折线加年份虚拟变量或分校准关联后大量空值名称不一致比对名称列表建映射表批量替换特大城市值偏低灯光饱和看最大值分布用后期数据或加交互项早期省份缺失边界年份错配核对区划调整回溯合并或排除面积计算出错未投影检查坐标系转Albers等面积投影这张表里的每一条都是我在实际处理中真实遇到过的。新手最容易犯的是拿到数据直接跑模型结果被这些基础问题绊住返工成本很高。养成先体检、再清洗、后分析的习惯能省下大量时间。6. 这份数据的延展用法与个人体会聊完基础和避坑说几个我觉得有意思的延展方向。第一个是灯光数据和其他宏观指标的交叉验证——比如用灯光增长率去校验统计公报里的GDP增速两者背离较大的年份和省份往往值得深挖可能是统计口径调整也可能是经济活动确实发生了结构性变化。第二个是灯光数据的空间聚集分析用莫兰指数看相邻省份的灯光是否抱团这能揭示区域一体化的程度。第三个是灯光基尼系数把省内灯光分布的不均衡度量出来作为区域差距的一个补充指标。还有一个用法是把它当作控制变量或者工具变量的来源。很多研究里经济活动难以直接度量灯光就成了一个现成的代理。当然用工具变量要满足外生性条件灯光是否合格取决于具体研究设计这里不展开但至少它提供了一个思路。我个人在实际操作中的体会是这类长序列面板数据的价值八成取决于预处理做得细不细。同一份数据清洗到位的人能跑出稳健的结论图省事的人可能被一个名称匹配错误或者传感器断点带偏。所以别嫌体检和清洗麻烦那才是真正决定分析质量的地方。另外数据格式的选择要跟着分析目的走做统计就用Excel做空间就用SHP别为了看起来专业硬用不合适的工具。最后分享一个小技巧把每次处理数据的脚本和日志都存好隔几个月回头看你会感谢当时留了记录的自己。
阅读完成 · 觉得有帮助?