摘要:本文通过Python的pandas、matplotlib和seaborn库对salaries.csv数据集进行分析与可视化。从年份、职称、地点等多个维度深入探究薪资分布与变化趋势,运用箱线图、柱状图、热力图等多种可视化手段,展示数据特征。

「2025年数据科学、人工智能和机器学习工作薪水数据集」,点击链接即可保存。打开「夸克APP」,链接:https://pan.quark.cn/s/6aa9337382d3

基于salaries.csv数据集的薪资数据分析与可视化_数据集

数据科学与AI领域薪资数据集解析

数据集概述

该数据集收录了2020-2025年全球数据科学、人工智能及机器学习领域的真实薪资数据,共133,349条记录,11个维度属性。数据涵盖职位名称、经验水平、远程工作比例等关键信息,可用于分析薪资趋势、地域差异及职场环境对薪酬的影响。

核心字段详解

字段名称

数据类型

含义说明

示例值

work_year

int64

薪资报告年份(2020-2025)

2025

experience_level

object

经验级别(EN=初级,MI=中级,SE=高级,EX=总监)

SE

employment_type

object

雇佣类型(FT=全职,PT=兼职,CT=合同工,FL=自由职业)

FT

job_title

object

具体职位名称(如数据科学家、ML工程师)

“Data Scientist”

salary

int64

原始货币年薪(税前)

214000

salary_currency

object

薪资货币类型

USD

salary_in_usd

int64

按2025年汇率换算为美元的标准化薪资

214000

employee_residence

object

员工居住国家(ISO代码)

US

remote_ratio

int64

远程工作比例(0=现场,50=混合,100=完全远程)

100

company_location

object

公司总部所在地(ISO代码)

US

company_size

object

公司规模(S=小,M=中,L=大)

M

关键词:薪资分析;数据可视化;Python数据分析

一、引言

在当今数据驱动的时代,对薪资数据的深入分析有助于了解就业市场的动态和趋势。本文借助Python的数据分析工具,对salaries.csv数据集进行多维度剖析,旨在揭示薪资与年份、职称、地点等因素之间的关系。

二、数据加载与初步探索

2.1 环境设置与数据加载

设置matplotlib以支持中文显示,并解决负号显示问题,随后加载salaries.csv数据集。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']  
plt.rcParams['axes.unicode_minus'] = False  

df = pd.read_csv('E:\\pycharm_workspace\\数据集\\salaries.csv')

2.2 数据概览与基本统计

通过head()方法展示数据集前几行,使用shape属性获取数据形状,利用isnull().sum()统计缺失值,并通过describe()方法呈现薪资(USD)的描述统计信息。

print(df.head())
print("\n数据形状:", df.shape)
print("\n缺失值统计:")
print(df.isnull().sum())

print("\n薪资(USD)描述统计:")
print(df['salary_in_usd'].describe())
work_year experience_level  ... company_location company_size
0       2025               SE  ...               US            M
1       2025               SE  ...               US            M
2       2025               MI  ...               AU            M
3       2025               MI  ...               AU            M
4       2025               EN  ...               US            M

[5 rows x 11 columns]

数据形状: (133349, 11)

缺失值统计:
work_year             0
experience_level      0
employment_type       0
job_title             0
salary                0
salary_currency       0
salary_in_usd         0
employee_residence    0
remote_ratio          0
company_location      0
company_size          0
dtype: int64

薪资(USD)描述统计:
count    133349.000000
mean     157617.272098
std       74288.363097
min       15000.000000
25%      106000.000000
50%      146206.000000
75%      198000.000000
max      800000.000000
Name: salary_in_usd, dtype: float64

三、多维度数据分析与可视化

3.1 按年份分析薪资趋势

绘制箱线图以展示各年份薪资趋势。通过boxplot函数绘制箱线图,设置showfliers=False暂时隐藏异常值,使用Blues调色板,添加中位数标注,使图表更清晰地展示各年份薪资的集中趋势。

plt.figure(figsize=(10,6))
ax = sns.boxplot(x='work_year', y='salary_in_usd', data=df,
                 hue='work_year',  
                 showfliers=False,  
                 palette="Blues",
                 legend=False)
ax.set_title('各年份薪资趋势分析(2019 - 2025)', pad=20)
ax.set_xlabel('年份', labelpad=10)
ax.set_ylabel('薪资(USD)', labelpad=10)
plt.grid(axis='y', linestyle='--', alpha=0.4)

for year in df['work_year'].unique():
    median = df[df['work_year']==year]['salary_in_usd'].median()
    ax.text(year - 2020, median, f'{median:,.0f}',
            ha='center', va='center', fontweight='bold')

基于salaries.csv数据集的薪资数据分析与可视化_数据集_02

3.2 按职称分析平均薪资

选取前20个最常见岗位,计算其平均薪资并绘制柱状图。利用value_counts().nlargest(20)获取前20个最常见岗位,通过groupby计算平均薪资,使用barplot绘制柱状图,添加数值标注,使各岗位平均薪资一目了然。

plt.figure(figsize=(14, 7))

