如果你接手一个数据整理需求,看到“把2000—2024年的人力资源和社会保障统计数据整理成面板数据”这种需求,第一反应是什么?我当时的反应很简单:翻统计公报、复制表格、拼个Excel,应该一两天就搞定。真正动手之后才发现,事情远没有这么轻松。这里面每一个指标的口径都在变,每一个省份的发布习惯都不一样,年度公报里的“万人”“亿元”“—”几乎能凑出一套字符编码全集。
这篇东西不是给你讲大道理,而是把我从零到一整理这份“人力资源和社会保障事业发展统计核心指标面板数据”的完整过程写下来,包括字段怎么定、口径哪些地方会坑人、清洗脚本怎么写、最终分析时要注意什么。如果你也要做类似的宏观面板数据,不管是不是人社领域,这份经验都能省你不少返工时间。
1. 我为什么要做这个数据库:面板数据不是把表堆在一起
先交代一下背景。当时我在做一个人力资本与社保覆盖相关的研究,需要同时用“时间趋势”和“地区差异”两个维度去观察 31 个省份的就业、养老保险、医疗保险、失业保险等指标变化。这类需求最合适的结构就是面板数据:每一行是一个省份在某一年份的观测,每一列是一个标准化的指标变量。
一开始我想得很简单:把每一年《人力资源和社会保障事业发展统计公报》里的全国数据抄下来,再补几个省份的数字,不就是一个面板了吗?很快我发现,单纯把表罗列起来,根本不算面板数据。真正的面板数据要满足几个基本条件:
- 有明确的个体维度,也就是省份;
- 有明确的时间维度,也就是年度;
- 同一个指标在历年的含义、单位和统计范围一致;
- 缺失值可以被定位、解释,而不是随手填个 0 或空着。
所以我把这个项目的目标定为:构建一份 2000—2024 年、覆盖全国 31 个省级行政单元的人社核心指标面板数据。做出来之后它能干什么?至少能支撑四类需求。
第一类是学术研究,比如做社保参保率对劳动供给的影响、失业率与产业结构的关系、养老保险基金收支的地区差异等,这类研究通常需要省级面板跑固定效应模型。第二类是政策评估,比如某项就业扶持政策实施前后,用面板数据做前后对照和地区对照。第三类是业务报表,很多单位做“十四五”总结或“十五五”规划时,也需要长周期的数据底座。第四类是数据可视化,把 25 年 31 个省份的数据放在一起,画趋势图、热力图、雷达图都非常直观。
这里也要说明一点:如果你只需要全国总量,不关注省份差异,那这份数据可以按年份汇总后当时间序列用;但反过来说,如果你以后在某个分析里突然需要分地区,没有省份维度就得全部重来。所以我的建议是,从一开始就做成省级面板,哪怕某些早期省份数据缺失,也比后期拍大腿强。
1.1 从统计公报到面板数据:一次常见的“数据搬运”需求
在很多人眼里,统计公报里的数据是“现成的”,把数字搬到表格里就行。但实际操作中,你会遇到至少三层问题。
第一层是获取问题。2000 年的公报可能只有 PDF,甚至有些省份早期只发布在纸质版统计年鉴上,网上找到的扫描件清晰度不够,OCR 出来的数字错得离谱。第二层是结构问题。公报的表格布局不太统一,有的按“就业、社保、人才、劳动关系”分块,有的直接把所有指标塞在一张大表里,有的用“—”表示缺项,有的用“空格”表示缺项,你甚至分不清那是 0 还是缺失。第三层是语义问题。同样是“基本养老保险参保人数”,2000 年、2010 年、2020 年这三年的内涵会有明显差异,如果不加处理直接拼接,就会出现“看似连续、实际断裂”的假趋势。
我见过不少人拿到这类数据之后直接画图,发现某个指标在某一两年突然暴涨,然后开始怀疑数据是不是错了。其实很多时候不是数据错了,而是口径变了。后面我会专门用一节说口径问题,这里先记住一个原则:面板数据整理工作中,口径说明和数值本身一样重要。
1.2 面板数据相比普通统计表的优势
既然要把数据整理成面板,就要理解它的价值。普通统计表是“某年某指标的数值”,断面数据只能看到某一个时间点的地区差异,时间序列只能看到全国总量变化。面板数据把这两个维度叠在一起,既能控制省份不随时间变化的特点,又能控制年份共同冲击的影响,这样在做实证分析时才比较有底气。
具体到人社领域,各省的经济发展水平、人口结构、社保制度执行力度差异非常大。如果只看全国时间序列,你很难知道某个政策的净效果到底有多大,因为全国数据的走势可能被经济周期、城镇化、人口流动等宏观因素淹没。而省级面板至少能在一定程度上去掉省份固定效应和年份固定效应,让政策变化前后的对比更干净。
当然,面板数据不是万能药,它只是数据组织方式。真正能不能做出因果推断,还要看研究设计和数据质量。但作为基础设施,一份干净的面板数据能让你后面的分析少走很多弯路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 人社指标的口径变化:这些数字并不是自然可比的
这个项目里最耗时间的不是写代码,而是搞清楚每一个指标在 25 年里到底经历了多少次口径调整。这里我不打算把所有变量的口径史都罗列出来,只挑几个最容易让数据直接“翻车”的指标说。
2.1 城镇登记失业率:不是真正的调查失业率
城镇登记失业率是很多人特别喜欢用的一个指标,因为它时间跨度长、省际可比性好,而且从 2000 年一直公布到现在。但它的定义必须搞清楚:城镇登记失业率的分子是“在公共就业服务机构进行失业登记的城镇失业人员”,分母是“城镇单位就业人员+城镇私营个体就业人员+登记失业人员”。这意味着什么?意味着只有主动去登记的人才会被算进来,没有登记的人、灵活就业又不想去登记的人,基本不会被统计到。
所以如果你拿城镇登记失业率去描述“真实的失业水平”,那一定会被质疑。它更适合描述“登记失业情况”和“公共就业服务压力”。2018 年前后,官方开始逐步公布“城镇调查失业率”,那是另一套口径,千万别混用。做面板数据时,我保留了城镇登记失业率这个变量,同时用一个备注字段标清楚“该指标为登记口径,非调查口径”。如果你想研究更宏观的就业质量,还需要额外去匹配调查失业率或分省调查数据,但那些数据的时间长度没有登记失业率长。
2.2 参保人数:从“城镇职工”到“全民覆盖”的结构性变化
社保类指标是这份面板数据的重头戏,也是最容易出现“突变”的地方。以基本养老保险为例,早期公报里的“基本养老保险参保人数”主要指城镇职工基本养老保险参保人数,包括参保职工和离退休人员。后来国家逐步建立城镇居民社会养老保险、新型农村社会养老保险,再后来整合为城乡居民基本养老保险。如果你把 2009 年前后的“基本养老保险参保人数”直接拉通,会发现这几年数字出现台阶式增长,但这并不是参保工作突然做得多好,而是统计范围变大了。
正确的处理方式是拆分变量。我的面板数据里把“城镇职工基本养老保险参保人数”“城乡居民基本养老保险参保人数”“机关事业单位基本养老保险参保人数”分别建列,而不是只留一个综合的“基本养老保险参保人数”。这样做的好处是,跑模型时可以选择自己需要的口径,也不容易因为合并口径不同而被审稿人质疑。
医疗保险也是同理。早期有“城镇职工基本医疗保险”,后来有“城镇居民基本医疗保险”和“新型农村合作医疗”,再往后又有城乡居民基本医疗保险整合。不同制度参保人数直接加总,既可能重复,也可能漏掉。最稳妥的办法是保留原始分项指标,需要汇总时再按同一套规则计算。
2.3 基金收入、支出和累计结余:名义值、扣除项和可比性
社保基金收入、支出、累计结余是很多人做养老保险可持续性研究的核心变量。但这三个变量也有几个坑。
第一,金额单位不统一。各省公报习惯不一样,有的用“亿元”,有的用“万元”,早年甚至会出现“万元”和“亿元”混排在同一张表里。清洗时必须统一成同一个单位,我统一用“亿元”作为存储单位。第二,这些金额是名义值,也就是当年价格。研究跨 25 年的实际变化时,需要自己用居民消费价格指数或 GDP 平减指数做缩减,不能直接比较绝对金额。第三,基金累计结余的口径也有讲究。有的省份公布的是“企业职工基本养老保险基金累计结余”,有的公布的是“全部基本养老保险基金累计结余”,两者相差很大。如果抽取时不看说明,就会把两个不同的东西当成同一个指标使用。
我在整理时给每个基金变量都加了一个后缀字段,比如 pension_fund_income_enterprise、pension_fund_income_all,让口径差异在变量名上就体现出来。虽然字段多了一些,但至少不会在分析时误用。
2.4 历年“—”和“空格”到底代表什么
早期统计公报里经常出现“—”或者“空格”。有些指标确实是当年没有这项统计,比如“城乡居民基本养老保险参保人数”在 2009 年之前根本没有制度基础,这种情况下填 0 是不对的,因为它是“制度未建立”,而不是“参保人数为 0”。有些指标则是“数据尚未公布”或“不单独公布”,这时候填 0 同样不对,正确做法是保留为空值,并在备注列写清楚缺失原因。
我还遇到过一种情况:同一年份,A 省公报里某个指标是“—”,B 省公报里却是具体数字。这不是 A 省没有数据,而是 A 省不对外公布。这种缺失是无法通过插补解决的,因为没有任何信息能告诉你真实值应该在哪个区间。所以我的处理策略是:能通过其他官方来源补的,尽量补;补不到的,保留 NaN,不插值、不估计。
3. 我最终确定的字段字典:25个核心指标的实际口径与单位
如果你只是临时用一两个指标,不看数据字典问题不大。但要做规范的面板数据,字典就是灵魂。我花了很大精力整理了一张数据字典表,这里放出主体部分,你可以直接参考。
3.1 核心字段表
我在最终版本里保留了 25 个核心指标,整体结构是“省份+年份+指标值+指标口径说明+来源编码”。长期可用的变量主要包括四类:就业类、社会保险类、基金财务类和基础属性类。
| 字段名 | 含义 | 单位 | 口径说明 |
|---|---|---|---|
| region | 省份名称 | 字符 | 31个省级行政单元 |
| region_code | 省份代码 | 字符 | 建议保留国家行政区划代码 |
| year | 年份 | 年 | 2000—2024 |
| urban_registered_unemployment_rate | 城镇登记失业率 | % | 年末登记失业人口口径 |
| urban_new_jobs | 城镇新增就业人数 | 万人 | 部分年份、地区缺失较多 |
| employee_basic_pension_insured | 城镇职工基本养老保险参保人数 | 万人 | 含参保职工和离退休人员 |
| resident_basic_pension_insured | 城乡居民基本养老保险参保人数 | 万人 | 2009年后逐步建立 |
| unemployment_insurance_insured | 失业保险参保人数 | 万人 | 全国统一口径较早 |
| work_injury_insurance_insured | 工伤保险参保人数 | 万人 | 部分年份不含机关事业单位?需看备注 |
| maternity_insurance_insured | 生育保险参保人数 | 万人 | 与职工医保合并后口径有变 |
| employee_basic_pension_fund_income | 城镇职工基本养老保险基金收入 | 亿元 | 名义值,未做价格缩减 |
| employee_basic_pension_fund_expenditure | 城镇职工基本养老保险基金支出 | 亿元 | 名义值 |
| employee_basic_pension_fund_balance | 城镇职工基本养老保险基金累计结余 | 亿元 | 年末累计结余 |
| source_code | 数据来源编码 | 字符 | 对应来源清单表 |
| note | 备注 | 字符 | 记录口径变化、缺失原因、异常值说明 |
这里要特别解释一下 region_code。很多计量软件对中文变量名支持不好,尤其是 Stata 老版本,直接跑中文变量名经常报错。保留一份纯数字行政区划代码,后续做匹配、转码、绘图都会方便很多。我采用的就是常见的省级行政区划代码,比如北京 110000、上海 310000,这样以后要 merge GDP、人口等外部数据也容易对上。
3.2 长表、宽表与备份结构
面板数据在存储时通常有两种形态:长表和宽表。长表是一行一个省份一年份,适合回归分析和数据合并;宽表是一行一个省份、一列一个年份,适合快速查看趋势和做可视化。我两个都保留了。
核心存储格式为 CSV,字段分隔符用英文逗号,文件编码用 UTF-8 BOM。为什么用 BOM?因为很多 Windows 下的 Excel 打开 UTF-8 无 BOM 的 CSV 时,中文会乱码。虽然你说“我们都有自己的 Python 环境”,但团队里总会有人用 Excel 查看数据,加个 BOM 能少被问十个问题。
另外,我没有把原始来源干掉。我在项目目录里单独建了一个 source/ 文件夹,按年份存放下载到的原始报文、PDF、Excel 和网页存档。每个清洗后的数值都能倒查到具体来源,这是数据管理习惯,不是可有可无的仪式。你永远不知道三个月后会被领导问“这个数哪来的”,到时候再翻就晚了。
3.3 多层元数据:让数据自己会说话
除了数据字典,我还建了两张辅助表。一张是“来源登记表”,包含每个文件的名称、发布机构、发布时间、下载链接、下载日期、文件页数、表格页码;另一张是“口径变更记录表”,记录每个变量在哪一年发生了什么变化,比如“2016 年,生育保险与职工医疗保险合并实施,该指标口径调整为合并后的参保人数”。
这两张表不需要多复杂,但能大幅提升数据的可追溯性。以后哪怕换一个人接手,也能快速读懂这份数据。我见过很多数据集,变量名写得到处都是拼音缩写,备注列全是空,等作者本人过几个月再看,自己都想不起来某个值为什么是 0。做面板数据,宁可字段多,也绝对不要偷懒省备注。
4. 数据清洗的完整过程:从网页公报到干净面板
有了字段字典之后,剩下的就是体力活加半自动化清洗。这一节我把整个流程拆开讲,包括哪些地方可以用脚本、哪些地方必须人工介入。
4.1 数据获取:能下载文件,就不要手动复制
人社领域最权威的数据来源首先是每年发布的《人力资源和社会保障事业发展统计公报》,以及《中国统计年鉴》《中国劳动统计年鉴》的地方章节。现在很多年份已经提供网页版和 PDF 版,但早期年份只有扫描 PDF,甚至只有图片文件,这时候就不能指望直接复制了。
我的做法是先用 pdfplumber 把 PDF 里的文本和表格抽出来,再用人工校对关键数字。项目里下载的文件名统一改成 yyyy_source_type.pdf 或 yyyy_region_note.xlsx,避免出现“最终版”“最终版2”“修改版3”这种灾难命名。这里要多说一句,不要让脚本去遍历“桌面/新建文件夹”这种路径,一定要建一个规范的项目目录。
python复制project/
├── source/
│ ├── 2000_全国公报.pdf
│ ├── 2001_全国公报.pdf
│ ├── ...
│ └── 2024_分省数据_待补齐.xlsx
├── raw_csv/
│ ├── 2000_全国_raw.csv
│ └── ...
├── clean/
│ ├── human_resources_panel_2000_2024.csv
│ ├── data_dictionary.csv
│ └── source_registry.csv
├── scripts/
│ ├── extract_pdf.py
│ ├── clean_panel.py
│ └── validate_panel.py
└── output/
目录看起来简单,但能给你省下大量找文件的时间。特别是跨月做这个项目的时候,清晰的目录结构比记性好用得多。
4.2 数值清洗:全角、千分位、空格和中文数字
从 PDF 和网页里抽出来的数字,脏得超乎想象。常见问题包括:数字中间带千分位逗号,数字后面带“万人”“亿元”,百分号挤在数字里,全角数字和半角数字混用,空格是普通空格还是不间断空格,还有中文单位和英文缩写混排。
我写了一个统一的清洗函数,核心逻辑是先做字符规范化,再提取数值,最后按单位换算。
python复制import pandas as pd
import unicodedata
import re
def clean_numeric(value: str) -> float:
if pd.isna(value):
return pd.NA
value = unicodedata.normalize("NFKC", str(value))
value = value.replace(",", "").replace(" ", "").replace("\u3000", "")
match = re.search(r"-?\d+\.?\d*", value)
if not match:
return pd.NA
return float(match.group())
这个函数不复杂,但处理大多数公报里的字符串绰绰有余。遇到“1,234.5 亿元”“1 234.5”“1,234.5”这类写法,基本都能正确提取。万一遇到“约 1200 万人”这种带“约”字的表述,函数会提取出 1200,但我建议在备注列里保留“原文为约数”的提示,免得后面分析时被当成精确值。
4.3 按统一单位换算
单位换算看起来简单,实操中却容易出大错。有的省份公报把“基金收入”写成“万元”,有的省份在表格标题里写着“亿元”、但某些单元格却写了“万元”。我清洗后统一到“亿元”和“万人”,换算逻辑封装在脚本里。
python复制def convert_unit(value: float, unit: str) -> float:
unit = unit.strip()
if unit == "万元":
return value / 10000
elif unit == "元":
return value / 100000000
elif unit == "亿元":
return value
elif unit == "人":
return value / 10000
elif unit == "万人":
return value
else:
return value
这里有个原则:能通过字段名或表格标题判断单位的,用脚本换算;无法判断的,宁可停下来人工看原始 PDF,也不要擅自猜。因为单位错一个,后面所有比率、增长率全是错的,这种错误往往还特别隐蔽。
4.4 多源交叉校验:拿总量卡分省加总
清洗完单年数据后,我做的第一件事不是直接拼接,而是“对总量”。把 31 个省份的某个指标加总,和全国公报中的数值对比。两者理论上应该接近,因为分省加总即使不完全等于全国数,也不该出现离谱差异。
我的校验脚本会计算每个指标、每一年的“分省之和 / 全国公报值”的比例,然后输出一份报告。比例在 0.98—1.02 区间的,基本认为没问题;低于 0.9 或高于 1.1 的,马上标红人工复核。这一步能抓出不少表格抄错、单位看错的问题。尤其要注意的是,有些省份的早期数据用的是“原口径”,全国公报却已经按新口径调整,这时候比例失真是正常的,我会在备注里写明原因。
4.5 拼接成长表:加唯一标识
校验结束后,再把每年、每省的清洗结果拼成长表。拼接的时候我不会直接用“省份+年份”当索引字符串,而是单独生成一列 region_year,格式如 110000_2005。这样做的好处是后续 merge 的时候不容易因为中文空格、全角括号之类的问题匹配失败。
python复制df["region_year"] = df["region_code"] + "_" + df["year"].astype(str)
df = df.set_index(["region_code", "year"]).sort_index()
如果你要用 Python 的 linearmodels 做面板回归,需要把索引设置成省份和年份两层。如果你用 Stata,那就 xtset region_code year。这里提醒一句,Stata 里 xtset 之前一定要确认 region_code 是数值型且唯一,不然报错会让人怀疑人生。
5. 那些没法直接用的指标和我的处理决策
不是所有看起来“连续”的指标都能直接进模型。我在整理过程中有好几个变量都走到了“这一步做不下去,必须换思路”的状态。挑几个典型的说说我的处理决策,也算给后来人排雷。
5.1 城镇新增就业人数:看起来很美,缺失和修订都不少
“城镇新增就业人数”是一个看起来特别适合做政策评估的指标,但它有几个问题。一是 2000 年代初部分省份没有公布这个指标,二是后来全国经济普查后,部分省份的历史值做过系统性修订。如果你用最新一年的公报去比早期数据,可能会发现同一年的数字对不上,那不是你抄错了,而是统计基准变了。
我的处理方式是:保留年份和省份两个维度,同时新增一个 data_version 字段,注明这一行数据取自哪个版本。如果后续官方发布了修订版,我不会直接覆盖原值,而是新增一行并保留旧值,这样避免破坏历史面板的连续性。虽然这样会让表格变长一点,但对于学术研究来说,可追溯比短表更重要。
5.2 生育保险参保人数:合并实施后的口径变化
生育保险和职工基本医疗保险在部分地区已经合并实施,合并后公报里的“生育保险参保人数”有的继续单列,有的合并进职工医保。如果不看备注,直接拿 2010 年和 2020 年的生育保险参保人数做趋势对比,很可能会得出“生育保险覆盖人数大幅波动”的错误结论。我的处理方式是把该变量标为“口径变化频繁”,在报告中建议使用者优先使用“职工医保参保人数”作为更稳定的控制变量,而不是单独使用生育保险参保人数。
5.3 累计结余:存量数据受制度变迁影响更大
基金累计结余是存量概念,除了受每年收支影响,还受到制度整合、转移支付、财政策略等多种因素影响。早期企业职工养老保险基金结余和机关事业单位养老保险基金结余是否合并计算,各地操作并不完全一致。如果你要做养老保险基金可持续性研究,我建议要么只使用统一口径的“城镇职工基本养老保险基金累计结余”,要么对机关事业养老金的并入年份做敏感性分析,而不是直接把“全部基金累计结余”当唯一指标。
5.4 缺失值策略:宁可空着,不要瞎填
这个原则值得单独拿出来强调。面板数据最怕的就是为了凑一个平衡面板,把缺失值用线性插值、均值填充、前向填充等方式填得漂漂亮亮。如果你只是在做描述性趋势,插值或许问题不大;但如果你跑固定效应模型,插值出来的“假数据”会严重扭曲标准误和系数估计。尤其是制度建立初期的缺失值,根本不应该被插补。
我的做法是:在最终数据表里允许缺失值存在,同时在 note 里注明缺失原因;在数据字典里增加一列 missing_rule,说明该变量在哪些年份不能直接使用。这样用户看到缺失就知道是“该省未公布”“制度未建立”还是“口径不适宜对比”,而不是把它当成一个普通的空单元格跳过。
6. 后续分析时的几个注意点:从趋势图到面板回归
数据整理完之后,不是马上就能画图跑回归,还有一些细节需要处理。我把这些注意点按使用场景整理一下。
6.1 画图前先做可比化处理
如果你要画全国或者省级的长期趋势,首先要处理两个问题:缩放在不同量纲的指标之间没有任何可比性,所以画多指标图时最好标准化或分别用双坐标轴;金额类变量要考虑是否做价格缩减。比如你看养老保险基金收入,25 年名义值翻了十几倍,但里面有通货膨胀、覆盖面扩大、缴费基数提高等多重因素,直接看绝对数会掩盖真实结构变化。我的习惯是:金额类变量先除以当年 CPI 定基指数生成实际值,再画图。
6.2 用面板数据跑固定效应模型:基准配置要记牢
如果你的目标是写论文或做实证分析,典型的基准模型是“双向固定效应模型”,也就是同时控制省份固定效应和年份固定效应。省份固定效应吸收那些不随时间变化的省际差异,比如地理位置、文化习惯、初始发展水平;年份固定效应吸收那些所有省份共同面临的时间冲击,比如宏观经济波动、中央统一政策变化。
在 Python 里,我常用 linearmodels 的 PanelOLS。代码结构大概是这样的:
python复制from linearmodels.panel import PanelOLS
df = df.set_index(["region_code", "year"])
mod = PanelOLS.from_formula(
"employee_basic_pension_insured ~ 1 + urban_registered_unemployment_rate + EntityEffects + TimeEffects",
df,
)
res = mod.fit(cov_type="clustered", cluster_entity=True)
print(res.summary)
这里 EntityEffects 是省份固定效应,TimeEffects 是年份固定效应,cluster_entity=True 表示按省份聚类标准误,用于处理同一省份不同年份之间的序列相关。这是很多实证论文的标配,也是比较稳妥的起始配置。
6.3 因果推断要谨慎,别把面板固定效应当万能钥匙
面板固定效应能解决一部分遗漏变量问题,但它解决不了所有问题。比如研究失业保险覆盖率对城镇登记失业率的影响,两者都会被地方经济结构、劳动力市场活力这些因素共同驱动,即使加了固定效应,依然可能存在反向因果或遗漏变量。真要做因果推断,最好找到政策冲击或者工具变量,比如某项制度试点在不同省份的分批实施,然后做事件研究或双重差分。面板数据只是给你提供了这种分析的可能性,它本身不会自动产生因果结论。
6.4 分省样本量很小,不要做过于复杂的模型
31 个省份、25 年,看起来数据不少,但里面真正连续无缺失的省份和变量并没有想象中那么多。你要是再加几个控制变量,自由度消耗会非常快。所以我通常建议:先用描述性统计把数据摸透,再跑一个简单的固定效应模型,最后做一个稳健性检验,不要一上来就搞分布式滞后、面板门槛、空间杜宾这些高级模型。数据长度和样本量未必撑得起这些复杂度。
我在实际使用中发现,这份数据最有价值的地方其实不是拿来跑复杂计量模型,而是作为“事实底座”。做任何分析之前,先画一张分省分年的热力图,看看哪些地方参保率突然跳升、哪些省份基金结余持续下降,很多研究问题就是在这个过程中冒出来的。数据整理的终点不是跑出一个显著系数,而是让你对这个问题域里的基本事实有一个踏实的把握。
做这个项目前后花了将近三周,中间返工了三次,越到后面越明白一个道理:面板数据的难点永远不在“统计软件”或者“代码”,而在你是否真的理解每个数字背后的定义和来源。把口径记录清楚,把缺失原因写明白,把原始文件留着,你的数据就能用很久。这份数据我目前还在维护,后面也会把新一年的公报按同一套字典持续追加进去,希望它能成为后续研究和报表工作的一个稳定底座。
