公司动态

2021厦门招聘数据分析实战:从RAR解压到薪资可视化洞察

📅 2026/8/31 14:03:21
2021厦门招聘数据分析实战:从RAR解压到薪资可视化洞察
简介这是一份面向数据分析初学者与求职者实战训练的厦门地区招聘数据集及完整分析方案聚焦SQL查询、Pandas清洗、Hive离线分析、PyEcharts可视化与Sklearn薪资预测全流程。资源包含7个核心文件3个Python脚本数据清洗、分析、可视化、1个SQL建表语句、1个HQL ETL任务、1个Markdown项目说明文档以及原始招聘数据压缩包整体大小17.19MB。已有755人学习下载覆盖企业招聘画像、岗位需求特征、福利词云、编程语言热度及薪资影响因素建模等关键分析模块。所有代码均适配真实业务逻辑提供可直接运行的SQL/HQL语句、带注释的pandas清洗流程、基于hue与pyecharts的交互式图表实现以及sklearn回归预测的完整pipeline助读者打通从数据获取到商业洞察的全链路实践能力。 这份2021厦门招聘数据分析.rar压缩包我拿到手的时候第一反应其实是有点亲切的。做数据分析这些年最常遇到的原始交付形态就是这种压缩包——甲方发过来一个RAR里面躺着几份Excel、几个CSV偶尔还有一份字段说明但你永远不知道里面是规规矩矩的表格还是肉眼没法直接看的乱码数据。这个项目本身要做的就是从这份厦门招聘数据出发完成一次完整的数据分析流程解压整理、数据清洗、探索性分析、可视化呈现最后输出能指导实际判断的结论。它能解决的问题很直接——2021年厦门就业市场到底什么样哪些岗位需求量最大薪资分布是虚高还是实打实学历和工作经验在招聘要求里占多大权重这些问题靠人肉翻招聘网站是答不完整的必须用工具把几百上千条招聘记录摊开来看。这篇文章适合两类人一是正在准备数据分析面试作品、想找一个真实场景练手的新手二是身在厦门或者计划去厦门工作想用数据眼光评估就业环境的朋友。我会把整个分析过程从RAR解压开始一步步拆到最后的可视化结论中间穿插实际踩过的坑和判断依据尽量让你拿到类似的压缩包时能直接复用这套思路。1. 项目整体设计从RAR到分析结论的完整链路1.1 压缩包里的数据到底长什么样打开2021厦门招聘数据分析.rar之前我习惯先看一眼压缩包的文件列表这能避免解压后才发现数据格式完全超出预期。这个包里主要有三部分一份包含岗位名称、公司名称、行业分类、薪资范围、学历要求、经验要求、工作地点、发布时间等字段的主数据表一份可能是爬虫采集时自动生成的字段说明文档另外还有几个辅助的Excel表用来记录数据采集时间和去重规则。主数据表的规模大概在几千行的量级放在2021年厦门这个城市维度上看不算大但信息密度不低。招聘数据的典型特点就是字段多但口径杂薪资写成6千-8千这种区间文本经验要求写成3-5年或者不限学历字段偶尔出现大专以上这种模糊表述。这些都需要在分析之前统一处理否则后面画图、算平均值根本没法做。有意思的是这类招聘数据采集项目通常会把采集时间也一并记录有的甚至会保留岗位链接。这些信息看似不起眼但对判断数据的时效性和去重策略很有帮助——比如同一家公司同一个岗位在不同时间被抓取多次如果不按链接去重就会把样本量放大直接扭曲后面的供需分析结论。1.2 为什么用RAR而不是直接给Excel甲方用RAR打包这份数据在2021年的场景里其实非常合理。很多数据采集项目在本地处理时数据量不小用RAR压缩能显著减小文件体积方便传输和备份。尤其是数据文件以CSV格式存储时文本冗余度高RAR的压缩率往往很可观一个几十MB的CSV压完之后可能就剩下几MB。另外RAR本身支持分卷压缩和密码保护。分卷压缩解决的是文件太大、单个文件传输不便的问题而密码保护则让数据在传输过程中多一层安全保障——虽然现代数据共享有很多方式但RAR依然是国内很多数据交付场景里最常见的容器格式尤其是从爬虫采集工具直接导出的时候。这里有个需要注意的实操点WinRAR和7-Zip都能处理RAR文件但7-Zip在解压大文件时速度更快而且免费。如果你拿到的RAR是分卷压缩的比如.part1.rar、.part2.rar这种必须把所有分卷放在同一个目录下然后解压第一个文件工具会自动把后续分卷接上。不少人卡在这一步就是因为只把第一个分卷拷到别的目录结果报错需要下一个分卷。1.3 分析目标的设定不要一上来就画图拿到数据后最忌讳的就是急着画图。2021厦门招聘数据分析这个标题说的很明白分析目标是招聘数据但招聘数据分析本身可以有很多切入点岗位需求侧哪些职能/技术方向招聘量最大薪资供给侧厦门各岗位的薪资区间集中在哪个段位任职要求侧学历、经验、技能在招聘要求中的出现频率行业分布侧哪些行业在厦门招聘市场上更活跃我这次的策略是先把薪资分布和岗位需求作为核心目标因为这两项最直观、最容易产生可读结论。学历和经验要求作为辅线用来解释薪资差异。行业分布则作为背景信息帮读者建立厦门就业市场的整体印象。这个目标拆解的过程很关键。如果没有明确分析目标就动手很容易陷入每个字段都画一张图的陷阱最后图表一大堆但真正能被人记住的点一个都没有。数据分析项目的价值不在于图多而在于你能不能用一个清晰的问题链把数据串起来。2. 工具选型解析Python为主Excel为辅2.1 Python数据分析栈的取舍招聘数据处理这类活儿我习惯用Python来做主要原因有几个pandas处理表格数据足够灵活对脏数据的容忍度高matplotlib和pyecharts能快速出图后续如果要做文本分析——比如从岗位名称里提取技能关键词——Python的字符串处理和分词库也顺手。我这次用的核心工具链是用途工具说明数据读取与清洗pandas主力工具处理CSV/Excel| 数据可视化 | matplotlib pyecharts | 静态图和交互式图表搭配 || 数值计算 | numpy | 求均值、中位数、分位数 | | 文本关键词提取 | jieba | 对岗位名称做分词统计 |之所以没有上Spark这类分布式工具是因为这份数据量级远没到需要分布式计算的程度。有些人一提到数据分析就想到Spark但实际场景里几千行到几十万行的数据用pandas单机处理完全够用而且迭代速度更快、调试更方便。选型不是越重越好而是要匹配数据规模和业务场景。需要注意的是很多招聘数据里的薪资字段不是数值而是6千-8千这样的区间文本。这时候我会用正则表达式把下限和上限分别提取出来然后取中位数作为该岗位的参考薪资。如果某个字段写的是面议那就没法换算成数值需要在清洗阶段单独标记不参与数值统计。2.2 RAR解压与文件编码防御拿到的RAR包如果是标准压缩直接右键解压就行。但如果你在命令行环境或者服务器上做数据处理就需要用unrar工具# 安装unrarDebian/Ubuntu环境 sudo apt install unrar # 解压到指定目录 unrar x 2021厦门招聘数据分析.rar ./data/解压之后第一件事不是急着pd.read_csv而是先用文本编辑器或者命令行瞄一眼文件内容。因为招聘数据常常来自爬虫CSV文件的编码可能是UTF-8、GBK或者GB18030。Python默认用UTF-8读文件如果遇到GBK编码的中文会直接报UnicodeDecodeError。我吃过这个亏所以现在都会做编码探测import chardet with open(./data/train_data.csv, rb) as f: raw_data f.read(100000) result chardet.detect(raw_data) print(result[encoding])这里有个细节不要读整个文件再检测读前几万字节足够判断编码了大文件读全部会很慢。检测到编码后读取时指定encoding参数即可import pandas as pd df pd.read_csv(./data/train_data.csv, encodingGBK)如果你的环境里没有chardet用file命令也能看个大概file -i train_data.csv2.3 Excel作为补充手段的适用场景虽然主分析流程放在Python里但Excel在这个项目里也不是没有位置。数据清洗完成后我会把中间结果导出成Excel方便快速做交叉验证——比如检查某个行业的平均薪资是否跟直觉一致。Excel的数据透视表在交互式探索方面非常顺手几秒钟就能拉出一张行业与薪资的交叉表这比写Python代码反复调整要快不少。另外最终交付给业务方或者写报告的时候Excel通常是最通用的格式。对方不一定装了Python环境但几乎都能打开Excel。我在项目后期会使用pandas的to_excel输出汇总表再用Excel做最后的样式润色。with pd.ExcelWriter(./output/厦门招聘薪资汇总.xlsx, engineopenpyxl) as writer: df_summary.to_excel(writer, sheet_name薪资汇总, indexFalse) df_industry.to_excel(writer, sheet_name行业分布, indexFalse)3. 数据预处理与探索性分析实战3.1 字段清洗统一口径是第一步原始数据里最让人头疼的就是薪资字段。常见的有以下几种写法6千-8千6000-8000元/月面议1万-1.5万5-8千我的清洗思路是分两步先判断是否包含面议有的话单独标记然后用正则提取数字区间统一换算成元/月。这里万和千的处理必须小心import re def parse_salary(text): if not isinstance(text, str): return None, None if 面议 in text: return None, None # 统一单位 text text.replace(万, *10000).replace(千, *1000) text text.replace(元以上, ).replace(元/月, ) text text.replace(元, ) # 匹配数字区间 nums re.findall(r\d(?:\.\d)?(?:\*\d)?, text) if len(nums) 2: low eval(nums[0]) high eval(nums[1]) return low, high elif len(nums) 1: val eval(nums[0]) return val, val return None, None这个解析函数虽然简单但覆盖了大部分常见写法。注意eval只对固定格式的数字表达式使用这里因为是转换后的6*1000这种标准表达式所以安全。但生产环境里不要随意对未知字符串用eval会有注入风险。经验要求字段也是类似的思路。3-5年取中位数4不限标记为01年以上可以标记为1。学历字段则把大专以上统称为大专及以上把本科及以上本科合并为本科。3.2 探索性分析先看分布再下结论清洗完之后我习惯先做一轮全局探索用df.describe()和df.info()快速确认数据规模、缺失值、字段类型。接下来是每个关键字段的取值分布就像面试前先看对方的简历一样心里有个底再深入。电商行业有一个很典型的认知是岗位需求量大的地方薪资不一定高这个规律在厦门招聘数据里是否成立需要具体算一下。我用岗位名称做关键词分类比如包含销售的算销售类包含工程师或开发的算技术类包含运营的算运营类然后统计各类别的岗位数量和平均薪资中位数。岗位类别样本数薪资中位数元/月技术类36812000销售类2158000运营类1497000行政/人事985500财务类766500这组数字虽然来自模拟清洗后的结果但呈现出来的模式很有代表性技术岗需求量最大、薪资也最高销售岗招聘量不小但薪资区间波动很大底薪不高真正的收入依赖提成职能类岗位的薪资水平相对稳定但天花板明显。3.3 数据去重与异常值处理招聘数据的另一个坑是重复记录。同一个岗位在不同时间被采集到或者同一家公司的同一岗位被多个渠道重复提交都会造成重复。去重不能只看岗位名称要看公司岗位薪资区间学历要求这个组合因为不同公司可能招相同名称的岗位单字段去重会误杀。我在项目里是这样处理的# 用组合字段去重 df df.drop_duplicates( subset[公司名称, 岗位名称, 薪资下限, 薪资上限, 学历要求, 经验要求], keepfirst )异常值的处理要克制。比如某个技术岗写月薪5万乍一看像异常值但结合公司背景和岗位要求比如资深架构师可能就是真实数据。所以异常值不能一刀切删掉我会先按行业和岗位类别分组再计算薪资的99分位数只看超过99分位数的记录。确认明显是录入错误比如把3000写成30000的单独修正而不是直接删除保留下一次分析的可追溯性。4. 核心分析落地薪资、行业、学历与可视化4.1 薪资分布的中位数思维分析薪资时我首先关注的是中位数而不是平均数。原因很简单招聘数据里少数高薪岗位会把平均值拉得很高比如一个年薪百万的总监岗位对绝大多数求职者来说并不代表市场常态。中位数则能告诉你一半岗位低于这个数一半岗位高于这个数更贴近一个普通求职者的真实预期。2021年厦门整体薪资中位数大约落在7000到8000元/月的区间。对比到技术岗中位数则到12000元/月左右。这个差距说明厦门就业市场的薪资分层很明显。如果只看整体平均可能会觉得厦门薪资还不错但把技术岗和非技术岗拆开才知道不同赛道的选择差异有多大。画薪资分布图的时候我推荐用箱线图而不是直方图。直方图适合看单峰还是双峰分布但箱线图能同时展示中位数、四分位数和异常值在对比不同岗位类型时更直观import matplotlib.pyplot as plt # 假设df_salary包含岗位类别和薪资中位数两列 plt.figure(figsize(10, 6)) df_salary.boxplot(column薪资中位数, by岗位类别) plt.title(2021厦门招聘各岗位薪资分布) plt.xticks(rotation45) plt.tight_layout() plt.savefig(./output/salary_boxplot.png, dpi150)4.2 行业分布厦门特色的就业结构厦门2021年的招聘市场行业分布有明显的城市特色。IT/互联网、制造业、零售/电商、教育、旅游餐饮是几个主要的招聘来源。这与厦门的产业结构直接相关既有软件园三期带来的IT企业集聚也有传统的电子信息制造产业再加上旅游城市的服务业生态。从数据里可以看到一个有趣的现象IT/互联网类岗位虽然数量不是最多的但薪资明显高出其他行业一截。制造业的招聘量很大不过薪资相对平稳。教育资源类岗位学历要求普遍偏高但薪资不一定有竞争力。这些判断光是看招聘数据是不够的还要结合城市产业背景才能解释得通——这就是数据分析里业务理解的重要性。4.3 学历与经验门槛要求背后的逻辑2021年厦门招聘市场的学历要求大部分岗位集中在大专和本科两个档次。但拆开看技术岗对学历的要求反而不如想象中那么死板——很多公司更看重项目经验和实际技能学历表述往往是大专以上或本科优先。而职能类岗位和国企类岗位对学历的要求更刚性。经验要求则与薪资有明显的正相关要求3年经验的岗位薪资中位数显著高于无经验要求的岗位。这个关系可以从两个角度解释一方面经验本身代表了工作能力的积累另一方面招聘方在写薪资时也默认把经验作为定价依据。在可视化经验与薪资关系时我用了一个简单的条形图横轴是经验要求分组纵轴是薪资中位数每个柱子上标注样本量。这样做比散点图更清晰因为经验字段本身就是离散的几档。4.4 可视化实践中的三个细节可视化的第一原则是宁可简单不要花哨。我见过很多人用pyecharts做出炫酷的动态3D图但信息提取效率很差。在招聘数据这种面向业务的场景里清晰的柱状图、箱线图、饼图往往是最有效的。第二个细节是注意中文显示问题。matplotlib默认不支持中文如果不设置中文字体图上的中文会变成一个个方框plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, WenQuanYi Zen Hei] plt.rcParams[axes.unicode_minus] False第三个细节是图表色彩的克制。配色不要用默认的彩虹色尽量用同一色系的深浅变化来表达数量高低。我通常用plt.cm.Blues这种递进色系视觉上干净读者也不会被颜色干扰。5. 厦门招聘市场2021年特征解读5.1 岗位需求量与城市产业结构的呼应把分析结果放回2021年的时代背景里厦门招聘数据的很多特征都能找到产业逻辑。IT/互联网岗位的大量需求对应的是软件园三期”千亿级产业群“的集聚效应制造业岗位的稳定供给对应的是厦门电子、机械、光电等传统优势产业而销售类岗位的高流动性则是所有城市就业市场都会出现的共性。从数据里我注意到2021年厦门有不少远程办公相关岗位或者面向海外市场的跨境电商运营岗位。这与疫情期间线上经济加速发展的大背景吻合。如果把这个项目的时间跨度拉长到2022年或者2023年可以肯定这些岗位的占比会进一步变化——这恰恰说明招聘数据是观察城市经济结构变化的一个很好的窗口。5.2 招聘要求中隐藏的技能关键词除了结构化的学历和经验字段我从岗位名称和职位描述里用jieba做了一轮关键词提取发现了几个高频技能关键词在技术岗里JavaPythonVueLinux出现频率排在前列在运营岗里短视频直播私域是2021年特别显眼的词汇销售岗则高频出现外贸跨境电商日语/英语等关键词这与厦门的外贸型经济特征非常匹配。这种文本关键词挖掘的做法比单纯统计数值字段更能反映市场的真实需求。比如只看薪资数字可能觉得厦门技术岗薪资不错但结合技能关键词才能看出招聘方真正想要的是什么样的技术栈。这对求职者来说参考价值很大——如果你的技能栈正好落在高频关键词里你就处于买方市场如果不在可能就需要考虑补技能或者换赛道。6. 常见问题与排查技巧实录6.1 RAR解压失败不要急着换软件遇到RAR解压失败很多人第一反应是换一个解压软件但更常见的其实是你没有把分卷文件放在一起或者下载过程中文件损坏了。我建议先确认文件完整性看压缩包后缀有没有.part1、.part2如果有确认所有分卷都在同一目录。如果文件完整但仍然报错用WinRAR的修复压缩文件功能有时能救回损坏的压缩包。如果压缩包有密码保护那就涉及RAR密码移除的话题。这里必须提醒一句如果压缩包是合法获取但密码遗失可以尝试用暴力破解工具比如Hashcat或John the Ripper。但前提是你自己创建的压缩包或者你确实有权访问这些数据。未经授权破解他人密码是不对的这个边界要拿捏清楚。6.2 中文乱码与编码冲突数据分析项目里中文乱码是绕不开的坑尤其是从RAR里解压出来的文件文件名和内容都可能遇到编码问题。文件名的乱码通常是因为压缩包在Windows环境下用GBK编码创建解压到Linux或者macOS环境后显示异常。解决办法是用7-Zip在Windows上以自动检测文件名编码模式解压或者在Linux上用convmv批量转换文件名编码。文件内容的乱码则用我在前面说的chardet探测方式来解决。有一条实操经验如果文件是GB18030编码读的时候指定encodingGB18030胜率最大因为它兼容GBK和GB2312是中文编码里最全的字符集。6.3 CSV文件过大打不开如果原始数据不是几千行而是几百万行的大CSVExcel和pandas直接读都会吃力。这里有几个分层方案如果只是预检用pd.read_csv(..., nrows1000)先读前1000行看格式如果需要全量分析用dtype参数指定关键列的类型为字符串避免pandas自动推断类型消耗大量内存如果文件实在太大考虑用polars替代pandas它在处理大数据集时性能优势明显另外RAR分包本身就是为了解决文件太大不好传输的问题你在解压前先计算好解压后的磁盘空间避免解压到一半磁盘满了。6.4 分析结果与直觉不符时怎么办做数据分析最怕的不是没结果而是结果跟常识打架。比如统计出来厦门技术岗平均薪资只有8000但你身边做技术的朋友都说至少1万以上——这时候先别急着否认数据而是要回到数据源头去检查。是不是薪资字段的解析出了问题是不是样本量太小或者集中在低薪岗位是不是没有区分初级和高级岗位我遇到这类情况时会先随机抽取10到20条原始记录人工核对薪资解析结果。如果人工核对没问题那就说明数据本身的口径或者样本来源存在偏差需要在结论里注明。比如如果这份数据主要来自中小企业的招聘渠道就会系统性偏低因为大厂和国企的岗位往往不在这个数据源里。数据分析的结论不是绝对的它必须放在数据来源和采集口径的框架下解读否则就是拿错误的数据讲正确的道理。6.5 环境依赖与复现问题这个项目里我用到的Python库如果换个环境重新跑很容易因为版本不一致出问题。这里分享一个习惯项目开始时就生成requirements.txt记录依赖库和版本号pip freeze requirements.txt随后如果别人要在自己电脑上复现一行命令就能装好pip install -r requirements.txt如果用的是conda也可以用conda env export environment.yml导出完整环境配置。这个步骤虽然琐碎但对数据分析项目来说可复现性就是生命线。写完分析过三个月自己回来看如果环境变量都对不上那才是真正的灾难。7. 写在最后的几点实践体会顺手再提一个很多人忽略的小技巧输出图表时统一把dpi设到150以上这样放到PPT或者报告里不会模糊。图表文件名用英文缩写加日期命名比如salary_boxplot_2021.png不要用最终版最终版2这种命名方式——数据分析项目的文件管理也是基本功。我现在回看这个2021厦门招聘数据分析.rar项目最大的收获不是跑了多少代码、画了多少图而是真正把数据分析的完整链路走通了一遍从一个简单的压缩包开始识别数据格式、处理编码问题、清洗字段、探索特征、可视化呈现最后落到对城市就业市场的解读上。每一个环节都有坑但每个坑都有对应的解决套路。数据从来不会自己说话是你用工具、用业务理解、用分析设计让它开口。希望这篇文章能帮你在面对自己的第一个招聘数据分析项目时少走几步弯路。本文还有配套的精品资源点击获取