ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

地级市工业三废面板数据清洗与实证应用实操指南

地级市工业三废面板数据清洗与实证应用实操指南 做城市环境经济研究的人最头疼的往往不是模型写不出来而是基础面板数据不干净。尤其是“工业三废”这种指标听起来就三个词真要拉出2003年到2023年、覆盖全国地级市的完整序列清洗工作至少占整个项目一半时间。我最近刚把手上这份2003-2023年地级市工业三废数据从头到尾理了一遍包括字段结构、统计口径、缺失值处理和实证分析里的各种坑趁热写一篇完整的实操笔记给同样准备用这类数据的朋友做参考。这篇文章适合三类人一是做环境经济学、城市经济学实证研究的学生和学者二是做产业规划和ESG报告的分析师三是纯粹想了解“一份地级市三废数据到底怎么用”的入门读者。1. 这份三废数据到底装了什么1.1 年份、城市、指标的三角结构先说最基础的骨架年份、城市、指标这是任何面板数据的三个维度。我这份数据覆盖2003至2023年连续21年这21年恰好是国内环境统计制度变化最频繁的时期也是城市扩张和产业转型最剧烈的时期所以数据的“连续”背后其实隐藏了很多不连续后面会专门讲。城市粒度是“地级市”。这里要特别注意很多数据库在“全市”和“市辖区”之间反复横跳。简单说“全市”包含代管的县和县级市“市辖区”只算市区这两个口径下的工业体量、人口密度、三废排放完全不是一个量级。如果一篇论文里2005年用的是市辖区口径2020年却变成全市口径结果基本没法解释。我一般在清洗阶段就定死优先用“全市”并且在变量名里加后缀注明比如ind_wastewater_fullcity防止后面忘记。指标方面核心是三废工业废水、工业废气、工业固体废物。常见字段有工业废水排放量万吨、工业二氧化硫排放量吨、工业烟粉尘排放量吨、工业固体废物产生量万吨此外还有固体废物的综合利用量、处置量、储存量废气还有去除量或削减量。注意“排放量”和“产生量”是两个概念产生量是工艺过程中生成的量排放量是最后排到环境里的量中间还有综合利用、处理处置等环节后面做物料衡算时会用到。1.2 核心字段的统计口径每个字段背后的口径比字段本身更容易让人翻车。工业废水排放量一般指工业企业通过排污口排到外环境的废水量但有的版本会把“达标排放量”单独列出来有的则直接混在一起。工业二氧化硫排放量也有“产生量”和“排放量”之分早期统计里常见的是产生量后来逐步强调排放量。废气里还有个容易被忽略的细节烟尘和粉尘。2011年前后统计制度调整原来的“工业烟尘”和“工业粉尘”合并成了“工业烟粉尘”。如果直接把2020年的“工业烟粉尘”和2008年的“工业烟尘”加总对比等于把同类指标错配了。我在整理时会把它们拆成三个历史口径烟尘、粉尘、烟粉尘再根据年份映射到统一口径最后才是可用于跨期比较的序列。固体废物字段相对稳定但“综合利用量”在不同年份可能存在“利用往年贮存量”导致的重复计算。比如某城市某年综合利用量超过当年产生量不一定错可能是历史堆存处理掉了。做总量分析时更稳妥的是用“当年产生量”做主要指标用“综合利用率”做辅助指标。1.3 常见的数据格式和附带信息这类数据常见的交付格式有三种Excel多年度分表、一张宽表列是年份、一张长表城市-年份-指标。很多从统计年鉴里手动摘出来的数据是第一种一张sheet放一年的数据然后通过VLOOKUP合并。我不推荐这么做太容易串行。最好是直接转成面板长表city_id, year, province, city_name, wastewater, so2, smog_dust, solid_waste, ...再加上一些辅助变量比如城市行政代码、是否属于资源型城市、是否处于东部/中部/西部这些对后面的分组和分析非常有用。行政代码尤其重要因为城市名称会变但代码相对稳定当然代码本身也会随着行政区划调整而改变所以光有代码还不够还要有一张“城市变更记录表”。2. 拿到数据后我建议先做这三步清洗2.1 城市名称和行政代码的对齐这一步看起来简单做起来非常费神。地级市名称存在三类问题同城不同名、同名不同城、城市升降格。同城不同名典型的就是历史上改名过的城市比如某城市从老名称改为新名称同名不同城更隐蔽有些县和地级市共用一个名字合并成地级市后名字没变但行政层级变了还有不少城市在样本期内经历了“撤地设市”“撤县设区”“县级市升格为地级市”等调整。我的做法不是直接拿城市名称做匹配键而是以历年的行政区划代码为基准构造稳定的city_id。具体来说收集样本期内所有城市的行政代码变更记录。对每个城市确定一个唯一的“起始代码”和“终止代码”并标记变更年份。如果代码变更但地理范围基本延续沿用同一city_id。如果是新设地级市新分配city_id如果是两个地方合并通常选择保留其中一方的ID。这样做完城市数量大概会比实际最新名录多几十个因为有些城市在2003年还不存在比如后来升格的新地级市。把代码对齐后再用名称做二次校验发现不匹配就回到变更记录里查。2.2 缺失值处理先看缺失机制再决定插补三废数据的缺失值非常普遍但很少是随机缺失。主要机制有几类早期统计不覆盖部分城市某年该城市没有规模以上工业但统计表仍为零数据录入时漏录行政区划调整导致当年数据归入其他单位。处理缺失值之前我建议先做缺失矩阵。用R的visdat或Python的missingno都可以一眼能看出哪些年份、哪些城市大面积缺失。如果是早期年份成片缺失比如2003年只有少部分城市有完整三级指标那别强行插补直接说明样本区间从2005年开始可能更诚实。插补方法上城市面板数据最常用的是线性插值和移动平均因为三废排放量通常有连续性前后年份差异不会特别夸张。但要注意如果是政策冲击导致的断点比如某年关停了一批污染企业排放量断崖式下跌这时候线性插值会严重低估真实下降幅度。我一般先画出该城市的时间序列看见断崖再决定插补参数。还要提醒一点不要把缺失值直接填0。很多城市在数据缺失年份并不是没有工业废水而是没有上报。填0以后算全国总量立刻偏低一大截后面的库兹涅茨曲线、收敛检验全部失真。我通常的做法是保留为缺失值建模时用feols或reghdfe让模型自动丢弃或者用多重插补做稳健性检验。2.3 要不要做人均和单位工业增加值标准化原始三废数据是绝对量两个城市对比没有太大意义一个两百多万人口的重工业城市和一个上千万人口的综合性城市排放总量完全不可比。所以很多研究会算“排放强度”也就是单位二产增加值或单位工业总产值的排放量。这一步需要引入经济变量匹配难度不亚于清洗三废本身。我常用的匹配逻辑是用“工业增加值”或者“工业总产值”做分母优先用规模以上工业口径因为三废统计也基本覆盖工业企业口径误差更小。如果没有分行业数据至少用第二产业增加值近似但要记得在论文里写清楚“二产包括工业和建筑业可能会低估工业排放强度”。GDP平减指数也是必做的环节。2003年的100亿元和2023年的100亿元完全不是一回事不消胀就做跨期比较等于开国际玩笑。我习惯以2003年为基期用各省级的GDP平减指数把工业增加值统一到实际值。省份层面的指数数据相对好拿地级市层面的平减指数基本没有只能用省级替代这也是目前实证文献里的常见做法。3. 这份数据在实证研究中的几个主要用途3.1 工业结构与污染排放的耦合关系三废数据最直接的应用是观察城市工业结构与环境排放的关系。你可以把城市按工业污染强度分成三档高排放强度、中低排放强度、清洁型然后看它们和城市产业结构的关系。我自己试过一种做法把每座城市历年工业SO2排放量除以工业增加值得到单位工业增加值SO2排放强度再和该城市的重工业占比做散点图会发现很清晰的抱团。重工业占比高、资源禀赋强的城市排放强度明显偏高高新产业和现代服务业占比高的城市即使绝对排放量不低单位强度也低得多。这种分析看着基础但在政策报告里特别好用。它能把“城市A比城市B排放高”转成“城市A的工业结构导致其单位排放强度比城市B高”结论更公平也更有解释力。3.2 “污染避难所”与跨区域转移检验环境经济学里有个著名的“污染避难所假说”污染企业在环境规制更严格的地区待不下去会往规制更宽松的地区转移。地级市三废数据恰好可以支撑这个检验因为企业迁移通常发生在城市之间而不是省这样的大块头。做法大致是先构造各城市的环境规制强度可以用排污费收入、环保处罚案件数、环境规制文本数量做代理然后把三废数据当成结果变量看规制强度高的城市排放是否下降周边规制强度低的城市排放是否上升。这里有个内生性问题环境规制强的城市本身就是因为污染重才强直接回归会得出“规制越强污染越重”的荒谬结论。所以一般要用政策冲击做工具变量或者用准自然实验设计。三废数据在这种场景下更多是“结果变量”真正要处理的是政策变量。3.3 环境规制的政策效应评估三废数据特别适合用来评估各种环境政策的净效果。最常见的例子是低碳城市试点、排污费改环保税、重点大气污染防治区等。政策评估最怕的就是没有好的结果变量三废数据提供了多个可交叉验证的结果指标。比如做排污费改环保税的政策效果可以用双重差分法DID把政策实施城市作为处理组非实施城市作为控制组比较政策前后工业SO2排放量的差异变化。因为三废分成废水、废气、固废三类还可以做异质性分析环保税主要影响废气还是废水固体废物的响应是否滞后使用三废做政策评估时要注意“预期效应”。政策公告和正式实施之间往往间隔一两年企业可能在实施前就开始调整生产。如果样本窗口太窄可能捕捉不到真实效应窗口太宽又会混入其他政策。我一般会把事件研究图做出来看政策实施前一年是否已经出现趋势分叉。分叉了结论就要谨慎。4. 我踩过的一些坑使用三废数据的四类问题4.1 统计口径调整废水、废气指标变化这是三废数据里最隐蔽的坑没有之一。我在整理2011年前后数据时发现某城市的工业废水排放量在2011年突然下降了一大截第一反应是环保督查见效后来一查统计制度说明才知道是口径调整了重点调查行业的范围变了小型工业企业的废水排放不再全部纳入统计。类似的情况也出现在废气指标上。2014年后烟尘和粉尘指标从分开统计变成合并统计一些数据库直接把新口径值回填到了所有历史年份看起来非常平滑实际上是假的。碰到这种情况我只能靠查历年统计年鉴的指标注释才能定位具体是从哪年开始变的。所以拿到数据第一件事不是跑模型而是写一个字段口径说明文档。把每个指标在样本期内的统计含义变化、调查方法变化、覆盖范围变化记录清楚后面任何分析出了异象回到这个文档能省大量排查时间。4.2 行政区划调整样本连续性被破坏地级市样本最怕行政区划调整。某县原本归A市代管后来划给了B市A市的三废排放总量瞬间减少B市瞬间增加但这不是任何减排政策的功劳。跨县的数据很难从地级市汇总中分离出来所以我处理时只能做两件事一是识别出发生这类调整的城市二是在该年设置断点不让前后年份强接。有些数据库里所谓“同口径调整”不一定靠谱。我曾经拿到一份整理好的面板城市数量从2019年的284个变成2020年的289个问对方原因回答是“当年新增了五个地级市”。但其中两个其实是原有的县级市升格历史数据应该跟着新代码走。这种事只能自己去比对历年行政区划代码表没有捷径。4.3 与宏观经济变量匹配时的单位/行业范围错位三废指标用的单位五花八门废水是万吨废气是吨或亿标立方米固废是万吨经济指标里工业增加值通常是亿元算排放强度时得先统一成同一单位体系。不统一的话计算强度出来的数值会大得离谱。更麻烦的是行业范围。早期三废统计覆盖的工业企业范围和统计年鉴里的“规模以上工业”并不完全一致有的年份是“县以上工业企业”有的年份是“重点调查工业企业”。把不同范围的三废排放直接除以规模以上工业增加值分子分母不对应强度指标就会系统性偏差。这个坑很难完全绕开我的策略是在注释里明确写出“使用的是规模以上工业增加值作为近似分母”再在稳健性检验里换成第二产业占比或人均排放量看结论是否一致。4.4 异常峰值是超排事故还是录入错误清洗三废数据时我发现过不少离谱的峰值某城市某年工业废水排放量比前后年份高出5倍某城市二氧化硫排放量出现负值还有连续三年为0后又突然高的城市。这些值不一定是错的比如大型石化项目投产、钢铁厂集中检修确实会造成排放量年度跳升但也有不少是录入错误比如把“万吨”录成了“吨”小数点错了一位。我的处理方式分三步第一步用箱线图和z-score把所有指标的极端值标出来第二步逐条对照原始年鉴或官方统计公报能查到原始出处就以原始出处为准第三步查不到的看它是否对整体趋势产生决定影响如果只影响单城单年又在论文里写清了剔除理由问题不大。切忌直接手动改数否则审稿人问起来连依据都拿不出。5. 从数据到成果我的实操建议5.1 数据存储别用Excel硬扛三废数据加上辅助变量后数量级通常是约300个城市乘21年做成长表大概6000到7000行Excel能打开但处理起来很卡。我个人更喜欢直接进Python的pandas或R的data.table存成parquet或feather格式读写比CSV快很多还能保留数据类型和缺失值标签。如果项目组要求用Stata我建议清洗完成后保存成dta文件变量名统一小写标签写清楚来源年份和口径。一个特别值得养成的习惯是保存一份清洗前和一份清洗后的数据中间的所有步骤用脚本保留不要用鼠标在Excel里改。这样论文被复核时能回答“这个变量怎么来的”所有问题。5.2 先用描述性统计探底再上计量模型很多人拿到数据的第一动作是跑基准回归我很不建议。三废数据的问题往往藏在均值、方差和分布里。我会先做下面这套体检按年份计算全国地级市废水、SO2、烟粉尘、固废产生量的均值和中位数看趋势方向和断点。按省汇总看哪些省份贡献了大部分总量变化。计算各指标的变异系数如果某年变异系数突然暴涨多半是数据质量问题。画核密度图看分布形状尤其是对数化之后是否近似正态。这套描述性分析看着简单却能救回很多看起来“显著”但实际是数据异常的回归结果。有一次我在模型里发现SO2和城市人均GDP存在显著正相关怎么看都不合理回头一查是早年几个资源型城市的粉尘口径突变导致的。做描述性统计时这个异常早就该暴露了。5.3 可视化线图、散点和地图要配合三废数据的可视化有三个层次。第一层是时间序列线图适合看全国或分地区的排放趋势第二层是散点图适合看排放强度与经济发展水平的关系第三层是地图适合看空间分布和转移但地图需要注意类别分级方法。画地图时我建议把年份固定统一色阶范围否则每年色阶不同看似更清楚实际上会让读者误判空间变化。分级方法最好用分位数分色而不是等距分色因为三废排放量高度右偏等距分色会让多数城市看起来都是一个颜色只有几个大城市闪闪发光。5.4 留下“可追溯”的清洗脚本数据清洗的工作量大概占整个项目的一半但如果不能追溯每一步这工作量等于白做。我会把每个清洗步骤写成带注释的脚本里面注明每条规则的理由例如“该城市2010年数据采用市级统计公报补充因省级年鉴缺报”。脚本不只是给自己看更是为了应对审稿时的“数据可用性”要求。如果条件允许还可以把处理后的数据做成公开的“协同数据包”包含原始文件来源、清洗规则、最终长表三个模块。很多期刊现在都要求数据可得性声明提前把这一步做好后面投稿会省掉无数邮件往来。最后再分享一个小技巧三废数据在下发或共享时最好附带一个“指标口径表”哪怕只有一页纸也要写清楚每个字段的定义、单位、缺失值代码、口径变更年份。我踩过那么多坑十有八九是因为源数据的说明文档不完整。把口径文档当成数据本身的一部分去对待比任何清洗技巧都管用。
返回列表