研究问题

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
Δ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

经济学解读

  1. 就业负向效应:GPT暴露更高的职业-州组合,就业增长更慢(尤其是就业密度)
  2. 地理分布无显著变化:区位商系数不显著,说明高暴露职业的地理集中度没有明显改变
  3. 工资正向效应:暴露越高的组合工资反而越高,说明”结构升级”——高技能岗位被保留,低技能岗位被淘汰

技术总结

用到的工具栈

工具 用途
pandas 面板数据构建与差分
linearmodels.AbsorbingLS 高维固定效应吸收
statsmodels OLS基础框架
matplotlib Event Study可视化

方法论要点

  1. 面板数据 > 横截面:控制了个体不变的特征(职业特性、州特征)
  2. Event Study > 简单DID:可以检验事前趋势,观察动态效应
  3. 吸收固定效应 > OLS+虚拟变量:内存友好,计算更快
  4. 稳健标准误 > 普通标准误:允许异方差存在

局限性

  • AIOE指数本身可能与其他职业特征相关(遗漏变量)
  • Google Trends作为扩散代理变量有噪声
  • 事前趋势不平行,说明高暴露职业可能本就在衰退

这是美赛ICM参赛作品的核心分析部分。

Stay tuned! 🚀