名师讲堂|使用 R 语言测算上市公司技术专业化与技术多样化

指标背景与文献来源

技术专业化(Technological Specialization, TSP)和技术多样化(Technological Diversification, TDI)是刻画企业技术布局的两个重要维度。

王慧扬等(2025)在《知识搜索与科技领军企业关键核心技术突破》(《科学学研究》2025)中系统使用了这两个指标来研究科技领军企业的关键核心技术突破。

  • 技术专业化(TSP):衡量企业专利技术是否集中于少数技术类别。TSP 越高,说明企业的专利越集中在少数技术小类上,专业化程度越高。
  • 技术多样化(TDI):衡量企业专利在技术大类上的分布广度。TDI 越高,说明企业的专利分布越分散,多样化程度越高。

这两个指标均基于企业专利的 IPC(国际专利分类) 分类号进行计算。

数据说明

本文使用的数据为 1985~2024 年上市公司与专利数据匹配结果(含引用与被引用信息),原始数据约 271 万行、70 列,10GB+。

为了便于演示和加快计算速度,计算时以 2020 年 为例进行。如果你需要处理其他年份或全量数据,只需修改读取数据部分的代码即可。

数据字段主要包括:

变量名 说明
股票代码 上市公司股票代码
年份 专利申请年份
申请号 专利申请号
公开公告号 专利公开/公告号
IPC主分类 IPC 主分类号(如 G06F)

IPC 分类简介

IPC(International Patent Classification,国际专利分类)是世界知识产权组织(WIPO)制定的专利分类标准,将专利技术领域分为五个层级:

层级 说明 示例
部(Section) 8 个大部,用 A~H 表示 A、G、H
大类(Class) 部 + 2 位数字,共 3 位 G06、H04
小类(Subclass) 大类 + 1 位字母,共 4 位 G06F、H04L
大组(Main Group) 小类 + 1~3 位数字 G06F 1
小组(Subgroup) 大组 + “/“ + 数字 G06F 1/00

本文计算中使用:

  • 技术多样化(TDI) → 基于 IPC 大类(前 3 位,如 G06)
  • 技术专业化(TSP) → 基于 IPC 小类(前 4 位,如 G06F)

为什么这样区分? 根据王慧扬等(2025)的研究设计,技术专业化关注企业在更细分的技术小类上是否集中(用变异系数衡量集中度),而技术多样化关注企业在更宏观的技术大类上的分布广度(用熵指数衡量多样性)。

计算方法

为什么用熵指数? Shannon 熵是信息论中衡量不确定性的指标,值越大说明分布越均匀。用在技术多样化上,熵越大说明企业技术布局越分散、越多样化。

R 语言完整实现

下面我们对 计算技术专业化与多样化.R 脚本进行逐行解读,完整展示使用 R 语言计算 TSP 和 TDI 的流程。

第一部分:加载所需 R 包

# ============================================================
# 计算上市公司技术专业化(TSP)与技术多样化(TDI)
# ============================================================
# 参考:王慧扬, 刘建华, 赵玉冰.《知识搜索与科技领军企业关键核心技术突破》
# 科学学研究, 2025
# 数据:1985~2024年上市公司与专利数据匹配结果_含引用与被引用信息.csv
# ============================================================

# 加载所需包
library(tidyverse)
library(data.table)

代码解读:

  1. tidyverse 是一个 R 语言包集合,包含了 dplyr(数据操作)、readr(数据读取)、stringr(字符串处理)等常用包,我们使用它来进行数据清洗和变换。
  2. data.table 提供了 fread() 函数,可以快速读取大型 CSV 文件(支持 10GB+ 数据),比基础 R 的 read.csv() 快很多。

注意:如果你处理的是全量数据(1985~2024 年),建议使用 data.table::fread() 读取,并配合 dplyr 进行数据操作。

第二部分:读取数据

# 读取数据(2020年样本)
df_2020 <- read_csv("2020年上市公司与专利数据匹配结果.csv")

代码解读:

这里我们使用 readr::read_csv() 读取已经预处理好的 2020 年数据。

如果你需要处理全量数据,可以使用以下代码(取消注释即可):

# 使用 data.table 的 fread 快速读取大数据
# df_raw <- fread("1985~2024年上市公司与专利数据匹配结果_含引用与被引用信息.csv",
# encoding = "UTF-8")

