GPT对就业市场影响的计量分析:面板数据+Event Study方法
研究问题
ChatGPT的出现是否影响了就业市场?哪些职业受冲击最大?
我们构建了一个州-职业-年三维面板数据,用计量经济学方法回答这个问题。
数据与方法
数据来源
- OEWS (Occupational Employment and Wage Statistics):美国职业就业与工资统计,2017-2024年
- AIOE (AI Occupational Exposure):职业AI暴露指数(Acemoglu et al.)
- Google Trends:ChatGPT搜索趋势,作为AI扩散的时间变量
核心指标构建
# GPT暴露 = 职业AI暴露指数 × ChatGPT搜索趋势
# AIOE是时间不变的职业特征,CHATGPT_TREND是时间变量
df['GPT_exposure'] = df['AIOE'] * df['CHATGPT_TREND']
# 对2022年之前(ChatGPT发布前),GPT_exposure = 0
# 因为CHATGPT_TREND在t < 2022时为0
为什么这样设计? AIOE衡量职业本身的AI替代潜力(如数据录入员高,水管工低),CHATGPT_TREND衡量技术扩散程度。两者相交得到实际暴露水平。
面板数据结构
Observation = (State, Occupation, Year)
├── 因变量: Δln(TOT_EMP), ΔJOBS_1000, ΔLOC_QUOTIENT, ln(A_MEAN)
├── 核心自变量: GPT_exposure
└── 固定效应: State + Occupation + Year
最终面板包含 ~14万条 州-职业-年观测值。
模型一:固定效应面板回归
\[\Delta Y_{o,s,t} = \beta \cdot GPTExposure_{o,s,t} + \delta_o + \delta_s + \delta_t + \varepsilon_{o,s,t}\]其中 $\delta_o$ 为职业固定效应,$\delta_s$ 为州固定效应,$\delta_t$ 为年份固定效应。
Python实现
from linearmodels.iv.absorbing import AbsorbingLS
import statsmodels.api as sm
def _fit_absorbed(dep: str, data: pd.DataFrame):
# 构建固定效应的类别编码
absorb = pd.DataFrame({
'state_fe': data['PRIM_STATE'].astype('category').cat.codes,
'occ_fe': data['OCC_CODE'].astype('category').cat.codes,
'year_fe': data['YEAR'].astype('category').cat.codes,
})
exog = sm.add_constant(data[['GPT_exposure']])
# AbsorbingLS: 吸收固定效应后估计核心变量
model = AbsorbingLS(data[dep].values, exog, absorb=absorb)
res = model.fit(cov_type='robust') # 异方差稳健标准误
return res
为什么用 AbsorbingLS 而不是 PanelOLS? 固定效应有三维(state × occ × year),直接OLS会内存爆炸。AbsorbingLS 通过投影矩阵”吸收”固定效应,只估计我们关心的 $\beta$。
踩坑记录
1. 高维固定效应的内存问题
初版用 pd.get_dummies() 创建虚拟变量,14万观测 × 数千虚拟变量直接OOM。
解决:改用 linearmodels.AbsorbingLS,内部用稀疏矩阵处理。
2. ChatGPT趋势数据的缺失值
部分职业-州组合在Google Trends中没有数据。
解决:CHATGPT_TREND 的缺失值填充为0(未搜索 ≠ 未暴露,但这是保守估计)。
3. 被解释变量的差分
使用一阶差分 $\Delta \ln(TOT_EMP)$ 而非水平值,消除个体趋势的影响。
merged = merged.sort_values(['PRIM_STATE', 'OCC_CODE', 'YEAR'])
groups = merged.groupby(['PRIM_STATE', 'OCC_CODE'])
merged['d_log_tot_emp'] = groups['log_tot_emp'].diff()
模型二:Event Study
用Event Study检验高暴露职业 vs 低暴露职业在ChatGPT发布前后的就业变化差异:
\[\Delta \ln(TOT\_EMP)_{o,s,t} = \sum_{k} \gamma_k \cdot \left(High\_AIOE_o \times \mathbf{1}\{YEAR-2022 = k\}\right) + \delta_o + \delta_s + \varepsilon_{o,s,t}\]Event Study实现
# 将职业按AIOE中位数分为高/低暴露组
panel['High_AIOE'] = (panel['AIOE'] >= panel['AIOE'].median()).astype(int)
panel['event_time'] = panel['YEAR'] - 2022 # 事件年 = 2022
# 为每个事件时间创建交互项
for k in event_values:
data[f'high_event_{k}'] = np.where(
(data['High_AIOE'] == 1) & (data['event_time'] == k), 1, 0
)
# 回归:只用state和occ固定效应,不用year(避免与event dummy共线性)
absorb = pd.DataFrame({
'state_fe': data['PRIM_STATE'].astype('category').cat.codes,
'occ_fe': data['OCC_CODE'].astype('category').cat.codes,
})
model = AbsorbingLS(data['d_log_tot_emp'].values, exog, absorb=absorb)
Event Study结果
| 事件时间 $k$ | 系数 $\hat{\gamma}_k$ | 标准误 | p值 | 95% CI |
|---|---|---|---|---|
| -4 | -0.0151 | 0.0022 | 3.4×10⁻¹² | [-0.0194, -0.0109] |
| -3 | -0.0084 | 0.0024 | 3.9×10⁻⁴ | [-0.0131, -0.0038] |
| -2 | -0.0582 | 0.0024 | <0.0001 | [-0.0630, -0.0535] |
| -1 | -0.0356 | 0.0032 | <0.0001 | [-0.0419, -0.0293] |
| 0 | +0.0104 | 0.0029 | 0.00027 | [0.0048, 0.0160] |
| 1 | +0.0035 | 0.0028 | 0.222 | [-0.0021, 0.0091] |
| 2 | -0.0070 | 0.0027 | 0.0099 | [-0.0124, -0.0017] |
解读:
- 事前趋势 (k < 0):高暴露职业在ChatGPT发布前就已经在走下坡路,说明平行趋势假设不完全成立
- 事件年 (k = 0):短暂反弹,可能是市场对新技术的乐观反应
- 事后 (k > 1):回落并继续下行,说明GPT扩散最终强化了下行趋势
核心发现
| 因变量 | 系数 $\hat{\beta}$ | 标准误 | t值 | p值 | N | R² |
|---|---|---|---|---|---|---|
| Δln(就业人数) | -8.1e-05 | 2.4e-05 | -3.34 | 0.0008 | 107,945 | 0.0028 |
| Δ就业密度(JOBS/1000) | -4.14e-04 | 3.0e-05 | -13.93 | <0.0001 | 107,945 | 0.0038 |
| Δ区位商 | -1.5e-05 | 3.9e-05 | -0.38 | 0.7065 | 107,945 | 0.0002 |
| ln(平均工资) | +1.49e-03 | 2.5e-05 | 60.19 | <0.0001 | 141,483 | 0.2985 |
经济学解读:
- 就业负向效应:GPT暴露更高的职业-州组合,就业增长更慢(尤其是就业密度)
- 地理分布无显著变化:区位商系数不显著,说明高暴露职业的地理集中度没有明显改变
- 工资正向效应:暴露越高的组合工资反而越高,说明”结构升级”——高技能岗位被保留,低技能岗位被淘汰
技术总结
用到的工具栈
| 工具 | 用途 |
|---|---|
pandas |
面板数据构建与差分 |
linearmodels.AbsorbingLS |
高维固定效应吸收 |
statsmodels |
OLS基础框架 |
matplotlib |
Event Study可视化 |
方法论要点
- 面板数据 > 横截面:控制了个体不变的特征(职业特性、州特征)
- Event Study > 简单DID:可以检验事前趋势,观察动态效应
- 吸收固定效应 > OLS+虚拟变量:内存友好,计算更快
- 稳健标准误 > 普通标准误:允许异方差存在
局限性
- AIOE指数本身可能与其他职业特征相关(遗漏变量)
- Google Trends作为扩散代理变量有噪声
- 事前趋势不平行,说明高暴露职业可能本就在衰退
这是美赛ICM参赛作品的核心分析部分。
Stay tuned! 🚀