2000-2024中国城市统计年鉴面板数据:缺失值填充与实证指南 做城市经济实证研究的人百分之八十的时间其实不是在跑回归而是在和数据搏斗。这是我整理2000到2024年中国城市统计年鉴面板数据时最直观的一句感慨。这份数据集不是简单的年鉴合订本而是把二十五年间全国地级及以上城市的核心经济指标按城市—年份的二维结构整理成了可直接使用的面板数据最关键的是所有缺失值都经过了填充处理形成了一个无缺失的平衡面板。换句话说拿过来不用再补数、不用再清洗直接跑回归、画图、做双重差分都行。这份数据适合谁做区域经济、城市经济、劳动经济、产业政策评估的硕博生写政策报告的研究人员以及需要做城市横向对比的数据分析师。它的价值不只是省事更重要的是统一口径、连续年份、完整覆盖这三个词分别解决的是可比性、趋势分析和实证模型对平衡面板的刚性需求。1. 这份数据的核心价值从翻年鉴到开箱即用1.1 数据集的完整画像时间、空间与变量体系先说结构。这份面板数据的主题词是中国城市统计时间跨度从2000年到2024年覆盖25个统计年度。空间上以地级及以上城市为主体同时也包含直辖市和部分省直辖县级市数量上稳定在280到300个城市左右。变量方面大致可以分成六个板块宏观经济地区生产总值GDP、人均GDP、GDP增速、三次产业增加值结构。财政金融一般公共预算收入与支出、税收收入、年末金融机构存贷款余额。人口就业年末常住人口、户籍人口、城镇登记失业率、从业人员数量。投资消费固定资产投资、社会消费品零售总额、商品房销售面积。对外开放进出口总额、实际利用外资。空间与基础设施建成区面积、城市道路面积、公共汽电车客运量、人均公园绿地面积。为什么强调城市—年份的二维结构因为实证经济学里最常用的固定效应模型本质上是在同时控制哪些城市和哪一年两个维度做识别。如果数据结构是乱的城市ID对不上、年份漏了、变量名改了模型跑出来再漂亮也没法让人信服。这份数据集最大的功劳就是把最耗时间的把人变成机器的活儿干完了。观测规模可以大致估算一下按290个城市、25年计算就是7250个城市—年份单元。每个单元如果包含50个指标就有36万多个数据点。这个体量放在Excel里会吃力但用Stata、R或者Python处理起来非常轻松。实际使用中我建议直接用统计分析软件读取不要用Excel打开整个文件否则光是滚动查看都可能卡顿。1.2 目标用户与研究场景谁会真的需要它先说最刚需的一群人区域经济学、城市经济学的硕士博士。写论文时最典型的需求是我要做2005年到2023年地级市层面的面板回归。自己动手的话得先下载25本年鉴一本一本地翻表格复制粘贴到Excel还要处理每年栏位不一样、某些城市某几年缺数的问题。这个过程轻则两周重则一个半月。这份数据集等于把这两周直接省出来了。第二类用户是做政策评估的研究人员。比如要看某个城市群的设立对成员城市投资的影响用双重差分模型做政策评估需要处理组在城市群设立前后若干年的完整序列。如果处理组里有城市在关键年份缺数据整个估计就没法做。无缺失的平衡面板正是双重差分的标准配置因为该模型对样本完整性要求很苛刻。第三类用户是咨询公司和投资机构。做城市商业选址或者市场容量测算时要快速对比几百个城市的消费、人口和收入水平。这种场景拼的不是模型复杂度而是数据获取速度和口径统一度。一份整理好的面板数据能直接接到Excel里做透视表几分钟就能输出一份城市对比报告。当然也要提醒一句这份数据适合做宏观层面和城市层面的研究不适合用来回答企业、家庭或者个人层面的问题因为《中国城市统计年鉴》的统计单元本身就是城市。如果你要研究的企业微观行为、居民个体决策还是得找对应的微观调查数据。2. 缺失值从哪里来又该怎么填2.1 缺失值的五种典型来源好端端的统计年鉴为什么会有缺失我在整理过程中总结出五个高频原因早期指标未收录。2000年前后部分城市的统计能力参差不齐比如实际利用外资这个指标西部一些城市在早期年份干脆没有统计。这类缺失不是随机发生的往往集中在特定地区和特定指标上。行政区划调整。2000年到2024年是撤地设市、撤县设区、地市合并非常频繁的时期。新设立的城市只有设立那年之后的数据被合并的城市则可能在合并前后数据口径对不上。统计口径调整。最典型的是2011年之后财政收支从预算内调整为一般公共预算部分指标的统计范围也跟着变了导致前后数据不可直接衔接。个别年份公布缺项。有些年份的《中国城市统计年鉴》因为出版周期紧张个别城市的部分指标没有收录这类缺失往往呈零散分布没有任何规律可循。异常值被剔除。还有一个容易忽略的原因原始数据里如果存在明显异常比如某个城市某年GDP增速超过100%通常是由行政区划调整或原始表录入错误造成的整理者在做数据清洗时会把异常值标记为缺失这类缺失如果用普通插值法处理会掩盖真问题。理解缺失来源很重要因为填充方法必须和缺失机制匹配。如果缺失是随机的线性插值就够了如果缺失和城市特征有关就需要更复杂的填充策略。拿到数据之后先别急着填多花半小时搞清楚为什么缺后面能省下好几天的纠错时间。2.2 四种填充方案的取舍面板数据缺数之后到底怎么填我见过很多研究者的选择简单分四类直接删除把缺失的城市或年份整行删掉。优点是简单缺点是损失样本量而且会让面板变成非平衡的。大多数固定效应模型虽然技术上允许非平衡面板但做差分、做动态面板时非常麻烦。均值或中位数填充用全样本或者同类城市的均值填进去。优点是好算缺点也很明显会严重压缩变量方差还会把趋势线拉平做出来的回归系数会偏保守。线性插值利用缺失值前后两个真实观察值按时间距离线性推算。适合连续型指标的中短期缺失因为经济变量的年度变化大体是平滑的。多重插补建立缺失变量与其他变量之间的回归关系反复迭代生成多套填充结果再合并。优点是能捕捉变量间的相关结构缺点是计算量大而且对模型设定敏感。我用一个表格直观对比一下填充方案优点缺点适用场景直接删除操作简单样本损失、面板不平衡缺失极少时均值填充计算简便压缩方差、扭曲趋势基本不推荐线性插值保留时间趋势无法处理结构断点连续指标的中短期缺口多重插补利用多变量关系计算复杂、设定敏感长跨度、高比例缺失实际整理这份数据时我以线性插值为主结合同类城市参考和多重插补做复核而不是只用某一种方法。填数之前多问一句这个指标是不是连续的、趋势是不是平滑的比套用任何现成方法都重要。2.3 为什么无缺失这么重要实证模型的刚性需求回到核心问题面板数据为什么要费这么大力气做填充直接丢给模型让模型自动删掉缺失行不行分情况看。如果你用最小二乘法跑一个截面回归缺失行被R或者Stata自动删除问题不大。但一旦进入标准的实证场景缺失值就会变成硬伤。第一面板固定效应模型。虽然理论上非平衡面板也能估计但个体效应和年份效应的解释会变复杂很多时候审稿人会追问你的样本为什么不平衡。一份无缺失的平衡面板直接堵住这个质疑。第二一阶差分和双重差分。做双重差分时政策冲击前后的差值必须有完整数据支撑。如果某个处理组城市在政策前一年缺数这个城市的政策效果就完全观测不到。第三动态面板GMM。这类模型要用滞后项做工具变量滞后阶数越多对序列完整性的要求越高任何缺口都会导致样本断层。第四空间计量模型。空间权重矩阵要求所有样本在同一时点可观测只要有缺失空间权重矩阵就建不起来。所以无缺失填充版这几个字看起来指的是数据整理工作实际上服务的全是模型层面的需求。准备数据的人如果不懂计量模型为什么需要平衡面板很容易把填充工作做得很随意反正数字填上了趋势对不对却没人管。这也是为什么我在填充过程中坚持做趋势检验每个填充值都要能融入前后年份的合理变动区间而不是孤零零地补一个数字进去。3. 填充方案背后的原理与实操过程3.1 线性插值的计算公式与边界线性插值是这次整理的主力工具。公式很简单V_t V_a (V_b - V_a) × (t - a) / (b - a)其中V_a和V_b是已知的较早和较晚年份的值t是缺失年份。说白了就是假设变量在两个已知点之间匀速变化按时间比例分配。举个例子。某城市2018年GDP是3200亿元2021年变成3950亿元2019年和2020年缺失2019年 3200 (3950 - 3200) × (2019 - 2018) / (2021 - 2018) 3200 750 × 1/3 3450亿元2020年 3200 750 × 2/3 3700亿元这个数合不合理如果该城市这几年没有大的行政区划变动、没有产业政策突变那这个平滑的增长路径完全可以接受。GDP这类经济总量的年度变化本来就相对平滑用线性插值非常合理。但线性插值不是万能的遇到结构断点就完全失效。比如某城市某年发生重大区划调整辖区大规模扩大GDP直接上了一个台阶这时候用前后两年做插值会把结构性跳跃硬生生抹平。这种场景下正确做法是先弄清楚这个城市是同一统计单元下的自然增长还是统计范围变了如果范围变了最好用调整后的可比口径数据而不是简单插值。3.2 三种填充策略的组合应用整理实测里我总结出一套三层填充策略基本可以应对绝大多数场景。第一层普通线性插值。适用于连续年度指标的短期缺失。判断标准是缺失期前后各两年内都有有效观测值且变量变化率没有超过50%。这个标准能过滤掉绝大多数异常情况因为正常经济指标短期内不会出现超过一半的跳跃。第二层同类城市参考填充。适用于结构性调整、突发事件导致的单城市异常。比如某城市受外部冲击数据剧烈波动线性插值填出来会明显偏离周边趋势。这时我会参考同省、同规模等级城市在相似年份的增长率按参考增长率反推缺失值。这种情况下填充值不再只是内插而是用外部信息做了校准。第三层多重插补。适用于长跨度、高比例缺失。比如某个城市连续五年没有公布某项指标只用前后边界值做插值太冒险。我会把GDP、财政收入、固定资产投资、用电量等强相关变量放进去做MICE迭代让模型自己学习指标间的相关结构。这里要特别说一下MICE的原理。它假设缺失变量与其他已观测变量之间存在一个可估计的线性关系。每轮迭代时先用已有的观测样本拟合回归再用拟合结果预测缺失值然后更新回归模型反复循环若干轮最后对多轮结果取平均。整个过程跑起来可能需要几分钟但得到的填充值比单变量插值更稳定。3.3 一次完整的填充对照演示为了把流程讲透我拿一个真实场景演示。假设某中部城市2015年到2020年社会消费品零售总额数据如下2015年680亿元2016年740亿元2017年810亿元2018年缺失2019年920亿元2020年950亿元2018年缺失前后年份完整。线性插值计算2018 810 (920 - 810) × (2018 - 2017) / (2019 - 2017) 810 110 × 1/2 865亿元。再看一个复杂场景。某沿海城市实际利用外资数据2005年为12亿美元2006年缺失2007年为19亿美元但2008年外部经济环境剧变后锐减到8亿美元。这里2006年可以直接线性插值成15.5亿美元。但如果缺失的是2008年就不能用2007和2009做插值因为2008年有明确的外部冲击。更稳妥的办法是参考同省其他外向型城市在2008到2009年的平均降幅用2007年数据按平均降幅推算。这两种情形放在一起就是填充不是无脑插值的最好说明。任何填充方法都是假设先行你先假设数据背后有个稳定的生成机制再选择匹配这个机制的方法。没有哪种方法能同时处理平滑增长和结构突变所以整理数据的人必须对城市背景有一定了解。3.4 首尾缺失与多重填充的处理细节还有一个常被忽略的场景缺失发生在时间序列的最开头或最结尾。比如某城市2003年设市2000年、2001年、2002年天然没有数据。这种缺失不是漏统计而是城市不存在理论上不应该填充。但如果研究中需要统一的时间起点那就只能做外推。外推策略是用最早可得年份的增长率向前反推并且必须在数据说明里标注该值属于估计值。结尾缺失更简单。比如某城市2024年数据尚未最终公布但研究需要2024年值。一般策略是用最近五年的平均增速外推。要注意的是这种外推值误差较大适合做展示和描述性统计不适合作为核心回归的因变量。多重插补在实操中还有个细节收敛性检查。每次迭代结束要对比填充值的分布是否基本稳定如果连续多轮迭代后填充值还在大幅波动说明模型没收敛得调整变量清单或者轮数。这里有个常见误区新手以为MICE跑完就行其实MICE是需要人工审核的。我见过有人用MICE填完数据后没做检查结果填充值出现负数这在GDP这类恒为正的指标里就是明显的模型设定错误。4. 拿到数据之后要做的质量检查与适配调整4.1 第一遍检查结构完整性与数据唯一性拿到无缺失面板数据第一件事不是直接建模而是先做质量检验。即便数据是整理好的也保不齐有重复行、城市代码错位、年份跳变这种低级问题。先检查面板结构。Stata里的操作是import excel city_panel_2000_2024.xlsx, firstrow clear encode cityname, gen(cityid) xtset cityid year xtdescribe如果输出结果里出现了unbalanced或某些城市年份不连续说明数据还有问题。R语言里则是library(readxl) library(plm) df - read_excel(city_panel_2000_2024.xlsx) p_df - pdata.frame(df, index c(cityid, year)) pdim(p_df)Python用户可以用pandas的一行代码检查重复import pandas as pd df pd.read_excel(city_panel_2000_2024.xlsx) print(df.duplicated(subset[cityid, year]).sum())正常情况下这个数字应该是0。如果大于0说明有同一城市同一年的重复记录必须找出是哪一行该删。这一步看着基础但真能拦住不少后续的麻烦。4.2 第二遍检查逻辑与非正常值审查结构过了接着看变量本身够不够合理。我一般会跑一个描述性统计表重点检查几个容易出问题的边界城市化率即城镇人口除以总人口是否都在0到100之间。GDP、人均GDP、财政收入是否全部为正数。三次产业占比加起来是否约等于100%。财政支出除以财政收入的比率是否在一个合理范围内大部分城市应该在0.5到3之间。进出口总额是否在部分内陆城市为0或者极小值这种情况本身合理但会影响对数变换做回归时通常要加1再取对数。部分年份关键指标是否有断崖式跳变。把缺口前后两年的增长率粗算一下如果出现超过100%的正增长或负50%以上的负增长就要怀疑是不是口径变化或者填充出了问题。这一步最容易发现填充质量问题。因为填充方法再好也只是数学上的合理不是经济逻辑上的必然。如果插值填出来的GDP增速和相邻年份差异巨大八成是插值区间选错了。4.3 第三遍检查与原始统计公报抽样比对第三步是抽样比对这个环节很多人不做但特别有效。随机挑5到10个城市找到它们对应年份的《中国城市统计年鉴》原始表格或者地方统计公报对比GDP、人口、财政收入三个核心指标。重点关注填充年份。比如某城市2016年GDP是插值填的那就随手翻一下统计公报看看当年真实值是多少。如果真实值和填充值相差不到5%说明填充逻辑靠谱如果偏差超过10%就要警惕整个数据集里同类情形可能都存在类似问题。抽样比对不用全做挑10个城市就够了。城市覆盖尽量有代表性东部、中部、西部各几个大城市和小城市都要有。这个检查半小时能做完但能换来对整份数据信任度的大幅提升。我在整理数据时做过一轮类似比对很多明显异常都是在这个环节被揪出来的。4.4 后续适配价格平减与口径统一最后一步是把数据从名义值改成实际值。年鉴里的GDP、固定资产投资、社会消费品零售总额默认都是当年价格。如果研究跨了二十年不做平减就直接用名义值建模结果会被通货膨胀严重干扰。通常的做法是用GDP平减指数。把基期定在某一年比如以2000年为基期然后把后续所有年份的GDP除以对应平减指数。如果有消费者价格指数消费类指标也可以用CPI平减。这部分在整理版数据里未必覆盖因为不同研究偏好不同的基期所以我建议拿到数据后按自己的研究目标做一次转换。这里要特别注意人口密度、人均道路面积这类比率指标不需要平减涉及价格的名义变量才需要。有人会把所有变量一股脑做对数处理结果发现比率变量做完对数之后解释起来变得很别扭。做任何变换之前先想清楚这个变量的经济含义是什么。5. 使用这份面板数据的常见坑与实操建议5.1 城市样本变动的四种类型2000到2024年不是静态的25年城市的边界和名单一直在变。使用数据前必须搞清楚样本变动类型否则同城市名在不同年份可能根本不是同一个统计单元。第一种新设地级市。比如三沙市设市后才有数据记录之前的年份天然不存在。第二种撤地设市。部分地区在2000年前后完成改制早期数据记录方式不同。第三种地市合并。部分城市在行政区划调整中发生合并或拆分原来的城市在调整后就消失了。第四种城市更名。有的城市改名后地名变了但城市统计单元没变。处理这些情况要遵循一个核心原则保持同一统计单元的连续可比性。城市改名不影响连续性但区划调整一定影响。遇到后一种情况处理办法有两种要么在样本里剔除调整当年数据避免拼接产生的口径断裂要么把调整前后的数据按可比口径重新计算。第一种办法更常见代价是损失少量样本但能保证结论不会被统计口径变化干扰。5.2 指标口径与单位最容易翻车的细节面板数据最怕的其实是口径不统一。同一个指标可能某一年改过名字、某个城市多算了下面县的数、某个年份单位变了。这里列三个最典型的坑。第一全市和市辖区是两套体系。城市统计年鉴里很多指标有全市和市辖区两个口径前者包括下辖县和县级市后者只算城区。这两个口径差得非常多。做城市经济比较时选哪个口径取决于研究问题但绝不能混用。比如研究城市化对经济增长的影响应该用市辖区口径研究整个城市的经济体量用全市口径。第二财政收支指标在2011年前后更名。早期叫地方财政一般预算收入后期叫地方一般公共预算收入。名字变了统计范围也有细微调整。如果直接按变量名读入2011年前后数据可能在拼接时出问题。第三单位变化。有些指标在部分年份用万元表示换了一年后又变成亿元。我见过有人用同一列数据做回归结果发现GDP数量级忽大忽小查了半天才发现是单位没有统一。建议拿到数据后先画核心变量的趋势图坐标轴数量级异常一眼就能看出来。5.3 快速上手三行命令检查数据合法性这里把我自己常用的数据体检三件套分享出来不管你用什么工具思路都可以复用。第一步看时间范围有没有坑df.groupby(cityname)[year].agg([min, max]).describe()如果有城市不是完整的2000到2024说明样本存在进入退出要确认是新增城市还是数据缺失。第二步看变量是否为数值型并检查缺失df[[gdp, pop, fiscal_revenue]].dtypes df[[gdp, pop, fiscal_revenue]].isna().sum()正常情况缺失应该是0类型应该是float或int如果是object类型多半是Excel里混入了文本字符。第三步看核心变量分布df.groupby(year)[gdp].sum().plot()逐年合计GDP应该平滑递增如果出现异常的凹坑或尖峰说明某些年份、某些城市的数据有问题。对Stata用户对应的操作是summarize加xtlinextline gdp, overlay画出来之后任何异常尖峰都会一目了然。做完这三步体检数据能不能用、哪里有问题基本心里有数了。5.4 与外部数据衔接扩展研究边界这份城市面板数据还可以和其他公开数据源做匹配扩展研究维度。长期趋势分析需要价格指数时可以对接统计部门发布的历年价格指数表。做空间分析时可以用城市经纬度生成距离矩阵或者接入夜间灯光数据做经济活动密度的交叉验证。研究劳动力流动时常住人口和户籍人口的差值就是净流入人口这个差值能直接算出来不需要额外找数据。匹配时最核心的技术活是城市代码对齐。统计年鉴里的城市代码在不同年份偶尔会调整尤其涉及行政区划变更时。稳妥的做法是用省份加城市名做联合主键而不是只靠代码或只靠名字。我在实际操作中还发现部分城市的名称在年鉴里有简写比如内蒙古和内蒙古自治区混用匹配前最好先做一轮标准化清洗。按我自己的习惯拿到这份数据后不用急着直接上全样本回归。先随手挑几个典型的城市用2000到2024年画GDP和人均GDP趋势线确认插值后的曲线足够平滑再开始正式的实证分析。这一步花不了十分钟但对数据信任度的建立极有帮助。做数据整理这么多年我最大的体会是一份面板数据值不值钱不在条目多少而在口径是否统一、序列是否连贯、使用的人能不能把精力放在研究问题上而不是清洗数据上。数据里那些填出来的数字永远只能作为辅助参考真正的判断还要靠你对研究问题的理解和对数据生成逻辑的把握希望这份数据能帮你把论文开头要走的弯路直接省掉。