产业链分析工具包 (Industry Chain Map)
基于中国国家统计局(NBS)投入产出表的产业链结构分析库。15 部门聚合模型,覆盖上下游依赖、关键部门识别、供应链路径追踪、乘数效应、进口依赖、结构洞分析、部门聚类和冲击模拟。
能力边界
支持的能力
- 上下游依赖分析:
upstream_dependency()后向关联(谁给这个部门供货)、downstream_influence()前向关联(这个部门供货给谁) - 关键部门识别:
key_sectors()基于前后向关联系数识别对经济拉动/推动效应最强的部门 - 供应链路径追踪:
supply_chain_path()BFS 最短路径查找任意两部门间的供应链传导路径,含每一步的中间流量和投入系数 - 产出乘数:
value_multiplier()基于 Leontief 逆矩阵计算最终需求增加 1 单位对总产出的拉动倍数 - 进口依赖度:
import_dependency()用中间投入率与供给集中度(HHI)联合估算各部门对进口中间品的依赖 - 结构洞分析:
structural_holes()用中介中心性(betweenness centrality)识别桥接离散集群的枢纽部门 - 部门聚类:
cluster_sectors()谱聚类(spectral clustering)/层次聚类根据投入产出相似性分组 - 冲击模拟:
impact_analysis()给定某部门产出冲击,通过 Leontief 逆矩阵传导计算全经济产出和增加值变化 - 数据模型:
IOTable类封装中间流量矩阵 Z、直接消耗系数 A、Leontief 逆、Ghosh 逆、增加值率等全套投入产出数据 - 配置与可视化色彩:
config/sectors.yaml定义 NBS42→15 聚合映射、产业分组、颜色方案 - 部门中文名称: 所有 15 部门均有中英文双语标签
不支持的能力
- 不提供 GUI 或 CLI,纯 Python 库,需在脚本/Jupyter 中调用
- 不包含国家统计局原始数据文件,数据为代码内嵌的 2020 年近似值(
io_table.py) - 不支持自定义部门粒度(固定 15 部门),不直接支持 NBS 42 部门原表
- 不支持动态/时间序列分析(仅单一静态年份)
- 不生成可视化图表(PNG/SVG),仅输出 pandas DataFrame(颜色配置在
sectors.yaml中可供外部绘图使用) - 进出口不区分国内/进口中间投入,用集中度代理估算
- 就业乘数为简化近似(产出/增加值比),非真实就业人数
- 仅覆盖中国大陆产业结构,不适用于其他国家/地区的 IO 表
触发条件
当用户提出以下意图时调用此 Skill:
- "分析XX行业的产业链上下游"
- "计算投入产出表的关键部门"
- "模拟某个行业减产对经济的影响"
- "产业链传导分析" / "上下游依赖关系"
- "进口依赖度分析"
- "产业关联度计算" / "投入产出建模"
- "中国供应链分析"
使用示例
from industry_chain import io_table, chain_analyzer
# 加载投入产出表
io = io_table.load_io_table()
# 查看摘要
print(io.summary())
# 哪个部门上游依赖最多?
dep = chain_analyzer.upstream_dependency(io)
print(dep.head(10))
# 查看指定部门的上下游
print(chain_analyzer.upstream_dependency(io, sector="electronics"))
print(chain_analyzer.downstream_influence(io, sector="electronics"))
# 关键部门(前后向均高于均值)
print(chain_analyzer.key_sectors(io, threshold=1.0))
# 追踪"采矿业→电子设备"的供应链路径
path = chain_analyzer.supply_chain_path("mining", "electronics", max_depth=4)
for step in path:
print(f"{step['from_name']} → {step['to_name']}: {step['flow']:.3f}万亿")
# 产出乘数
print(chain_analyzer.value_multiplier("autos"))
# 冲击分析:电子设备产出减少 10%
chain_analyzer.impact_analysis("electronics", shock_magnitude=0.1)
# 进口依赖度排名
print(chain_analyzer.import_dependency(io))
# 结构洞(桥梁部门)
print(chain_analyzer.structural_holes(io).head(5))
# 部门聚类
print(chain_analyzer.cluster_sectors(io, n_clusters=5))
15 部门列表
| 代码 | 中文名 | 总产出(万亿) | 分组 |
|---|---|---|---|
| agriculture | 农林牧渔 | 13.78 | 第一产业 |
| mining | 采矿业 | 4.52 | 第一产业 |
| food_processing | 食品制造及烟草 | 8.46 | 轻工制造 |
| textiles | 纺织服装 | 6.51 | 轻工制造 |
| wood_paper | 木材加工及造纸 | 4.98 | 轻工制造 |
| petroleum_refining | 石油加工及炼焦 | 3.82 | 能源供应 |
| chemicals | 化学工业 | 11.95 | 重工制造 |
| metals | 金属冶炼及制品 | 13.27 | 重工制造 |
| machinery | 通用专用设备 | 8.14 | 重工制造 |
| electronics | 电子设备及通信 | 10.83 | 重工制造 |
| autos | 汽车及运输设备 | 7.52 | 重工制造 |
| electricity | 电力热力燃气 | 6.05 | 能源供应 |
| construction | 建筑业 | 9.88 | 建筑业 |
| transport | 交通运输仓储 | 7.03 | 生产性服务业 |
| finance_business | 金融及商务服务 | 15.14 | 生产性服务业 |
FAQ
Q1: 数据是哪一年的?
2020 年近似值,基于国家统计局 2018/2020 投入产出表 42 部门聚合而来。数据硬编码在 industry_chain/io_table.py 中。
Q2: 能换用其他年份的数据吗?
load_io_table(year=XXXX) 中的 year 参数目前仅为标签。实际只加载 2020 年数据。要使用其他年份,需在 io_table.py 中替换 TOTAL_OUTPUT、VALUE_ADDED、FINAL_DEMAND、A_MATRIX 数组。
Q3: 后向关联系数和前向关联系数的含义?
- 后向关联(影响力系数): 某部门生产 1 单位最终产品,需要从其他部门购买多少中间投入。系数>1 表示该部门对上游拉动高于平均水平。
- 前向关联(感应度系数): 各部门均生产 1 单位最终产品,对该部门中间产品的需求总量。系数>1 表示该部门被下游依赖程度高于平均水平。
Q4: 冲击分析的原理是什么?
基于 Leontief 需求驱动模型: ΔX = (I-A)^(-1) * ΔF。给定某部门最终需求减少 ΔF,通过逆矩阵传导计算所有部门的总产出变化 ΔX 和增加值变化 ΔVA。传导放大倍数 = 全经济产出减少 / 初始冲击产出减少。
Q5: 进口依赖度是怎么算的?
当前为估算代理,非真实进口数据:进口依赖度 = 中间投入率 * (1 - min(HHI*5, 0.9))。逻辑是中间投入占比高且国内供给来源集中的部门,一旦供应链中断风险更大。需要精确分析需要区分国内/进口中间投入表。
Q6: 供应链路径有时返回空怎么办?
两个部门间可能不存在直接或间接的显著联系(系数 < 0.005 的边被忽略)。可降低 max_depth 参数或检查 io.A 矩阵中两部门间的直接消耗系数是否足够大。
Q7: 如何生成可视化?
本库仅输出 pandas DataFrame 和数值结果。config/sectors.yaml 提供了完整的颜色映射,可用 matplotlib/plotly/ECharts 等外部工具基于 DataFrame 结果作图。
技术栈
| 组件 | 技术 |
|---|---|
| 数值计算 | numpy (矩阵运算、线性代数) |
| 数据处理 | pandas (DataFrame 输出) |
| 图分析 | scipy.sparse.csgraph (最短路径)、BFS 手动实现 |
| 聚类 | sklearn.cluster.SpectralClustering + scipy.cluster.hierarchy (降级方案) |
| 配置 | YAML (config/sectors.yaml) |
| 数据 | 硬编码 NBS 投入产出表近似值 |
| 入口 | 纯 Python 库,无 CLI |