Python人力资源数据分析案例
人力资源分析,也称为人员分析、劳动力分析或人才分析,涉及收集、分析和报告人力资源数据。它是收集和应用人才数据,以改善关键人才和业务成果。它使您的组织能够衡量一系列人力资源指标对整体业务绩效的影响,并根据数据做出决策。他们主要负责解释和分析庞大的数据集。在人力资源管理领域中,分析各项员工工作相关的数据和指标,可以揭示员工流失的趋势和原因、薪酬公平性、员工满意度以及职业发展路径等关键指标。这些见解对于
一、项目概述
背景描述
HR analytics, also referred to as people analytics, workforce analytics, or talent analytics, involves gathering together, analyzing, and reporting HR data. It is the collection and application of talent data to improve critical talent and business outcomes. It enables your organization to measure the impact of a range of HR metrics on overall business performance and make decisions based on data. They are primarily responsible for interpreting and analyzing vast datasets.
人力资源分析,也称为人员分析、劳动力分析或人才分析,涉及收集、分析和报告人力资源数据。它是收集和应用人才数据,以改善关键人才和业务成果。它使您的组织能够衡量一系列人力资源指标对整体业务绩效的影响,并根据数据做出决策。他们主要负责解释和分析庞大的数据集。
在人力资源管理领域中,分析各项员工工作相关的数据和指标,可以揭示员工流失的趋势和原因、薪酬公平性、员工满意度以及职业发展路径等关键指标。这些见解对于优化人才招聘、留存策略、绩效评估体系和员工发展计划至关重要。通过对这些多维数据的深入分析,组织可以制定更加人性化的管理措施,改进工作环境,提高员工的工作满意度和忠诚度,从而推动组织的整体业绩和竞争力。此外,分析结果还支持制定更加公正和激励性的薪酬体系,以吸引和保留顶尖人才,确保组织的长期成功和可持续发展。
数据说明
字段 | 说明 |
---|---|
EmpID | 唯一的员工ID |
Age | 年龄 |
AgeGroup | 年龄组 |
Attrition | 是否离职 |
BusinessTravel | 出差:很少、频繁、不出差 |
DailyRate | 日薪 |
Department | 任职部门:研发部门、销售部门、人力资源部门 |
DistanceFromHome | 通勤距离 |
Education | 教育等级 |
EducationField | 专业领域:生命科学、医学、市场营销、技术、其他 |
EnvironmentSatisfaction | 工作环境满意度 |
Gender | 性别 |
HourlyRate | 时薪 |
JobInvolvement | 工作参与度 |
JobLevel | 工作级别 |
JobRole | 工作角色 |
JobSatisfaction | 工作满意度 |
MaritalStatus | 婚姻状况 |
MonthlyIncome | 月收入 |
SalarySlab | 工资单 |
MonthlyRate | 月薪 |
NumCompaniesWorked | 工作过的公司数量 |
PercentSalaryHike | 加薪百分比 |
PerformanceRating | 绩效评级 |
RelationshipSatisfaction | 关系满意度 |
StandardHours | 标准工时 |
StockOptionLevel | 股票期权级别 |
TotalWorkingYears | 总工作年数 |
TrainingTimesLastYear | 去年培训时间 |
WorkLifeBalance | 工作生活平衡评价 |
YearsAtCompany | 在公司工作年数 |
YearsInCurrentRole | 担任现职年数 |
YearsSinceLastPromotion | 上次晋升后的年数 |
YearsWithCurrManager | 与现任经理共事年数 |
数据来源
https://www.kaggle.com/datasets/anshika2301/hr-analytics-dataset
问题描述
员工流失分析
-
识别导致员工离职的因素(Attrition与其他字段的关系,如满意度、工资、通勤距离等)。
-
分析不同年龄组、婚姻状况、工作年数与离职率之间的关系。
薪酬公平性研究
-
比较不同性别(Gender)、教育等级(Education)和专业领域(EducationField)的薪资差异。
-
探讨工作级别(JobLevel)、工作角色(JobRole)与月收入(MonthlyIncome)、时薪(HourlyRate)、日薪(DailyRate)之间的关系。
工作满意度分析
-
评估工作满意度(JobSatisfaction)、工作环境满意度(EnvironmentSatisfaction)、关系满意度(RelationshipSatisfaction)与员工绩效(PerformanceRating)之间的关联。
-
分析工作生活平衡评价(WorkLifeBalance)与工作参与度(JobInvolvement)、在公司工作年数(YearsAtCompany)之间的关系。
职业发展和晋升路径分析
-
检查晋升历史(YearsSinceLastPromotion)与工作满意度、工作级别和绩效评级之间的关联。
-
分析员工在当前角色的时间(YearsInCurrentRole)对于工作参与度和晋升机会的影响。
培训和发展需求评估
-
评估培训次数(TrainingTimesLastYear)与员工绩效评级的关系。
-
分析工作经验(TotalWorkingYears)与培训需求之间的关系。
员工福利和激励措施分析
-
探索股票期权级别(StockOptionLevel)对员工留存的影响。
-
分析加薪百分比(PercentSalaryHike)与员工满意度和绩效的关系。
人力资源规划和预测
-
预测哪些因素会影响员工留存(如工资、工作满意度、工作环境)。
-
用历史数据建模,预测员工晋升路径和潜在的流失风险。
二、数据读取与预处理
# 导入需要的库 import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt
# 读取数据 hr_data = pd.read_csv("HR_Analytics.csv")
# 查看数据维度 hr_data.shape
(1480, 34)
# 查看数据信息 hr_data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1480 entries, 0 to 1479 Data columns (total 34 columns): EmpID 1480 non-null object Age 1480 non-null int64 AgeGroup 1480 non-null object Attrition 1480 non-null object BusinessTravel 1480 non-null object DailyRate 1480 non-null int64 Department 1480 non-null object DistanceFromHome 1480 non-null int64 Education 1480 non-null int64 EducationField 1480 non-null object EnvironmentSatisfaction 1480 non-null int64 Gender 1480 non-null object HourlyRate 1480 non-null int64 JobInvolvement 1480 non-null int64 JobLevel 1480 non-null int64 JobRole 1480 non-null object JobSatisfaction 1480 non-null int64 MaritalStatus 1480 non-null object MonthlyIncome 1480 non-null int64 SalarySlab 1480 non-null object MonthlyRate 1480 non-null int64 NumCompaniesWorked 1480 non-null int64 PercentSalaryHike 1480 non-null int64 PerformanceRating 1480 non-null int64 RelationshipSatisfaction 1480 non-null int64 StandardHours 1480 non-null int64 StockOptionLevel 1480 non-null int64 TotalWorkingYears 1480 non-null int64 TrainingTimesLastYear 1480 non-null int64 WorkLifeBalance 1480 non-null int64 YearsAtCompany 1480 non-null int64 YearsInCurrentRole 1480 non-null int64 YearsSinceLastPromotion 1480 non-null int64 YearsWithCurrManager 1423 non-null float64 dtypes: float64(1), int64(23), object(10) memory usage: 393.2+ KB
# 描述性分析 hr_data.describe(include='all')
EmpID | Age | AgeGroup | Attrition | BusinessTravel | DailyRate | Department | DistanceFromHome | Education | EducationField | ... | RelationshipSatisfaction | StandardHours | StockOptionLevel | TotalWorkingYears | TrainingTimesLastYear | WorkLifeBalance | YearsAtCompany | YearsInCurrentRole | YearsSinceLastPromotion | YearsWithCurrManager | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 1480 | 1480.000000 | 1480 | 1480 | 1480 | 1480.000000 | 1480 | 1480.000000 | 1480.000000 | 1480 | ... | 1480.000000 | 1480.0 | 1480.000000 | 1480.000000 | 1480.000000 | 1480.000000 | 1480.000000 | 1480.000000 | 1480.000000 | 1423.000000 |
unique | 1470 | NaN | 5 | 2 | 4 | NaN | 3 | NaN | NaN | 6 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
top | RM1462 | NaN | 26-35 | No | Travel_Rarely | NaN | Research & Development | NaN | NaN | Life Sciences | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
freq | 2 | NaN | 611 | 1242 | 1042 | NaN | 967 | NaN | NaN | 607 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
mean | NaN | 36.917568 | NaN | NaN | NaN | 801.384459 | NaN | 9.220270 | 2.910811 | NaN | ... | 2.708784 | 80.0 | 0.791892 | 11.281757 | 2.797973 | 2.760811 | 7.009459 | 4.228378 | 2.182432 | 4.118060 |
std | NaN | 9.128559 | NaN | NaN | NaN | 403.126988 | NaN | 8.131201 | 1.023796 | NaN | ... | 1.081995 | 0.0 | 0.850527 | 7.770870 | 1.288791 | 0.707024 | 6.117945 | 3.616020 | 3.219357 | 3.555484 |
min | NaN | 18.000000 | NaN | NaN | NaN | 102.000000 | NaN | 1.000000 | 1.000000 | NaN | ... | 1.000000 | 80.0 | 0.000000 | 0.000000 | 0.000000 | 1.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
25% | NaN | 30.000000 | NaN | NaN | NaN | 465.000000 | NaN | 2.000000 | 2.000000 | NaN | ... | 2.000000 | 80.0 | 0.000000 | 6.000000 | 2.000000 | 2.000000 | 3.000000 | 2.000000 | 0.000000 | 2.000000 |
50% | NaN | 36.000000 | NaN | NaN | NaN | 800.000000 | NaN | 7.000000 | 3.000000 | NaN | ... | 3.000000 | 80.0 | 1.000000 | 10.000000 | 3.000000 | 3.000000 | 5.000000 | 3.000000 | 1.000000 | 3.000000 |
75% | NaN | 43.000000 | NaN | NaN | NaN | 1157.000000 | NaN | 14.000000 | 4.000000 | NaN | ... | 4.000000 | 80.0 | 1.000000 | 15.000000 | 3.000000 | 3.000000 | 9.000000 | 7.000000 | 3.000000 | 7.000000 |
max | NaN | 60.000000 | NaN | NaN | NaN | 1499.000000 | NaN | 29.000000 | 5.000000 | NaN | ... | 4.000000 | 80.0 | 3.000000 | 40.000000 | 6.000000 | 4.000000 | 40.000000 | 18.000000 | 15.000000 | 17.000000 |
11 rows × 34 columns
# 查看各列缺失值 hr_data.isna().sum()
EmpID 0 Age 0 AgeGroup 0 Attrition 0 BusinessTravel 0 DailyRate 0 Department 0 DistanceFromHome 0 Education 0 EducationField 0 EnvironmentSatisfaction 0 Gender 0 HourlyRate 0 JobInvolvement 0 JobLevel 0 JobRole 0 JobSatisfaction 0 MaritalStatus 0 MonthlyIncome 0 SalarySlab 0 MonthlyRate 0 NumCompaniesWorked 0 PercentSalaryHike 0 PerformanceRating 0 RelationshipSatisfaction 0 StandardHours 0 StockOptionLevel 0 TotalWorkingYears 0 TrainingTimesLastYear 0 WorkLifeBalance 0 YearsAtCompany 0 YearsInCurrentRole 0 YearsSinceLastPromotion 0 YearsWithCurrManager 57 dtype: int64
说明:YearsWithCurrManager(与现任经理共事年数)列,共有 57 个缺失值,这里我默认和字段YearsInCurrentRole(担任现职年数)的值相同,将缺失值替换为YearsInCurrentRole(担任现职年数)
# 使用 YearsInCurrentRole 的值来填补 YearsWithCurrManager 的缺失值 hr_data['YearsWithCurrManager'].fillna(hr_data['YearsInCurrentRole'], inplace=True) # 再次检查缺失值情况 hr_data.isna().sum()
EmpID 0 Age 0 AgeGroup 0 Attrition 0 BusinessTravel 0 DailyRate 0 Department 0 DistanceFromHome 0 Education 0 EducationField 0 EnvironmentSatisfaction 0 Gender 0 HourlyRate 0 JobInvolvement 0 JobLevel 0 JobRole 0 JobSatisfaction 0 MaritalStatus 0 MonthlyIncome 0 SalarySlab 0 MonthlyRate 0 NumCompaniesWorked 0 PercentSalaryHike 0 PerformanceRating 0 RelationshipSatisfaction 0 StandardHours 0 StockOptionLevel 0 TotalWorkingYears 0 TrainingTimesLastYear 0 WorkLifeBalance 0 YearsAtCompany 0 YearsInCurrentRole 0 YearsSinceLastPromotion 0 YearsWithCurrManager 0 dtype: int64
# 查看重复值 hr_data.duplicated().sum()
7
说明:数据集中存在 7 行重复值。考虑到后续分析需要每行数据代表一个独特的实例,删除该重复值
三、员工流失分析
员工流失(Attrition)相关性分析
-
识别导致员工离职的因素(Attrition与其他字段的关系,如满意度、工资、通勤距离等)。
# 将Attrition列的文本值转换为数值(是: 1, 否: 0) hr_data['Attrition'] = hr_data['Attrition'].map({'Yes': 1, 'No': 0}) # 计算Attrition与其他数值型字段的相关性 correlation_with_attrition = hr_data.corr()['Attrition'].sort_values() correlation_with_attrition
TotalWorkingYears -0.168358 JobLevel -0.167150 YearsWithCurrManager -0.161021 YearsInCurrentRole -0.160968 MonthlyIncome -0.157672 Age -0.155476 StockOptionLevel -0.135140 YearsAtCompany -0.135108 JobInvolvement -0.130769 JobSatisfaction -0.104232 EnvironmentSatisfaction -0.101696 WorkLifeBalance -0.062646 TrainingTimesLastYear -0.058415 DailyRate -0.056976 RelationshipSatisfaction -0.045387 YearsSinceLastPromotion -0.032244 Education -0.030144 PercentSalaryHike -0.014603 HourlyRate -0.008252 PerformanceRating 0.002531 MonthlyRate 0.016585 NumCompaniesWorked 0.045336 DistanceFromHome 0.080006 Attrition 1.000000 StandardHours NaN Name: Attrition, dtype: float64
说明:通过相关系数,首先是负相关关系TotalWorkingYears -0.170847JobLevel -0.168926YearsInCurrentRole -0.160302MonthlyIncome -0.159458YearsWithCurrManager -0.159338Age -0.158775StockOptionLevel -0.136939YearsAtCompany -0.134106JobInvolvement -0.129678EnvironmentSatisfaction -0.104022JobSatisfaction -0.103276WorkLifeBalance -0.064221TrainingTimesLastYear -0.059769DailyRate -0.056809RelationshipSatisfaction -0.045763YearsSinceLastPromotion -0.032487Education -0.030526PercentSalaryHike -0.013827HourlyRate -0.005593以上字段成负相关关系:(1)工作时长越长,离职的可能越小,(2)工作级别越高,离职可能性越小,(3)现任职位时间越长,也约不太可能离职,(4)月收入越高,越不会离职接着是正相关关系PerformanceRating 0.003268MonthlyRate 0.014647NumCompaniesWorked 0.043469DistanceFromHome 0.077585以上字段成正相关关系:(1)离家越远,越有可能离职,(2)加薪越低越有可能离职结论都是符合客观情况的
不同年龄组、婚姻状况、工作年数与离职率分析
-
分析不同年龄组、婚姻状况、工作年数与离职率之间的关系。
# 设置绘图风格 sns.set(style="whitegrid") # 绘制不同年龄组的员工流失率 plt.figure(figsize=(12, 6)) sns.barplot(x='AgeGroup', y='Attrition', data=hr_data, ci=None) plt.title('员工流失率按年龄组') plt.ylabel('Attrition') plt.xlabel('AgeGroup') plt.show()
如18-25岁年龄段的离职率较高,55岁以上年龄段的离职率较高;36-45岁年龄段的离职率较低过于年轻的员工和过于年长的员工的离职率相对于正值壮年的员工离职率比较高
# 婚姻状况与离职率的关系 plt.figure(figsize=(8, 5)) sns.countplot(x='MaritalStatus', hue='Attrition', data=hr_data) plt.title('婚姻状况与离职率的关系') plt.xlabel('MaritalStatus') plt.ylabel('Attrition') plt.show()
未婚员工的离职率相对较高。已婚和离婚员工的离职率相对较低
# 绘制工作年数与员工流失率的关系 plt.figure(figsize=(12, 6)) sns.lineplot(x='TotalWorkingYears', y='Attrition', data=hr_data) plt.title('员工流失率随工作年数的变化') plt.ylabel('Attrition') plt.xlabel('TotalWorkingYears') plt.show()
在工作年数较少的员工中(特别是在5年以下),离职率较高。工作年限40年的员工也比较高(异常的高)随着工作年数的增加,离职率逐渐降低,特别是在10年以上的员工中,离职率明显较低。
四、薪酬公平性研究
不同性别、教育等级和专业领域的薪资差异分析
-
比较不同性别(Gender)、教育等级(Education)和专业领域(EducationField)的薪资差异。
# 薪资差异分析 # 按性别比较月收入 plt.figure(figsize=(8, 5)) sns.boxplot(x='Gender', y='MonthlyIncome', data=hr_data) plt.title('性别与月收入的关系') plt.xlabel('Gender') plt.ylabel('MonthlyIncome') plt.show() # 按教育等级比较月收入 plt.figure(figsize=(8, 5)) sns.boxplot(x='Education', y='MonthlyIncome', data=hr_data) plt.title('教育等级与月收入的关系') plt.xlabel('Education') plt.ylabel('MonthlyIncome') plt.show() # 按专业领域比较月收入 plt.figure(figsize=(12, 6)) sns.boxplot(x='EducationField', y='MonthlyIncome', data=hr_data) plt.title('专业领域与月收入的关系') plt.xlabel('EducationField') plt.ylabel('MonthlyIncome') plt.xticks(rotation=45) plt.show()
男女性的收入分布都差不多教育等级和收入的分布大致呈现了线性增长的趋势,教育等级较高,月收入也越高不同专业领域的员工月收入不同。市场Marketing的比较高,人力Human Resources行业的比较低
工作级别、工作角色与月收入、时薪、日薪关系分享
-
探讨工作级别(JobLevel)、工作角色(JobRole)与月收入(MonthlyIncome)、时薪(HourlyRate)、日薪(DailyRate)之间的关系。
# 工作级别与薪酬的关系 plt.figure(figsize=(10, 6)) sns.boxplot(x='JobLevel', y='MonthlyIncome', data=hr_data) plt.title('工作级别与薪酬的关系') plt.xlabel('JobLevel') plt.ylabel('MonthlyIncome') plt.show() # 工作角色与月收入的关系 plt.figure(figsize=(14, 7)) sns.boxplot(x='JobRole', y='MonthlyIncome', data=hr_data) plt.title('工作角色与月收入的关系') plt.xlabel('JobRole') plt.ylabel('MonthlyIncome') plt.xticks(rotation=45) plt.show() # 工作级别与时薪的关系 plt.figure(figsize=(10, 6)) sns.boxplot(x='JobLevel', y='HourlyRate', data=hr_data) plt.title('工作级别与时薪的关系') plt.xlabel('工作级别') plt.ylabel('时薪') plt.show() # 工作角色与时薪的关系 plt.figure(figsize=(14, 7)) sns.boxplot(x='JobRole', y='HourlyRate', data=hr_data) plt.title('工作角色与时薪的关系') plt.xlabel('JobRole') plt.ylabel('HourlyRate') plt.xticks(rotation=45) plt.show() # 工作级别与日薪的关系 plt.figure(figsize=(10, 6)) sns.boxplot(x='JobLevel', y='DailyRate', data=hr_data) plt.title('工作级别与日薪的关系') plt.xlabel('JobLevel') plt.ylabel('DailyRate') plt.show() # 工作角色与日薪的关系 plt.figure(figsize=(14, 7)) sns.boxplot(x='JobRole', y='DailyRate', data=hr_data) plt.title('工作角色与日薪的关系') plt.xlabel('JobRole') plt.ylabel('DailyRate') plt.xticks(rotation=45) plt.show()
工作等级符合客观事实,级别越高钱越多大部分角色岗位的中位数薪资都差不多,不过好像人力Human Resources这个角色的工资上限确实是比较低的
五、工作满意度分析
工作满意度、工作环境满意度、关系满意度与员工绩效分析
-
评估工作满意度(JobSatisfaction)、工作环境满意度(EnvironmentSatisfaction)、关系满意度(RelationshipSatisfaction)与员工绩效(PerformanceRating)之间的关联。
# 创建一个散点矩阵图(Pair Plot)来可视化这些变量之间的关系 sns.pairplot(hr_data, vars=["JobSatisfaction", "EnvironmentSatisfaction", "RelationshipSatisfaction", "PerformanceRating"]) plt.show() # 计算这些变量之间的相关系数 correlation_matrix = hr_data[["JobSatisfaction", "EnvironmentSatisfaction", "RelationshipSatisfaction", "PerformanceRating"]].corr() # 打印相关系数矩阵 print(correlation_matrix)
JobSatisfaction EnvironmentSatisfaction \ JobSatisfaction 1.000000 -0.010201 EnvironmentSatisfaction -0.010201 1.000000 RelationshipSatisfaction -0.009918 0.009256 PerformanceRating 0.002421 -0.031625 RelationshipSatisfaction PerformanceRating JobSatisfaction -0.009918 0.002421 EnvironmentSatisfaction 0.009256 -0.031625 RelationshipSatisfaction 1.000000 -0.031020 PerformanceRating -0.031020 1.000000
# 重新制图,使用热力图来显示 selected_columns = ["JobSatisfaction", "EnvironmentSatisfaction", "RelationshipSatisfaction", "PerformanceRating"] # 计算这些列之间的相关系数矩阵 correlation_matrix = hr_data[selected_columns].corr() # 创建热力图来可视化相关性 plt.figure(figsize=(8, 6)) sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", linewidths=0.5) plt.title("Correlation Heatmap") plt.show()
correlation_matrix
JobSatisfaction | EnvironmentSatisfaction | RelationshipSatisfaction | PerformanceRating | |
---|---|---|---|---|
JobSatisfaction | 1.000000 | -0.010201 | -0.009918 | 0.002421 |
EnvironmentSatisfaction | -0.010201 | 1.000000 | 0.009256 | -0.031625 |
RelationshipSatisfaction | -0.009918 | 0.009256 | 1.000000 | -0.031020 |
PerformanceRating | 0.002421 | -0.031625 | -0.031020 | 1.000000 |
晋升历史(YearsSinceLastPromotion)与其他变量的相关性:与工作满意度(JobSatisfaction)的相关系数为-0.014979,接近零。这表示晋升历史与工作满意度之间几乎没有线性关系,它们之间的变化不太可能通过线性关系来解释。与工作级别(JobLevel)的相关系数为0.355518,为正值。这表示晋升历史与工作级别之间存在正相关关系,即晋升历史较长的员工更有可能达到更高的工作级别。与绩效评级(PerformanceRating)的相关系数为0.017239,接近零。这意味着晋升历史与绩效评级之间没有明显的线性关系,它们之间的变化不太可能通过线性关系来解释。
工作满意度(JobSatisfaction)与其他变量的相关性:与工作级别(JobLevel)的相关系数为-0.001440,接近零。这表明工作满意度与工作级别之间几乎没有线性关系,它们之间的变化不太可能通过线性关系来解释。与绩效评级(PerformanceRating)的相关系数为0.002421,接近零。这意味着工作满意度与绩效评级之间没有明显的线性关系,它们之间的变化不太可能通过线性关系来解释。
工作级别(JobLevel)与绩效评级(PerformanceRating)之间的相关性:这两个变量之间的相关系数为-0.021588,接近零。这表明工作级别与绩效评级之间也几乎没有线性关系,它们之间的变化不太可能通过线性关系来解释。
这个图展示了评估工作满意度(JobSatisfaction)、工作环境满意度(EnvironmentSatisfaction)、关系满意度(RelationshipSatisfaction)与员工绩效(PerformanceRating)之间的关联关系。几个变量之间系数不大,影响也不大,且相互之间没有太大的实际影响
工作生活平衡评价与工作参与度、在公司工作年数关系分析
-
分析工作生活平衡评价(WorkLifeBalance)与工作参与度(JobInvolvement)、在公司工作年数(YearsAtCompany)之间的关系。
# 创建散点图来可视化工作生活平衡评价和工作参与度之间的关系 plt.figure(figsize=(10, 6)) sns.scatterplot(data=hr_data, x="WorkLifeBalance", y="JobInvolvement", hue="YearsAtCompany", palette="coolwarm", size="YearsAtCompany", sizes=(20, 200)) plt.title("WorkLifeBalance vs. JobInvolvement (Color by YearsAtCompany)") plt.show() # 创建箱线图来可视化工作生活平衡评价和在公司工作年数之间的关系 plt.figure(figsize=(8, 6)) sns.boxplot(data=hr_data, x="WorkLifeBalance", y="YearsAtCompany") plt.title("WorkLifeBalance vs. YearsAtCompany") plt.show()
展示不太好看
import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 选择字段 selected_columns = ["WorkLifeBalance", "JobInvolvement", "YearsAtCompany"] # 创建一个新的Matplotlib图形 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # 在三维坐标系上绘制散点图 ax.scatter(hr_data["WorkLifeBalance"], hr_data["JobInvolvement"], hr_data["YearsAtCompany"], c=hr_data["YearsAtCompany"], cmap='coolwarm', s=50) # 设置坐标轴标签 ax.set_xlabel("WorkLifeBalance") ax.set_ylabel("JobInvolvement") ax.set_zlabel("YearsAtCompany") # 添加颜色图例 cbar = plt.colorbar(ax.scatter(hr_data["WorkLifeBalance"], hr_data["JobInvolvement"], hr_data["YearsAtCompany"], c=hr_data["YearsAtCompany"], cmap='coolwarm', s=50)) cbar.set_label("YearsAtCompany") plt.title("3D Scatter Plot (WorkLifeBalance, JobInvolvement, YearsAtCompany)") plt.show()
大致分成四种情况:在公司工作年数(YearsAtCompany)比较低的员工人数占比较高1,工作生活平衡评价(WorkLifeBalance)低,工作参与度(JobInvolvement)低,在公司工作年数(YearsAtCompany)比较低,这种情况的员工比较少2,工作生活平衡评价(WorkLifeBalance)居中,工作参与度(JobInvolvement)居中,这部分员工数比较多,可能存在的关系正向关系:工作生活平衡与工作参与度之间可能存在正向关系。当员工感到他们的工作和生活之间的平衡较好时,他们可能更容易投入工作并表现出更高的工作参与度。这是因为他们能够更好地管理工作压力,保持积极的情绪状态,从而更积极地投入工作。负向关系:相反,工作生活平衡也可能与在公司工作年数之间存在负向关系。如果员工长时间工作并感到工作与生活之间的平衡不佳,他们可能会更容易感到疲惫和燃尽,可能会考虑离职或寻找更好的平衡。中介关系:工作生活平衡也可能充当工作参与度和在公司工作年数之间的中介因素。良好的工作生活平衡可能有助于提高工作参与度,并最终促使员工更长时间地在公司工作。个体差异:关系也可能因个体差异而异。一些员工可能更注重工作生活平衡,而另一些员工可能更注重工作参与度。同样,员工的年龄、家庭状况和职业目标等因素也可能影响这些关系
六、职业发展和晋升路径分析
晋升历史与工作满意度、工作级别和绩效评级关系分析
-
检查晋升历史(YearsSinceLastPromotion)与工作满意度、工作级别和绩效评级之间的关联。
#选择字段 selected_columns = ["YearsSinceLastPromotion", "JobSatisfaction", "JobLevel", "PerformanceRating"] subset_data = hr_data[selected_columns] # 计算这些列之间的相关系数矩阵 correlation_matrix = subset_data.corr() # 创建热力图来可视化相关性 plt.figure(figsize=(8, 6)) sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", linewidths=0.5) plt.title("Correlation Heatmap (YearsSinceLastPromotion, JobSatisfaction, JobLevel, PerformanceRating)") plt.show()
correlation_matrix
YearsSinceLastPromotion | JobSatisfaction | JobLevel | PerformanceRating | |
---|---|---|---|---|
YearsSinceLastPromotion | 1.000000 | -0.014979 | 0.355518 | 0.017239 |
JobSatisfaction | -0.014979 | 1.000000 | -0.001440 | 0.002421 |
JobLevel | 0.355518 | -0.001440 | 1.000000 | -0.021588 |
PerformanceRating | 0.017239 | 0.002421 | -0.021588 | 1.000000 |
晋升历史(YearsSinceLastPromotion)与其他变量的相关性:与工作满意度(JobSatisfaction)的相关系数为-0.014979,接近零。这意味着晋升历史与工作满意度之间没有明显的线性关系。与工作级别(JobLevel)的相关系数为0.355518,为正值。这表示晋升历史与工作级别之间存在正相关关系,即晋升历史较长的员工更有可能达到更高的工作级别。与绩效评级(PerformanceRating)的相关系数为0.017239,接近零。这意味着晋升历史与绩效评级之间没有明显的线性关系。
工作满意度(JobSatisfaction)与其他变量的相关性:与工作级别(JobLevel)的相关系数为-0.001440,接近零。这表明工作满意度与工作级别之间几乎没有线性关系。与绩效评级(PerformanceRating)的相关系数为0.002421,接近零。这意味着工作满意度与绩效评级之间没有明显的线性关系。
工作级别(JobLevel)与绩效评级(PerformanceRating)之间的相关性:这两个变量之间的相关系数为-0.021588,接近零。这表明工作级别与绩效评级之间没有强烈的线性关系。
当前角色的时间对于工作参与度和晋升机会影响分析
-
分析员工在当前角色的时间(YearsInCurrentRole)对于工作参与度和晋升机会的影响。
员工在当前角色的时间与工作满意度、绩效评级和工作生活平衡的关系
# 选择字段 correlation_matrix_2 = hr_data[['YearsInCurrentRole', 'JobSatisfaction', 'YearsSinceLastPromotion']].corr() # 相关矩阵热力图 plt.figure(figsize=(8, 5)) sns.heatmap(correlation_matrix_2, annot=True, cmap='coolwarm', fmt=".2f") plt.title("Correlation Matrix for YearsInCurrentRole, JobSatisfaction, and YearsSinceLastPromotion") plt.show()
correlation_matrix_2
YearsInCurrentRole | JobSatisfaction | YearsSinceLastPromotion | |
---|---|---|---|
YearsInCurrentRole | 1.000000 | -0.001871 | 0.548418 |
JobSatisfaction | -0.001871 | 1.000000 | -0.014979 |
YearsSinceLastPromotion | 0.548418 | -0.014979 | 1.000000 |
员工在当前角色的时间(YearsInCurrentRole)与其他变量的相关性:与工作满意度(JobSatisfaction)的相关系数为-0.001871,接近零。这表示员工在当前角色的时间与工作满意度之间几乎没有线性关系,它们之间的变化不太可能通过线性关系来解释。与距离上次晋升的时间(YearsSinceLastPromotion)的相关系数为0.548418,为正值。这表示员工在当前角色的时间与距离上次晋升的时间之间存在正相关关系,即在当前角色工作的时间较长的员工通常在距离上次晋升的时间上也较长。
工作满意度(JobSatisfaction)与其他变量的相关性:与员工在当前角色的时间(YearsInCurrentRole)的相关系数为-0.001871,接近零。这表明工作满意度与员工在当前角色的时间之间几乎没有线性关系。与距离上次晋升的时间(YearsSinceLastPromotion)的相关系数为-0.014979,接近零。这意味着工作满意度与距离上次晋升的时间之间也没有明显的线性关系。
距离上次晋升的时间(YearsSinceLastPromotion)与其他变量的相关性:与员工在当前角色的时间(YearsInCurrentRole)的相关系数为0.548418,为正值。这表示距离上次晋升的时间与员工在当前角色的时间之间存在正相关关系,即在当前角色工作的时间较长的员工通常距离上次晋升的时间也较长。与工作满意度(JobSatisfaction)的相关系数为-0.014979,接近零。这意味着距离上次晋升的时间与工作满意度之间也没有明显的线性关系。
七、培训和发展需求评估
评估培训次数与员工绩效评级关系分析
-
评估培训次数(TrainingTimesLastYear)与员工绩效评级的关系。
# 相关性矩阵 correlation = hr_data['TrainingTimesLastYear'].corr(hr_data['PerformanceRating']) # 绘图 plt.figure(figsize=(10, 6)) sns.scatterplot(x='TrainingTimesLastYear', y='PerformanceRating', data=hr_data) plt.title('Relationship between Training Times Last Year and Performance Rating') plt.xlabel('Training Times Last Year') plt.ylabel('Performance Rating') plt.grid(True) plt.show() correlation
-0.019123465918259225
TrainingTimesLastYear(去年的培训次数)和PerformanceRating(员工绩效评级)之间的相关性非常低(约为 -0.019),这表明这两者之间没有显著的线性关系。
工作经验与培训需求关系分析
-
分析工作经验(TotalWorkingYears)与培训需求之间的关系。
# 相关性矩阵 correlation_work_train = hr_data['TotalWorkingYears'].corr(hr_data['TrainingTimesLastYear']) # 绘图 plt.figure(figsize=(10, 6)) sns.scatterplot(x='TotalWorkingYears', y='TrainingTimesLastYear', data=hr_data) plt.title('Relationship between Total Working Years and Training Times Last Year') plt.xlabel('Total Working Years') plt.ylabel('Training Times Last Year') plt.grid(True) plt.show() correlation_work_train
-0.0348195234809513
TotalWorkingYears(总工作年限)和TrainingTimesLastYear(去年的培训次数)之间的相关性也非常低(约为 -0.035),这同样表明这两者之间没有显著的线性关系。
八、员工福利和激励措施分析
股票期权级别与员工留存关系分析
-
探索股票期权级别(StockOptionLevel)对员工留存的影响。
# 按股票期权水平分组并计算留存率 retention_by_stock_option = hr_data.groupby('StockOptionLevel')['Attrition'].mean() # 绘图 plt.figure(figsize=(10, 6)) retention_by_stock_option.plot(kind='bar') plt.title('Employee Retention Rate by Stock Option Level') plt.xlabel('Stock Option Level') plt.ylabel('Attrition Rate (Lower is Better)') plt.xticks(rotation=0) plt.grid(True) plt.show() retention_by_stock_option
StockOptionLevel 0 0.242138 1 0.094842 2 0.075949 3 0.176471 Name: Attrition, dtype: float64
股票期权级别为0的员工离职率最高,约为24.21%。股票期权级别为1和2的员工离职率较低,分别为9.48%和7.59%。股票期权级别为3的员工离职率稍高于1和2级,约为17.65%。
加薪百分比与员工满意度和绩效关系分析
-
分析加薪百分比(PercentSalaryHike)与员工满意度和绩效的关系。
# 相关性矩阵计算 correlation_salary_hike_satisfaction = hr_data['PercentSalaryHike'].corr(hr_data['JobSatisfaction']) correlation_salary_hike_performance = hr_data['PercentSalaryHike'].corr(hr_data['PerformanceRating']) # 加薪百分比与工作满意度的关系图 plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1) sns.scatterplot(x='PercentSalaryHike', y='JobSatisfaction', data=hr_data) plt.title('Percent Salary Hike vs Job Satisfaction') plt.xlabel('Percent Salary Hike') plt.ylabel('Job Satisfaction') plt.grid(True) # 加薪百分比与绩效评级 plt.subplot(1, 2, 2) sns.scatterplot(x='PercentSalaryHike', y='PerformanceRating', data=hr_data) plt.title('Percent Salary Hike vs Performance Rating') plt.xlabel('Percent Salary Hike') plt.ylabel('Performance Rating') plt.grid(True) plt.tight_layout() plt.show() (correlation_salary_hike_satisfaction, correlation_salary_hike_performance)
(0.018850833014910383, 0.7724203035631152)
加薪百分比与员工满意度:加薪百分比和员工满意度之间的相关性非常低(约为0.019),说明加薪百分比与员工的满意度之间没有显著的线性关系。加薪百分比与绩效评级:加薪百分比和绩效评级之间的相关性较高(约为0.772),说明加薪百分比与绩效评级之间存在显著的正相关关系。
九、人力资源规划和预测
人力资源规划和预测
-
预测员工留存率预测
预测员工留存率
from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, accuracy_score from sklearn.preprocessing import LabelEncoder # 选择潜在特征 features = ['MonthlyIncome', 'JobSatisfaction', 'Department', 'WorkLifeBalance'] target = 'Attrition' #检查所选特征中的缺失值 missing_values = hr_data[features].isnull().sum() # 数据准备 # 对分类数据进行编码 le = LabelEncoder() hr_data['Department'] = le.fit_transform(hr_data['Department']) # 选择特征和目标数据 X = hr_data[features] y = hr_data[target] # 将数据集分割成训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 构建一个随机森林分类器 rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42) rf_classifier.fit(X_train, y_train) # 预测和评估模型 y_pred = rf_classifier.predict(X_test) accuracy = accuracy_score(y_test, y_pred) report = classification_report(y_test, y_pred) missing_values, accuracy, report
(MonthlyIncome 0 JobSatisfaction 0 Department 0 WorkLifeBalance 0 dtype: int64, 0.777027027027027, ' precision recall f1-score support\n\n 0 0.85 0.89 0.87 249\n 1 0.24 0.19 0.21 47\n\n accuracy 0.78 296\n macro avg 0.55 0.54 0.54 296\nweighted avg 0.76 0.78 0.77 296\n')
模型的准确度为77.7%。分类报告显示,模型对于预测非离职员工(标签“0”)的性能较好,其精确度为85%,召回率为89%。然而,对于预测离职员工(标签“1”)的性能较差,其精确度为24%,召回率为19%。
员工晋升路径和潜在的流失风险预测
-
用历史数据建模,预测员工晋升路径和潜在的流失风险。
# 定义晋升的目标变量 # 假设如果'YearsSinceLastPromotion'为0,员工在去年晋升 hr_data['RecentlyPromoted'] = hr_data['YearsSinceLastPromotion'].apply(lambda x: 1 if x == 0 else 0) # 选择可能影响晋升的潜在特征 # 为简单起见,使用一些常见的可能影响晋升的特征 promotion_features = ['TotalWorkingYears', 'JobSatisfaction', 'PerformanceRating', 'TrainingTimesLastYear', 'YearsAtCompany'] promotion_target = 'RecentlyPromoted' # 数据准备 # 如果需要,我们将使用与之前相同的LabelEncoder来处理分类数据 # 我们只使用数值特征为晋升预测模型选择特征和目标 # 为晋升预测模型选择特征和目标数据 X_promotion = hr_data[promotion_features] y_promotion = hr_data[promotion_target] # 将数据集分割成用于晋升模型的训练集和测试集 X_train_promo, X_test_promo, y_train_promo, y_test_promo = train_test_split(X_promotion, y_promotion, test_size=0.2, random_state=42) # 构建一个用于晋升模型的随机森林分类器 rf_classifier_promo = RandomForestClassifier(n_estimators=100, random_state=42) rf_classifier_promo.fit(X_train_promo, y_train_promo) # 预测和评估晋升模型 y_pred_promo = rf_classifier_promo.predict(X_test_promo) accuracy_promo = accuracy_score(y_test_promo, y_pred_promo) report_promo = classification_report(y_test_promo, y_pred_promo) accuracy_promo, report_promo
(0.6790540540540541, ' precision recall f1-score support\n\n 0 0.73 0.81 0.76 191\n 1 0.56 0.45 0.50 105\n\n accuracy 0.68 296\n macro avg 0.64 0.63 0.63 296\nweighted avg 0.67 0.68 0.67 296\n')
模型的准确度为67.9%。分类报告显示,对于预测未晋升员工(标签“0”)的性能较好,其精确度为73%,召回率为81%。对于预测晋升员工(标签“1”)的性能较差,其精确度为56%,召回率为45%
十、PyCharm完整代码
# 导入需要的库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 读取数据
hr_data = pd.read_csv("HR_Analytics.csv")
# 查看数据维度
print(hr_data.shape)
# 查看数据信息
print(hr_data.info())
# 描述性分析
print(hr_data.describe(include='all'))
# 查看各列缺失值
print(hr_data.isna().sum())
# 使用 YearsInCurrentRole 的值来填补 YearsWithCurrManager 的缺失值
hr_data['YearsWithCurrManager'].fillna(hr_data['YearsInCurrentRole'], inplace=True)
# 再次检查缺失值情况
print(hr_data.isna().sum())
# 查看重复值
print(hr_data.duplicated().sum())
# 将Attrition列的文本值转换为数值(是: 1, 否: 0)
hr_data['Attrition'] = hr_data['Attrition'].map({'Yes': 1, 'No': 0})
# 计算Attrition与其他数值型字段的相关性
correlation_with_attrition = hr_data.corr()['Attrition'].sort_values()
print(correlation_with_attrition)
# 设置绘图风格
sns.set(style="whitegrid")
plt.rcParams["font.family"] = "SimHei"
# 绘制不同年龄组的员工流失率
plt.figure(figsize=(12, 6))
sns.barplot(x='AgeGroup', y='Attrition', data=hr_data)
plt.title('员工流失率按年龄组')
plt.ylabel('流失率')
plt.xlabel('年龄分组')
plt.show()
# 婚姻状况与离职率的关系
plt.figure(figsize=(8, 5))
sns.countplot(x='MaritalStatus', hue='Attrition', data=hr_data)
plt.title('婚姻状况与离职率的关系')
plt.xlabel('婚姻状况')
plt.ylabel('离职率')
plt.show()
# 绘制工作年数与员工流失率的关系
plt.figure(figsize=(12, 6))
sns.lineplot(x='TotalWorkingYears', y='Attrition', data=hr_data)
plt.title('员工流失率随工作年数的变化')
plt.ylabel('离职率')
plt.xlabel('工作年数')
plt.show()
# 薪资差异分析
# 按性别比较月收入
plt.figure(figsize=(8, 5))
sns.boxplot(x='Gender', y='MonthlyIncome', data=hr_data)
plt.title('性别与月收入的关系')
plt.xlabel('性别')
plt.ylabel('月收入')
plt.show()
# 按教育等级比较月收入
plt.figure(figsize=(8, 5))
sns.boxplot(x='Education', y='MonthlyIncome', data=hr_data)
plt.title('教育等级与月收入的关系')
plt.xlabel('教育等级')
plt.ylabel('月收入')
plt.show()
# 按专业领域比较月收入
plt.figure(figsize=(12, 6))
sns.boxplot(x='EducationField', y='MonthlyIncome', data=hr_data)
plt.title('专业领域与月收入的关系')
plt.xlabel('专业领域')
plt.ylabel('月收入')
plt.xticks(rotation=45)
plt.show()
# 工作级别与薪酬的关系
plt.figure(figsize=(10, 6))
sns.boxplot(x='JobLevel', y='MonthlyIncome', data=hr_data)
plt.title('工作级别与薪酬的关系')
plt.xlabel('工作级别')
plt.ylabel('月收入')
plt.show()
# 工作角色与月收入的关系
plt.figure(figsize=(14, 7))
sns.boxplot(x='JobRole', y='MonthlyIncome', data=hr_data)
plt.title('工作角色与月收入的关系')
plt.xlabel('工作角色')
plt.ylabel('月收入')
plt.xticks(rotation=45)
plt.show()
# 工作级别与时薪的关系
plt.figure(figsize=(10, 6))
sns.boxplot(x='JobLevel', y='HourlyRate', data=hr_data)
plt.title('工作级别与时薪的关系')
plt.xlabel('工作级别')
plt.ylabel('时薪')
plt.show()
# 工作角色与时薪的关系
plt.figure(figsize=(14, 7))
sns.boxplot(x='JobRole', y='HourlyRate', data=hr_data)
plt.title('工作角色与时薪的关系')
plt.xlabel('工作级别')
plt.ylabel('时薪')
plt.xticks(rotation=45)
plt.show()
# 工作级别与日薪的关系
plt.figure(figsize=(10, 6))
sns.boxplot(x='JobLevel', y='DailyRate', data=hr_data)
plt.title('工作级别与日薪的关系')
plt.xlabel('工作角色')
plt.ylabel('时薪')
plt.show()
# 工作角色与日薪的关系
plt.figure(figsize=(14, 7))
sns.boxplot(x='JobRole', y='DailyRate', data=hr_data)
plt.title('工作角色与日薪的关系')
plt.xlabel('工作级别')
plt.ylabel('日薪')
plt.xticks(rotation=45)
plt.show()
# 创建一个散点矩阵图(Pair Plot)来可视化这些变量之间的关系
sns.pairplot(hr_data, vars=["JobSatisfaction", "EnvironmentSatisfaction", "RelationshipSatisfaction", "PerformanceRating"])
plt.show()
# 计算这些变量之间的相关系数
correlation_matrix = hr_data[["JobSatisfaction", "EnvironmentSatisfaction", "RelationshipSatisfaction", "PerformanceRating"]].corr()
# 打印相关系数矩阵
print(correlation_matrix)
# 重新制图,使用热力图来显示
selected_columns = ["JobSatisfaction", "EnvironmentSatisfaction", "RelationshipSatisfaction", "PerformanceRating"]
# 计算这些列之间的相关系数矩阵
correlation_matrix = hr_data[selected_columns].corr()
# 创建热力图来可视化相关性
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", linewidths=0.5)
plt.title("相关性热力图")
plt.show()
print(correlation_matrix)
# 创建散点图来可视化工作生活平衡评价和工作参与度之间的关系
plt.figure(figsize=(10, 6))
sns.scatterplot(data=hr_data, x="WorkLifeBalance", y="JobInvolvement", hue="YearsAtCompany", palette="coolwarm", size="YearsAtCompany", sizes=(20, 200))
plt.title("工作生活平衡评价与工作参与度 (Color by 在公司工作年数)")
plt.show()
# 创建箱线图来可视化工作生活平衡评价和在公司工作年数之间的关系
plt.figure(figsize=(8, 6))
sns.boxplot(data=hr_data, x="WorkLifeBalance", y="YearsAtCompany")
plt.title("工作生活平衡评价与在公司工作年数")
plt.show()
import matplotlib.pyplot as plt
# 选择字段
selected_columns = ["WorkLifeBalance", "JobInvolvement", "YearsAtCompany"]
# 创建一个新的Matplotlib图形
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 在三维坐标系上绘制散点图
ax.scatter(hr_data["WorkLifeBalance"], hr_data["JobInvolvement"], hr_data["YearsAtCompany"], c=hr_data["YearsAtCompany"], cmap='coolwarm', s=50)
# 设置坐标轴标签
ax.set_xlabel("WorkLifeBalance")
ax.set_ylabel("JobInvolvement")
ax.set_zlabel("YearsAtCompany")
# 添加颜色图例
cbar = plt.colorbar(ax.scatter(hr_data["WorkLifeBalance"], hr_data["JobInvolvement"], hr_data["YearsAtCompany"], c=hr_data["YearsAtCompany"], cmap='coolwarm', s=50))
cbar.set_label("YearsAtCompany")
plt.title("3D 散点图 (工作生活平衡评价, 工作参与度, 在公司工作年数)")
plt.show()
#选择字段
selected_columns = ["YearsSinceLastPromotion", "JobSatisfaction", "JobLevel", "PerformanceRating"]
subset_data = hr_data[selected_columns]
# 计算这些列之间的相关系数矩阵
correlation_matrix = subset_data.corr()
# 创建热力图来可视化相关性
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", linewidths=0.5)
plt.title("相关性热力图 (上次晋升后的年数, 工作满意度, 工作级别, 绩效评级)")
plt.show()
# 选择字段
correlation_matrix_2 = hr_data[['YearsInCurrentRole', 'JobSatisfaction', 'YearsSinceLastPromotion']].corr()
# 相关矩阵热力图
plt.figure(figsize=(8, 5))
sns.heatmap(correlation_matrix_2, annot=True, cmap='coolwarm', fmt=".2f")
plt.title("相关性矩阵(担任现职年数, 工作满意度, 上次晋升后的年数)")
plt.show()
# 相关性矩阵
correlation = hr_data['TrainingTimesLastYear'].corr(hr_data['PerformanceRating'])
# 绘图
plt.figure(figsize=(10, 6))
sns.scatterplot(x='TrainingTimesLastYear', y='PerformanceRating', data=hr_data)
plt.title('去年培训时间与绩效评级关系')
plt.xlabel('去年培训时间')
plt.ylabel('绩效评级')
plt.grid(True)
plt.show()
print(correlation)
# 相关性矩阵
correlation_work_train = hr_data['TotalWorkingYears'].corr(hr_data['TrainingTimesLastYear'])
# 绘图
plt.figure(figsize=(10, 6))
sns.scatterplot(x='TotalWorkingYears', y='TrainingTimesLastYear', data=hr_data)
plt.title('总工作年数和去年培训时间关系')
plt.xlabel('总工作年数')
plt.ylabel('去年培训时间')
plt.grid(True)
plt.show()
print(correlation_work_train)
# 按股票期权水平分组并计算留存率
retention_by_stock_option = hr_data.groupby('StockOptionLevel')['Attrition'].mean()
# 绘图
plt.figure(figsize=(10, 6))
retention_by_stock_option.plot(kind='bar')
plt.title('按股票期权级别的员工留存率分析')
plt.xlabel('股票期权级别')
plt.ylabel('离职率(越小越好)')
plt.xticks(rotation=0)
plt.grid(True)
plt.show()
print(retention_by_stock_option)
# 相关性矩阵计算
correlation_salary_hike_satisfaction = hr_data['PercentSalaryHike'].corr(hr_data['JobSatisfaction'])
correlation_salary_hike_performance = hr_data['PercentSalaryHike'].corr(hr_data['PerformanceRating'])
# 加薪百分比与工作满意度的关系图
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
sns.scatterplot(x='PercentSalaryHike', y='JobSatisfaction', data=hr_data)
plt.title('加薪百分比与工作满意度')
plt.xlabel('加薪百分比')
plt.ylabel('工作满意度')
plt.grid(True)
# 加薪百分比与绩效评级
plt.subplot(1, 2, 2)
sns.scatterplot(x='PercentSalaryHike', y='PerformanceRating', data=hr_data)
plt.title('加薪百分比与绩效评级')
plt.xlabel('加薪百分比')
plt.ylabel('绩效评级')
plt.grid(True)
plt.tight_layout()
plt.show()
print(correlation_salary_hike_satisfaction, correlation_salary_hike_performance)
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score
from sklearn.preprocessing import LabelEncoder
# 选择潜在特征
features = ['MonthlyIncome', 'JobSatisfaction', 'Department', 'WorkLifeBalance']
target = 'Attrition'
#检查所选特征中的缺失值
missing_values = hr_data[features].isnull().sum()
# 数据准备
# 对分类数据进行编码
le = LabelEncoder()
hr_data['Department'] = le.fit_transform(hr_data['Department'])
# 选择特征和目标数据
X = hr_data[features]
y = hr_data[target]
# 将数据集分割成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建一个随机森林分类器
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
rf_classifier.fit(X_train, y_train)
# 预测和评估模型
y_pred = rf_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
print(missing_values, accuracy, report)
# 定义晋升的目标变量
# 假设如果'YearsSinceLastPromotion'为0,员工在去年晋升
hr_data['RecentlyPromoted'] = hr_data['YearsSinceLastPromotion'].apply(lambda x: 1 if x == 0 else 0)
# 选择可能影响晋升的潜在特征
# 为简单起见,使用一些常见的可能影响晋升的特征
promotion_features = ['TotalWorkingYears', 'JobSatisfaction', 'PerformanceRating', 'TrainingTimesLastYear', 'YearsAtCompany']
promotion_target = 'RecentlyPromoted'
# 数据准备
# 如果需要,我们将使用与之前相同的LabelEncoder来处理分类数据
# 我们只使用数值特征为晋升预测模型选择特征和目标
# 为晋升预测模型选择特征和目标数据
X_promotion = hr_data[promotion_features]
y_promotion = hr_data[promotion_target]
# 将数据集分割成用于晋升模型的训练集和测试集
X_train_promo, X_test_promo, y_train_promo, y_test_promo = train_test_split(X_promotion, y_promotion, test_size=0.2, random_state=42)
# 构建一个用于晋升模型的随机森林分类器
rf_classifier_promo = RandomForestClassifier(n_estimators=100, random_state=42)
rf_classifier_promo.fit(X_train_promo, y_train_promo)
# 预测和评估晋升模型
y_pred_promo = rf_classifier_promo.predict(X_test_promo)
accuracy_promo = accuracy_score(y_test_promo, y_pred_promo)
report_promo = classification_report(y_test_promo, y_pred_promo)
print(accuracy_promo,report_promo)
附:更多参考
更多推荐
所有评论(0)