拓冰建站拓冰建站
首页 / 资讯中心 / 正文

上市公司内部薪酬差距数据处理与实证回归实操指南

上市公司内部薪酬差距这六七个字是公司金融、公司治理研究里绕不开的话题。2012—2024年13个年度的上市公司面板数据听起来只是“一叠Excel加几段代码”但真正自己从头整一遍就会明白这个看似常规的指标口径差一点、处理粗一点结果就能跑出完全相反的方向。这个题目我前后折腾了好几轮从数据清洗、变量构造到Stata回归全流程踩过不少坑今天把这份“上市公司内部薪酬差距数据”背后的做法拆开讲清楚也会把代码思路、文献搭配和实际遇到的问题一并整理出来给打算复跑实证、做课程论文或者写公司治理方向研究报告的朋友一份可以直接上手的参考。1. 内部薪酬差距数据到底在解决什么问题1.1 为什么大家都盯着“内部薪酬差距”这个指标先明确一点内部薪酬差距指的是企业内部不同层级人员之间的薪酬差异最常见的是高管与普通员工之间的差距也包括高管团队内部一把手和其他高管之间的差距。学术界和实务界之所以对这个指标兴趣浓厚根源在两种理论锦标赛理论薪酬差距是一种“竞赛奖金”。只要能往上爬赢了的人拿到远超普通水平的报酬这会刺激所有人努力工作。差距越大激励效应可能越强。行为理论人不是纯经济机器员工会拿自己和上级比。差距过大会让人觉得不公平、产生被剥削感反而降低协作、增加离职率甚至诱发盈余管理等短视行为。正因为两种理论预测方向相反内部薪酬差距到底怎么影响企业绩效就变成了一个实证问题。早期文献大多讨论“差距大一点好还是小一点好”后期研究则关注更细的机制差距是提升了投资效率还是加剧了风险承担是促进创新还是诱发管理层短视如果想在论文里讨论这些问题你首先得有一个可靠、口径一致的“内部薪酬差距”变量。2012—2024年的长面板恰好覆盖了上市公司治理规则逐渐完善、薪酬披露越来越规范的阶段样本期间足够长适合做动态面板和政策类研究设计。1.2 这份数据适合谁用、能做什么我自己理解这份“数据代码文献”的完整包最适合三类人写公司金融、劳动经济、会计方向毕业论文的研究生刚入门实证研究、需要靠谱“初始数据”来练手的研究助理想快速做行业薪酬分析报告又不想从年报PDF里手工抓数据的分析师。拿到这组数据后至少可以做几件事描述统计年度行业薪酬差距的整体趋势、行业差异、所有制差异。基准回归检验薪酬差距与企业ROA、ROE、TobinQ之间的关系。机制识别把样本切分为不同子样本看差距在激励和公平之间的净效应。稳健性测试换口径、换缩尾标准、换固定效应模型确认结论是否稳定。一般公开渠道能拿到的薪酬数据往往不完整比如只给了高管薪酬总额或者员工薪酬需要用现金流量表项目倒推口径处理非常麻烦。把数据整理成可直接merge的面板结构就省掉了最耗时的一步。1.3 和普通薪酬数据比关键差异在哪市面上常见的“高管薪酬榜”里只有董事、监事和高管的个人薪酬它回答的是“老板拿了多少钱”。而内部薪酬差距数据必须把高管薪酬和普通员工薪酬放在同一个框架里比较所以还牵扯到员工人数的准确估计、薪酬总额归属期间、高管人数口径等细节。千万不要以为拿“高管平均薪酬减员工平均薪酬”是唯一解法光这个定义就有好几种主流做法后面我会专门展开。2. 动手处理前必须定下来的三件事2.1 什么叫“内部”要先定义清楚同样是“内部薪酬差距”实证文献里至少有三种截然不同的口径。口径类别具体含义常见处理方式适用研究问题高管-员工差距高管团队平均薪酬与普通员工平均薪酬的比值或对数差高管平均薪酬 董事、监事及高管年薪总额 / 高管人数员工平均薪酬 应付职工薪酬净增加额或支付给职工现金 - 高管薪酬总额/员工总数 - 高管人数研究公平感知、劳资关系、全要素生产率高管团队内部差距CEO薪酬与其他高管平均薪酬的差异非CEO高管薪酬均值作为参照研究团队协作、继任竞争CEO-员工相对差距只拿薪酬最高的个人和员工平均水平比用“披露薪酬最高的前三名高管平均值”代替CEO薪酬锦标赛理论做检验我自己在整理时默认优先做“高管-员工差距”因为这个口径的数据来源最稳、文献基础最厚。高管-员工差距还可以细分两种算法一种是直接用“董事、监事和高管年薪总额 / 高管人数”得到管理层平均薪酬另一种只取“高级管理人员”剔除董事和监事。后者的优势是更贴近内部治理含义但部分上市公司披露质量参差不齐会导致大量缺失值所以复现文献时要注意原文的口径表述。2.2 员工平均薪酬的数据来源怎么取这是整个数据整理中差异最大的地方也是必须写进代码注释里的关键决策。员工平均薪酬不是公司年报里直接给你的现成数字通常由两个路径倒推路径一用现金流量表的“支付给职工以及为职工支付的现金”减去高管薪酬再除以员工人数。这个口径更容易受离职补偿、劳务派遣、社保公积金支付时间影响。路径二用资产负债表“应付职工薪酬”科目的期末余额减期初余额加回本期计提工资、奖金、津贴和补贴。这个口径更接近“应归属于当年的劳动报酬”但受应付职工薪酬明细分类披露质量影响。从我过去处理的数据看两条路径算出来的薪酬差距在个别公司上可能差20%以上。原因很简单现金流量表项目包含所有为职工支付的现金可能把辞退福利等非经常项目也带进去而资产负债表路径更偏权责发生制。因此一套完整的数据集最好同时保留两种算法让使用者根据论文假设选择。2.3 变量保留粒度直接决定后续分析空间不少初处理数据的人喜欢一开始就只保留最终计算好的“薪酬差距”一个变量这是大忌。你永远不知道后面会因为更换员工人数的代理指标或改换高管定义而需要重新计算。我更建议原始数据按公司-年份维度保留中间关键字段包括证券代码、证券简称、年份员工总人数高管薪酬总额、高管人数董监高薪酬总额、董监高人数薪酬最高的前三位高管薪酬总额支付给职工以及为职工支付的现金应付职工薪酬期初余额、期末余额归属于母公司的净利润、营业收入、总资产、总负债等常规财务变量。这样一份宽表既可以在Stata或Python里随时重新计算薪酬差距也可以直接和会计类数据库merge不用反复回到原始表。3. 从零到一构建面板数据的完整实操代码3.1 文件目录与处理顺序我处理数据时习惯这样组织文件project/ raw/ exec_comp.csv employee_pay.csv basic_info.csv financials.csv code/ 01_build_data.py 02_paygap_calc.py 03_merge_data.py 04_regression_stata.do output/ panel_paygap.csv panel_paygap.dta先用Python把各家数据库原始表合并、清洗成标准长表再把中间结果保存为dta文件交给Stata做缩尾和回归。这样既能利用Pandas灵活的字段处理能力也能利用Stata在计量模型面板估计上的便利。3.2 Python读入并检查原始数据假设公司基本信息已经导入代码的第一步通常是统一股票代码格式。import pandas as pd df_basic pd.read_csv(raw/basic_info.csv, dtype{Stkcd: str}) df_exec pd.read_csv(raw/exec_comp.csv, dtype{Stkcd: str}) # 把股票代码补足6位数字 df_basic[stkcd] df_basic[Stkcd].str.zfill(6) df_exec[stkcd] df_exec[Stkcd].str.zfill(6) # 检查核心缺失 print(df_exec.isnull().mean()) print(df_exec[year].value_counts().sort_index().head())注意有些数据库会把退市公司中途剔除如果要做长时间面板建议把历史上的退市公司也一并保留到退市前年份否则样本选择偏差会非常难看。这一点常被忽略却直接影响后续回归结论尤其是2012年到2024年这段时间里行业洗牌速度很快。3.3 核心变量计算高管薪酬和员工平均工资先计算“董监高平均薪酬”再倒推“普通员工平均薪酬”。这里我使用最常见的“现金流量表项目修正项”方式。# 算出管理层的平均薪酬 df_exec[exec_comp_total] df_exec[director_supervisor_mngr_comp] # 董监高年薪总额 df_exec[exec_count] df_exec[director_supervisor_mngr_num] # 董监高人数 df_exec[avg_exec_pay] df_exec[exec_comp_total] / df_exec[exec_count].replace(0, pd.NA) # 员工薪酬总额 df df_basic.merge(df_exec, on[stkcd, year], howinner) df df.merge(df_cashflow, on[stkcd, year], howleft) df[staff_comp] df[cash_paid_to_staff] - df[exec_comp_total] df[staff_num] df[total_employees] - df[exec_count] df[avg_staff_pay] df[staff_comp] / df[staff_num].replace(0, pd.NA)这里最容易踩坑的地方是“高管人数”。不同数据库对高管人数的定义不同有的是董监高总人数有的是高级管理人员人数有的只算完整任职年度有的把独立董事也算进去。独立董事薪酬通常不高如果混入高管团队会拉低管理层平均薪酬导致高估薪酬差距。稳妥做法是保留“高管薪酬总额”和“董监高薪酬总额”两个维度供使用者选择。3.4 薪酬差距指标与对数处理薪酬差距通常有三种最终形态绝对差距 高管平均薪酬 - 员工平均薪酬相对比值 高管平均薪酬 / 员工平均薪酬对数差 ln(高管平均薪酬 / 员工平均薪酬)。对数差在实证中更常见因为对数能缓解右偏分布估计系数也好解释薪酬差距每变动1%被解释变量的变化幅度是多少。import numpy as np df[paygap_abs] df[avg_exec_pay] - df[avg_staff_pay] df[paygap_ratio] df[avg_exec_pay] / df[avg_staff_pay] df[paygap_ln] np.log(df[avg_exec_pay]) - np.log(df[avg_staff_pay]) # 剔除异常值 df df[(df[staff_num] 10) (df[avg_staff_pay] 0) (df[avg_exec_pay] 0)]员工人数小于等于10的公司薪酬结构往往不可比建议直接从样本中拿掉否则会在分布两端制造一堆离谱的极值。3.5 缩尾处理到底该在哪个环节做这一点我帮不少朋友改过很多人习惯把原始薪酬总金额先缩尾再计算差距这在逻辑上是错误的。缩尾处理要在“最终进入回归的变量”上做例如对paygap_ln进行1%缩尾而不是对分子分母分别缩尾。如果先缩尾分子分母再相除或取对数你得到的已经不是真实样本分布。建议直接用Stata的winsor2做百分位缩尾use output/panel_paygap.dta, clear xtset stkcd year winsor2 paygap_ln paygap_ratio roa tobinq firm_size, replace cuts(1 99) save output/panel_paygap_winsor.dta, replace缩尾阈值一般选1%和99%两端这对薪酬类数据已经足够。如果担心变量被极端值影响可以再换5%和95%做稳健性检验。4. 数据跑通后实证模型和研究设计如何落地4.1 基准模型怎么搭最常见的基准设定是双向固定效应模型[ Y_{i,t} \alpha \beta\ PayGap_{i,t} \gamma\ X_{i,t} \mu_i \theta_t \varepsilon_{i,t} ]其中 ( Y_{i,t} ) 可以是企业业绩、投资效率或者创新产出( \mu_i ) 是企业固定效应用来吸收不随时间变化的企业特征( \theta_t ) 是年份固定效应用来吸收宏观层面的共同冲击。标准误需要在企业层面聚类否则会因为同一个企业的面板误差相关而低估标准误。Stata里用reghdfe顺手就能跑reghdfe roa paygap_ln size lev growth board pay, absorb(stkcd year) vce(cluster stkcd) estimates store m1 reghdfe tobinq paygap_ln size lev growth board pay, absorb(stkcd year) vce(cluster stkcd) estimates store m2 esttab m1 m2 using output/reg.rtf, replace b(%9.4f) t(%9.3f)这里paygap_ln的系数代表的是“企业内部的横向比较”当年薪酬差距更大的企业是否业绩更好或者反而更差。加入年份固定效应后不同年份因为宏观薪酬水平整体抬升导致的变化就不会混入我们的估计系数里。4.2 因果推断怎么办一个常见的批评是业绩更好的公司可能本来就有钱发高薪酬也会主动拉大激励差距也就是反向因果问题。对策大致有几类滞后自变量用上一期或前两期的薪酬差距解释当期绩效这在Stata中用L.paygap_ln实现工具变量寻找与薪酬差距相关、但与企业业绩不直接相关的变量。比如同行其他公司平均薪酬差距或者地方最低工资标准外生冲击利用外部制度环境变化做双重差分比如某些强制信息披露规则升级后薪酬谈判对标行为增强控制管理层能力和企业复杂度比如加入CEO是否兼任董事长、高管持股比例、独立董事规模等变量。数据里把高管个人特征尽量多保留后面就能直接在“是否兼任”“是否持股”子样本上做异质性分析不需要重新翻原始数据。这里特别提醒实证回归遇到不显著结果是很正常的事。如果换口径后系数方向反转那不是代码问题而是经济机制本身在不同口径下可能有不同含义。写文章时一定要回到理论解释清楚你用的口径对应哪一种理论情境。4.3 文献部分怎么搭更省力项目自带“文献”的意义不只是为了让你引用时不用大段复制粘贴而是提醒你引用文献和研究假设必须跟数据处理口径自洽。在内部薪酬差距方向我通常建议建一个双向文献分组理论文献组锦标赛理论相关文献选1-2篇奠基性文献用来解释薪酬差距能激励努力行为理论相关文献选1-2篇实验或实证文章用来解释公平偏好会抑制差距代理理论文献用来解释高管薪酬契约设计的本质。中国制度背景文献组这类文章多使用中国上市公司样本讨论员工薪酬刚性、国企与民企差异、高管限薪背景、劳动力市场流动等。引用它们时要注意样本期间不要拿2012年以前的结论直接外推到2024年之后。文献不在于多而在于每一篇都在回答你的研究设计中的一个环节。如果文献用了A类口径你的主回归却用了B类口径审稿人一问就会露馅。5. 处理13年数据时反复踩到的高频问题5.1 必须注意的高频异常情景速查表格里整理的这些问题每一类我都真实遇到过。按重要性排列序号问题现象根本原因处理建议1员工平均薪酬为负数高管薪酬总额超过了“支付给职工现金”检查是否存在劳务外包、内部结算或者高管薪酬非现金化删去极值样本2薪酬差距为0董监高人数为0或者没有披露年报可能只披露了部分高管薪酬不能当真实值使用3某年员工人数减半公司外包生产岗位或重大资产重组对比年报“员工总数”附注谨慎保留必要时加员工变动率控制变量4顶薪人员来自境外子公司高额美元薪酬折算人民币后导致支付总额异常可做敏感性分析剔除极端值后看结果5同一公司不同数据库数值不一致数据库抓取的是报表披露总额还是补充公告调整值尽量以年报“董事、监事和高级管理人员报酬情况”为准做交叉验证6股票代码带后缀B或退市标记未统一代码格式造成merge失败所有代码统一为6位数字退出公司保留退市前样本7缩尾后变量仍不服从正常分布薪酬分布天然幂律化考虑对薪酬再做自然对数或者用中位数回归辅助检验8年份标签错位年报期间跨年、适用年度不统一以公司会计期间年份为准不太使用公告日期做聚合5.2 我自己养的三个好习惯第一每做一次清洗就把条件写成一个“清洗日志”。比如drop if staff_num 10 // 样本量小不可比 - 删除189条 winsor paygap_ln, p(0.01) // 缩尾1% - 修正极端值这样后续写论文的“样本筛选过程”部分会非常轻松不用再回忆。第二要多保留一版不缩尾的中间数据。有些编辑或审稿人要求你用不同缩尾区间复跑如果只存缩尾后的最终文件还得从零开始重算。保留中间宽表换一次缩尾阈值只是几秒钟的事。第三绝不能忽视员工人数中的“在职”和“报告期末”的区别。年报里员工人数按报告期末时点数统计而薪酬支付额是全年累计数。如果公司在年度中旬集中招聘或裁员严重公式算出的员工平均薪酬会被系统性地高估或低估。遇到人员结构变动大的年份最好在结论部分承认这个局限。6. 数据边界、后续扩展和一点个人体会6.1 这套数据解决不了什么先泼一盆冷水不管口径怎么精确年报里公开的货币薪酬都只是“冰山一角”。高管收入还包括股权激励、期权、养老金计划、在职消费、免费住房和用车等非货币福利。普通员工薪酬也可能包括社保、公积金、企业年金。如果我们只用董监高年薪总额减出来的员工平均薪酬严格意义上处理的是“账面薪酬差距”而不能等于“实际经济薪酬差距”。所以如果负责的企业或者课题特别关注长期激励就需要另外补股权激励数据。常见的做法是构建一个“总薪酬”版本把高管当年行权收益、限制性股票解禁收益估算出来加进薪酬总额后再重新算差距。这个思路虽然复杂但能更好地刻画高管薪酬的真实激励水平尤其对于高科技企业和互联网公司来说非常关键。6.2 可以继续扩展的三个方向把薪酬差距和数字化转型结合起来。2012—2024年正好是数字技术深度渗透企业运营的阶段可以用年报文本挖掘得到数字化程度指标看转型背景下薪酬差距对创新的影响是否改变。结合企业ESG数据。薪酬公平本身就是ESG中“社会维度”的一部分可以用来分析企业内部薪酬结构与外部ESG评级的关系。从水平差距扩展到变动趋势。计算每个企业薪酬差距的年度增长率研究薪酬差距的“上升惯性”是否带来人才流失这比单纯看存量水平更有动态洞察力。我个人的体会是这类数据集最核心的价值并不在最终指标本身而在清洗过程里积累的对公司的理解。每次看年报注释里关于员工人数、高管薪酬的那几行字都会发现高管薪酬受子公司薪酬政策影响明显也受不同行业的薪酬结构决定。把这种结构性差异放进研究框架里做出来的回归才不会只是“数字搬运”。如果你正准备用2012—2024年的数据写论文或者做报告建议拿到数据后不要急着回归先画一张均值趋势图看看整体内部薪酬差距年度走势。你会发现2012年附近和2020年之后的趋势有明显差异这种直观感受能帮助你更好地选择模型设定和样本分割点。数据只是半成品真正让研究活起来的是你对每个数字背后业务故事的理解。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门