ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从xlsx到洞察:企业员工与裁员数据的处理、分析与落地

从xlsx到洞察:企业员工与裁员数据的处理、分析与落地 最近整理手头的数据资产发现一批横跨2000年到2024年的企业员工数、裁员数相关表格格式清一色xlsx。这些数据是我这几年做人力资源分析和商业研究时慢慢攒下来的从早期到处找公开披露文件到后来养成定时归档的习惯这份表格已经成了我观察企业用工变化最重要的底稿之一。这张xlsx里装着两类核心数字企业员工数和裁员数。员工数代表一家公司的用工规模裁员数则代表组织收缩的力度前者告诉你企业活得大不大后者告诉你企业活得紧不紧。把二十多年的数据拉通来看能明显感受到用工周期和经济周期的交叉影响。无论你是做HR数据分析、行业研究、企业信用评估还是单纯对商业史感兴趣这份数据都有东西可挖。而且因为用的是xlsx格式Excel、WPS乃至Python都能直接读写几乎不存在入门门槛。这篇文章我打算把这份数据的完整处理流程拆开讲先聊业务口径和字段设计再讲xlsx格式的底层机制以及两个高频问题然后是清洗实操和分析落地最后给一份常见问题排查记录。不管你是手里已经捏着类似数据还是准备从公开渠道自己搭一份这套流程都可以直接搬走用。1. 拿到这批数据前先想清楚要回答什么问题1.1 员工数和裁员数其实是两套完全不同的口径很多刚开始做数据分析的人容易把员工数、裁员数、离职人数混在一起实际上这三个概念背后的口径差异非常大。员工数一般是一个时点值比如某年12月31日公司在册的员工总数而裁员数是一个流量值指的是某一段时间内企业主动解除劳动合同的人数。两者一个是存量一个是流量计算方法和业务含义完全不能互相替代。具体到员工数还得区分是母公司口径还是合并报表口径。集团公司在年报里披露的人数往往涵盖子公司、控股公司甚至劳务派遣人员而单一法人主体的人数会小很多。我见过不少初学者拿一个口径的数据去对标另一个口径结果趋势解读完全跑偏。所以在整理数据的时候每一列都必须记录清楚这组数字来自哪个报告期、覆盖了哪些主体、是否包含劳务派遣。裁员数就更微妙了。绝大多数企业不会在财报里直接写“裁员”两个字更常见的表述是“优化组织架构”“业务重组”“人员结构调整”或者“离职补偿金支出”。我整理这批数据时的做法是优先用年报附注里的应付职工薪酬变动明细去推算再用新闻公告里披露的重组人数去做交叉验证。如果你的数据源里直接给了“裁员数”这一列务必看一下它的定义是“被动离职”还是“广义离职”这直接影响后续所有分析结论。1.2 从用途倒推字段设计数据才真正能被用起来拿到数据不能急着做图先问自己三个问题我要研究什么现象需要哪些字段数据粒度要到什么程度。这三个问题决定了表格的字段设计也决定了数据会不会在分析中途推倒重来。我见过至少三类典型用途对应的字段设计逻辑完全不同。第一类是行业景气观察核心关注的是员工总人数的年度变化和裁员规模波动这种场景下年份、行业代码、地区、员工总数、裁员数是刚需。第二类是单企业信用评估重点会落在单体企业的员工增速、裁员率、营收人效比上这时候除了人数还需要公司名称、证券代码、营业收入、净利润这些财务字段。第三类是HR效能对标关心的是主动离职率、被动离职率、招聘完成率那就要把离职原因拆成主动、被动、自然减员三个细项。我自己做这份2000-2024年数据时用的通用字段结构大概是这样的字段名说明示例年份数据所属年度2008企业名称公司全称某某科技股份有限公司证券代码便于关联财务数据600XXX行业代码按国标或申万行业分类C39注册地区省级/城市广东深圳期末员工总数12月31日在册人数12000年均员工数期初期末平均11850主动离职人数员工主动辞职350被动离职人数企业单方解除400裁员率被动离职/期初员工数3.3%数据来源年报/公告/统计文件2023年报备注口径异常说明含子公司不含劳务派遣这个结构不是一次定死的而是随着分析需求不断加的。比如后来我需要研究裁员对员工结构的影响于是又补了“管理人员数”“技术人员数”“生产人员数”几个字段。我的经验是字段宁可多留几个也别等到分析时才去补数据补数据的成本往往是最高的。2. xlsx格式的底层逻辑以及存储膨胀和格式漂移问题2.1 你手里的xlsx其实是一个压缩包不是单一文件做数据分析这么多年我发现大部分人对xlsx的认识停留在“Excel能打开的文件”这个层面。实际上xlsx从2007年开始成为Excel的默认格式它的本质是一个ZIP压缩包内部塞了一堆XML文件。你可以把xlsx想象成一个打包好的衣柜外壳是一个压缩包拉开拉链里面是分隔好的格子每个格子存放不同类型的东西比如工作表内容、字体样式、图片、图表、共享字符串等。因为页面结构是XML文本xlsx天生就比老式的二进制xls文件体积更小、容错性更好也更安全。老式的xls格式更像一本厚重的纸质账簿一旦页脚破损整个账本都可能打不开而xlsx的内部格子是模块化的某个工作表损坏其他文件通常还能抢救出来。这也是为什么现在的数据报表、导出功能、开放数据接口几乎都用xlsx的原因。了解这一点对数据分析有什么用非常有用。当你遇到一个超大xlsx文件打不开或者读取特别慢的时候你完全可以用解压工具直接打开这个zip包检查内部有没有异常大的XML文件。我曾经遇到一个几百MB的xlsx解压后发现罪魁祸首是sheet1.xml里有几十万条重复的字符串而不是数据本身有多庞大。这种情况在Excel里很难看出来但在压缩包层面一眼就能定位。2.2 xlsx文件为什么会越存越膨胀怎么瘦身“xlsx的存储膨胀”是我被问得最多的问题之一明明只改了几个数字文件却多出几十MB甚至原始数据没多少保存一次体积却翻倍。这个现象在长时间使用同一个工作簿的团队里特别常见原因往往出在共享字符串表、样式缓存和修订记录上。xlsx会建立一个共享字符串表用来统一存放所有单元格里的文本每个单元格只存一个索引。问题在于当你在Excel里反复编辑、撤销、复制粘贴时工作表里会积累大量“孤儿字符串”已经没有任何单元格引用了却依然躺在sharedStrings.xml里占空间。样式也是一样条件格式、单元格背景色、字体设置不断堆叠样式表越滚越大文件自然越来越肥。还有一个容易被忽略的元凶修订记录。如果打开了“共享工作簿”或者追踪修订功能每次保存的历史记录都会累计。解决存储膨胀的常规手段有这么几个一是全选复制所有数据粘贴到一个新的工作簿里从根本上丢弃旧的样式和字符串缓存二是清理条件格式规则尤其是那些整行整列应用的条件格式这样可以大幅减小样式表三是把历史修订功能彻底关掉四是如果文件确实很大直接用openpyxl重新读取再另存等于重新打包一次流出的垃圾XML也会被清理掉。我实测过一个原本80MB的工作簿用“另存为新文件清理样式”两条操作之后能瘦到20MB以内。2.3 WPS里xlsx格式全变xlsm是怎么回事怎么处理关于WPS把xlsx变成xlsm这里面有几个情况要说清楚。xlsm和xlsx本质上结构几乎一样唯一区别是xlsm允许包含宏代码也就是VBA程序。如果你的工作簿里没有任何宏却被存成了xlsm一般是下面几种情况第一种是打开的文件本身带宏。很多从网上下载的模板尤其是带按钮带自动功能的模板内部确实嵌了VBA代码。你在WPS里打开再保存默认会保留宏机制于是扩展名就变成了xlsm。第二种是WPS的另存为默认格式设置问题。WPS的“文件-选项-常规与保存”里有一个默认文件格式设置如果它被改成了“启用宏的工作簿”你保存普通表格时就会自动带上m的后缀。第三种是文件本身可能确实没有宏但WPS为了兼容性加了一个宏容器导致后缀变化。处理方式很简单先检查文件是否真的含宏“开发工具-宏”里看有没有代码。如果没有任何宏直接在另存为对话框里把文件类型改成“Excel工作簿(xlsx)”保存后即可。如果明确有宏而且你不需要它那么打开VBA编辑器把模块全部删除再另存为xlsx。我个人的习惯是对于只做数据分析的工作簿一律保存为纯xlsx不保留任何宏既能避免扩展名混乱也能降低文件被判定为可疑文件的风险。3. 2000-2024年数据的完整处理流程3.1 第一步数据获取只走合法公开渠道先建源文件档案做2000年跨度到2024年的数据不可能是某一天一次性下载完成的多数情况下是一年一年攒出来的。我在整理这份员工数、裁员数数据时数据来源主要分成几类企业公开年度报告、官方统计部门发布的劳动统计年鉴、行业协会发布的年度人事报告、以及公开数据库平台提供的上市公司治理明细。这些都是合法合规的公开渠道拿到之后一定要第一时间登记来源。我的建议是不要急着把所有数据揉进一个大表格先建一个“源文件档案”文件夹每下载一个原始文件就按“获取日期_数据源_报告期”命名比如“20240315_某公司2023年报_员工人数明细.xlsx”。然后在汇总表的最后一列记录来源和备注确保未来任何一个数字都能溯源。这一点太重要了。我就栽过跟头有一版2008年的数据找不到出处后来回推花了整整两天去核对从那次之后所有数据都必须带来源列。公开渠道拿到的数据不会是现成的、口径一致的尤其是“裁员数”这种企业不爱主动披露的指标经常要从公告里的“重组费用”倒推或者从新闻稿里找“人员优化计划涉及人数”。我对不同来源做过口径备注关键交叉数字都做了二次验证。在正式分析之前数据源必须可追、可查、可解释否则后面的一切结论都是空中楼阁。3.2 第二步清洗和标准化三步走把原始表变成分析表拿到的原始表往往是多个来源拼凑出来的字段名不统一、行业分类不一致、年份格式千奇百怪这些都得在进入分析之前一次处理掉。我把清洗拆成三步每一步都有明确目标。第一步是去重和去尾。同一家公司同一年在不同来源可能重复出现需要用“企业名称年份”做一个组合主键跑一遍重复检测。尾部的异常值要特别小心有些年份公司因为并购或分拆员工数出现极端的成倍增长或近乎归零的暴跌这类数据不是错误但一定要在备注里标出来避免在趋势图里造成误导。第二步是统一编码和日期格式。年份统一转成四位数字行业代码尽量统一到同一套标准我一般用国标行业分类GB/T 4754的两位数大类代码方便跨年对比。企业名称同样要做清洗带“股份有限公司”还是不带是不是存在改名情况这些都要整理成“当前名称曾用名”两个字段。2000年到2024年这二十多年里改名的企业非常多不处理的话同一家公司在图上会断成两条线。第三步是口径对齐。员工数到底含不含劳务派遣裁员数和主动离职怎么区分期初和期末人数用的是哪个时点这些在每个来源里的定义可能都不一样。我的做法是建一个“口径字典”工作表把每个年份、每个数据源的统计口径写清楚。遇到不一致的宁可舍弃某些记录也不要把不同口径的数字混进同一个指标列里。3.3 第三步Excel做交互探索Python做批量计算数据和清洗都到位后就是分析效率的问题了。我的工作流一般是Excel和Python配合使用各取所长。一两千行以内的数据Excel的数据透视表和切片器用起来非常顺手适合做交互探索鼠标点几下就能换维度看趋势。数据量一旦上到几十万行Excel就会明显吃力这时就要交给Python来处理。在pandas里读取xlsx非常简单但有一个细节值得注意read_excel会一次性把整个工作表读进内存面对超大xlsx时内存开销很高。我通常先用openpyxl的只读模式或者Excel的“另存为CSV”把数据集转成更适合批量处理的格式再用pandas读取。如果只是筛选、聚合、算比率pandas比Excel快出几个数量级。import pandas as pd # 读取xlsx指定读取“清洗后数据”工作表 df pd.read_excel(企业员工数_2000_2024.xlsx, sheet_name清洗后数据, engineopenpyxl) # 查看数据结构和缺失情况 df.info() print(df.isna().sum()) # 按年份汇总员工总数和裁员总数 annual df.groupby(年份).agg( 员工总数(期末员工总数, sum), 裁员总数(被动离职人数, sum) ).reset_index() # 计算整体裁员率裁员总数 / 期初员工总数 annual[期初员工总数] annual[员工总数].shift(1) annual[裁员率] annual[裁员总数] / annual[期初员工总数]这段代码本身不复杂但它把重复性的手工操作自动化了按年份聚合、算增速、算裁员率以后每年更新数据跑一遍脚本就能出来新结论。对于2000到2024年这种时间跨度很长的数据集这种可复用的批处理脚本绝对是值得花时间搭的。Excel适合快速看个大概Python适合做严肃的批量计算和可复现分析两条腿走路效率最高。4. 落地到具体分析趋势、对比与裁员率4.1 年度员工数趋势图怎么画信息量最大员工数趋势是大多数报告里都会有的图但很多人画出来就是一根单调的折线信息量非常有限。我建议把图分成两个层次第一层是员工总规模的柱状图或面积图反映绝对量变化第二层是同比增速的折线图反映相对变化节奏。两者放在同一个坐标系里或者上下拼接才能直观看出“规模大”和“增长快”不是一回事。比如某一年员工总数依然在高位但同比增速已经转负这就是一个值得关注的预警信号。2000年到2024年之间每隔几年就会有一次明显的用工收缩周期从图形上看是柱高降低和折线跌破零轴同时发生。脱离增速直接看绝对人数很容易把一个滞后信号当成领先信号。画图工具选哪种不重要Excel折线图、Python的matplotlib、在线图表工具都可以。重要的是标注关键事件比如行业政策调整、重大并购完成、业务剥离等时间点。我通常会在图上加垂直参考线配合简短文字说明这样读者一眼就能明白某个年份人数异常波动的原因而不是自己去猜。4.2 行业与地区对比的切片方式跨行业对比要特别注意行业分类的口径问题。2000年的行业分类标准和今天的分类标准有差异很多企业的主营业务也在二十多年里不断变换。我在处理这份数据时统一采用了最新的两位数行业代码重新归类所有历史记录并标注为基于当前主营业务的回溯修正。这样做虽然有一定的主观性但至少保证了时间序列上同口径可比。地区切片也是一个高频分析维度。企业员工数和裁员数按省份或城市聚合可以看出来不同区域的用工活力差异。我习惯用堆叠柱状图来展示分地区的员工总数构成用气泡图来展示“员工总数vs裁员率vs同比增速”三个维度的关系。这类图信息密度高用来做行业报告或者内部分析都很有说服力。需要提醒的是地区数据受注册地和实际经营地错配的影响非常大。有些公司注册在税收优惠地区实际办公却在另一个城市直接用注册地做地区分析会有偏差。如果你的分析对区位敏感最好补充“主要经营地”或“办公地址城市”字段数据会更贴近真实情况。4.3 裁员率这个指标怎么算才不容易挨打裁员率是这组数据里最核心的衍生指标但它也是一个很容易被误解的指标。最常见的问题是分子分母不匹配用“被动离职人数”做分子分母却写成“年末员工总数”这在逻辑上是有问题的。年末员工数已经是被裁员之后剩下的存量用它做分母会人为抬高裁员率尤其在裁员规模较大的年份失真非常明显。我推荐的算法是用“期初员工总数”做分母因为期初人数反映了裁员行为发生前的基数更接近真实的风险暴露水平。如果期初数据拿不到可以使用“期初与期末的平均员工数”在业务逻辑上也有意义。举个例子某公司期初1000人年末800人当年被动离职100人那么分母用期初1000裁员率是10%如果用年末800裁员率变成12.5%后者明显高估了。还有一个容易被忽略的点裁员率和主动离职率要分开看。主动离职率高说明组织留人能力弱裁员率高说明组织主动优化力度大业务含义截然不同。我在整理这组数据时特意把“被动离职率”和“总离职率”分成两列正是因为很多公开资料里“离职人数”是两者的混合体。如果只有混合数据宁可放弃这个指标也不要强行拆解拆出来的数字反而会误导决策。5. 常见问题与排查技巧实录5.1 xlsx文件打不开或提示损坏怎么抢救数据分析过程中最崩溃的场景之一就是xlsx文件打不开尤其是在截止日期前。遇到这种情况先别急着重做有几个抢救顺序值得记下来。第一步把文件扩展名改成zip用解压工具直接解开检查内部核心xml是否存在。如果能正常解压大概率只是某张工作表出了问题可以用文本编辑器打开对应的sheet xml去定位异常数据。第二步用WPS或Excel的“打开并修复”功能尝试修复。Excel的打开对话框右下角有一个“打开”按钮的下拉菜单里面藏着“打开并修复”选项很多文件损坏不严重时这一步就能救回来。第三步如果文件能打开但某张表不见了检查一下文件里是否存在隐藏工作表有时候并不是数据丢了只是工作表的可见状态被改成了隐藏。这些都是我踩坑之后总结的顺序基本遵循“从外到内、从轻到重”的救援策略。无论如何最重要的防线其实是平时的备份习惯我处理跨年数据一定会做“原始文件清洗文件分析文件”三重备份光这一个习惯就帮我避免了不知道多少灾难。5.2 数据口径混乱对不上账怎么快速定位做跨年度数据时最耗时间的往往是口径对不上账。比如你从两个数据库下载同一年同一家企业的员工数数字却差了两倍原因可能是其中一个源包含了劳务派遣另一个只有正式员工。我处理这类问题的思路很简单先进入审核模式别再管分析把两个数据源各自的统计定义和附注说明找出来逐字对比看到底差在哪里。有一个实用小技巧把两个来源的数据按月份或季度画一下如果只是系统性偏差比如其中一边始终是另一边的固定倍数那多半是口径包含范围不同。如果偏差时大时小很可能是数据源本身的质量问题。系统性偏差可以调整随机偏差就只能换源验证。另外年份错位也是一个高发问题有些报表用日历年度有些用财年财年截止日不同的数据直接混在一起就是灾难。我在最终表格里加了一列“口径状态”取值是“统一口径”或“已验证差异”这样后续分析可以一眼排除掉不可靠的记录。口径问题永远比数值错误隐蔽得多它也最能体现一个数据分析师的基本功。5.3 “鸢尾花数据集下载xlsx”这件事给我的启发最近看到不少人在搜“鸢尾花数据集下载xlsx”一开始我没反应过来后来明白了鸢尾花数据集是机器学习领域最经典的入门数据通常以csv格式分发但很多教学场景为了方便学员用Excel打开特地做成了xlsx版本。这个细节其实很能说明问题在真实工作环境里很多分析任务的数据格式起点并不是学术标配的csv而是办公室标配的xlsx。对企业员工数、裁员数这类数据来说xlsx格式不只是存储工具更是一种团队协作的共识语言。做数据分析的人如果只熟悉pandas里的csv直读到了实际工作现场会遇到各种格式阻力。反过来如果你能熟练处理xlsx的多种变体、理解不同工作簿间的联动、知道如何避免格式漂移那你在实际项目里就能少走很多弯路。鸢尾花数据集的意义在于让人在最小样本上练熟一套工具练完之后迁移到几万行的企业数据上思维路径是完全一致的。5.4 大表格卡顿和内存占满的实战优化员工数据按年份积累下来行数虽然远达不到大数据的量级但在Excel里反复操作时依然会卡。我遇到过几十万行的xlsx随便筛个条件就要转圈半分钟内存占用一直居高不下。这种情况的优化思路无非三个方向数据瘦身、工具降级、格式转换。数据瘦身指删除不用的列和样式把宽表拆成长表或窄表去掉合并单元格避免整列条件格式。工具降级指在Excel卡顿明显时果断把活交给Python或SQLite这类更适合批量处理的工具。格式转换是指把xlsx转成csv或者parquet格式跨工具协作时效率能提升好几倍。对我来说xlsx更适合做最终交付和分析交互真正的大批量清洗计算还是交给Python更稳妥。还有一个专门的坑xlsx里嵌入大图片或者图表对象会导致文件体积猛增拖动和筛选都跟着变慢。对于数据分析工作簿我一般只保留必要图表源数据里的插图一律移除。记住xlsx是数据容器不是作品集把展示内容留给报告去承载就好。6. 最后再聊几句实际操作中的体会这批2000到2024年的企业员工数和裁员数数据我前前后后迭代过四个版本。第一个版本只有员工总数完全看不出裁员趋势第二个版本加入了被动离职人数却发现口径混乱根本没法跨年比第三个版本统一了口径和编码分析图才终于立得住第四个版本加上了数据溯源清单交付的时候心里才真正有底。我个人最大的体会是横向时间跨度长的数据价值不在某一个年份的绝对值而在于趋势、拐点和周期。2000年时很多企业还在扩张期员工数逐年攀升中间经历了多轮经济波动裁员数呈现明显的脉冲式特征再到近几年越来越多企业选择用组织调整而不是大规模裁员来应对不确定性。这些变化用单一年份的数据完全看不出来但放在二十多年的xlsx表格里规律会自己浮现出来。如果你也想自己动手整理一份类似的数据我的建议是先明确要回答的问题再确定字段结构然后老老实实做源文件档案清洗时宁可保守也不要激进。xlsx格式本身没有多玄妙真正值钱的是你对数据的理解和处理数据的严谨程度。这批数据未来肯定还会继续更新我也会持续把新一年的数据并入这个工作簿让这张表一直长下去。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进