插图
由于借助 AI 工具学习编程已经变得非常容易了,因此之后的课程就不再默认进行视频讲解了,如果特别需要视频讲解也可以联系李老师预约讲解~讲义材料学习过程中遇到的问题也可以及时与李老师联系。
购买 RStata 名师讲堂会员即可参加该课程啦(之前的和未来的都可以参加)!
价格:2800/年 或者 4800/长期
购买会员可以从这里下单:https://rstata.duanshu.com/#/card/list/
名师讲堂会员权益:
- 参加每个月 3~4 次的名师讲堂课程;
- 参加平台上的其他 R 语言和 Stata 的课程;
- 以会员折扣价购买我们分享的数据资料(10 元/份);
- 课程内外的提问解答服务(课程外的尽量帮忙解决)。
* 如果发票可添加小编微信 r_stata2 (RStata 李老师)开具。如需数据资料,购买后可添加小编微信免费领取数据折扣卡。
更多关于 RStata 会员的更多信息可添加微信号 r_stata2 咨询:
课程主页(点击文末的阅读原文即可跳转):<>
指标来源
供应链地理加权距离指标来自邹颖、石福安、祁亚发表在《世界经济》2026 年第 1 期的论文《以数促联:公共数据开放与企业供应链地理布局》。
该论文采用堆叠双重差分模型考察公共数据开放对企业供应链地理布局的影响,其中核心被解释变量即为供应链地理加权距离,包括两个维度:
- 供应商加权距离(Disws):衡量上市企业与主要供应商之间的地理距离(加权);
- 客户加权距离(Diswc):衡量上市企业与主要客户之间的地理距离(加权)。
论文发现,公共数据开放能打破地理距离约束,拓宽企业供应链分布范围。
指标定义与计算公式
数据来源
该指标的测算需要三类数据:
- 上市公司注册地址与办公地址数据:包含 2000~2024 年所有沪深 A 股上市公司的注册地址和办公地址经纬度信息,以及所处省市区县。
- 上市公司前 5 大供应商数据:包含 2001~2024 年上市公司前 5 大供应商的工商注册信息匹配结果,含供应商经纬度、采购额及采购额占比。
- 上市公司前 5 大客户数据:包含 2001~2024 年上市公司前 5 大客户的工商注册信息匹配结果,含客户经纬度、销售额及销售额占比。
计算公式
![]()
地理距离计算方法
地理距离采用 Haversine 大圆距离公式计算,与 R 语言 sf::st_distance(crs=4326) 使用完全相同的公式,保证了结果的可复现性。Python 实现如下:
import numpy as np |
其中:
- R = 6371.0 为地球平均半径(千米);
- 使用 numpy 的向量化运算,支持对整列数据批量计算;
- 最终结果单位为千米(km)。
上市公司地址使用的是办公地址(而非注册地址),这与论文中基于实际经营地址的选择一致。
加权方式说明
权重采用的是供应商采购额占前五大供应商采购总额的比例(而非供应商采购额占企业总采购额的比例)。这是因为上市公司年报中通常只披露前五大供应商/客户的名称和交易金额,无法获取完整的采购/销售总额数据。
![]()
计算过程
第 1 步:参数设置与数据读取
首先设置数据路径并读取三类数据:
import pandas as pd |
说明:使用
pandas.read_stata()直接读取 Stata 的.dta格式文件,无需格式转换。dropna()用于过滤经纬度缺失的记录。
第 2 步:计算供应商加权距离
首先读取供应商数据,筛选有效记录(年报、有经纬度、有采购额),然后合并办公地址并计算距离:
# 此处代码需下载讲义材料查看~ |
关键逻辑说明:
haversine_km的参数顺序是 (纬度, 经度, 纬度, 经度),注意不要写反经纬度的位置。groupby().transform("sum")计算组内总额,再除以总额得到权重比例。lambda x: np.log(1 + x.sum())在agg()中直接计算加权距离的对数值。
第 3 步:计算客户加权距离
客户加权距离的计算逻辑与供应商完全对称,只是将”供应商采购额”替换为”客户销售额”:
# 筛选有效记录 |
第 4 步:合并结果并输出
将供应商加权距离和客户加权距离合并到上市公司信息表中:
# 合并公司信息 |
注意:
pandas.to_stata()对中文列名有严格限制(仅支持 ASCII 字符),因此保存.dta文件时使用英文列名。如需保留中文列名,可同时保存 CSV 版本。
描述性统计
# 描述性统计 |
可以看到:
- 供应商加权距离(Disws)和客户加权距离(Diswc)的中位数分别为 6.197 和 6.408,均值分别为 5.840 和 5.915;
- 由于取了对数变换,中位数大于均值说明存在明显的左偏分布;
- 客户加权距离的标准差(1.504)略大于供应商加权距离(1.361),说明不同企业与客户的地理距离差异更大。
说明:上述描述性统计基于全样本(2001~2024 年)计算,与论文中 2007~2022 年的子样本统计量存在差异属于正常现象。
使用 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 目录) |
虚拟环境管理常用命令
# 查看所有已创建的虚拟环境 |
完整 Python 脚本
# -*- coding: utf-8 -*- |
参考文献
邹颖、石福安、祁亚,2026:《以数促联:公共数据开放与企业供应链地理布局》,《世界经济》第 1 期。
点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Python 计算上市公司供应链地理加权距离
评论