ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

专精特新小巨人企业财务数据面板:2013-2024五批数据清洗与实操指南

专精特新小巨人企业财务数据面板:2013-2024五批数据清洗与实操指南 简介这份资源面向研究中小企业发展、区域经济与政策评估的高校师生、智库研究人员及投资分析人员提供专精特新“小巨人”企业第1至5批的财务与基础信息数据覆盖2013至2024年可用于分析企业成长路径、行业分布与政策扶持效果。压缩包共10个文件约36.12MB包含xlsx财务数据表、dta格式Stata数据文件、html数据来源说明、txt说明文档以及多份pdf企业名单兼顾直接查阅与统计建模需求。其中财务数据表便于在Excel中快速筛选与透视dta文件支持清洗、回归等计量操作名单文件则提供企业名称、批次与所属行业等维度方便与财务指标匹配。目前已有53人学习下载适合需要一手微观数据支撑论文、课题或投资尽调的读者能有效减少数据搜集与整理成本。1. 专精特新“小巨人”财务数据一份横跨十二年的企业样本库如果你正在做企业成长性研究、区域产业对比或者要给投资组合里的制造业标的做基本面回溯大概率绕不开“专精特新”这个标签。但真正动手时你会发现名单好找连续多年的财务数据难凑——尤其是第1到第5批、跨度从2013到2024年这种长面板。这份压缩包解决的正是这个痛点它把五批“小巨人”企业的财务指标按年份整理成结构化文件省去了逐家爬年报、对齐会计期间的重复劳动。适合谁用做产业研究的分析师、写论文需要面板数据的研究生、以及想批量筛选优质制造企业的量化爱好者。它不是原始年报的扫描件而是已经过清洗的指标集合拿到手就能进Excel或Python做透视。下面我从数据拆解、口径核对、实操复现三个层面把这份资源拆开讲透。2. 拆开压缩包五批名单与十二年财务字段的对应关系2.1 批次维度与年份覆盖的交叉逻辑第1到第5批“小巨人”的公示时间并不均匀最早一批可追溯到2019年后续批次间隔约一到两年。这份数据把每批企业的财务记录回溯到2013年向前延伸了六年目的是让研究者能观察到企业入选前后的完整变化轨迹。压缩包内通常按批次分文件夹每个文件夹下再按年份存放CSV或Excel文件。常见做法是文件名里带批次号和年份比如batch1_2013.csv、batch3_2020.xlsx。你拿到手第一件事不是急着合并而是先确认每个批次的年份覆盖是否完整——有的批次可能只回溯到2015年因为企业成立时间晚于2013年强行补零会污染样本。字段方面核心指标一般包括营业收入、净利润、资产总计、负债合计、所有者权益、研发费用、员工人数、资产负债率、净资产收益率。部分年份还会附带企业注册地、所属行业代码、成立日期。这些字段的命名在不同批次间可能存在细微差异比如“营业收入”在早期文件里可能写成“营业总收入”“净利润”可能区分“归母净利润”和“净利润”。合并前必须做字段映射否则后期做同比分析时会出现大量空值。2.2 数据清洗的第一步统一字段名与会计期间我一般会先写一个字段映射字典把各批次文件里的列名统一成一套标准名。下面这段Python代码就是干这个的依赖pandas和glob逻辑很直白遍历所有文件读进来重命名列再按年份和批次打上标签最后拼成一张大表。import pandas as pd import glob import os # 字段映射把各批次可能的列名统一 col_map { 营业总收入: revenue, 营业收入: revenue, 净利润: net_profit, 归母净利润: net_profit, 资产总计: total_assets, 负债合计: total_liabilities, 所有者权益: equity, 研发费用: rd_expense, 员工人数: employees, 资产负债率: debt_ratio, 净资产收益率: roe } all_dfs [] for file in glob.glob(data/**/*.csv, recursiveTrue): # 从路径中提取批次和年份假设路径形如 data/batch1/2013.csv parts file.replace(\\, /).split(/) batch parts[-2] # batch1 year os.path.splitext(parts[-1])[0] # 2013 df pd.read_csv(file, encodingutf-8-sig) df df.rename(columnscol_map) df[batch] batch df[year] int(year) all_dfs.append(df) panel pd.concat(all_dfs, ignore_indexTrue) panel.to_parquet(panel.parquet, indexFalse)这段代码的关键参数是encodingutf-8-sig因为很多从Excel另存为CSV的文件带BOM头用默认utf-8读会多出一个\ufeff字符导致第一列列名匹配不上。另外recursiveTrue配合**可以递归子目录省得手动列文件夹。跑完之后用panel.info()看一眼各列的非空计数如果某个字段空值超过30%就要回头检查是不是映射漏了或者该批次根本没采集这个指标。2.3 企业唯一标识的构建与去重不同批次之间可能有企业重复入选的情况——某家企业第一批没进第二批进了或者同一集团下的不同子公司分别入选。如果不做去重做行业汇总时会把同一实体的数据算两次。常见做法是用“企业名称统一社会信用代码”作为联合主键。但这份数据里不一定每行都有信用代码退而求其次可以用“企业名称注册地”做近似唯一键。去重时保留哪一条我一般保留年份最新的那条因为后期财务数据更完整。如果要做时间序列分析则不能简单去重而应该把同一企业在不同批次的记录视为同一实体的多次观测用企业名称分组后按年份排序再检查是否有同一年份出现两条记录的情况。3. 把财务指标变成可分析面板合并、对齐与衍生计算3.1 跨年合并后的缺失值处理策略拼成大表之后你会看到大量NaN。原因有三类企业当年未成立、当年未披露、或者该批次根本没回溯到那么早。处理方式取决于研究目的。如果做的是“入选前后对比”那么企业成立前的年份应该直接剔除而不是填零如果做的是“行业均值趋势”那么缺失值可以用行业中位数填充但要在论文里注明填充比例。我通常先算一个缺失值热力图按年份和批次交叉看如果某个批次在2013-2015年缺失率超过80%说明这个批次的企业普遍成立较晚强行纳入会拉低早期样本的代表性。# 查看各批次各年份的缺失情况 missing panel.groupby([batch, year])[revenue].apply(lambda x: x.isna().mean()) print(missing.unstack())输出会是一个矩阵行是批次列是年份值是缺失比例。如果发现batch1在2013年的缺失率是0.95而batch3在2013年是0.99那说明早期年份对这两个批次基本没有覆盖做时间趋势时应该从2016年或2017年开始截取。3.2 衍生指标增长率、研发强度与人均产出原始字段只有绝对额要比较企业质量得自己算比率。最常用的三个营收同比增长率、研发费用占营收比、人均营收。计算时注意两点一是增长率要用同企业上一年的数据不能跨企业二是研发强度在营收极小时会异常大比如营收10万、研发费用5万比值50%这种极端值要缩尾处理。panel panel.sort_values([企业名称, year]) panel[revenue_growth] panel.groupby(企业名称)[revenue].pct_change() panel[rd_intensity] panel[rd_expense] / panel[revenue] panel[revenue_per_employee] panel[revenue] / panel[employees] # 对研发强度做1%和99%缩尾 lower panel[rd_intensity].quantile(0.01) upper panel[rd_intensity].quantile(0.99) panel[rd_intensity_winsor] panel[rd_intensity].clip(lower, upper)pct_change()默认按行顺序算所以前面的sort_values不能省。缩尾用clip比直接删除温和保留样本量的同时压住极端值。人均营收如果遇到员工人数为0或缺失会变成inf记得用replace([float(inf), -float(inf)], pd.NA)处理掉。3.3 按行业和地区聚合的透视表做法做区域对比时需要把企业级面板聚合成“省份-年份”或“行业-年份”的汇总表。用pivot_table可以一次性算出均值、中位数、企业数量。注意聚合前要确保同一省份的名称写法一致比如“广东省”和“广东”要统一“深圳市”如果单独列出是否要并入广东取决于你的分析层级。region_summary panel.pivot_table( index[province, year], values[revenue, rd_intensity_winsor, revenue_growth], aggfunc{revenue: sum, rd_intensity_winsor: median, revenue_growth: median} ).reset_index()这里营收用sum是因为要算地区总盘子研发强度和增长率用median是为了避免被少数巨头拉偏。如果你关心的是“典型企业”的表现中位数比均值更稳健。跑完这个透视表可以导出到Excel用条件格式快速看哪些省份在哪些年份研发强度明显跳升。4. 避坑与排查这份数据最容易翻车的五个地方4.1 现象合并后企业数量对不上名单总数原因不同批次文件里企业名称的写法有差异比如“有限公司”和“有限责任公司”、“股份公司”和“股份有限公司”导致groupby时被当成两家企业。解决在合并前先做名称标准化用正则把“有限责任公司”统一替换成“有限公司”去掉括号里的备注信息再重新去重计数。如果数量仍然对不上检查是否有企业名称里带空格或全角字符。4.2 现象某年份净利润全为正但资产总计出现负值原因资产总计为负通常是数据录入错误或者该企业当年资不抵债且报表未做重分类。解决先标记出total_assets 0的记录逐条核对原始年报。如果无法核对建议将这类记录设为缺失而不是直接删除整行因为该企业的其他年份数据可能仍然可用。4.3 现象研发费用在某一年突然翻十倍原因可能是单位不一致比如前一年是万元后一年是元。也可能是企业当年合并了子公司研发费用口径变了。解决先看该企业前后年份的营收是否也同比例跳变如果营收没变而研发费用跳变大概率是单位问题。统一成万元后重新计算研发强度。如果确认是合并范围变化在分析时对该企业该年份加一个哑变量标记。4.4 现象用pct_change算增长率时出现inf或极值原因上一年营收为0或接近0导致分母极小。解决在算增长率之前先把营收小于1万元或你设定的阈值的记录设为缺失或者用np.where加一个条件只有上年营收大于阈值时才计算增长率否则返回NA。不要用fillna(0)去填那会制造出虚假的0增长。4.5 现象按省份聚合时发现某省企业数量逐年减少原因不是企业消失了而是该省新入选的企业被归到了其他批次而你的聚合只用了某一个批次的数据。解决确认聚合时用的是全量panel而不是单个批次的子集。另外检查省份字段是否有空值空值会被pivot_table默认丢弃导致总数偏少。5. 进阶用法用这份数据做同群对比与事件研究5.1 构建同群对照组按行业和规模匹配单纯看“小巨人”企业的增长说服力有限因为可能整个行业都在涨。更好的做法是给每家小巨人企业匹配一家非小巨人的同行业、同规模企业作为对照。这份数据本身不含非小巨人样本但你可以用它的行业代码和营收规模作为匹配依据去其他数据库比如上市公司年报里找对照。匹配时用马氏距离或倾向得分匹配PSM都行核心是控制住行业和期初规模。我一般用sklearn的NearestNeighbors做快速匹配特征用“期初营收对数”和“行业代码哑变量”。5.2 事件研究以入选年份为事件窗口如果你想知道入选“小巨人”对企业财务表现有没有实质影响可以把入选年份设为t0看t-3到t3的营收增长率和研发强度变化。做法是先从批次信息里提取每家企业的入选年份然后和panel按企业名称合并生成相对年份rel_year year - entry_year。接着按rel_year分组算均值画事件窗口图。# 假设entry_year已经合并进来 panel[rel_year] panel[year] - panel[entry_year] event_window panel[panel[rel_year].between(-3, 3)] event_avg event_window.groupby(rel_year)[[revenue_growth, rd_intensity_winsor]].median() print(event_avg)看结果时注意如果入选前三年增长率就已经在上升那说明存在选择效应——不是入选导致增长而是增长快的企业更容易入选。这时候需要配合PSM做进一步检验。另外事件窗口内的样本量会逐年减少因为不是每家企业都有完整的t-3到t3数据解读时要留意各年份的企业数量。5.3 一个我常犯的错误忽略会计期间调整早期年份的部分企业可能执行的是旧会计准则科目口径和新准则有差异比如“营业总收入”在旧准则下可能不含“其他业务收入”。我一开始没注意直接把2013年和2020年的营收做同比结果发现一批企业2014年营收暴跌后来才意识到是准则切换导致的。从那以后我每次做跨年比较前都强制走一遍口径核对先看该企业前后年份的审计意见类型再看财报附注里有没有“会计政策变更”的说明。如果实在无法对齐就在论文里加一段稳健性检验把2013-2015年的样本单独跑一遍和全样本结果对比。希望帮到你。本文还有配套的精品资源点击获取
返回列表