使用 Stata 匹配工商注册信息行业与国民经济行业代码

前不久给大家分享了一份工商注册信息数据:

1949~2023 年工商企业注册信息数据(含经纬度及其所属的省市区县)(版本2):https://rstata.duanshu.com/#/brief/course/6d38a3f10cdb467492f3204d1ebdd313

里面关于行业的变量有三个:一级行业分类、二级行业分类、三级行业分类

不过并没有国民经济行业代码。因此我们今天来介绍下该如何给这份数据匹配上国民经济行业代码。

首先我们需要准备下面两个数据:

  • 1949~2023年各省市区县、行业新增企业数量统计.dta:来自工商注册信息的汇总;
  • 国民经济行业分类和代码.pdf:来自国家统计局,2017 版;

整理国民经济行业分类和代码

首先我们先把「国民经济行业分类和代码.pdf」文件转换成 xlsx 文件,这里我是使用的 Adobe Acrobat 软件完成的。

附件中也提供了转换后的文件:国民经济行业分类和代码.xlsx。

把 xlsx 读进 Stata 中整理下:

cd "~/Desktop/使用 Stata 匹配工商注册信息行业与国民经济行业代码"
import excel using "国民经济行业分类和代码.xlsx", clear

foreach i of varlist _all {
cap format `i' %10s
}

keep A-E
drop in 1
gen id = _n
order id
gen 行业门类 = A if ustrregexm(A, "[A-Z]")
order id 行业门类
gen 行业大类 = A if strlen(A) == 2
order id 行业门类 行业大类
gen 行业中类 = A if strlen(A) == 3
order id 行业门类 行业大类 行业中类
drop A
ren B 行业小类
drop if !mi(C) | D == "—"
carryforward 行业门类, replace
bysort 行业门类: carryforward 行业大类, replace
bysort 行业门类 行业大类: carryforward 行业中类, replace
bysort 行业门类 行业大类 行业中类: carryforward 行业小类, replace
foreach i of varlist 行业门类 行业大类 行业中类 行业小类 {
replace `i' = subinstr(`i', " ", "", .)
}
save data1, replace

行业代码的结构是这样的:

下面我们把行业门类、大类、中类、小类分别提取出来:

*- 行业门类
use data1, clear
keep if !mi(行业门类) & mi(行业大类)
bysort 行业门类: keep if _n == 1
keep 行业门类 D
ren 行业门类 行业门类代码
ren D 行业门类
save "行业门类", replace

*- 行业大类
use data1, clear
replace 行业大类 = 行业门类 + 行业大类
keep if !mi(行业门类) & mi(行业中类)
drop if strlen(行业大类) < 3
bysort 行业大类: keep if _n == 1
keep 行业大类 D

ren 行业大类 行业大类代码
ren D 行业大类
save 行业大类, replace

*- 行业中类
use data1, clear
replace 行业中类 = 行业门类 + 行业中类
keep if !mi(行业中类) & mi(行业小类)
drop if strlen(行业中类) < 4
bysort 行业中类: keep if _n == 1
keep 行业中类 D

ren 行业中类 行业中类代码
ren D 行业中类
save 行业中类, replace

*- 行业小类
use data1, clear
replace 行业小类 = 行业门类 + 行业小类
keep if !mi(行业小类)
drop if strlen(行业小类) < 5
bysort 行业小类: keep if _n == 1
keep 行业小类 D

ren 行业小类 行业小类代码
ren D 行业小类
save 行业小类, replace

然后再合并起来:

*- 合并
use 行业小类, clear
gen 行业中类代码 = substr(行业小类代码, 1, 4)
merge m:1 行业中类代码 using 行业中类
replace 行业中类 = 行业小类 if _m == 1
drop _m
gen 行业大类代码 = substr(行业小类代码, 1, 3)
merge m:1 行业大类代码 using 行业大类
drop _m

gen 行业门类代码 = substr(行业小类代码, 1, 1)
merge m:1 行业门类代码 using 行业门类
drop _m
order 行业门类代码 行业门类 行业大类代码 行业大类 行业中类代码 行业中类 行业小类代码 行业小类
label data "数据处理:微信公众号 RStata"
save "国民经济行业分类和代码(GB_T4754_2017)", replace

为了更好的检索,我用 R 语言制作了一个表格控件:

library(tidyverse)
haven::read_dta("国民经济行业分类和代码(GB_T4754_2017).dta") %>%
DT::datatable() %>%
htmlwidgets::saveWidget("国民经济行业分类和代码.html")

处理工商注册信息中的行业

首先找到所有互不相同的行业分类:

use "1949~2023年各省市区县、行业新增企业数量统计.dta", clear
keep 一级行业分类 二级行业分类 三级行业分类
duplicates drop 一级行业分类 二级行业分类 三级行业分类, force
drop if 三级行业分类 == " "
gen myid = _n
order myid
save 待匹配行业代码, replace

匹配两组数据

首先我们试着和行业小类匹配:

use 待匹配行业代码, clear
gen 行业小类 = 三级行业分类
replace 行业小类 = "药用辅料及包装材料制造" if 行业小类 == "药用辅料及包装材料"
drop if 三级行业分类 == " "
merge 1:1 行业小类 using "国民经济行业分类和代码(GB_T4754_2017)"

*> Result Number of obs
*> -----------------------------------------
*> Not matched 1,463
*> from master 270 (_merge==1)
*> from using 1,193 (_merge==2)

*> Matched 189 (_merge==3)
*> -----------------------------------------

keep if _m == 3
save 第一部分匹配成功, replace

keep myid
save myid1, replace

然后再和行业中类匹配试试:

use 待匹配行业代码, clear
merge 1:1 myid using myid1
drop if _m == 3
drop _m
gen 行业中类 = 三级行业分类
replace 行业中类 = "羽毛(绒)加工及制品制造" if 行业中类 == "羽毛(绒)加工及制品制造"
merge 1:m 行业中类 using "国民经济行业分类和代码(GB_T4754_2017)"
keep if _m == 3

*> Result Number of obs
*> -----------------------------------------
*> Not matched 214
*> from master 0 (_merge==1)
*> from using 214 (_merge==2)
*>
*> Matched 1,168 (_merge==3)
*> -----------------------------------------

drop _merge 行业小类 行业小类代码
save 第二部分匹配成功, replace

可以看到这时候完全匹配上了。

最后合并两部分匹配结果:

use 第一部分匹配成功, clear
append using 第二部分匹配成功

gsort myid
drop _m
compress
foreach i of varlist _all {
cap format `i' %10s
}
duplicates drop _all, force
label data "数据处理:微信公众号 RStata"
save "工商注册信息中的行业匹配国民经济行业代码", replace

这样我们就完成了这个匹配工作~

点击这里跳转到 RStata 短书平台获取附件:使用 Stata 匹配工商注册信息行业与国民经济行业代码

评论