# 筛选 2020 年数据并选择所需变量
# df_2020 <- df_raw[年份 == 2020, .(股票代码, 年份, 申请号, 公开公告号, IPC主分类)]

# 保存为 CSV,方便后续使用
# df_2020 %>% write_csv("2020年上市公司与专利数据匹配结果.csv")

读取数据后,我们查看一下数据的维度:

# 查看数据维度
cat(sprintf("2020年数据维度: %d 行, %d 列\n", nrow(df_2020), ncol(df_2020)))

# 查看前几行
head(df_2020)

第三部分:数据去重

专利数据中存在同一专利被多次记录的情况(例如同一专利有多个公开公告号),需要按一定规则去重。去重分三步:

3.1 清洗公开公告号

# Step 1: 清洗公开公告号(去掉末尾字母)
# 公开公告号末尾常带有一位字母(如 CN1234567A),需将其去掉
df_2020 <- df_2020 %>%
mutate(公开公告号_clean = str_remove(公开公告号, "[A-Z]$"))

# 查看清洗效果
table(str_sub(df_2020$公开公告号, -1), useNA = "ifany")[1:10]

代码解读:

  • 公开公告号的格式通常为 CN1234567A 或 CN1234567B,末尾的字母表示专利公告的不同阶段
  • 使用 stringr::str_remove(公开公告号, “[A-Z]$”) 去掉末尾的大写字母
  • [A-Z]$ 是正则表达式,表示”末尾的一个大写字母”

3.2 按公开公告号去重

# Step 2: 按 股票代码 + 年份 + 公开公告号_clean 去重
df_2020 <- df_2020 %>%
distinct(股票代码, 年份, 公开公告号_clean, .keep_all = TRUE)

cat(sprintf("按公开公告号去重后:%d 行\n", nrow(df_2020)))

代码解读:

  • distinct(股票代码, 年份, 公开公告号_clean, .keep_all = TRUE) 会保留每个(股票代码、年份、公开公告号_clean)组合的第一行,并保留所有变量
  • 这样可以去除同一专利的多个公开公告记录

3.3 按申请号去重

# Step 3: 按 股票代码 + 年份 + 申请号 去重
df_2020 <- df_2020 %>%
distinct(股票代码, 年份, 申请号, .keep_all = TRUE)

cat(sprintf("按申请号去重后:%d 行\n", nrow(df_2020)))

代码解读:

  • 进一步按「股票代码 + 年份 + 申请号」去重,确保同一专利申请只计算一次
  • 经过这两步去重,我们获得了干净的企业-专利匹配数据

第四部分:提取 IPC 分类信息

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

代码解读:

  • stringr::str_sub(IPC主分类, 1, 3) 提取 IPC主分类 的前 3 位字符,作为 IPC 大类
  • stringr::str_sub(IPC主分类, 1, 4) 提取前 4 位字符,作为 IPC 小类
  • 例如:IPC主分类 = “G06F 1/00” → IPC大类 = “G06”,IPC小类 = “G06F”

接下来,我们检查并处理 IPC 分类为 NA 的观测值:

# 检查 IPC主分类的 NA 值
na_count <- sum(is.na(df_2020$IPC主分类))
cat(sprintf("IPC主分类的NA值数量: %d (占比%.2f%%)\n",
na_count, na_count/nrow(df_2020)*100))

# 移除 IPC 分类为 NA 的观测值(无法归入任何技术类别)
df_2020 <- df_2020 %>%
filter(!is.na(IPC大类) & !is.na(IPC小类))

cat(sprintf("移除IPC为NA后的数据维度: %d 行, %d 列\n",
nrow(df_2020), ncol(df_2020)))

代码解读:

  • IPC 主分类为 NA 的专利无法归入任何技术类别,需要移除
  • 根据我们的统计,这部分约占 10.46%

第五部分:计算技术专业化(TSP)

技术专业化的计算分为四个步骤:

5.1 计算每个企业在各技术小类的专利数量

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

代码解读:

  • 按「股票代码 + IPC小类」分组,统计每家企业每个技术小类的专利数量
  • 例如:企业 000001 在 G06F 小类有 10 件专利,在 H04L 小类有 5 件专利

5.2 计算每个企业的专利总数

# 计算每个企业的专利总数
firm_total_patents <- df_2020 %>%
group_by(股票代码) %>%
summarise(总专利数 = n(), .groups = "drop")

