4 c$ _4 m5 @! w. C. P( k
p3 F& I0 [3 B人工智能与机器人的兴起重塑了全球劳动力市场,也引起了学术界极大的研究热情。其中,经济学界最具代表性的人物无疑是 Daron Acemoglu,其撰写的几篇关于机器人的文章,基本都发表在诸如 AER,JPE,RES 等经济学顶刊上,尤其是 2020 年发表于 JPE 的 《Robots and jobs: Evidence from US labor markets》,短短两年间,引用量就超过了 2400 次。
, Y7 M; S' a# h+ z5 D; m2 ^7 v! ~/ J4 w+ \/ d. Z% ~, |
( w8 H0 f' u9 h! e
. D5 D" k/ F5 {- E' Y/ b中文期刊中,也有多篇关于机器人的文章见诸于《管理世界》、《经济研究》等顶级期刊,关于各种话题的研究纷纷涌现。
$ [( X6 h" c Z' c% E
# B! k: j/ \3 i5 y看到这个领域日趋火热,我们参考了王永钦、董雯 2020 年发表于《经济研究》一文的方法,计算了 2011-2019 年中国制造业上市公司的机器人渗透度,以飨读者。该数据为公司层面数据,并保留了公司和年份信息,可与上市公司的其他财务信息匹配,展开自己感兴趣的研究。 " a) M1 @ v- |$ C+ h! x
8 x! O3 @; G+ P1 T) r3 X9 }$ P# V& t4 p
2 W$ n; Y& X+ e& U3 p4 @我们参考 Acemoglu and Restrepo (2020) 和 王永钦、董雯 (2010) 的做法,构造中国制造业企业层面的机器人渗透度指标。具体测算方法如下: # |* p" l; L" s( P/ L
) ~! k) x' v" d4 }( h0 @+ d' `
8 V+ [$ [$ W# q6 z
其大致思路是,先计算出行业层面的单位从业人员的机器人数量 (机器人渗透度),随后再使用标准化的企业生产部门人数占比乘以行业机器人渗透度,两者的乘积即为该企业的机器人渗透度。2 B( V; I w, G2 h. w7 a" m* i
1 D( n7 I) j! j: S1 i8 Y% o在计算过程中,我们需要解决几个核心问题,下面我们具体展开分析。0 E7 G5 d. ? {$ [4 Z6 ~. y2 L3 g
/ T& O. a- N! u& w% t
0 y; k( i: S; P1 M9 I
首先,我们要完成不同版本行业分类代码的衔接。这其中由分为两个部分,分别是《2002 版国民经济行业分类与代码》和《2011 版国民经济行业分类与代码》的衔接,以及中国的行业分类代码与 IFR 行业分类代码的衔接。参考王永钦、董雯 (2020) 的做法,我们先将中国的二位数制造业行业分类码统一至 2011 年,随后再与 IFR 进行匹配。9 f6 l5 b8 ]0 T, J
) b- P K- c2 i( n9 z
调整后的行业分类为:5 L4 e3 s' |, O: o6 i8 Z

( w( R) I* E2 G$ W5 z( y$ t
$ L6 w2 }1 h, t) H3 H随后我们开始用Stata实现具体计算:% m8 W5 \4 y/ @( @$ Y4 r
+ u) a! A5 D2 e5 s先确定工作路径:$ W- y$ g2 A" C& W, ^4 M" K0 Y5 H
- cd "~/Desktop/IFR to firm"
1 n5 ~5 k: _, ]" ^$ L& `+ P: U - global path "~/Desktop/IFR to firm"
z4 K7 ]$ z/ I - global raw_data "$path/raw_data"
2 T2 L5 [0 `- T. Y& b) t - global result_data "$path/result_data"
复制代码 4 l8 M2 I4 V: O6 q2 M
9 L3 i+ I+ a3 a1 {
参考王永钦、董雯 (2020) 的测算方法,我们先计算出 2010 年中国各行业的从业人数。该数据来自于 CSMAR。0 `3 C( k- y8 a. f8 @
6 T# O6 N% s: O3 E- import excel using "$raw_data/IND_Indstsvy.xlsx", firstrow clear Y2 H" z2 ~% ]4 ?/ @8 i. w1 i$ p
- labone, nrow(1 2)$ Q ^: q5 U/ C6 C0 f9 G
- drop in 1/26 J7 w0 L$ V6 S7 O `9 w
- keep Yeasgn Indcd Indnme Noemploy
. T5 t' h: B: I0 ^' d* ` - destring Yeasgn Indcd Noemploy, replace force. ^8 b: U5 E p7 y
- keep if Yeasgn == 2010
7 k& }- y9 W6 `8 I/ U. v - keep if inrange(Indcd, 13, 43)# w0 T2 ^# e# E7 \- T' ~! j
- ) U, I( {% c7 m3 |2 c
- #delimit ; J: M; O* r, Y7 H9 q9 `# @& Z5 W
- recode Indcd (13 14 15 16 = 1 "食品与饮料")
" e8 F, J" o3 O0 l" G7 s+ | - (17 18 19 = 2 "纺织与服装")! F0 a" k, e$ a1 ]* m: E
- (20 21 = 3 "木材家具")
* A/ f, `) P/ ]' k0 F - (22 23 = 4 "造纸印刷")3 ^, I9 x" d: p7 }, |
- (24 42 43 = 5 "其他制造业")
$ q- z y5 q: q7 F - (25/30 = 6 "塑料和化学制品")
: S# b5 A% L% `/ O3 u - (31 = 7 "玻璃、陶瓷、矿石制品")8 y% K3 d2 B5 x; u
- (32 33 = 8 "基本金属")
% h, ] j% E. q; C( J! [: a - (34 = 9 "金属制品"), D( X9 C" m; K C
- (35 36 = 10 "机械设备制造")
4 j. v5 c* J: h7 M- j, c- B - (37 = 11 "汽车制造业和其他交通设备制造业")
2 Y' {% j: s2 W1 ^- _7 h) L8 s7 Q - (39/41 = 12 "电力设备与计算机、电子产品、光学产品制造"),
: O. B: ]2 @9 \( H: |* D* t r - gen(industrycode);
+ Q5 J N- ]! f& I' J. F) L* z - #delimit cr
( `/ n J6 v% J) l* g - collapse (sum)labor = Noemploy, by(industrycode)
0 q4 }! y! {% O4 \& u4 ^ - save "$result_data/labor.dta", replace
复制代码 随后,我们导入 IFR 的机器人数据,并统一行业编码。
) p+ ~# h _# \, k5 d c- use "$raw_data/IFR.dta", clear
' _8 S% A0 Z6 e - keep if country == "CN"
( @0 X/ i q$ e. f" g2 c - keep if inrange(year, 2011, .)8 W# Q1 V8 K, M" u, V5 g
- drop country Country installations
* f/ E0 I& D9 C3 [# M9 `( P7 d# q - gen industrycode = .
! H! o! [4 G& E! D6 r3 ] - replace industrycode = 1 if industry == "10-12"- E4 q8 \5 u1 z( m, ^
- replace industrycode = 2 if industry == "13-15"
0 w+ ~, F8 s2 I2 A - replace industrycode = 3 if industry == "16"
1 ]. o% G/ j; z. O* T- p - replace industrycode = 4 if industry == "17-18"+ f5 a$ S% I9 k2 X3 R5 h
- replace industrycode = 5 if industry == "91"8 b+ r! N3 D3 W5 p9 E/ M
- replace industrycode = 6 if industry == "19-22"
+ Y F7 P, d: r/ X$ ?4 D - replace industrycode = 7 if industry == "23"6 A b% x# a/ I! {3 G
- replace industrycode = 8 if industry == "24"6 v" [) j* }( I5 Q
- replace industrycode = 9 if industry == "25"
4 O# k) D& `. Y, E- V& s7 h* Y - replace industrycode = 10 if industry == "28"7 |2 l. ] E& o$ C! |
- replace industrycode = 11 if industry == "29" | industry == "30"
2 `/ }! z* B8 _: x7 O$ I& d - replace industrycode = 12 if industry == "26-27"8 ?3 G: o' `, `, ?% G0 l
- keep if !mi(industrycode)8 d d( D8 w/ S+ W
- collapse (sum)stock = operation, by(industrycode year)$ x: |0 v! r3 A$ ~7 S
- save "$result_data/robot.dta", replace
复制代码 合并上述两份数据,计算行业层面的机器人渗透度:
, k: W1 j: ~# W+ d$ K5 ^- use "$result_data/robot.dta", clear
0 k2 I* a5 W. F0 x0 {+ H - merge m:1 industrycode using "$result_data/labor.dta", ///! k- {3 d1 w4 f& m D
- keep(1 3) nogen
. ?2 r. z& |" x9 j |- l D6 [ - gen density = stock / labor * 10000* W9 [( h- ]7 P9 d0 n8 K
- xtset industrycode year) I# P ^. c5 {' t
- save "$result_data/robot_density.dta", replace
复制代码 我们导入 2011 年各制造业企业的生产部门员工占比,该数据来源于 Wind。
: D# ?, r0 X. f6 F4 s/ z) Q- import excel using "$raw_data/员工构成-2011年.xlsx", clear
" y3 j7 g9 G$ Z" F - labone, nrow(1/2)
& Q8 b, C% B6 e6 x/ z, l, B - drop in 1/2
& m, s: \1 P: e) U: ^8 `! l - keep A B C R
& f1 a; d3 n* H - replace A = subinstr(A, ".SZ", "", .)
/ A; o% D" g) M! t - replace A = subinstr(A, ".SH", "", .)3 M3 k0 q4 z) ]! |2 L, R0 L& O
- destring A R, replace force1 [2 k; a' ]; G* A& b8 O% h
- gen year = real(substr(C, -4, .))# W$ X' p& T4 ~# |1 c! R0 \
- drop C
* V! v" S/ `1 c. a) } - xtset A year. R6 a4 I( ~, X% D5 h
- rename (_all)(Stkcd ShortName product_share year)- n* k) d D" i V
- order Stkcd year
! `0 i" s1 w& J$ p# e$ Y - drop if mi(Stkcd)
7 F% \9 s8 ?, A% y" w% i! ] - format Stkcd %06.0f S, l$ W7 N/ T. @7 D" H
- save "$result_data/employee_structure.dta", replace
复制代码 由于 Wind 并不提供上市公司的行业代码,我们从 CSMAR 下载了各企业的股票代码与行业分类码,并按照本文第二章所属的编码规则,对行业分类 recode
4 S6 d5 _6 {8 D8 t7 N# Q- import excel using "$raw_data/STK_LISTEDCOINFOANL.xlsx", firstrow clear3 H$ `' {+ q* g( D3 f* B6 |
- labone, nrow(1 2)8 C* n- K4 [' ]0 g0 G& ], D
- drop in 1/29 u/ U1 u0 Q, P- u! r4 w6 h7 y
- gen year = real(substr(EndDate, 1, 4))
& `8 j; E. H( X8 F( o" m0 c - gen listyear = real(substr(LIST, 1, 4))9 N0 A; k, P' O: K3 Q& u
- keep if ustrregexm(IndustryCode, "C")0 c. i* p! d# f& G* f& v
- keep if inrange(year, 2011, 2019)
" r5 X" P+ ^' Z- _+ O2 t2 B2 \ - clonevar Industrycode = IndustryCode% t9 K* C7 [6 t& \; a1 B
- replace Industrycode = subinstr(Industrycode, "C", "", .)0 _! e+ P; I! W- ?
- destring Symbol Industrycode, replace force
( \1 o. P$ k, Q. l& H4 N, l
) {- e6 K3 { w. \2 Q9 R- #delimit ;
( ^" b8 U* _! e$ ], { - recode Industrycode
7 A# l4 v. T5 L/ x' T# Q/ w - (13 14 15 16 = 1 "食品与饮料")
* m' w# Q0 A2 f - (17 18 19 = 2 "纺织与服装")
% H. [7 q4 j+ y2 J( e4 g, Q5 \ - (20 21 = 3 "木材家具")
; H& a f0 G4 c1 e, ^ - (22 23 = 4 "造纸印刷")
+ f+ U: N+ E; S1 F k0 w" Q - (24 41 42 = 5 "其他制造业")2 V9 a/ i% |# X+ N' Z: }2 W4 r6 n
- (25/29 = 6 "塑料和化学制品")3 k. a1 V' {+ ~9 n8 ^% z( Y
- (30 = 7 "玻璃、陶瓷、矿石制品")! Z1 a& P- N$ y+ S9 }, \
- (31 32 = 8 "基本金属")1 P2 G4 l, h& I8 z4 o4 [, G* E
- (33 = 9 "金属制品")& Q: w0 u9 L6 N1 `& k4 ]
- (34 35 = 10 "机械设备制造")
$ _: P9 J. e& p- ?1 n" ]) o - (36 37 43 = 11 "汽车制造业和其他交通设备制造业")8 b! j% T4 R& r7 \: M- }* M/ Q
- (38/40 = 12 "电力设备与计算机、电子产品、光学产品制造"),
2 q0 r, |% D/ G( L/ F - gen(industrycode);4 |- ~4 N' h1 q8 E3 Y
- #delimit cr# c4 b$ S" a1 h
* w0 z, M' i) t, e' r# T* P- drop ListedCoID EndDate LISTINGDATE IndustryName
, f1 a. M" H2 B+ B7 o9 _ - rename Symbol Stkcd6 S2 H) U6 ?3 [- a
- format Stkcd %06.0f
4 U$ \: \8 B$ u - order Stkcd year listyear
! R) A3 N& v" k" Q! M8 t9 y1 ^ - save "$result_data/industrycode.dta", replace
复制代码 7 K' T; p. {0 S0 E; P
$ n& O8 N& e2 Q& y5 p; d接下来,就是最终的计算结果了。我们先把前述所有数据 merge 到一起,包括 2011 年企业生产部门员工占比,和各行业的机器人渗透度。2 P' }% ]( w+ x; B2 S! ^
- c( E' g+ n$ M6 G6 g
随后,我们使用 egen 中的 mediam 计算出生产部门员工占比的中位数。
, T) @; g* l0 b* O9 D! Q
- @8 R; {2 I. z( J4 `" P: F最后,将企业生产部门员工占比除以中位数,再乘以行业机器人渗透度 density,所得的 exposure 就是企业的机器人渗透度了。0 ~' F# c/ k2 ]9 Y7 H1 ?
5 R4 j6 w ]4 w$ }& Y3 d5 A3 d' P, b
- use "$result_data/industrycode.dta", clear5 L, |' N+ ]6 X% h
- merge m:1 Stkcd using "$result_data/employee_structure.dta", ///$ S. @3 G2 @' v+ Z; |. g8 ]) k
- keepusing(product_share) keep(1 3) nogen- R6 Y; {4 I) k
- merge m:1 industrycode year using "$result_data/robot_density.dta", ///1 v: S! Z! x; ^4 m, j3 D/ Y
- keepusing(density) keep(1 3) nogen0 ]+ ?8 F0 ~- b/ T/ N+ ]( ^
- format %20.0g industrycode2 E' @4 x# T/ P- E: c
- egen share_median = median(product_share) P( `0 L! y$ G! l) @. t
- gen exposure = (product_share / share_median) * density
8 D2 _: U/ A/ k6 m/ L I# A - / d7 S8 j, x8 E% B' L1 u* x
- label var density "行业层面机器人渗透度(每万人)"$ ~9 x2 t7 K6 h% ?
- label var product_share "生产部门员工占比"
9 C1 r+ F; @. Q8 x# T9 ? I - label var share_median "生产部门员工占比中位数"
: L9 ~& ]( V, C ?. `# }) ` - label var exposure "企业机器人渗透度"- m$ c6 p+ a$ i/ _; }+ ]5 ]2 o
- order Stkcd year9 p) i6 o. K+ f. U, Y7 d
- xtset Stkcd year6 e3 j. m6 q6 g0 r
- save "$result_data/exposure.dta", replace
复制代码
' u( k1 l+ Y( ^2 W& x& r* }1 x# d8 q& G* P6 _- \( D
4 V h) O5 X1 B9 ?* w
9 x! L: o6 n8 U' N% z8 W. t, U2 J2 T7 Z L* _7 W
|