揭秘职场薪资秘密:用Python全面解读BOSS直聘招聘数据
前言
-
随着求职市场的数字化转型和数据分析的广泛应用,从招聘网站获取数据并进行分析已经成为个人职业发展和企业招聘的重要工具。 在本系列博客中,我们以 BOSS 直聘的职位数据为例,通过 Python 实现了从数据采集到清洗再到深入分析的完整流程。以下是前两篇博客的内容概述:
- 使用Python爬取BOSS直聘职位数据并保存到Excel 在第一篇文章中,我们介绍了如何通过 Python 的爬虫工具,自动化爬取 BOSS 直聘上的职位信息,并将其保存到 Excel 文件中。通过这个过程,我们能够高效地获取大规模的招聘数据,为后续分析打下基础。
- BOSS直聘招聘数据分析的第一步:用Python进行深度清洗 第二篇文章详细讲解了数据清洗的全过程,包括缺失值处理、重复数据删除、字段格式标准化等操作。通过深度清洗,我们将原始爬取数据转化为一份高质量的数据集,使其具备分析和建模的条件。
本篇文章是系列的第三篇,将基于清洗后的数据展开深入分析,围绕薪资分布、职位要求、行业分布等多个维度,揭示职场薪资秘密、技能需求和地域分布特点。
必需安装的库和功能说明
以下 Python 库将在分析中被广泛使用:
库名 | 功能说明 | 安装命令 |
---|---|---|
pandas | 数据清洗与处理,如缺失值填充、分组统计、读取和保存 Excel 文件。 | pip install pandas |
matplotlib | 绘制柱状图、饼图、散点图等基础可视化图表。 | pip install matplotlib |
seaborn | 基于 Matplotlib 的高级可视化库,支持箱线图、分布图等美观图表。 | pip install seaborn |
wordcloud | 生成词云,直观显示职位描述和技能要求中的高频关键词。 | pip install wordcloud |
folium | 生成交互式地理热图,展示职位分布密集度。 | pip install folium |
pyecharts | 绘制交互式图表,如中国地图的城市薪资分布图。 | pip install pyecharts |
openpyxl | 支持 Pandas 读取和保存 Excel 文件(.xlsx 格式)。 | pip install openpyxl |
快速安装所有依赖
使用以下命令一次性安装所有必要依赖:
pip install pandas matplotlib seaborn wordcloud folium pyecharts openpyxl
数据分析思路与实现
下面从六个维度逐步展示对 BOSS 直聘数据的分析。
1. 薪资水平分析
功能描述
分析薪资字段,挖掘职位薪资分布及其影响因素,包括:
- 整体分布:均值、中位数、最大值、最小值等指标。
- 城市对比:不同城市的薪资水平差异。
- 薪资区间:各薪资区间的职位数量分布。
实现代码
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
def analyze_salary(df):
"""
分析薪资水平,展示整体统计、城市对比和薪资区间分布。
"""
print("薪资水平统计:")
salary_stats = df['薪资描述'].describe()
print(salary_stats)
# 按城市统计薪资均值
city_salary = df.groupby('城市')['薪资描述'].mean().sort_values(ascending=False)
print("\n不同城市的薪资均值:")
print(city_salary)
# 绘制薪资分布箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(data=df, x='城市', y='薪资描述')
plt.title('不同城市的薪资分布')
plt.xticks(rotation=45)
plt.show()
# 绘制薪资区间分布直方图
plt.figure(figsize=(10, 6))
sns.histplot(df['薪资描述'], bins=[0, 5000, 10000, 15000, 20000, 30000, 40000], kde=True)
plt.title('薪资区间分布图')
plt.xlabel('薪资范围')
plt.ylabel('职位数量')
plt.show()
输出说明
- 统计结果:包括均值、中位数等指标,反映整体薪资水平。
- 箱线图:展示不同城市薪资分布的波动范围。
- 直方图:直观体现职位数量在不同薪资区间的分布情况。
2. 职位要求分析
功能描述
通过对职位的学历、经验要求以及职位描述进行分析,可以了解:
- 不同学历和经验要求的职位占比。
- 技能关键词的高频分布趋势(如词云可视化)。
实现代码
from wordcloud import WordCloud
def analyze_job_requirements(df, font_path):
"""
分析职位要求,包括学历分布、经验分布及技能关键词。
"""
# 学历要求分布
education_counts = df['学历要求'].value_counts()
print("学历要求分布:")
print(education_counts)
plt.figure(figsize=(8, 8))
education_counts.plot(kind='pie', autopct='%1.1f%%', startangle=140)
plt.title('学历要求分布')
plt.ylabel('')
plt.show()
# 年限要求分布
experience_counts = df['年限要求'].value_counts()
plt.figure(figsize=(10, 6))
sns.barplot(x=experience_counts.index, y=experience_counts.values)
plt.title('年限要求分布')
plt.xlabel('年限要求')
plt.ylabel('职位数量')
plt.show()
# 职位描述词云
job_descriptions = " ".join(df['岗位要求'].dropna())
wordcloud = WordCloud(
width=800,
height=400,
background_color='white',
font_path=font_path
).generate(job_descriptions)
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('岗位描述词云')
plt.show()
输出说明
- 学历要求饼图:展示职位中不同学历要求的比例。
- 年限要求柱状图:了解职位对工作经验的要求情况。
- 词云图:通过高频关键词揭示职位描述中的技能需求。
3. 行业和公司分析
功能描述
通过行业和公司规模的分析,可以得出:
- 各行业的职位数量排名。
- 不同公司规模的薪资分布特点。
实现代码
def analyze_industry_and_company(df):
"""
分析不同行业和公司规模对职位数量及薪资的影响。
"""
# 行业分布
industry_counts = df['行业类型'].value_counts()
print("行业类型职位数量:")
print(industry_counts)
plt.figure(figsize=(12, 6))
sns.barplot(x=industry_counts.index[:10], y=industry_counts.values[:10])
plt.title('不同行业的职位数量(Top 10)')
plt.xlabel('行业类型')
plt.ylabel('职位数量')
plt.xticks(rotation=45)
plt.show()
# 公司规模与薪资分布
company_salary = df.groupby('公司规模')['薪资描述'].mean().sort_values()
print("\n不同公司规模的薪资均值:")
print(company_salary)
plt.figure(figsize=(12, 6))
sns.barplot(x=company_salary.index, y=company_salary.values)
plt.title('公司规模与平均薪资')
plt.xlabel('公司规模')
plt.ylabel('平均薪资')
plt.xticks(rotation=45)
plt.show()
输出说明
- 行业职位数量:了解哪些行业对人才需求旺盛。
- 公司规模与薪资:展示小公司、中型公司和大公司的薪资特点。
4. 地域分布分析
功能描述
通过分析职位数据的城市和区域信息,绘制热图和分布图,探索:
- 职位数量在哪些区域分布密集。
- 地理分布是否呈现明显的聚集效应。
实现代码
import folium
from folium.plugins import HeatMap
def analyze_region_distribution(df):
"""
使用地理热图展示职位分布密度。
"""
heat_data = df[['纬度', '经度']].dropna().values.tolist()
m = folium.Map(location=[22.5431, 114.0579], zoom_start=11)
HeatMap(heat_data).add_to(m)
m.save("job_heatmap.html")
print("地理热图已保存为 job_heatmap.html")
输出说明
- 热图:展示职位在不同区域的分布密集度。
- 交互式地图:可在浏览器中查看职位的地理分布。
5. 上市公司与非上市公司对比
功能描述
分析上市和非上市公司在薪资和职位要求上的差异,发现:
- 哪类公司更倾向提供高薪职位。
- 不同融资阶段公司对学历和经验的要求。
实现代码
def analyze_listing_status(df):
"""
对比上市与非上市公司的薪资均值。
"""
listing_salary = df.groupby('是否上市')['薪资描述'].mean()
print("\n上市与非上市公司薪资均值:")
print(listing_salary)
plt.figure(figsize=(8, 6))
listing_salary.plot(kind='bar', color=['blue', 'orange'])
plt.title('上市与非上市公司薪资对比')
plt.xlabel('是否上市')
plt.ylabel('薪资均值')
plt.show()
输出说明
- 薪资对比条形图:揭示两类公司在薪资上的显著差异。
- 文字描述:统计上市公司和非上市公司平均薪资水平。
6. 职位稀缺度分析
功能描述
通过统计职位名称的出现频率,找出稀缺职位,并分析其特点:
- 稀缺职位是否提供更高的薪资。
- 稀缺职位对技能和经验的要求是否更高。
实现代码
def analyze_job_rarity(df):
"""
分析职位稀缺度及其薪资特点。
"""
job_name_counts = df['职位名称'].value_counts()
print("稀缺职位(出现次数最少):")
print(job_name_counts.tail(10))
# 稀缺职位薪资对比
rare_jobs = df[df['职位名称'].isin(job_name_counts.tail(10).index)]
plt.figure(figsize=(10, 6))
sns.barplot(x=rare_jobs['职位名称'], y=rare_jobs['薪资描述'])
plt.title('稀缺职位与薪资对比')
plt.xlabel('职位名称')
plt.ylabel('薪资')
plt.xticks(rotation=45)
plt.show()
输出说明
-
稀缺职位列表:显示出现频率最低的职位。
-
薪资对比图:稀缺职位是否具有薪资优势一目了然。
7.完整代码示例
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
import folium
from folium.plugins import HeatMap
from pyecharts.charts import Map
from pyecharts import options as opts
import matplotlib
from matplotlib import rcParams
matplotlib.use('TkAgg')
# 使用微软雅黑字体
rcParams['font.sans-serif'] = ['Microsoft YaHei']
rcParams['axes.unicode_minus'] = False
# 指定中文字体路径
# 微软雅黑字体路径
font_path = 'C:/Windows/Fonts/msyh.ttc'
# 1. 薪资水平分析
def analyze_salary(df):
print("薪资水平统计:")
salary_stats = df['薪资描述'].describe()
print(salary_stats)
# 按城市统计薪资均值
city_salary = df.groupby('区域')['薪资描述'].mean().sort_values(ascending=False)
print("\n不同城市的薪资均值:")
print(city_salary)
# 绘制薪资分布箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(data=df, x='区域', y='薪资描述')
plt.title('深圳不同区域的薪资分布')
plt.xticks(rotation=45)
plt.show()
# 绘制薪资区间分布直方图
plt.figure(figsize=(10, 6))
sns.histplot(df['薪资描述'], bins=[0, 5000, 10000, 15000, 20000, 30000, 40000], kde=True)
plt.title('薪资区间分布图')
plt.xlabel('薪资范围')
plt.ylabel('职位数量')
plt.show()
# 2. 职位要求分析
def analyze_job_requirements(df):
print("学历要求分布:")
education_counts = df['学历要求'].value_counts()
print(education_counts)
# 绘制学历要求饼图
plt.figure(figsize=(8, 8))
education_counts.plot(kind='pie', autopct='%1.1f%%', startangle=140)
plt.title('学历要求分布')
plt.ylabel('')
plt.show()
# 年限要求分布
experience_counts = df['年限要求'].value_counts()
plt.figure(figsize=(10, 6))
sns.barplot(x=experience_counts.index, y=experience_counts.values)
plt.title('年限要求分布')
plt.xlabel('年限要求')
plt.ylabel('职位数量')
plt.show()
# 职位描述词云
job_descriptions = " ".join(df['岗位要求'].dropna())
wordcloud = WordCloud(
width=800,
height=400,
background_color='white',
font_path=font_path # 为 WordCloud 指定支持中文的字体
).generate(job_descriptions)
# 显示词云
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off') # 去除坐标轴
plt.title('岗位描述词云') # Matplotlib 的标题,不需要指定 font_path
plt.show()
# 3. 行业和公司分析
def analyze_industry_and_company(df):
industry_counts = df['行业类型'].value_counts()
print("行业类型职位数量:")
print(industry_counts)
# 行业职位数量条形图
plt.figure(figsize=(12, 6))
sns.barplot(x=industry_counts.index[:10], y=industry_counts.values[:10])
plt.title('不同行业的职位数量(Top 10)')
plt.xlabel('行业类型')
plt.ylabel('职位数量')
plt.xticks(rotation=45)
plt.show()
# 公司规模与薪资分布
company_size_salary = df.groupby('公司规模')['薪资描述'].mean().sort_values(ascending=False)
print("不同公司规模的薪资均值:")
print(company_size_salary)
plt.figure(figsize=(12, 6))
sns.boxplot(data=df, x='公司规模', y='薪资描述')
plt.title('不同公司规模的薪资分布')
plt.xticks(rotation=45)
plt.show()
# 4. 地域分布分析
def analyze_region_distribution(df, coordinates_file='city_coordinates.csv'):
region_counts = df['区域'].value_counts()
print("区域职位数量:")
print(region_counts)
# 区域职位分布柱状图
plt.figure(figsize=(12, 6))
sns.barplot(x=region_counts.index[:10], y=region_counts.values[:10])
plt.title('不同区域的职位数量(Top 10)')
plt.xlabel('区域')
plt.ylabel('职位数量')
plt.xticks(rotation=45)
plt.show()
# 地理热图
# coordinates = pd.read_csv(coordinates_file) # 假设城市数据包含经纬度
# merged_data = pd.merge(df, coordinates, on='城市')
# heat_data = merged_data[['纬度', '经度']].values.tolist()
#
# m = folium.Map(location=[22.5431, 114.0579], zoom_start=11)
# HeatMap(heat_data).add_to(m)
# m.save("job_heatmap.html")
# 5. 上市与非上市公司对比
def analyze_listing_status(df):
listing_salary = df.groupby('是否上市')['薪资描述'].mean()
print("上市与非上市公司薪资均值:")
print(listing_salary)
plt.figure(figsize=(8, 6))
listing_salary.plot(kind='bar', color=['blue', 'orange'])
plt.title('上市与非上市公司薪资对比')
plt.xlabel('是否上市')
plt.ylabel('薪资均值')
plt.show()
# 6. 城市薪资与需求分布
def analyze_city_salary_distribution(df):
city_data = df.groupby('城市')['薪资描述'].mean().reset_index()
city_data.columns = ['城市', '平均薪资']
map_chart = Map()
map_chart.add("平均薪资", [list(z) for z in zip(city_data['城市'], city_data['平均薪资'])], "china")
map_chart.set_global_opts(
title_opts=opts.TitleOpts(title="城市薪资分布"),
visualmap_opts=opts.VisualMapOpts(max_=30000, min_=5000)
)
map_chart.render("城市薪资分布.html")
# 7. 职位需求稀缺度分析
def analyze_job_rarity(df):
job_name_counts = df['职位名称'].value_counts()
print("稀缺职位(出现次数较少):")
print(job_name_counts.tail(10))
# 稀缺职位薪资对比
rare_jobs = df[df['职位名称'].isin(job_name_counts.tail(10).index)]
plt.figure(figsize=(10, 6))
sns.barplot(x=rare_jobs['职位名称'], y=rare_jobs['薪资描述'])
plt.title('稀缺职位与薪资对比')
plt.xlabel('职位名称')
plt.ylabel('薪资')
plt.xticks(rotation=45)
plt.show()
# 主函数
if __name__ == "__main__":
# 加载数据
data_file = 'cleaned_job_data.xlsx'
df = pd.read_excel(data_file)
# # 调用各功能
print("开始薪资分析...")
analyze_salary(df)
print("开始职位要求分析...")
analyze_job_requirements(df)
print("开始行业和公司分析...")
analyze_industry_and_company(df)
print("开始地域分布分析...")
analyze_region_distribution(df)
print("开始上市与非上市公司对比...")
analyze_listing_status(df)
print("开始城市薪资与需求分布分析...")
analyze_city_salary_distribution(df)
print("开始职位需求稀缺度分析...")
analyze_job_rarity(df)
总结与展望
在本篇分析中,我们对 BOSS 直聘数据从薪资、职位要求、行业分布等维度进行了细致的分析,得出以下结论:
- 薪资水平:职位薪资受城市、行业、公司规模的显著影响。
- 技能需求:自动化测试、Python 等技能高频出现,反映了市场对技术型岗位的需求。
- 地域差异:一线城市(如深圳、北京)的职位数量和薪资水平遥遥领先。
展望:利用机器学习挖掘技术热点与薪资预测
在数据分析的基础上,我们计划利用机器学习模型挖掘更深层次的价值,尝试解决以下问题:
- 技术热点分析 通过职位描述中的关键词提取和聚类算法(如 TF-IDF、LDA 主题建模),挖掘当前行业内的技术热点。例如,分析 Python、自动化测试、人工智能等技能的需求变化趋势,帮助求职者了解市场需求,优化自身技能结构。
- 岗位需求与薪资预测 基于职位要求(如年限、学历、技能)和其他相关数据,构建薪资预测模型(如线性回归、随机森林、XGBoost 等),预测岗位合理的薪资范围。该模型可为求职者提供薪资谈判参考,也为企业优化薪资策略提供支持。
- 职位需求趋势预测 借助时间序列分析,结合历史数据和季节性变化趋势,预测未来某些岗位的需求增长情况。此分析企业规划招聘计划,并为求职者提供择业参考。
通过这些模型的构建和分析,我们期待:
- 帮助求职者找到高薪岗位,规划职业发展路径。
- 为企业提供智能化的薪资参考和岗位规划建议。
- 深入了解技术发展的热点方向,推动技能与市场需求的精准匹配。