人力资源数据集分析(一)_t-test、卡方检验和描述性统计
数据入口:人力资源分析数据集 - Heywhale.com
数据说明
字段 | 说明 |
---|---|
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 | 与现任经理共事年数 |
import pandas as pd
data = 'HR_Analytics.csv'
data = pd.read_csv(file_path)
# 打印每一列的唯一值
for column in data.columns:
print(f"Unique values in {column}:")
print(data[column].unique())
通过这段代码可以了解每一列的唯一值。观察到某些列含有缺失值且缺失值的行数较少,可以直接删去。
data_cleaned = data.dropna()
本文将通过t-test、卡方检验和描述性统计来识别与分析员工离职因素。
一:识别员工离职因素
缺失值已成功删除。现在,我们将继续进行探索性数据分析(EDA),以识别与员工离职(Attrition)相关的因素。EDA将包括以下步骤:
- 分析目标变量 “Attrition” 的分布。
- 使用统计测试和可视化方法来探索其他变量与 “Attrition” 的关系。
- 基于分析结果,识别可能导致员工离职的关键因素。
现在,我将开始执行探索性数据分析的第一步,分析目标变量 “Attrition” 的分布。
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(8, 6))
attrition_distribution = sns.countplot(data=data_cleaned, x='Attrition')
attrition_distribution.set_title('Distribution of Attrition')
attrition_distribution.set_xticklabels(['No', 'Yes'])
plt.show()
从 “Attrition” 变量的分布图中,我们可以看到员工离职(Yes)和未离职(No)的数量。接下来,我们将使用统计测试和可视化方法来探索其他变量与 “Attrition” 的关系。
为了识别可能导致员工离职的关键因素,我们将重点关注以下类型的变量:
- 数值变量,如 “Age”, “DailyRate”, “DistanceFromHome” 等。
- 分类变量,如 “Department”, “EducationField” 等。
我们将通过以下步骤进行分析:
- 对于数值变量,我们将使用箱线图来可视化其分布,并使用统计测试(如t-test)来检查它们与 “Attrition” 的关系。
- 对于分类变量,我们将使用条形图来可视化其分布,并使用卡方检验来检查它们与 “Attrition” 的关系。
现在,我将开始分析数值变量与 “Attrition” 的关系。为了简化分析,我将选择一些可能对员工离职有较大影响的数值变量进行分析,包括 “Age”, “DailyRate”, “DistanceFromHome”, “EnvironmentSatisfaction”, “JobInvolvement”, “JobSatisfaction”, “RelationshipSatisfaction”, 和 “WorkLifeBalance”。
现在,我将为这些选定的数值变量绘制箱线图。
selected_numerical_columns = ['Age', 'DailyRate', 'DistanceFromHome', 'EnvironmentSatisfaction',
'JobInvolvement', 'JobSatisfaction', 'RelationshipSatisfaction', 'WorkLifeBalance']
plt.figure(figsize=(15, 10))
for i, column in enumerate(selected_numerical_columns, 1):
plt.subplot(2, 4, i)
sns.boxplot(data=data_cleaned, x='Attrition', y=column)
plt.title(column)
plt.ylabel('')
plt.tight_layout()
plt.show()
我们已经为选定的数值变量绘制了箱线图,这些图显示了员工离职(Yes)和未离职(No)的分布情况。从箱线图中,我们可以观察到一些变量在离职和未离职的员工之间有显著差异,例如年龄、日薪、环境满意度、工作投入度、工作满意度和工作生活平衡。
接下来,我们将分析分类变量与 “Attrition” 的关系。我们将使用条形图来可视化分类变量的分布,并使用卡方检验来检查它们与 “Attrition” 的关系。
为了简化分析,我将选择一些可能对员工离职有较大影响的分类变量进行分析,包括 “Department”, “EducationField”, “JobRole”, 和 “MaritalStatus”。
现在,我将为这些选定的分类变量绘制条形图。
我们已经为选定的分类变量绘制了条形图,这些图显示了不同分类变量在不同离职状态(Yes/No)下的分布情况。从条形图中,我们可以观察到一些分类变量在离职和未离职的员工之间有显著差异,例如部门、教育领域、工作角色和婚姻状况。
基于这些可视化结果,我们可以进行更深入的分析,例如使用统计测试(如t-test或卡方检验)来确认这些差异是否具有统计学意义。然后,我们可以根据这些分析结果总结可能导致员工离职的关键因素。
现在,我将进行统计测试来确认这些差异是否具有统计学意义。我们将对数值变量进行t-test,对分类变量进行卡方检验。
from scipy import stats
t_test_results = {}
for column in selected_numerical_columns:
t_stat, p_value = stats.ttest_ind(data_cleaned[data_cleaned['Attrition'] == 'No'][column],
data_cleaned[data_cleaned['Attrition'] == 'Yes'][column],
equal_var=False)
t_test_results[column] = (t_stat, p_value)
chi_square_test_results = {}
for column in selected_categorical_columns:
contingency_table = pd.crosstab(data_cleaned[column], data_cleaned['Attrition'])
chi2, p, dof, expected = stats.chi2_contingency(contingency_table)
chi_square_test_results[column] = (chi2, p)
t_test_results, chi_square_test_results
我们已经完成了统计测试,并得到了以下结果:
数值变量的t-test结果:
- “Age”, “DailyRate”, “EnvironmentSatisfaction”, “JobInvolvement”, “JobSatisfaction”, 和 “WorkLifeBalance” 的 p 值小于0.05,表明这些变量在离职和未离职的员工之间存在显著差异。
- “DistanceFromHome” 和 “RelationshipSatisfaction” 的 p 值大于0.05,表明这些变量在离职和未离职的员工之间没有显著差异。
分类变量的卡方检验结果:
- 所有选定的分类变量(“Department”, “EducationField”, “JobRole”, “MaritalStatus”)的 p 值都小于0.05,表明这些变量在离职和未离职的员工之间存在显著差异。
基于这些结果,我们可以总结可能导致员工离职的关键因素,包括:
- 数值变量:员工的年龄、日薪、环境满意度、工作投入度、工作满意度和工作生活平衡。
- 分类变量:部门、教育领域、工作角色和婚姻状况。
二:影响因素具体分析
为了更好地分析AgeGroup、MaritalStatus、TotalWorkingYears和Attrition之间的关系。,我们将进行以下分析:
- 描述性统计:了解这些字段的分布情况。
- 交叉分析:分析这些字段之间的关系,特别是Attrition与其他字段的关系。
让我们首先进行描述性统计分析。
descriptive_stats = data[['AgeGroup', 'MaritalStatus', 'TotalWorkingYears', 'Attrition']].describe(include='all')
descriptive_stats
以下是关于AgeGroup、MaritalStatus、TotalWorkingYears和Attrition字段的描述性统计信息:
- AgeGroup:
- 共有5个不同的年龄组。
- 最常见的年龄组是26-35岁,共有611人。
- MaritalStatus:
- 共有3种婚姻状况。
- 最常见的婚姻状况是已婚,共有679人。
- TotalWorkingYears:
- 平均工作年限为11.28年。
- 工作年限的范围从0年到40年。
- 中位数为10年。
- Attrition:
- 有两种离职情况:是和否。
- 大多数员工没有离职,共有1242人。
接下来,我们将进行交叉分析,以了解Attrition与其他字段之间的关系。我们将计算每个AgeGroup、MaritalStatus和TotalWorkingYears的离职率。
attrition_by_age = data.groupby('AgeGroup')['Attrition'].value_counts(normalize=True).unstack().fillna(0)
attrition_by_marital = data.groupby('MaritalStatus')['Attrition'].value_counts(normalize=True).unstack().fillna(0)
attrition_by_years = data.groupby('TotalWorkingYears')['Attrition'].value_counts(normalize=True).unstack().fillna(0)
attrition_by_age, attrition_by_marital, attrition_by_years.head()
以下是按AgeGroup、MaritalStatus和TotalWorkingYears分组的离职率分析结果:
按AgeGroup分组的离职率:
- 18-25岁年龄组的离职率为35.77%
- 26-35岁年龄组的离职率为18.99%
- 36-45岁年龄组的离职率为9.13%
- 46-55岁年龄组的离职率为11.84%
- 55岁以上的年龄组的离职率为17.02%
按MaritalStatus分组的离职率:
- 离婚员工的离职率为10.37%
- 已婚员工的离职率为12.37%
- 单身员工的离职率为25.37%
按TotalWorkingYears分组的离职率:
- 工作年限为0年的员工的离职率为45.45%
- 工作年限为1年的员工的离职率为49.38%
- 工作年限为2年的员工的离职率为29.03%
- 工作年限为3年的员工的离职率为21.43%
- 工作年限为4年的员工的离职率为19.05%
从这些数据中,我们可以观察到以下趋势:
- 年龄较大的员工离职率较低。
- 单身员工的离职率高于已婚和离婚员工。
- 工作年限较短的员工离职率较高。
附录:每日股票行情数据
想要探索多元化的数据分析视角,可以关注之前发布的相关内容。