做地级市层面的农林牧渔业数据分析,最头疼的往往不是模型怎么跑,而是数据从哪里来、口径怎么对齐、缺失怎么处理。我自己这几年整理过不少区域经济面板数据,也踩过很多坑。这次分享一个覆盖2000到2024年、全国地级市尺度的农林牧渔业数据集,把字段设计、清洗要点、分析应用和典型坑位都讲透,希望对做农业经济、区域经济或者产业研究的同学有用。
1. 数据集整体设计与指标框架
1.1 覆盖范围与时空尺度
这个数据集的核心定位是全国地级市层面的农林牧渔业年度面板数据,时间跨度从2000年到2024年,共25个年份。空间单元覆盖了全国300多个地级行政单位,包括地级市、地区、自治州和盟,个别省直辖县级行政单位也做了单独处理。
为什么从2000年开始?因为2000年以后,各地统计机构发布的农业统计口径基本稳定,和早期计划经济时代的统计体系有比较明显的差异。同时2000年恰好是很多区域经济研究惯用的面板数据起点,方便和其他经济数据直接merge。24年长期面板的好处是可以覆盖多轮农业政策周期、粮食价格波动周期和产业结构调整周期,做时间序列分析和政策评估时样本量足够。
数据集在空间尺度上做了几层处理。第一层是全国汇总,可以做整体趋势判断;第二层是省级汇总,方便做省际对比;第三层是地级市截面,这是最核心的颗粒度。个别城市因为行政区划调整或机构改革,统计口径出现明显断层,数据集里都加了标识字段,后面展开讲。
1.2 核心指标字段设计
字段设计遵循一个原则:既要保证跨地区可比,又要保留原始统计的灵活性。主表是长面板结构,每一行代表一个城市在某一年份的农业统计记录,主要字段包括:
| 字段名 | 类型 | 说明 |
|---|---|---|
| city_code | 字符 | 地级行政区划代码,12位国标码 |
| city_name | 字符 | 地级市名称 |
| province | 字符 | 所属省或自治区 |
| year | 数值 | 统计年份,2000-2024 |
| agri_output | 数值 | 农林牧渔业总产值(当年价格,万元) |
| agri_add_value | 数值 | 农林牧渔业增加值(当年价格,万元) |
| crop_output | 数值 | 农业产值 |
| forestry_output | 数值 | 林业产值 |
| animal_output | 数值 | 牧业产值 |
| fishery_output | 数值 | 渔业产值 |
| agri_service_output | 数值 | 农林牧渔专业及辅助性活动产值 |
| crop_area | 数值 | 农作物总播种面积(千公顷) |
| grain_output | 数值 | 粮食总产量(吨) |
| urban_ratio | 数值 | 城镇化率或非农人口比重,辅助指标 |
这类数据我一般会同时保留“当年价格”和“可比价格”两套逻辑。当年价格适合做当年截面比较,可比价格适合做增长率和真实产出趋势分析。数据集中没有强制做平减,但提供了指标说明,用户可以用各省农业GDP平减指数自己去处理。
注意:农林牧渔业总产值和农林牧渔业增加值是两个完全不同的概念。总产值包含中间消耗的重复计算,增加值是扣除农用投入后的净产出。研究生产效率或全要素生产率时务必用增加值,描述产业规模时用总产值更直观。
2. 数据来源与清洗逻辑
2.1 数据来源与多源校对
这类数据最初的来源一般是各级统计年鉴、农村统计年鉴和省市级统计公报。不同出版物在对同一个指标的表达上经常出现偏差,这是做数据集最头疼的部分。我的处理方式是多源交叉验证,以省统计年鉴为准,市统计年鉴和统计公报做辅助,出现矛盾时按少数服从多数原则处理。
举个例子,某地级市2021年粮食产量的统计公报数字和省年鉴数字差了将近5%。查下来原因是国家统计机构在年度终报时对粮食产量做了修订,而地方统计公报只反映初步核算数。这种问题如果只拿一个来源做数据,后面分析结果就会出现系统性偏差。
多源校对还会发现一类比较隐蔽的问题:部分地级市在农业产值统计中把“农林牧渔服务业”单独列出,部分城市则把这项并入各业产值。如果不做归位处理,城市之间的总量对比就会失真。数据集的做法是明确记录原始口径,同时提供统一归口后的调整值字段,用户根据自己研究需要选择。
2.2 行政区划调整与口径修正
地级市行政区划在25年里变动非常大。举例来说,某些地区撤地设市、某些县级市升格为地级市、某些城市的市辖区范围经历了大幅度调整。如果直接使用名义城市代码去做面板数据,会出现“同一个城市代码前后完全不是同一块地理范围”的问题。
数据集的解决方案是引入区划调整标识:
- 若城市代码在样本期内未变化,city_code保持不变
- 若城市经历撤地设市但辖区未变,以新代码统一,备注旧名称
- 若城市辖区发生重大调整(如扩容、拆分),保留原始代码并增加adjust_flag字段
adjust_flag字段有四个取值:0表示无调整,1表示名称变更但辖区不变,2表示辖区明显变化,3表示该城市为新设立。用户做面板回归时,建议剔除adjust_flag等于3的城市,或者对辖区变化大的城市做稳健性检验。
2.3 缺失值与异常值处理
地级市农业数据最常见的缺失模式有两种:一种是一整年数据全部缺失,多发生在城市新设立初期或统计工作滞后的年份;另一种是个别指标缺失,比如渔业产值在某内陆城市长期没有统计。
对单指标缺失,我采用的是插补与标识并行的方案。相邻年份线性插补适合短期缺失,但遇到粮食产量这种受气候影响波动大的指标,线性插补会低估波动性。更可靠的方案是用省级同指标增速结合邻近同类型城市增速做估算,插补后必须加插补标识,绝对不能把插补值当作真实值用。
异常值方面,常见的错误场景包括:单位录错(吨写成万吨)、小数点点错、统计口径误用(把总产值当增加值录入)。识别方法是用城市自身的历史序列做差分检查,某年份增幅超过50%或者长期趋势中断的都标记为待查。人工核查后确认为口径调整的保留并调整,确认为录入错误的直接修正。
3. 数据集的适用场景与典型分析路径
3.1 区域农业结构演变分析
这套数据最直接的应用就是分析地级市农业内部结构演变。把总产值拆为农、林、牧、渔和农林牧渔服务五个一级分项,计算各分项占比后就能刻画每个地区的农业转型轨迹。
我拿某地级市做了一次分析:2010年该市牧业产值占比接近50%,种植业约占38%,渔业占8%。到2020年,种植业占比上升到45%,牧业降到40%,渔业提升到10%。从数据表面看似乎是种植业占比回升,但结合绝对产值看,实际是牧业增长放缓、种植业率先回暖导致的相对结构变化。如果只看占比不看总量,很容易得出完全相反的结论。
这类结构分析建议先做标准化处理,把每个分项产值除以当年该市农林牧渔业总产值,得到各地级市的产业结构向量,然后再用结构相似系数、区位熵等指标衡量地区间差异,比直接比较绝对产值更有洞察力。
3.2 面板数据建模与政策评估
对学术界和进阶分析者来说,这套数据可以支撑非常标准的双向固定效应模型。以研究农村金融发展对农业增长的影响为例,被解释变量用agri_add_value取对数,核心解释变量是某地区的农村贷款余额(需要另找数据),控制变量包括crop_area、urban_ratio、财政支农支出等,城市和年份双向固定效应,聚类到省或市层面。
做这类分析有两点提醒。第一,面板数据的标准误聚类层级要高于处理变量层级,否则容易低估标准误,导致假阳性结果。第二,2000到2024年这段时间里,统计口径经历过几次调整,务必在回归中加入“是否调整”的虚拟变量或者干脆用调整后的数值变量,否则识别结果会掺入口径变动的噪声。
3.3 粮食安全与供给保障研究
grain_output字段可以用来构建地级市层面的粮食供给保障指标体系。常见做法是计算人均粮食产量、粮食自给率(粮食产量除以估算口粮需求)、粮食产量波动系数。配合降雨量和温度数据,还能做气候变化对粮食产量的定量影响评估。
需要注意,用行政区划的粮食产量做供需判断,要区分“生产地”和“消费地”。很多粮食主产区和主销区是分离的,地级市层面的粮食自给率更多反映生产布局而非消费福利。做这类研究时建议把研究对象限定在粮食主产区,或者引入省际流动数据校正。
4. 实操过程:从原始数据到分析就绪
4.1 数据加载与质量检查流程
拿到的数据一般是CSV格式,我习惯用Python的pandas加载后先做一轮快速体检,查三件事:数据维度是否符合预期、关键字段缺失率是否超标、核心数值是否存在明显离群。
import pandas as pd df = pd.read_csv('agri_city_2000_2024.csv', dtype={'city_code': str}) print(df.shape) print(df['agri_output'].describe()) # 检查各年城市数量 city_counts = df.groupby('year')['city_code'].nunique() print(city_counts[city_counts < 300])这一步能快速发现数据中是否存在某些年份大面积缺失。实际使用中发现少部分地级市在2002年之前存在若干记录缺失,需要按年单独排查。
4.2 面板结构生成与平衡性判断
从宽表转长面板,标准做法是设定MultiIndex:
df = df.set_index(['city_code', 'year']) df = df.sort_index() print(df.index.is_unique)接着检查面板平衡性。完全平衡的面板在现实数据中几乎不存在,更常见的是非平衡面板。用户需要明确自己的模型是否要求平衡面板,从计量角度看非平衡面板在随机效应和双向固定效应下通常也能一致估计,但处理时需要确保缺失机制与解释变量无关。
连贯性检查推荐用如下方式:
# 检验各城市时间序列中是否存在异常跳跃 df['growth'] = df['agri_output'].groupby('city_code').pct_change() outliers = df[abs(df['growth']) > 0.5] print(outliers[['city_name', 'year', 'agri_output', 'growth']])某地级市2021年农业总产值增幅超过60%,经过核实是统计口径把原本单列的农林牧渔服务业并入了总产值。这种调整如果不修正,用增长率做因变量的模型会直接受污染。
4.3 价格平减与真实增长估算
价格平减是很多新手最容易忽略的环节。直接用当年价格比较不同年份的产值会混入通货膨胀因素,导致“虚增长”。这里提供一种常见处理方案:利用省级农林牧渔业总产值指数或GDP平减指数换算为以某一年为基期的实际值。
# 示例:以2010年为基期,deflator为省级平减指数 deflator = pd.read_csv('province_agri_deflator.csv') df = df.merge(deflator, on=['province', 'year'], how='left') df['agri_output_real'] = df['agri_output'] * df['deflator_2010'] / 100省级平减指数本身也存在统计口径调整,但相比市级数据,省级序列的连续性和可比性要强得多,做市级层面的趋势分析时这是一个相对稳健的折中方案。
4.4 地理与空间可视化准备
如果要做空间分布图,需要把面板数据和地理边界数据对齐。各地级市行政边界在样本期内存在变动,建议使用最近一期(2024年)的行政边界数据,并剔除历史边界差异较大的城市或做缓冲区说明。对齐键建议使用city_code而非city_name,因为城市名称有重复和改名的情况,只用名称匹配极易出错。
import geopandas as gpd # 读取最新地级市边界 boundary = gpd.read_file('city_boundary_2024.geojson') merge_data = boundary.merge(df[df['year'] == 2024], on='city_code', how='left')这样拿到的矢量数据可以快速生成农业产值分布的专题地图。可视化层面,建议用自然断点法分级,不要用等间距分级,因为农业产值分布高度右偏,等间距图会让绝大多数城市落在同一色阶,完全丢失信息。
5. 常见问题与排查技巧
5.1 指标口径变动
Q:我发现某城市2022年农业总产值突然下降30%,是数据错了吗?
A:不一定。先看该城市当年是否经历过重大自然灾害或非洲猪瘟等突发事件,再看统计口径是否发生了变化。某城市在2022年将原本计入牧业产值的部分猪禽养殖副产品调整到其他科目,导致牧业产值大幅下降。处理办法是找到统计机构发布的修订说明,或者在回归中加入年份虚拟变量吸收该冲击。
Q:部分城市“农林牧渔业总产值”小于“农业产值+林业产值+牧业产值+渔业产值”之和,怎么解释?
A:这种矛盾基本可以肯定是原始数据存在不一致。有些城市在列示汇总值时用的是当年快报数,而分项数据取自最终年报数,两个口径在时间上错位。建议以分项之和重新计算汇总值,并标记该条记录为“重算值”。
5.2 单位与量级问题
这类数据最容易出现的单位陷阱有两个。一个是播种面积,部分统计资料用千公顷,部分用万亩,转换系数算错会直接导致面积类指标失真;另一个是粮食产量,部分资料用吨,部分用万吨,差三个数量级。读取数据后用食用消费量反推校验是常用的做法,比如一个地级市户籍人口500万,粮食产量报成3吨显然不可能,至少要对应几十万吨级别。
做跨省对比时还要留意南方地区“农业产值”中包含了部分热带经济作物(如橡胶、水果)的加工产值,和北方粮食主产区的产值结构相比,两者的可比性较弱。建议在分析前用产业结构分组或加控制变量方式处理。
5.3 时间序列断裂
一些城市在特定年份因为统计方法改革,整个序列产生结构性断点。比如不少城市在2007年前后推行了新的农业统计制度,对各类农业经营主体的核算范围做了扩展。肉眼观察时间序列会发现2007年出现一个台阶式跳跃。针对这种结构性断点,不能简单当异常值删掉,应该引入结构断点虚拟变量,或者分区间做趋势分析。
5.4 行政边界变化对空间分析的影响
某城市2015年并入相邻县的几个乡镇后,粮食产量增幅明显超过正常趋势。如果做空间计量或区域对比,这个城市和相邻城市的数据都会受扰动。稳健做法是:对发生了区划调整的城市,在稳健性检验中剔除样本,或者用2015年前后边界完全可比的城市子样本重跑一遍关键结果。
6. 基于数据集的扩展方向
这套数据本身是一个基础性的经济统计数据集,但它可以和其他数据拼出很多有价值的研究方向。
6.1 气候数据融合
把地级市农业数据与网格化气象数据匹配,可以研究气温、降水、极端天气事件对农业产出和粮食产量的影响。具体操作上,先将气象栅格按地级市边界聚合为市级均值或累计值,再与agri_output、grain_output匹配成面板。这类研究的关键是识别策略,例如用历史气候正常值作为工具变量,避免当年气候与当年产出之间的反向因果和同时性偏误。
6.2 土地利用数据融合
通过遥感解译的土地利用数据,可以计算各地级市的耕地面积变化、农业用地转非农用地规模等指标。把土地利用数据和农业产值结合,可以分析土地城市化对农业生产的挤压效应。这种分析需要特别注意土地数据与统计数据在分类标准上的差异,至少要做一次土地分类体系的匹配和一致性校验。
6.3 农村经济与收入数据融合
如果进一步匹配各地级市农村居民人均可支配收入、农村住户储蓄余额、财政支农支出等数据,就能扩展成更完整的农村经济数据库。农业结构数据和收入数据结合,可以回答农业产业结构调整是否带动了农民增收这类经典问题。跑这类分析时,建议至少用两期差分或者事件研究法,避免遗漏变量干扰。
6.4 农产品价格数据融合
农林牧渔业总产值变动包含产量和价格双重因素。如果拥有主要农产品的年度收购价格或批发价格指数,构造市级农产品价格指数后,就能把总产值变动拆成量变和价变两部分。这样做出来的结果能直接识别农业增长到底是“真实产出增长”还是“价格驱动型增长”,对判断农业产业政策效果非常有帮助。
7. 实践中的几点总结
做这套数据的清洗和校验前后花了不少时间。最深的体会是:地级市层面的农业统计数据看起来规整,实际上到处是“看似合理但经不起推敲”的细节。2000年到2024年恰好经历了统计制度多次改革、行政区划频繁调整,直接拿原始数据跑分析,很容易产出看似显著但实际虚假的结论。
我踩过最大的坑是早期做面板回归时没有处理口径调整,结果核心解释变量的估计系数显著但方向完全不对。后来引入区划调整标识和口径调整虚拟变量后,结论才稳定下来。所以给用这套数据的同学一个建议:宁可前期多花时间做数据审计,也不要急着进模型。
最后分享一个小技巧:不管数据来源多么可靠,拿到后先做一次“反常识检查”——把某个地级市2024年的数据单独打印出来,和统计公报上的数字当面核对一遍,再拿它去和2023年做对比。如果连这一步都通过不了,后面的计量分析输出再漂亮,也只是在错误数据上堆砌出的数字游戏。
这套数据集是一份可以长期使用的底表,配合好其他辅助数据,能支撑的研究方向非常多。希望这篇分享能帮助大家少走一些我当年走过的弯路。