top_20_jobs = df['job_title'].value_counts().nlargest(20).index
job_salary = df[df['job_title'].isin(top_20_jobs)].groupby('job_title')['salary_in_usd'].mean().sort_values(ascending=False)

sns.barplot(x=job_salary.values, y=job_salary.index,
            hue=job_salary.index,  
            palette="viridis",
            edgecolor='black',
            linewidth=0.5,
            legend=False)  

for i, v in enumerate(job_salary.values):
    plt.text(v + 2000, i, f"${v:,.0f}",
             color='black',
             va='center',
             fontsize=10)

plt.title('前20个最常见岗位平均薪资(USD)', fontsize=16, pad=20)
plt.xlabel('平均薪资(USD)', fontsize=12)
plt.ylabel('职位名称', fontsize=12)
plt.xlim(0, job_salary.max() * 1.15)  
plt.grid(axis='x', linestyle='--', alpha=0.6)
plt.tight_layout()
plt.show()

基于salaries.csv数据集的薪资数据分析与可视化_中位数_03

3.3 按地点分析薪资分布

按薪资中位数选择并排序前10个地区,绘制箱线图展示其薪资分布。通过groupby计算各地区薪资中位数,使用boxplot绘制箱线图,添加中位数标注,直观呈现不同地区薪资水平的差异。

top_paying = df.groupby('company_location')['salary_in_usd'].median().nlargest(10)
order = top_paying.sort_values(ascending=False).index

plt.figure(figsize=(14, 7))
ax = sns.boxplot(
    x='company_location',
    y='salary_in_usd',
    hue='company_location',  
    data=df[df['company_location'].isin(order)],
    order=order,
    showfliers=False,
    palette="Blues",
    legend=False
)

for i, loc in enumerate(order):
    median = top_paying[loc]
    ax.text(i, median, f'${median:,.0f}',
            ha='center', va='bottom',
            fontweight='bold', color='red')

plt.title('薪资中位数Top 10国家/地区的薪资分布', pad=20, fontsize=14)
plt.xlabel('国家/地区代码', labelpad=10)
plt.ylabel('薪资(USD)', labelpad=10)
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.4)

plt.tight_layout()
plt.show()

基于salaries.csv数据集的薪资数据分析与可视化_数据分析_04

3.4 按年份和职称的薪资趋势

选择薪资标准差最大的15个职称,创建数据透视表并绘制分块热力图。利用groupby计算各职称薪资标准差,选取前15个职称创建数据透视表,使用heatmap绘制热力图,设置参数使热力图更清晰地展示不同年份各职称薪资的变化趋势。

dynamic_jobs = df.groupby('job_title')['salary_in_usd'].std().nlargest(15).index

pivot_dynamic = df[df['job_title'].isin(dynamic_jobs)].pivot_table(
    values='salary_in_usd',
    index='work_year',
    columns='job_title',
    aggfunc='mean'
)

plt.figure(figsize=(18, 8))
sns.heatmap(
    pivot_dynamic,
    annot=True,
    fmt=".0f",
    cmap="RdYlGn",  
    center=df['salary_in_usd'].median(),  
    square=True,    
    linecolor='grey'
)

plt.title('高差异职称薪资趋势热力图', fontsize=14)
plt.xticks(fontsize=10, rotation=45)
plt.yticks(fontsize=10, rotation=0)
plt.tight_layout()
plt.show()

基于salaries.csv数据集的薪资数据分析与可视化_数据_05

3.5 按地点和职称的薪资趋势

筛选高频高薪职位和有代表性的地区,创建数据透视表并绘制热力图。通过groupbyagg方法筛选前8个高频高薪职位,选取15个有代表性地区创建数据透视表,使用heatmap绘制热力图,设置参数展示不同地区热门职位的薪资中位数分布。

top_jobs = (df.groupby('job_title')['salary_in_usd']
            .agg(['count','median'])
            .sort_values(['count','median'], ascending=False)
            .head(8).index)  

rep_locations = df['company_location'].value_counts().nlargest(15).index
pivot_data = df[df['job_title'].isin(top_jobs) &
                df['company_location'].isin(rep_locations)].pivot_table(
    values='salary_in_usd',
    index='company_location',
    columns='job_title',
    aggfunc='median',  
    fill_value=np.nan  
)
plt.figure(figsize=(8, 12))
sns.heatmap(
    pivot_data,
    annot=True,
    fmt=".0f",
    cmap="YlGnBu",
    annot_kws={'size':9, 'color':'black'},  
    linewidths=0.3,  
    cbar_kws={'label': 'Median Salary (USD)'},
    square=True  
)
plt.title('核心地区热门职位薪资分布(中位数)', pad=20, fontsize=14)
plt.xticks(rotation=45, ha='right', fontsize=10)  
plt.yticks(rotation=0, fontsize=10)
plt.xlabel('')  
plt.ylabel('Company Location', labelpad=15)
plt.tight_layout()
plt.show()

基于salaries.csv数据集的薪资数据分析与可视化_数据分析_06

通过以上多维度的分析与可视化,我们对salaries.csv数据集中的薪资信息有了全面而深入的理解,为薪资相关的决策提供了有力的数据支撑。