尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

招聘数据分析实战:从RAR压缩包到可视化报告全流程拆解

招聘数据分析实战:从RAR压缩包到可视化报告全流程拆解 简介数据分析项目的起点往往是一堆杂乱无章的原始文件比如一个压缩包、几张Excel表、若干CSV和PDF。真正的价值不在于数据本身而在于如何通过系统化的数据处理流程把原始数据转化为可支撑决策的结论。数据清洗是其中最核心的环节包括文本标准化、缺失值处理、字段归一化等基本功而薪资解析和岗位分类又是招聘场景下的高频难点。借助Python生态中的pandas、matplotlib等工具分析师可以有效完成从数据体检、清洗建模到图表输出的完整链路。这一套方法论不仅适用于厦门招聘数据也能泛化到企业人事分析、行业薪酬调研、人才供需预测等场景。本文以一份真实的招聘数据项目为例完整拆解了从RAR文件解压、编码处理、去重补全到维度构建和报告呈现的每个步骤帮助读者避开常见陷阱快速上手招聘类数据分析。 上个月整理硬盘翻出来一个老压缩包名字叫“2021厦门招聘数据分析.rar”是我当初接的一个本地化招聘行情分析项目留下的原始资料包。时隔几年重新打开里面那份数据结构还挺有代表性的正好可以拿来做一篇完整的实战拆解。如果你手里也有一批招聘数据、企业名录或者行业调研的原始表格想做成一版能交付的分析报告那这篇文章应该能帮你省下不少弯路。这里先说明一点整个项目从解压到出报告全程用的是公开渠道能拿到的常规工具和Python库没有涉及任何爬虫、私域数据或者灰色手段所有分析维度也都是脱敏后的业务层面结论。下面按我当时实际操作的顺序把每一个环节的关键动作、踩过的坑和处理思路完整过一遍。1. 拿到压缩包之后先别急着解压想清楚分析目标很多人拿到一个.rar文件第一反应是赶紧解开看看里面有什么。这个习惯在赶进度的时候能理解但正式做数据分析项目时我建议你先停下来花十分钟想清楚三个问题这批数据解决什么问题是看2021年厦门整体招聘热度还是对比不同行业薪资还是看特定岗位的技能要求变化输出物是什么形态是一张Excel汇总表、一份PDF分析报告还是一套可交互的BI看板数据质量能不能支撑结论如果数据缺失率超过30%很多分析维度就要提前砍掉或者降级处理。我当时接到的需求很明确围绕2021年厦门招聘市场输出一份包含岗位分布、学历要求、经验要求、薪资区间、行业需求等维度的分析报告附可视化图表。所以数据解压之前我先列了一个字段清单哪些字段必须有哪些字段只是锦上添花。从实战角度讲招聘数据的分析目标通常逃不出三类供求职者了解市场行情、供企业校招社招定价、供政府和园区做产业人才规划。不同的目标决定了后续分析的颗粒度。如果你是给个人求职者做参考那城市内部各区的差异、岗位平均薪资、面试经验要求就是重点如果你是给企业做薪酬对标那分岗位分职级的薪资分位数比平均值更有价值如果你是帮园区做产业分析那行业分类、企业规模、职位供给增速才是核心。这个阶段不需要写代码但建议用备忘录或者纸笔把分析框架列出来后面所有数据处理都围绕这个框架走否则很容易在清洗时被各种无关字段带偏。2. 解压只是第一步真正的坑在文件体检和编码处理2.1 解压方案的选择图形工具还是命令行.rar格式的解压本身不复杂但不同场景下效率差别很大。如果你只是解一两个文件用WinRAR、360压缩、7-Zip这类图形工具双击就行右键解压到指定目录三秒钟结束。但如果你跟我一样后面要写Python脚本做二次处理和自动化建议直接用命令行。Windows系统装了WinRAR之后在cmd里可以调用unrar命令如果装了7-Zip可以用7z x命令解压。我当时的做法是在Python脚本里调用rarfile库直接读取压缩包内容并解压指定文件省去人工操作环节。import rarfile rar_path 2021厦门招聘数据分析.rar extract_path ./data/ rf rarfile.RarFile(rar_path) rf.extractall(extract_path) print(rf.namelist())注意rarfile库默认依赖于本机的unrar组件如果直接extract报错先确认命令行能不能执行unrar否则需要配置UNRAR_TOOL路径或者改用其他解压方式。2.2 解压后的文件体检扩展名、编码、行数、缺失率压缩包解开之后里面通常不是一张干干净净的表而是一个杂乱的文件夹可能有多个Excel文件、CSV、PDF招聘简章甚至还有图片截图。我那次遇到的是一份Excel主表加若干附件。先做一次“体检”用一段代码快速了解数据全貌import pandas as pd df pd.read_excel(./data/2021厦门招聘数据_清洗前.xlsx, sheet_name原始数据) print(df.shape) print(df.columns.tolist()) print(df.dtypes) print(df.isnull().sum())体检结果决定了后面的清洗方案。比如我发现那张表有2万多行但其中公司名称缺失了2000多行薪资字段缺失了3000多行还有不少“面议”这种无效值。这种情况下直接删行会损失大量样本所以清洗策略要做三档处理关键字段缺失的行直接剔除非关键字段缺失的行保留但标注薪资类字段靠文本解析和填充规则补全。编码问题也得一并检查。很多Excel导出的CSV是GBK编码直接用pandas默认的utf-8读取会乱码需要这样处理df pd.read_csv(./data/xxx.csv, encodinggbk)如果打开后还是乱码可以尝试encodinggb18030这是GBK的超集兼容性更好。还有一种情况是从网页直接粘贴到Excel里的数据里面会混入大量换行符、制表符和不可见字符清洗阶段一并处理。3. 招聘数据清洗从脏乱差到可分析核心就这几招3.1 岗位名称标准化招聘数据里最头疼的字段岗位名称绝对排第一。同一个岗位不同企业的叫法五花八门Java开发工程师、Java高级开发、Java后端开发、JAVA程序员、Java软件工程师……如果直接按原始文本统计结果会碎成一地。处理思路是建立一套“岗位分类映射表”把底层岗位归到职能大类。比如技术类Java、Python、前端、测试、运维、算法、数据分析、DBA产品类产品经理、产品助理、游戏策划运营类新媒体运营、电商运营、内容运营、用户运营设计类UI设计、平面设计、视觉设计销售类销售代表、客户经理、渠道销售市场类市场推广、品牌公关、活动策划职能类HR、财务、行政、法务用apply函数做映射如果匹配不上就保留原文最后人工抽查一批。def map_job_category(title): title str(title).lower() rules { 技术类: [java, python, 前端, 测试, 运维, 算法, 数据分析, 后端, 开发], 产品类: [产品经理, 产品助理, 策划], # 省略其他规则 } for category, keywords in rules.items(): if any(kw in title for kw in keywords): return category return 其他 df[岗位大类] df[岗位名称].apply(map_job_category)这里要提醒一点规则匹配的顺序很关键关键词之间有包含关系时要把更具体的规则放在前面。比如“数据分析师”不能先被“数据”匹配到别的类目里所以要把“数据分析”放在“数据”之前。更稳妥的方式是用正则表达式配合词边界避免子串误匹配。3.2 薪资字段解析招聘数据里的薪资表现形式五花八门我遇到过这几种8千-1.2万8k-12k10-15万/年3000-4500元/月15-25K·13薪面议要用于分析必须统一转成数字。我的做法是写一个解析函数把文本拆成区间上下限再统一换算成月薪万元。import re def parse_salary(text): if not isinstance(text, str): return None, None, None text text.replace( , ).replace( , ) if 面议 in text or 面谈 in text: return None, None, None # 提取所有数字 nums re.findall(r[\d.], text) if not nums: return None, None, None # 判断单位 unit 1.0 # 默认元/月 if 万/年 in text or w/年 in text.lower(): unit 10000 / 12 elif 万 in text or w in text.lower(): unit 10000 elif 千 in text or k in text.lower(): unit 1000 # 如果只有1个数就当固定值 if len(nums) 1: low high float(nums[0]) * unit / 10000 mid low else: low float(nums[0]) * unit / 10000 high float(nums[1]) * unit / 10000 mid (low high) / 2 return round(low, 2), round(high, 2), round(mid, 2) df[月薪下限(万)], df[月薪上限(万)], df[月薪中位(万)] zip(*df[薪资].apply(parse_salary))解析完成之后不要把原始文本删掉万一发现换算规则有问题还可以追溯。我当时就因为“13薪”这种表述专门写了一版判断逻辑凡是包含“13薪”或“14薪”的在计算年薪时乘以对应倍数但月薪展示时还是用基本月薪口径并且单独加一个字段标注“是否含13薪以上”。3.3 去除重复与异常值招聘数据里的重复问题比想象中严重。同一家公司的同一个岗位可能被多个渠道重复发布同一份原始数据里也可能有几条内容相同、只有URL参数不同的记录。去重不能只看岗位名称要结合公司名称、工作地点、薪资、经验、学历这几个字段做联合判断。直接用df.drop_duplicates(subset[公司名称,岗位名称,工作地点,薪资,经验,学历])先做一轮物理去重。但这里有个坑Excel表里看着一样的公司名称可能有全角和半角空格、不换行空格、以及“厦门分公司”和“厦门分公司”这种写法差异。我通常先把文本字段统一做一次标准化把常见标点转半角、去除空格再用标准化后的字段做去重。异常值方面招聘数据经常出现薪资区间离谱的情况比如月薪2000的“技术总监”或者月薪8万的“实习生”多数是录入错误或者企业挂的引流岗。对于这种记录我的处理原则是保留原始文本但在数值字段上打标记后续统计时用分位数截断而不是直接删除比如只保留月薪在P1到P99之间的记录做薪资分析。4. 分析维度设计与业务结论拆解数据清洗到你满意为止接下来进入正题从哪些维度看能看到什么结论。4.1 供需热度分析招聘量可以从两个角度解读一是招聘岗位数本身代表企业端的用人需求二是岗位的竞争程度通常用“投递人数/招聘人数”近似但2021厦门这批数据里没有投递量所以只能从岗位供给端做分析。我当时按行业、岗位大类、企业规模、工作地点几个维度分别做了数量统计。从结果看2021年厦门的招聘需求集中在软件和信息技术服务业、制造业、批发零售业这个和厦门本地产业政策是吻合的。具体岗位大类里技术类岗位发布量最大其次是销售类这两个大类加起来占了总量的40%以上。代码上就是简单的groupby和value_countsindustry_count df.groupby(行业).size().sort_values(ascendingFalse).head(20) job_count df.groupby(岗位大类).size().sort_values(ascendingFalse)4.2 薪资结构分析薪资分析不能只算平均值平均值会被头部高薪岗位拉高看中位数和分位数更稳。我按岗位大类、学历、经验区间三个维度交叉分析薪资中位数这样得出的结论才可以落地。比如在2021厦门的样本里技术类岗位的月薪中位数明显高于销售类本科学历的薪资中位数比大专高约15%—20%经验要求上3—5年的岗位比1—3年的岗位薪资中位数高出约30%。这些结论要结合业务解释才有价值不能只丢一屏数字。用pandas实现分位数统计pivot df.groupby([岗位大类, 学历要求])[月薪中位(万)].agg([median, count, mean]).reset_index() pivot pivot[pivot[count] 50] # 过滤样本量太小的组 pivot.to_excel(./output/薪资结构分析.xlsx, indexFalse)样本量过滤必须做否则某个岗位大类下只有两三条记录算出来的分位数毫无意义。我当时设定的经验值是每个分组至少30条主流维度50条以上否则在报告里标注“样本量不足仅供参考”。4.3 学历与经验要求分布学历要求这个字段在招聘数据里一般比较规范基本就是高中、大专、本科、硕士、博士、不限这几档。但企业之间写法不一有“本科及以上”“全日制本科”“本科一本”“本科学历”之分需要把“以上/及以上”后面的附加条件去掉归一化成基础学历。经验要求字段更乱常见表述有“1年经验”“1-3年”“两年以上”“无需经验”“经验不限”。归一化规则是只要提取数字区间的下限作为“最低经验年限”如果需要更细的区间就分为“应届/1年以下”“1-3年”“3-5年”“5-10年”“10年以上”几个档位。做完归一化之后可以做两个方向的交叉分析学历×薪资、经验×薪资。厦门2021年样本里的一个显著信号是本科以上学历的岗位数量占比过半说明厦门对高学历人才的需求比传统制造业城市更突出。但经验要求上中低年限岗位依然占大头3年以下合计超过60%说明这是一个既需要成熟人才、也在大量培养新人的市场。5. 可视化与报告输出让结论自己会说话5.1 图表选型原则表格适合展示精确数值但图表更适合传递趋势和差异。招聘数据分析里我比较常用的图表组合是这样的岗位数量Top10横向条形图因为岗位名称通常比较长横向排列更易读各行业招聘占比饼图或环形图只放占比超过5%的类别其余归入“其他”学历要求分布柱状图按学历从低到高排序薪资中位数对比分组柱状图按岗位大类分组展示经验要求与薪资关系折线图或箱线图能看到随经验年限增加薪资的变化趋势薪资区间分布直方图配合中位数、平均值标注线图表不在于多而在于每一张图都要能回答一个问题。我当时最终报告里只放了8张核心图每一张都能支撑一段业务解读。5.2 用Python快速出图我习惯用matplotlib配合SimHei字体解决中文乱码问题然后统一封装绘图函数避免每画一张图都重复设置样式。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 岗位数量Top10横向条形图 top10 job_count.head(10) fig, ax plt.subplots(figsize(10, 6)) bars ax.barh(top10.index[::-1], top10.values[::-1], color#4C72B0) ax.set_title(2021厦门招聘岗位数量Top10, fontsize14, pad12) ax.set_xlabel(岗位发布数量) ax.grid(axisx, linestyle--, alpha0.4) for bar, val in zip(bars, top10.values[::-1]): ax.text(bar.get_width() 5, bar.get_y() bar.get_height() / 2, str(val), vacenter, fontsize9) plt.tight_layout() plt.savefig(./output/岗位数量Top10.png, dpi200) plt.show()如果你不想在代码里反复调样式也可以直接用Excel的自带图表功能。Excel做分组柱状图和饼图很快适合快速预览但量大且需要保持一致风格时脚本出图完胜。5.3 报告叙述逻辑从图表到业务结论报告不等于图表的堆砌。每张图下面至少要写两到三句解读告诉自己看图的人“这个图说明了什么”、“为什么会出现这个现象”、“对读者有什么参考价值”。比如岗位数量Top10那张图如果只看图你只能得出“销售代表岗位最多”的结论。但结合行业和企业规模数据进一步看你会发现销售类岗位里的低底薪高提成模式约定了行业和岗位的绑定关系。这样解读才有信息增量。报告的整体结构我当时是这样组织的一页摘要核心数据和三个主要发现招聘供给概览数量、行业、企业规模岗位需求结构岗位大类、学历、经验薪资水平解析整体、分岗位、分学历附数据说明与口径6. 实战问题排查记录与经验速查6.1 常见错误和解决方式整个项目跑下来遇到的问题比我预想的多这里挑几个有代表性的。问题1rarfile解压报错“Unknown RAR header”排查过程先确认rar文件本身能否用WinRAR解开如果能说明是Python库版本太旧或者缺少unrar组件。解决方式是升级rarfile版本并安装unrar或者直接改用系统命令行解压。# Windows下用WinRAR的命令行工具 C:\Program Files\WinRAR\WinRAR.exe x 2021厦门招聘数据分析.rar ./data/问题2Excel读取时报错“File is corrupt”排查过程文件后缀是xlsx实际是CSV伪装或者旧版xls文件被改了后缀。处理方式是先看文件头部几个字节的魔数xlsx是PK开头xls是D0 CF 11 E0开头CSV就直接是文本。问题3薪资解析出来一堆NaN排查过程发现很多薪资字段是“面议”“面谈”“薪资面议”或者Excel里存的是数字单元格被读成了float而正则只匹配字符串。解决方式是在解析函数开头统一做str()转换并且对“面议”单独标记最后分析时单独统计“面议占比”它本身也是一个市场信号——面议占比高说明该岗位定价不透明或者高端岗位比例高。问题4散落多个Sheet的表合并困难排查过程有的Excel一本工作簿里放了12个月的招聘数据每个Sheet字段顺序还不一样。先统一字段名再用pd.concat合并。如果Sheet数太多用pd.read_excel(..., sheet_nameNone)一次读出全部Sheet再循环处理。6.2 招聘数据分析的避坑心得第一条心得别迷信总量要看趋势和数据之间的交叉印证。单看招聘岗位数量会忽略岗位结构的变化。我当时的做法是同时输出绝对数量和占比两个口径占比更能反映结构性变化。第二条心得文本字段的清洗永远比你想的费时间。招聘数据里公司名称、岗位名称、薪资表述的多样化程度远超教科书用例。建议预留总工时的一半给数据清洗和验证剩下的才是分析和写报告。第三条心得做决策场景的数据分析样本过滤条件一定要白纸黑字写清楚。比如“月薪0.3万—3万”之外的数据剔除、样本量小于30的分组不参与对比这些口径不写清楚报告拿出去很容易被挑毛病。第四条心得能自动化的环节绝不手工操作。清洗规则、图表生成、报告排版只要出现过两次以上的重复动作就值得脚本化。我当时把整个清洗到出图的过程封装成了几个Python脚本改一改输入路径和参数就能复跑后来换了一个城市的数据也用上了。7. 从这份数据还能继续做些什么如果你拿到的不是2021厦门而是其他年份、其他城市的数据分析框架完全可以直接套用只要把区域政策背景、重点产业结构的解读换成对应的城市就行。更进一步如果你能拿到多个年份的同口径数据可以做时间序列对比看招聘量、薪资水平、岗位结构的变化趋势那会比单独一年的快照分析更有价值。技术层面如果数据量特别大——几十万行以上Excel和Pandas单机处理会吃力可以上DuckDB或者SQLite做本地分析语法接近SQL又不需要搭服务端。再大就是Spark或者ClickHouse的方向了但对招聘数据分析这个场景一般用不到。我的经验是数据分析项目百分之六十的精力在数据工程百分之二十在分析思考百分之二十在表达呈现。不要嫌准备工作繁琐前面地基打得越稳后面出结论越有底气。本文还有配套的精品资源点击获取
返回列表