薪资数据集特征工程咨询:类别特征数值化的实现与最优方案
薪资数据集特征工程与关联分析实现方案
一、核心前提说明
你的标签是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}")
四、最优解决方案总结
- 优先统一薪资货币:直接使用
salary_in_usd作为标签,规避币种差异导致的分析偏差; - 特征编码策略:
- 有序分类特征(experience_level):采用有序编码,保留等级递进信息;
- 无序分类特征(employment_type、salary_currency):关联分析用独热编码,预测建模用目标编码(需注意过拟合);
- 关联分析流程:先通过描述性统计看趋势,再用可视化直观展示,最后用统计检验验证显著性;
- 额外优化:对
job_title做类别合并(如将相似职位归为"数据科学家"、"数据工程师"大类),减少类别数量,提升分析清晰度。
内容的提问来源于stack exchange,提问作者Eslam Fouad
相关产品推荐
相关产品推荐

