今天给大家分享使用 Python 测算各城市虚拟集聚度的方法。该方法参考自宋林等《虚拟集聚与城市经济韧性》,通过结合区位熵和空间距离权重来综合测度城市的虚拟集聚水平。
附件中提供了该参考文献的 PDF 文件,感兴趣的小伙伴可以阅读原文。
指标来源与计算原理
虚拟集聚度(Virtual Agglomeration)
虚拟集聚度是衡量城市在数字经济领域集聚程度的重要指标。与传统的地理集聚不同,虚拟集聚强调通过信息技术实现的空间联系和资源共享,反映了城市在信息传输、软件和信息技术服务业领域的相对优势。
虚拟集聚度的计算公式为:
![]()
区位熵(Location Quotient)
公式中方括号内的部分即为区位熵:
![]()
区位熵衡量某城市 IT 行业的专业化程度相对于全国的水平:
- 区位熵 > 1:该城市 IT 行业集聚度高于全国平均水平
- 区位熵 = 1:与全国平均水平相当
- 区位熵 < 1:低于全国平均水平
距离权重
![]()
计算步骤概述
整个计算过程分为以下几个步骤:
- 数据准备:读取新增企业和注销企业数据
- 存续企业计算:通过累计新增减去累计注销得到各城市各行业的存续企业数
- IT 行业筛选:提取”信息传输、软件和信息技术服务业”企业数据
- 区位熵计算:计算各城市 IT 行业的区位熵
- 距离矩阵计算:使用 geopandas 计算城市间的地理距离
- 虚拟集聚度计算:结合区位熵和距离权重计算最终指标
- 结果保存:输出 CSV 文件
使用 reticulate 创建与管理 Python 虚拟环境
在 R 中通过 reticulate 包来调用 Python,最好的实践是为项目创建一个专属的 Python 虚拟环境,将所需依赖隔离到独立空间,避免与系统 Python(如 Anaconda)发生版本冲突。
重要说明(避免”已初始化”报错):reticulate 在 R 会话中只能绑定一次 Python——一旦某个
{python}代码块运行,Python 解释器就被锁定,之后再调用use_virtualenv()会报错:ERROR: The requested version of Python cannot be used, as another version has already been initialized.
因此,虚拟环境的激活必须在所有
{python}代码块之前完成。本文档的解决方案是在setupchunk 中通过Sys.setenv(RETICULATE_PYTHON = ...)提前锁定 Python 路径,这是 reticulate 选取 Python 的最高优先级入口。
安装 reticulate(仅首次)
# 设置 CRAN 镜像(knit 时 R 处于非交互模式,不会自动选择镜像) |
虚拟环境初始化原理(已在 setup chunk 中完成)
本文档的 setup chunk(隐藏运行)包含如下逻辑:
library(reticulate) |
这样做的关键在于:knitr 在处理第一个 {python} chunk 时,reticulate 已经通过 RETICULATE_PYTHON 环境变量知道要使用 .venv,不会再去碰 Anaconda。
在虚拟环境中安装 Python 包(仅首次)
# 检查关键包是否已安装,缺失的才安装 |
验证激活状态
# 验证当前绑定的 Python 路径(应指向 .venv 目录) |
查看已安装的包
# 列出虚拟环境中已安装的包 |
虚拟环境管理常用命令
# 查看所有已创建的虚拟环境 |
详细计算代码
数据读取
读取新增企业和注销企业数据:
import pandas as pd |
数据说明:
- 新增企业数量.csv:包含各城市各行业每年的新增注册企业数量
- 注销公司数量.csv:包含各城市各行业每年的注销企业数量
- 数据时间范围:1949-2023年
- 行业分类:按照国民经济行业分类标准
上面代码中读取的两个 csv 文件分别来源于平台上的工商注册信息和注销信息:
use "1949~2023年各省市区县、行业新增企业数量统计.dta", clear |
数据预处理——计算累计存续企业
计算每个城市各行业的累计存续企业数,需要考虑企业的进入(新增)和退出(注销):
# 处理新增企业数据 |
关键函数说明:
- cumsum():计算累计和,等价于 R 的 cumsum()
- groupby(dropna=False):将 NaN 作为一个分组,与 R 的 group_by 默认行为一致
- sort_values():按指定变量排序,等价于 R 的 arrange()
合并计算存续企业数
将新增和注销数据合并,计算最终的存续企业数量:
# 全连接(R 的 full_join) |
关键函数对照:
| R 函数 | Python 函数 | 说明 |
|---|---|---|
full_join() |
merge(how="outer") |
全连接 |
coalesce(x, 0) |
fillna(0) |
用 0 填充缺失值 |
pmax(x, 0) |
np.maximum(x, 0) |
并行取最大值 |
筛选 IT 行业并汇总
提取”信息传输、软件和信息技术服务业”数据,并按城市-年份汇总:
# 定义 IT 行业名称 |
计算区位熵
区位熵衡量某城市 IT 行业的专业化程度相对于全国的水平:
此处代码需下载讲义材料查看~
区位熵解读:
- 区位熵 > 1:该城市 IT 行业集聚度高于全国平均水平
- 区位熵 = 1:与全国平均水平相当
- 区位熵 < 1:低于全国平均水平
计算城市间距离矩阵
使用 geopandas 读取行政区划数据,计算城市质心间的距离:
import geopandas as gpd |
接下来使用 haversine 公式计算城市间距离,与 R 的 sf::st_distance 测地距离结果高度一致:
from math import radians, sin, cos, sqrt, atan2 |
距离计算说明:
- R 使用 sf::st_distance() 在 WGS84 坐标系下计算测地距离(geodesic distance)
- Python 使用 haversine 公式计算大圆距离,两者结果高度一致
- 距离单位均为公里
计算虚拟集聚度
结合区位熵和距离权重,计算每个城市的虚拟集聚度:
此处代码需下载讲义材料查看~
合并结果并保存
# 合并结果 |
结果概览
# 输出摘要 |
数据可视化
这部分使用 Python 的 matplotlib + geopandas 进行地图绘制,字体使用附件中的 LXGWWenKai-Regular.ttf。
使用 R 语言绘制地图课程汇总索引: https://mp.weixin.qq.com/s/lYyVFUzKWkzyBFRAInoZFg
空间分布地图绘制
读取地图数据并合并
import matplotlib.pyplot as plt |
数据分组处理
# 将连续变量分组为离散变量(五分位数分组) |
绘制地图
此处代码需下载讲义材料查看~
![]()
历年趋势折线图
# 筛选数据 |
![]()
点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Python 测算各城市虚拟集聚程度
评论