ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

员工绩效分析实战:从数据清洗到随机森林回归的20个脚本

员工绩效分析实战:从数据清洗到随机森林回归的20个脚本 简介这份资源面向机器学习入门与进阶学习者围绕员工绩效与薪资数据集展开完整的分析与预测实战帮助读者掌握从数据预处理、探索性分析到回归建模的全流程技能。包内共23个文件以20个Python源代码为主体另附1个CSV数据集、1份PDF任务说明和1份readme说明文档压缩包约266KB代码与数据分离存放便于按模块逐步运行调试。代码覆盖numpy、pandas、seaborn、matplotlib等数据处理与可视化库并调用sklearn的MinMaxScaler、train_test_split、RandomForestRegressor及均方误差评估涉及数据合并、特征缩放、随机森林回归等关键环节。已有67人学习下载。读者可借此获得一套可直接运行的绩效预测方案理解特征工程与模型评估思路并对照PDF任务清单逐项练习适合作为课程设计或自学练手项目。1. 拿到这份员工绩效数据集先别急着建模很多做 HR 数据或者刚转行机器学习的朋友拿到一份「员工绩效分析」资源包第一反应就是打开 Jupyter 跑RandomForestRegressor结果跑完 MSE 一脸懵——预测值全挤在均值附近特征重要性也看不出业务含义。这份资源包的价值不在于模型多复杂而在于它把一条完整的分析链路拆成了 20 个独立脚本从1-Employee Performance and Salary Solution.py的基线方案到7-Preprocessing Merging Joining.py的数据合并再到20-Employee Performance Using Pandas.py的纯 Pandas 视角复盘。273.98 KB 的数据集里包含Employe_Performance_dataset.csv和一份50_Tasks_to_perform_on_dataset.pdf任务清单后者其实是很好的练手索引。它适合两类人一是想用真实表格数据走一遍「清洗→EDA→特征工程→回归预测」的 Python 学习者二是需要快速搭出绩效分析原型的 HR 数据从业者。但要注意这份资源里的代码是手工整理的教学向脚本不是生产级流水线直接套业务数据前得先搞清它的字段口径和缺失逻辑。2. 拆开资源包20 个脚本的分工与数据字段摸底2.1 脚本命名规律与推荐阅读顺序这 20 个.py文件不是按编号顺序写的编号更像是整理时的归档序号。我实际翻了一遍发现可以按功能分成四组基线方案组1、2、6、9、数据预处理组7、13、EDA 与趋势分析组3、4、5、8、10、12、16、17、19、Pandas 专项组11、14、15、18、20。如果你时间有限建议按7 → 5 → 1 → 20的顺序读先看合并逻辑再看 EDA 怎么出图然后看基线模型怎么搭最后用纯 Pandas 脚本对照检查前面的特征工程有没有漏。readme.txt里没有写依赖版本但摘要里列了模块清单我建议直接建一个干净环境避免和本地已有的 sklearn 版本冲突python -m venv emp_env source emp_env/bin/activate # Windows 用 emp_env\Scripts\activate pip install numpy pandas scikit-learn seaborn matplotlib这里不装warnings和os因为它们是标准库。datetime也是标准库但摘要里单独列了datetime.datetime说明有脚本用到了日期解析后面读 CSV 时要注意parse_dates参数。2.2 数据集字段与 50 个任务的对应关系Employe_Performance_dataset.csv的文件名里Employe少了一个e这是原始命名读文件时别手滑改成Employee导致FileNotFoundError。用下面这段代码先做字段摸底比直接df.head()看得更全import pandas as pd df pd.read_csv(data/Employe_Performance_dataset.csv) print(df.shape) print(df.dtypes) print(df.isnull().sum()) print(df.describe(includeall).T)逻辑说明shape确认行列数dtypes区分数值型和分类型字段isnull().sum()定位缺失列describe(includeall)同时给出数值统计和类别频次。参数上如果 CSV 里有日期列建议加parse_dates[HireDate]之类的参数但具体列名要以实际输出为准不要照抄。50_Tasks_to_perform_on_dataset.pdf我翻了一遍里面很多任务其实是引导性问题比如「哪个部门的平均绩效分最高」「薪资和绩效的相关系数是多少」。这些任务不需要全部做完挑 10 个左右就能覆盖主要分析模式。常见做法是先把 PDF 里的任务按「单变量统计」「分组聚合」「相关性」「可视化」四类打标签再对应到脚本编号这样读代码时目标更明确。3. 从清洗到合并预处理脚本里的四个关键操作3.1 缺失值与异常值的处理策略7-Preprocessing Merging Joining.py是整包的核心预处理脚本。它处理缺失值的方式不是简单dropna()而是分列处理数值列用中位数填充分类列用众数填充。这个选择在员工绩效场景下是合理的因为薪资和绩效分往往有长尾均值容易被高管薪资拉偏。from sklearn.preprocessing import MinMaxScaler num_cols df.select_dtypes(include[float64, int64]).columns cat_cols df.select_dtypes(include[object]).columns for col in num_cols: df[col] df[col].fillna(df[col].median()) for col in cat_cols: df[col] df[col].fillna(df[col].mode()[0]) scaler MinMaxScaler() df[num_cols] scaler.fit_transform(df[num_cols])逻辑说明先按 dtype 自动分列避免手写列名漏字段。fillna(median())对异常值不敏感mode()[0]取众数第一个值。MinMaxScaler把数值压到 0-1这是摘要里明确用到的模块。注意归一化之后describe()的均值会变如果后面要做业务解释建议保留一份未归一化的副本。参数上MinMaxScaler默认feature_range(0,1)如果数据里有极端离群点可以考虑RobustScaler但这份资源没用所以先按原脚本走。3.2 合并与连接时的主键选择7号脚本里还涉及merge和join。员工绩效数据通常有两张表一张是员工基本信息一张是绩效评分。合并时主键一般是EmployeeID。但这份资源只有一个 CSV所以合并操作更多是教学演示比如把聚合后的部门统计量 merge 回原表。dept_avg df.groupby(Department)[PerformanceScore].mean().reset_index() dept_avg.columns [Department, DeptAvgScore] df df.merge(dept_avg, onDepartment, howleft)逻辑说明groupby后reset_index()把分组键变回列否则 merge 会报错。howleft保证原表行数不变。参数上如果部门列有前后空格merge 会匹配失败建议先df[Department] df[Department].str.strip()。提示合并前务必检查主键的唯一性df[EmployeeID].duplicated().sum()如果大于 0merge 后行数会膨胀。4. EDA 与可视化把绩效趋势画成能汇报的图4.1 用 Seaborn 做分组箱线图与相关性热力图5-Employee Performance SalaryAnalysis EDA.py和12-Analyzing Employee Performance and Salary Dataset.py里有大量可视化代码。我挑两个最实用的分组箱线图看部门绩效分布热力图看数值特征相关性。import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize(10, 6)) sns.boxplot(xDepartment, yPerformanceScore, datadf) plt.xticks(rotation45) plt.title(Performance Score by Department) plt.tight_layout() plt.show() plt.figure(figsize(8, 6)) corr df.select_dtypes(include[float64, int64]).corr() sns.heatmap(corr, annotTrue, cmapcoolwarm, fmt.2f) plt.title(Correlation Matrix) plt.show()逻辑说明boxplot的x放分类列y放数值列rotation45防止部门名重叠。heatmap前先筛数值列否则corr()会报错。annotTrue显示相关系数fmt.2f保留两位小数。参数上如果部门超过 8 个建议改用sns.violinplot或只取 Top 5 部门。4.2 薪资与绩效的散点图及趋势线17-Analysis Employee Performance and Sales.py里有一个散点图加回归线的做法适合向业务方解释「薪资和绩效是否正相关」。plt.figure(figsize(8, 6)) sns.regplot(xSalary, yPerformanceScore, datadf, scatter_kws{alpha: 0.5}, line_kws{color: red}) plt.title(Salary vs Performance Score) plt.show()逻辑说明regplot自动拟合线性回归线alpha0.5让散点半透明避免重叠。line_kws把趋势线设成红色。参数上如果数据点超过 5000regplot会变慢可以改用sns.scatterplot加sns.lineplot手动叠加。注意相关性不等于因果。薪资和绩效正相关可能是绩效高导致薪资高也可能是职级高同时推高两者。汇报时别把话说死。5. 建模预测RandomForestRegressor 的参数与评估5.1 特征与目标变量的划分1-Employee Performance and Salary Solution.py和9-Employee Performance and Salary Notebook.py是建模主脚本。摘要里明确用了train_test_split和RandomForestRegressor。目标变量通常是PerformanceScore或Salary但这两个不能同时做特征否则数据泄漏。from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error X df.drop(columns[PerformanceScore, EmployeeID]) y df[PerformanceScore] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) model RandomForestRegressor(n_estimators100, random_state42) model.fit(X_train, y_train) y_pred model.predict(X_test) mse mean_squared_error(y_test, y_pred) print(fMSE: {mse:.4f})逻辑说明drop里去掉目标列和 ID 列ID 做特征没有意义。test_size0.2是常见比例random_state42保证可复现。n_estimators100是默认值资源里没调参但你可以试 200 看 MSE 是否下降。mean_squared_error直接算 MSE如果要 RMSE 就mse ** 0.5。参数上RandomForestRegressor还有max_depth、min_samples_split等默认是None和2。如果过拟合可以设max_depth10试试。5.2 特征重要性排序与业务解释训练完随机森林feature_importances_能告诉你哪些字段对绩效影响最大。这一步比 MSE 更有汇报价值。import numpy as np importances model.feature_importances_ indices np.argsort(importances)[::-1] for i in range(X.shape[1]): print(f{X.columns[indices[i]]}: {importances[indices[i]]:.4f})逻辑说明argsort升序后[::-1]反转成降序。打印时保留四位小数。参数上如果特征超过 20 个建议只打印前 10 个或者用pd.Series配合plot.barh出图。提示特征重要性高不代表因果。比如「工龄」重要性高可能是因为老员工绩效评分普遍偏高而不是工龄直接导致绩效。6. 避坑与排查这份资源里最容易翻车的五个点6.1 文件名拼写与路径问题现象运行pd.read_csv(Employee_Performance_dataset.csv)报FileNotFoundError。 原因实际文件名是Employe_Performance_dataset.csv少了一个e而且文件在data目录下。 解决用pd.read_csv(data/Employe_Performance_dataset.csv)或者先os.listdir(data)确认文件名。6.2 归一化后目标变量被缩放现象MSE 看起来很小但预测值都在 0-1 之间业务方看不懂。 原因MinMaxScaler对全部数值列做了归一化包括目标变量PerformanceScore。 解决先分离目标变量再做缩放或者用scaler.inverse_transform还原预测值。6.3 分类变量未编码直接进模型现象RandomForestRegressor报ValueError: could not convert string to float。 原因Department、JobRole等分类列还是字符串sklearn 不接受。 解决用pd.get_dummies(df, columnscat_cols, drop_firstTrue)做独热编码或者用LabelEncoder转成数值。注意drop_firstTrue避免多重共线性。6.4 合并后行数膨胀现象merge之后df.shape[0]比原来多。 原因主键不唯一一对多合并导致笛卡尔积。 解决合并前df[EmployeeID].duplicated().sum()检查如果重复先聚合或去重。6.5 随机森林训练太慢现象fit跑了十几分钟没结束。 原因n_estimators太大或者数据量远超 273.98 KB 的原始规模。 解决先设n_estimators50试跑确认流程通再加大。也可以设n_jobs-1用满 CPU 核心。7. 进阶技巧用 Pandas 做交叉验证与残差分析20-Employee Performance Using Pandas.py这个脚本容易被忽略但它其实提供了一个不依赖 sklearn 的验证视角。我习惯在建模后补两步一是用 Pandas 做分组残差分析二是用cross_val_score做交叉验证。先看残差分析df_result X_test.copy() df_result[Actual] y_test df_result[Predicted] y_pred df_result[Residual] df_result[Actual] - df_result[Predicted] print(df_result.groupby(Department)[Residual].agg([mean, std]))逻辑说明把测试集的真实值、预测值、残差拼成一张表按部门分组看残差均值和标准差。如果某个部门的残差均值明显偏离 0说明模型对该部门有系统性高估或低估。参数上agg([mean, std])可以换成describe()看更多统计量。再看交叉验证from sklearn.model_selection import cross_val_score scores cross_val_score(model, X, y, cv5, scoringneg_mean_squared_error) rmse_scores np.sqrt(-scores) print(fCV RMSE: {rmse_scores.mean():.4f} ± {rmse_scores.std():.4f})逻辑说明cv5做 5 折交叉验证scoringneg_mean_squared_error返回负 MSE取负号再开方得到 RMSE。±后面是标准差越小说明模型越稳定。参数上如果数据量小cv3就够数据量大可以cv10。这两个步骤加起来不到 20 行代码但能帮你判断模型是「真的学到了规律」还是「只是记住了训练集」。我自己的习惯是每次跑完随机森林先看交叉验证 RMSE 和训练集 RMSE 的差距如果差距超过 30%就回头检查特征工程有没有泄漏或者max_depth是不是太深。从那以后我每次拿到新的表格数据都强制先跑一遍df.isnull().sum()和df.duplicated().sum()再开始画图。希望帮到你。本文还有配套的精品资源点击获取
返回列表