7 x: \. {7 M$ x7 ~2 G
& v. [; z& ?/ p人工智能与机器人的兴起重塑了全球劳动力市场,也引起了学术界极大的研究热情。其中,经济学界最具代表性的人物无疑是 Daron Acemoglu,其撰写的几篇关于机器人的文章,基本都发表在诸如 AER,JPE,RES 等经济学顶刊上,尤其是 2020 年发表于 JPE 的 《Robots and jobs: Evidence from US labor markets》,短短两年间,引用量就超过了 2400 次。. ~" ?. S8 i3 E8 D8 `/ Y. h+ U) W
4 \" E4 |5 m/ P9 u8 Q# |8 p/ \2 E c5 m8 i
) M( b9 T% M I/ G2 [& U+ j中文期刊中,也有多篇关于机器人的文章见诸于《管理世界》、《经济研究》等顶级期刊,关于各种话题的研究纷纷涌现。1 l( k8 v. ]1 p
h# T( X0 y" O* ~ E看到这个领域日趋火热,我们参考了王永钦、董雯 2020 年发表于《经济研究》一文的方法,计算了 2011-2019 年中国制造业上市公司的机器人渗透度,以飨读者。该数据为公司层面数据,并保留了公司和年份信息,可与上市公司的其他财务信息匹配,展开自己感兴趣的研究。 2 K* ~3 p5 \7 ^! E
) A& _4 j" `) X6 g. V
$ [. u( K& V* i* m ?7 a3 w我们参考 Acemoglu and Restrepo (2020) 和 王永钦、董雯 (2010) 的做法,构造中国制造业企业层面的机器人渗透度指标。具体测算方法如下:
+ {$ j3 n7 A9 [0 }6 {9 z* C
7 r2 b% C; t. e' l/ w; K6 L/ V. @% s/ [1 a5 B
其大致思路是,先计算出行业层面的单位从业人员的机器人数量 (机器人渗透度),随后再使用标准化的企业生产部门人数占比乘以行业机器人渗透度,两者的乘积即为该企业的机器人渗透度。, G6 u0 s; Y* F
2 l# e' d) {- H4 r3 \7 ?3 m在计算过程中,我们需要解决几个核心问题,下面我们具体展开分析。
- q2 m0 \5 }6 k0 m7 Z6 X
4 j/ H' @/ Y, z6 r D: Z6 T' t* l N8 O, Y! k/ ]
首先,我们要完成不同版本行业分类代码的衔接。这其中由分为两个部分,分别是《2002 版国民经济行业分类与代码》和《2011 版国民经济行业分类与代码》的衔接,以及中国的行业分类代码与 IFR 行业分类代码的衔接。参考王永钦、董雯 (2020) 的做法,我们先将中国的二位数制造业行业分类码统一至 2011 年,随后再与 IFR 进行匹配。
^' {9 p' |' Q, s- Y% t$ V; t+ _# g0 n2 X' _
调整后的行业分类为:2 A- {. v7 {2 k" T9 W
2 a2 x+ a5 h0 p3 c
5 C# j2 x8 H+ s5 \随后我们开始用Stata实现具体计算:
3 |" N2 n9 d: C- x- t$ ^8 [9 a7 l. A& E5 P
先确定工作路径:* Z/ C" r7 x: u$ ^0 x
- cd "~/Desktop/IFR to firm"
, v n6 ^6 g+ d6 K3 x - global path "~/Desktop/IFR to firm"
* x4 N. I$ o8 |" h# d( k - global raw_data "$path/raw_data"
6 a: ]) r# ~9 {6 e - global result_data "$path/result_data"
复制代码 1 d; n1 k/ N% t& a6 @) U
5 L, u3 i s4 N. d# F6 B参考王永钦、董雯 (2020) 的测算方法,我们先计算出 2010 年中国各行业的从业人数。该数据来自于 CSMAR。9 p. l; R6 d0 L& d
$ u% ]- F. A8 C- J
- import excel using "$raw_data/IND_Indstsvy.xlsx", firstrow clear5 \4 H1 H( T4 b
- labone, nrow(1 2)
' x$ h V% v: F1 s - drop in 1/2
: f5 D6 u* b/ s# a - keep Yeasgn Indcd Indnme Noemploy
! s7 ?7 G# K+ M8 b& @8 X$ H0 p* T - destring Yeasgn Indcd Noemploy, replace force
+ d& ?9 ~" h& Q( c' L - keep if Yeasgn == 2010
' v+ y1 V. U, }4 F0 }6 O+ V - keep if inrange(Indcd, 13, 43)
- v3 ^2 J' i9 X9 b }* F - `2 l8 ~' ]! l+ [' H0 E; t& D( u: n
- #delimit ;
6 {* h( y. K9 ?2 H - recode Indcd (13 14 15 16 = 1 "食品与饮料")
3 P' `. F+ U% m5 M - (17 18 19 = 2 "纺织与服装")
5 {. t6 O! B0 P" l* x - (20 21 = 3 "木材家具")2 f/ \) c/ f& k$ X- d& ?
- (22 23 = 4 "造纸印刷")# V" j1 R v9 P6 X. X
- (24 42 43 = 5 "其他制造业")9 W) D1 e9 ~4 E$ Z+ M% L
- (25/30 = 6 "塑料和化学制品")
" F2 V7 L+ t$ {. Q6 _0 ` - (31 = 7 "玻璃、陶瓷、矿石制品")! L* _5 C! M+ G' W! N2 q; Y2 ?
- (32 33 = 8 "基本金属")' C* M8 d# I" g7 v& T
- (34 = 9 "金属制品")
0 {, R3 B" {* N: o - (35 36 = 10 "机械设备制造")
" b! m7 q8 y" y - (37 = 11 "汽车制造业和其他交通设备制造业")/ G1 z% z* ~4 x3 U2 }5 ^" I3 o% Q
- (39/41 = 12 "电力设备与计算机、电子产品、光学产品制造"),/ r* `+ n7 L2 x. M* Z( n
- gen(industrycode);% f: q3 _" d2 o# M9 O1 J; Q- A
- #delimit cr
3 R6 B2 N' ~6 {7 x% G% O - collapse (sum)labor = Noemploy, by(industrycode). |! u: Y w) f& V/ X, @
- save "$result_data/labor.dta", replace
复制代码 随后,我们导入 IFR 的机器人数据,并统一行业编码。, [9 ^) c8 Z# ]$ r5 U
- use "$raw_data/IFR.dta", clear
2 m8 h. k" B- r: O$ f7 \- p - keep if country == "CN"
! F4 \( y1 h$ Q7 |1 P2 G - keep if inrange(year, 2011, .)7 _9 O' _! T) L% D8 k! D
- drop country Country installations+ R1 u7 _5 l5 D B7 r2 `: R
- gen industrycode = .
2 O$ S1 e, j7 J3 j - replace industrycode = 1 if industry == "10-12"' r1 b6 R) n% Z
- replace industrycode = 2 if industry == "13-15"; R% l' O; c8 Q7 {$ s9 E
- replace industrycode = 3 if industry == "16"% G% P2 _' N O) ?
- replace industrycode = 4 if industry == "17-18") c' c3 ]4 s. I
- replace industrycode = 5 if industry == "91"' G( z! R, j3 X4 M2 j& \; ]+ P
- replace industrycode = 6 if industry == "19-22": }3 R% t" Z( _4 ?! [$ v2 ?/ _ s
- replace industrycode = 7 if industry == "23"$ q# G; l7 [ ]$ n$ A3 \/ f3 x
- replace industrycode = 8 if industry == "24"
Q5 `+ p# i; Y, W - replace industrycode = 9 if industry == "25"
3 i4 t& {6 _' n2 J$ z$ a - replace industrycode = 10 if industry == "28"; p" F2 q) S) y) O9 C
- replace industrycode = 11 if industry == "29" | industry == "30"$ \; C* {) x1 S
- replace industrycode = 12 if industry == "26-27"# k) F+ c' i1 [' H/ n) w+ ~
- keep if !mi(industrycode)
0 [! S& a8 |" q8 v( w4 K - collapse (sum)stock = operation, by(industrycode year)5 [+ w* i- ^1 O& @
- save "$result_data/robot.dta", replace
复制代码 合并上述两份数据,计算行业层面的机器人渗透度:
, e( v$ V8 C B0 z; Q2 S2 m- use "$result_data/robot.dta", clear
+ h& w ^, {7 W - merge m:1 industrycode using "$result_data/labor.dta", ///
+ S/ n* I" H( x - keep(1 3) nogen
' U7 P ^; m. Q - gen density = stock / labor * 10000" u0 _ u* N+ \
- xtset industrycode year
. W& n0 q* w5 |8 \* e5 c- Z4 M - save "$result_data/robot_density.dta", replace
复制代码 我们导入 2011 年各制造业企业的生产部门员工占比,该数据来源于 Wind。
; P4 Q9 ^" K: }" d! R$ u- import excel using "$raw_data/员工构成-2011年.xlsx", clear2 J$ S/ L6 N5 N1 H& Y" X4 r
- labone, nrow(1/2)
; `0 d* ?2 T# G- @; l/ g- L5 g - drop in 1/2
* ~- @& J$ R; b) J7 u5 q4 s0 m - keep A B C R
# {% D& K. z' W: {8 P. y+ H - replace A = subinstr(A, ".SZ", "", .)' ]% S* H( @# _2 i7 K
- replace A = subinstr(A, ".SH", "", .)# D4 U3 Z+ R: I) c; ^' A
- destring A R, replace force5 T& E0 v+ N' G% T' |
- gen year = real(substr(C, -4, .)) \4 {$ B# q. ~: j, }* b8 s. M
- drop C8 C6 v* n6 d/ [1 P3 q# i" v
- xtset A year
6 Y/ ^* R+ p2 f- I( s0 B0 y6 m/ K" ~4 I - rename (_all)(Stkcd ShortName product_share year)
9 u* P( i6 g% p - order Stkcd year B% W. R) H$ h! I9 N
- drop if mi(Stkcd)
9 K' m( { \/ U7 O( z0 ^( c6 R4 W - format Stkcd %06.0f
! r, \% i* Z1 ` - save "$result_data/employee_structure.dta", replace
复制代码 由于 Wind 并不提供上市公司的行业代码,我们从 CSMAR 下载了各企业的股票代码与行业分类码,并按照本文第二章所属的编码规则,对行业分类 recode
) o' z% a9 {$ t* n+ |8 }; F- import excel using "$raw_data/STK_LISTEDCOINFOANL.xlsx", firstrow clear
& i$ U& G% Z* {& Z - labone, nrow(1 2)( ~2 z+ b/ g" A3 e( j% D: g& I
- drop in 1/2, r$ V8 a, d5 ~6 h" e6 n0 b+ ^
- gen year = real(substr(EndDate, 1, 4))* D/ J: V% u( E, R
- gen listyear = real(substr(LIST, 1, 4))* I( L8 k& v, ]+ Q' }
- keep if ustrregexm(IndustryCode, "C")) }; Z, n ^5 F1 z
- keep if inrange(year, 2011, 2019)$ i* l4 m# }" D, V }$ Y5 E
- clonevar Industrycode = IndustryCode5 X m8 h9 o! a! b9 r: h
- replace Industrycode = subinstr(Industrycode, "C", "", .)6 j* A+ H2 E# W7 |
- destring Symbol Industrycode, replace force1 Y" \( r5 u* J9 z0 j* _
: }$ l# S ]% t9 `% L3 m' c- #delimit ; L7 U6 [3 K/ ^! G9 E: h. I5 Z
- recode Industrycode
8 o4 c) z; Y& R9 X; i& O - (13 14 15 16 = 1 "食品与饮料")
8 R1 L0 B+ s# s1 E8 ? - (17 18 19 = 2 "纺织与服装")
( v E* J: C7 r$ I1 {( }3 E9 } - (20 21 = 3 "木材家具")
$ l: Y6 J# b" {7 g - (22 23 = 4 "造纸印刷"); ]% ^1 ^/ p; | d7 q
- (24 41 42 = 5 "其他制造业")
6 k* {8 s3 ?2 k% u, i" ~# H - (25/29 = 6 "塑料和化学制品")
1 u0 [- t0 [5 D, g2 ~1 i3 F+ Y* H - (30 = 7 "玻璃、陶瓷、矿石制品")
4 s) v- e, P3 a4 C" `5 b+ x Z8 T - (31 32 = 8 "基本金属")
7 R9 _# G9 T$ f8 r8 j3 | - (33 = 9 "金属制品")
2 |- ]+ k' `1 m! f0 N# u- ]+ F - (34 35 = 10 "机械设备制造")
- M4 r: |, @8 e+ [; t - (36 37 43 = 11 "汽车制造业和其他交通设备制造业")0 ]4 p, `- V% _5 w
- (38/40 = 12 "电力设备与计算机、电子产品、光学产品制造"),# b& H4 |" @0 d6 |9 X# E7 t" \
- gen(industrycode);8 q2 \3 Y6 ?6 `) E5 y, L7 ~
- #delimit cr
; }: [# B! r5 i& T' i' k9 x+ y - / e+ e( ^, p! g" L( ?- h5 F: k2 Z
- drop ListedCoID EndDate LISTINGDATE IndustryName
) l) t, }2 p: a& q% | - rename Symbol Stkcd
! k* O# R1 i, e+ L6 N - format Stkcd %06.0f
0 W4 f. x: s1 D9 a( R& m; D - order Stkcd year listyear
% y9 R& E3 |3 v - save "$result_data/industrycode.dta", replace
复制代码 7 T+ _. h @3 N5 |! u
6 i; X5 U) s* v接下来,就是最终的计算结果了。我们先把前述所有数据 merge 到一起,包括 2011 年企业生产部门员工占比,和各行业的机器人渗透度。
7 V5 b2 V: S% d1 |. S! N' V+ @' d$ H6 h e# x
随后,我们使用 egen 中的 mediam 计算出生产部门员工占比的中位数。
' H. U w: M. ~) y4 v( z S+ k1 p' |. A
最后,将企业生产部门员工占比除以中位数,再乘以行业机器人渗透度 density,所得的 exposure 就是企业的机器人渗透度了。
# x4 y3 f2 O" Z' `8 s
( a; D7 \2 L" R- use "$result_data/industrycode.dta", clear' ~5 m$ ^' r% l
- merge m:1 Stkcd using "$result_data/employee_structure.dta", //// m) c" U- s' r; t5 D
- keepusing(product_share) keep(1 3) nogen
. @' y* T! _7 Q: l' A* Z; M - merge m:1 industrycode year using "$result_data/robot_density.dta", ///
6 n* L4 \) l, X8 x - keepusing(density) keep(1 3) nogen; @7 b6 ?3 P( ?9 S* x4 ?
- format %20.0g industrycode2 r" ]( `2 k; y5 q4 d9 { m
- egen share_median = median(product_share)0 A: _9 B9 H1 n1 t9 w; n3 E. O
- gen exposure = (product_share / share_median) * density
: N3 j7 ?2 U+ l5 a - # R' |: g. D* e- A# T+ J9 K
- label var density "行业层面机器人渗透度(每万人)"3 [. N9 }1 y e! R. M; }! f9 ]
- label var product_share "生产部门员工占比"
2 t0 R% L C# c2 C+ @6 M - label var share_median "生产部门员工占比中位数"3 }+ v) ?. `! h/ {
- label var exposure "企业机器人渗透度", U) w9 _' K5 j! l
- order Stkcd year# j+ ^6 C1 H+ T" N9 ]5 v6 p
- xtset Stkcd year3 C. Z6 D+ m. ?. N7 P8 L3 I# D
- save "$result_data/exposure.dta", replace
复制代码
' q3 [3 m" C; I& I4 o. d, \. u# ^4 E3 @: D
. t: g' |& h$ N5 {3 Q( J& s$ y
" u' ]& H+ O; a- {7 O* k
2 [' v( C' ^: h- x, | |