You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

薪资数据集特征工程咨询:类别特征数值化的实现与最优方案

薪资数据集特征工程与关联分析实现方案

一、核心前提说明

你的标签是salary,但该字段按币种区分,直接分析不同特征与它的关联没有实际意义(比如1000欧元和1000美元的薪资量级完全不同)。因此第一步必须统一薪资的货币单位:

  • 直接使用数据集已有的salary_in_usd作为分析标签(最便捷,已完成汇率转换);
  • 若坚持用原始salary,需自行获取对应年份的汇率,将所有薪资转换为同一币种(如美元)。

以下方案默认采用salary_in_usd作为分析标签,若需使用原始salary,请先完成货币转换。

二、特征工程:分类特征转数值化

1. experience_level(有序分类特征)

该字段存在明确的等级递进关系(EN=入门 < MI=中级 < SE=高级 < EX=专家),需保留顺序信息,采用有序编码:

import pandas as pd

# 定义等级映射关系
exp_level_map = {'EN': 0, 'MI': 1, 'SE': 2, 'EX': 3}
df['experience_level_num'] = df['experience_level'].map(exp_level_map)

编码后数值大小直接对应经验等级高低,后续相关性分析、建模均可利用这一递进关系。

2. employment_type(无序分类特征)

该字段的类别(FT全职、PT兼职、CT合同、FL自由职业)无顺序关联,有两种常用处理方式:

方式一:独热编码(适配关联分析、线性模型)

# 生成独热编码列,添加前缀区分
emp_type_dummies = pd.get_dummies(df['employment_type'], prefix='emp_type')
df = pd.concat([df, emp_type_dummies], axis=1)

独热编码后每个类别对应一个0/1列,可直观观测某类雇佣形式对薪资的单独影响。

方式二:目标编码(适配树模型建模)

若后续需做预测建模,目标编码效率更高,用该类别下的平均薪资作为编码值:

# 计算每个雇佣类型的平均薪资
emp_type_target_map = df.groupby('employment_type')['salary_in_usd'].mean().to_dict()
df['employment_type_num'] = df['employment_type'].map(emp_type_target_map)

注意:目标编码易引发过拟合,建模时需配合交叉验证。

3. salary_currency(无序分类特征)

处理逻辑与employment_type一致:

  • 关联分析场景:用独热编码,观测不同币种对应地区的薪资水平差异;
  • 建模场景:用目标编码,或直接移除该字段(因已统一薪资单位,币种影响已被抵消)。

4. remote_ratio

该字段本身为数值型(0=完全线下、50=混合办公、100=完全远程),无需转换,可直接使用。

三、特征与标签的关联分析

1. 描述性统计分析

按分类特征分组,统计薪资关键指标:

# 按经验等级分组的薪资统计
exp_salary_stats = df.groupby('experience_level')['salary_in_usd'].agg(['mean', 'median', 'min', 'max'])
print(exp_salary_stats)

# 按雇佣类型分组的薪资统计
emp_salary_stats = df.groupby('employment_type')['salary_in_usd'].agg(['mean', 'median'])
print(emp_salary_stats)

通过均值、中位数的差异,可快速捕捉不同特征类别对薪资的影响趋势。

2. 可视化分析

用可视化直观展示关联关系:

import seaborn as sns
import matplotlib.pyplot as plt

# 经验等级 vs 薪资箱线图
plt.figure(figsize=(10,6))
sns.boxplot(x='experience_level', y='salary_in_usd', data=df, order=['EN','MI','SE','EX'])
plt.title('薪资分布与经验等级的关系')
plt.show()

# 远程比例 vs 薪资箱线图
plt.figure(figsize=(10,6))
sns.boxplot(x='remote_ratio', y='salary_in_usd', data=df)
plt.title('薪资分布与远程办公比例的关系')
plt.show()

# 数值化特征与薪资的相关性热力图
numeric_features = ['experience_level_num', 'remote_ratio'] + [col for col in df.columns if 'emp_type_' in col]
corr_matrix = df[numeric_features + ['salary_in_usd']].corr()
plt.figure(figsize=(12,8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('特征与薪资的相关性热力图')
plt.show()

箱线图可展示分布差异与异常值,热力图可呈现数值特征与薪资的线性相关程度。

3. 统计检验

用统计方法验证关联的显著性:

  • 有序分类特征(experience_level)与连续标签:采用Kruskal-Wallis检验(非参数方法,适配非正态分布数据),验证不同经验等级的薪资是否存在显著差异;
  • 无序分类特征(employment_type)与连续标签:采用单因素ANOVA检验,验证不同雇佣类型的薪资均值是否存在显著差异。
from scipy.stats import kruskal, f_oneway

# Kruskal-Wallis检验经验等级与薪资的关联
groups = [df[df['experience_level'] == level]['salary_in_usd'] for level in ['EN','MI','SE','EX']]
stat, p_value = kruskal(*groups)
print(f"Kruskal-Wallis检验统计量: {stat}, p值: {p_value}")
# p值<0.05则说明不同经验等级的薪资存在显著差异

# ANOVA检验雇佣类型与薪资的关联
groups = [df[df['employment_type'] == typ]['salary_in_usd'] for typ in df['employment_type'].unique()]
stat, p_value = f_oneway(*groups)
print(f"ANOVA检验统计量: {stat}, p值: {p_value}")

四、最优解决方案总结

  1. 优先统一薪资货币:直接使用salary_in_usd作为标签,规避币种差异导致的分析偏差;
  2. 特征编码策略:
    • 有序分类特征(experience_level):采用有序编码,保留等级递进信息;
    • 无序分类特征(employment_type、salary_currency):关联分析用独热编码,预测建模用目标编码(需注意过拟合);
  3. 关联分析流程:先通过描述性统计看趋势,再用可视化直观展示,最后用统计检验验证显著性;
  4. 额外优化:对job_title做类别合并(如将相似职位归为"数据科学家"、"数据工程师"大类),减少类别数量,提升分析清晰度。

内容的提问来源于stack exchange,提问作者Eslam Fouad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:06:25