名师讲堂|使用 R 语言测算各城市生产性服务业集聚水平

附件中的文献《生产性服务业集聚何以赋能技术扩散》中提到了城市的生产性服务业专业化集聚指标和多样化集聚指标,今天的课程中我们将会讲解如何使用 R 语言根据城市统计年鉴数据来测算这两个指标。

城市统计年鉴数据在这里:

1999~2025 年中国城市统计年鉴面板数据整理结果: https://rstata.duanshu.com/#/brief/course/c6b0aaf3bcba494faadbacacb012dcef

这里选择的是 2017~2019 年的样本作为演示使用。也就是附件中的 城市统计年鉴样本数据.dta。


一、指标来源与计算公式

1.1 专业化集聚指数 SP(公式4)

1.2 多样化集聚指数 DV(公式5)

二、数据与变量说明

2.1 数据来源

城市统计年鉴数据在这里:

1999~2025 年中国城市统计年鉴面板数据整理结果: https://rstata.duanshu.com/#/brief/course/c6b0aaf3bcba494faadbacacb012dcef

这里选择的是 2017~2019 年的样本作为演示使用。也就是附件中的 城市统计年鉴样本数据.dta。

由于计算所需的变量主要集中在 2003~2019 年,所以完整数据仅可计算得到 2003~2019 年的。

2.2 生产性服务业行业界定

参考 Ke et al.(2014)和韩峰和阳立高(2020),生产性服务业包括 7个细分行业:

代码 行业名称 说明
s1 交通运输、仓储和邮政业 全市口径
s2 金融业 全市口径
s3 科学研究和技术服务业 2003-2016含地质勘探,2017-2019不含
s4 租赁和商务服务业 全市口径
s5 信息传输、计算机服务和软件业 全市口径
s6 批发和零售业 全市口径
s7 水利、环境和公共设施管理业 全市口径

注意:科学研究和技术服务业在2003-2016年统计口径含”地质勘探业”,2017-2019年不含。处理时用 coalesce() 合并两套口径。

2.3 就业数据说明

  • 数据来自《中国城市统计年鉴》城镇单位从业人员(全市口径)
  • 单位:人
  • 总就业 = 城镇单位从业人员期末人数(全市)

三、R 语言代码实现

3.1 环境准备与数据读取

# ============================================================
# 测算各城市生产性服务业集聚水平(专业化集聚 SP + 多样化集聚 DV)
# 数据来源:中国城市统计年鉴地级市面板数据(1998~2024年)
# 测算方法:参考 金培振等(2026)《生产性服务业集聚何以赋能技术扩散》
# 《世界经济》2026年第3期,公式(4)(5)
# 数据处理:微信公众号 RStata
# ============================================================

library(tidyverse) # 数据处理核心
library(haven) # 读写 Stata dta 文件

# 读取数据(请替换为实际文件路径)
# df_raw <- read_dta("1998~2024年中国城市统计年鉴地级市面板数据.dta")
# 为演示方便,这里使用样本数据
df_raw <- read_dta("城市统计年鉴样本数据.dta")

3.2 变量选取与数据清洗

# ============================================================
# 二、选取变量并清洗
# 生产性服务业包括 7 个细分行业
# 就业数据来自《中国城市统计年鉴》城镇单位从业人员(全市口径)
# 数据处理:微信公众号 RStata
# ============================================================

# 此处代码需下载讲义材料查看~

3.3 异常值处理

# ============================================================
# 异常值处理
# 数据处理:微信公众号 RStata
# ============================================================

# --- (1) 修复嘉峪关市 2013 年 emp_total ---
# 原始值 660,000 多一个零,用 2012/2014 年均值替换
jyg_fix <- df %>%
filter(city == "嘉峪关市", year %in% c(2012, 2014)) %>%
summarise(emp_total_fix = mean(emp_total, na.rm = TRUE)) %>%
pull(emp_total_fix)

cat("嘉峪关市 2013 年 emp_total 修复:\n")
cat(" 原始值:", df %>% filter(city == "嘉峪关市", year == 2013) %>% pull(emp_total), "\n")
cat(" 替换值(2012/2014均值):", round(jyg_fix), "\n")