head(firm_total_patents)

代码解读:

  • 按「股票代码」分组,统计每家企业 2020 年的专利总数
  • 这个总数将用于计算各技术小类的专利占比

5.3 计算各技术小类专利占比

# 计算各技术小类专利占比
tech_small_ratio <- tech_small_class %>%
inner_join(firm_total_patents, by = "股票代码") %>%
mutate(专利占比 = 专利数 / 总专利数)

head(tech_small_ratio)

代码解读:

  • 将 tech_small_class 和 firm_total_patents 按「股票代码」内连接
  • 计算每个技术小类的专利占比:pij=NiNij
  • 例如:企业总专利 100 件,其中 G06F 小类 30 件,则 G06F 的专利占比 = 0.3

5.4 计算变异系数(TSP)

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

代码解读:

  1. 技术小类数量 = n():统计每家企业有多少个技术小类
  2. 技术小类占比均值 = mean(专利占比):计算专利占比的均值
  3. 技术小类占比标准差 = sd(专利占比):计算专利占比的标准差
  4. TSP = sd / mean:变异系数 = 标准差 / 均值
  5. 边界情况处理:

第六部分:计算技术多样化(TDI)

技术多样化的计算分为三个步骤:

6.1 计算每个企业在各技术大类的专利数量

# 计算每个企业在各技术大类的专利数量
tech_large_class <- df_2020 %>%
group_by(股票代码, IPC大类) %>%
summarise(专利数 = n(), .groups = "drop")

head(tech_large_class)

代码解读:

  • 按「股票代码 + IPC大类」分组,统计每家企业每个技术大类的专利数量
  • 注意:这里用的是 IPC 大类(前 3 位),而不是小类

6.2 计算各技术大类专利占比

# 计算各技术大类专利占比
tech_large_ratio <- tech_large_class %>%
inner_join(firm_total_patents, by = "股票代码") %>%
mutate(专利占比 = 专利数 / 总专利数)

head(tech_large_ratio)

代码解读:

  • 与计算 TSP 时类似,这里计算的是各技术大类的专利占比
  • 例如:企业总专利 100 件,其中 G06 大类 40 件,H04 大类 30 件,则 G06 的专利占比 = 0.4

6.3 计算 Shannon 熵指数(TDI)

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

代码解读:

  1. 技术大类数量 = n():统计每家企业有多少个技术大类
  2. TDI = -sum(专利占比 * log(专利占比)):计算 Shannon 熵指数
  3. Shannon 熵的性质:

第七部分:合并结果并保存

# 合并 TSP 和 TDI 结果
result <- TSP %>%
select(股票代码, 技术小类数量, TSP) %>%
inner_join(select(TDI, 股票代码, 技术大类数量, TDI), by = "股票代码") %>%
inner_join(firm_total_patents, by = "股票代码") %>%
arrange(股票代码)

# 查看最终结果
cat("=== 最终结果概览 ===\n")
cat(sprintf("结果维度: %d 行, %d 列\n", nrow(result), ncol(result)))
head(result, 20)

代码解读:

  1. 将 TSP 和 TDI 两个结果按「股票代码」内连接
  2. 同时保留每家企业的总专利数
  3. 按股票代码排序,便于查看

第八部分:结果分析与描述性统计

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

计算结果解读(基于 2020 年数据):

变量 最小值 25% 分位数 中位数 均值 75% 分位数 最大值
TSP(技术专业化) 0.0000 0.4283 0.7071 0.8015 1.0700 2.8284
TDI(技术多样化) 0.0000 0.5623 1.1342 1.1234 1.5276 2.0794
总专利数 1 3 8 47.1 28 5,832
  • TSP 中位数为 0.707,均值为 0.802,说明多数企业的技术布局有一定专业化倾向。
  • TDI 中位数为 1.134,均值为 1.123,说明多数企业的技术多样化程度处于中等水平。

第九部分:保存结果

# 保存结果
output_file <- "技术专业化与多样化_2020年.csv"
fwrite(result, output_file, encoding = "UTF-8")
cat(sprintf("\n结果已保存至: %s\n", output_file))

代码解读:

  • 使用 data.table::fwrite() 快速写入 CSV 文件
  • 指定 encoding = “UTF-8”,确保中文字符正确保存

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 R 语言测算上市公司技术专业化与技术多样化

评论