df <- df %>%
mutate(emp_total = if_else(city == "嘉峪关市" & year == 2013,
jyg_fix, emp_total))

# --- (2) 剔除鹤壁市 2013 年 ---
# 科研技术 = 110,000,数据录入错误
cat("\n剔除鹤壁市 2013 年(科研技术异常值):\n")
n_before <- nrow(df)
df <- df %>% filter(!(city == "鹤壁市" & year == 2013))
cat(" 剔除前:", n_before, "条 → 剔除后:", nrow(df), "条\n")

cat("\n异常值处理后样本量:", nrow(df), "\n")

3.4 计算全国层面基准(按年份)

# ============================================================
# 三、计算全国层面基准(按年份)
# 数据处理:微信公众号 RStata
# ============================================================

# 此处代码需下载讲义材料查看~
cat("全国层面基准计算完成,年份数:", nrow(nat_by_year), "\n")

3.5 测算专业化集聚指数 SP(公式4)

# ============================================================
# 四、测算专业化集聚指数 SP(公式4)
# SP_i = ∑_s(E_is/E_i) / ∑_s(E_s/E)
# 数据处理:微信公众号 RStata
# ============================================================

# 此处代码需下载讲义材料查看~

3.6 测算多样化集聚指数 DV(公式5)

# ============================================================
# 五、测算多样化集聚指数 DV(公式5)
# 关键:公式中的份额是"其余行业在剩余就业中的份额"
# DV_i = ∑_s (E_{i,s}/E_i) × [∑_{s'≠s}[E_{s'}/(E-E_s)]^2 / ∑_{s'≠s}[E_{i,s'}/(E_i-E_{i,s})]^2]
# 数据处理:微信公众号 RStata
# ============================================================

# 此处代码需下载讲义材料查看~

# 城市与全国就业宽表合并

# 此处代码需下载讲义材料查看~

3.7 缩尾处理与结果保存

# ============================================================
# 六、合并 SP 和 DV,并进行缩尾处理(Winsorize)
# 数据处理:微信公众号 RStata
# ============================================================

# 此处代码需下载讲义材料查看~

cat(" 处理后范围:", round(min(df_result$`生产性服务业多样化集聚DV`), 4),
"~", round(max(df_result$`生产性服务业多样化集聚DV`), 4), "\n")

# 结果概览
cat("\n=== 最终结果数据概览 ===\n")
cat("总行数:", nrow(df_result), "\n")
cat("年份范围:", min(df_result$year), "~", max(df_result$year), "\n")

cat("\nSP(专业化集聚)描述性统计:\n")
print(summary(df_result$SP))

cat("\nDV(多样化集聚,经1% Winsorize)描述性统计:\n")
print(summary(df_result$`生产性服务业多样化集聚DV`))

cat("\n样本展示(前10行):\n")
print(
df_result %>%
select(year, prov, city, SP, `生产性服务业多样化集聚DV`) %>%
head(10),
digits = 4
)
# ============================================================
# 七、保存为 dta 文件
# 数据处理:微信公众号 RStata
# ============================================================

year_min <- min(df_result$year)
year_max <- max(df_result$year)
output_filename <- paste0(year_min, "~", year_max, "年各城市生产性服务业集聚水平.dta")

df_out <- df_result %>%
rename(
`年份` = year,
`省` = prov,
`省代码` = prov_code,
`市` = city,
`市代码` = cityid,
`生产性服务业专业化集聚SP` = SP
)

write_dta(
df_out,
path = output_filename,
label = "数据处理:微信公众号 RStata"
)

cat("\n已保存:", output_filename, "\n")

四、结果验证:与论文对比

4.1 SP 指标验证

论文报告 SP 均值约为 0.83。

sp_mean <- mean(df_result$SP, na.rm = TRUE)
cat("SP 均值:", round(sp_mean, 4), "\n")
cat("论文报告 SP 均值: 0.83\n")
cat("差距:", round(sp_mean - 0.83, 4), "\n")

结论:SP 均值 r round(sp_mean, 4) 与论文报告的 0.83 高度吻合 ✅

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 R 语言测算各城市生产性服务业集聚水平

评论