2.33 员工离职预测实战:用机器学习预测员工流失,降低企业成本

引言

员工离职预测是HR数据分析的重要应用,通过预测员工流失,企业可以提前采取措施,降低招聘成本,提升员工满意度。本文将实战演示如何构建员工离职预测模型。

一、业务背景

1.1 问题定义

# 业务背景
def hr_analytics_background():
    """
    HR分析背景
    """
    print("=" * 60)
    print("员工离职预测业务背景")
    print("=" * 60)
    
    print("""
    业务问题:
    - 员工离职率高,招聘成本上升
    - 需要提前识别离职风险
    - 制定针对性的挽留策略
    
    数据需求:
    - 员工基本信息
    - 工作表现数据
    - 满意度调查
    - 历史离职数据
    
    目标:
    - 预测员工离职概率
    - 识别关键风险因素
    - 支持HR决策
    """)
    
    return True

hr_analytics_background()

二、数据准备

2.1 员工数据

# 员工数据准备
def prepare_employee_data():
    """
    准备员工数据
    """
    np.random.seed(42)
    n = 2000
    
    data = {
        'employee_id': range(1, n + 1),
        'age': np.random.randint(22, 60, n),
        'gender': np.random.choice(['M', 'F'], n),
        'department': np.random.choice(['IT', 'Sales', 'HR', 'Finance'], n),
        'position': np.random.choice(['Junior', 'Middle', 'Senior'], n),
        'salary': np.random.uniform(5000, 50000, n),
        'years_at_company': np.random.uniform(0, 15, n),
        'years_in_current_role': np.random.uniform(0, 5, n),
        'overtime': np.random.choice([0, 1], n, p=[0.6, 0.4]),
        'work_life_balance': np.random.uniform(1, 5, n),
        'job_satisfaction': np.random.uniform(1, 5, n),
        'performance_rating': np.random.uniform(1, 5, n),
        'training_times': np.random.randint(0, 10, n),
        'promotion': np.random.choice([0, 1], n, p=[0.8, 0.2]),
        'churn': np.random.choice([0, 1], n, p=[0.75, 0.25])
    }
    
    df = pd.DataFrame(data)
    return df

df_employee = prepare_employee_data()
print(f"员工数据形状: {df_employee.shape}")
print(df_employee.head())

三、特征工程

3.1 特征处理

# 特征工程
def employee_feature_engineering(df):
    """
    员工特征工程
    """
    from sklearn.preprocessing import LabelEncoder
    
    df_processed = df.copy()
    
    # 编码分类特征
    le_dept = LabelEncoder()
    df_processed['department_encoded'] = le_dept.fit_transform(df['department'])
    
    le_pos = LabelEncoder()
    df_processed['position_encoded'] = le_pos.fit_transform(df['position'])
    
    le_gender = LabelEncoder()
    df_processed['gender_encoded'] = le_gender.fit_transform(df['gender'])
    
    # 选择特征
    features = ['age', 'salary', 'years_at_company', 'years_in_current_role',
               'overtime', 'work_life_balance', 'job_satisfaction',
               'performance_rating', 'training_times', 'promotion',
               'department_encoded', 'position_encoded', 'gender_encoded']
    
    X = df_processed[features]
    y = df_processed['churn']
    
    return X, y

X, y = employee_feature_engineering(df_employee)
print(f"特征形状: {X.shape}")
print(f"离职率: {y.mean():.2%}")

四、模型训练

4.1 离职预测模型

# 离职预测模型
def train_churn_model(X, y):
    """
    训练离职预测模型
    """
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42, stratify=y
    )
    
    # 训练XGBoost模型
    import xgboost as xgb
    
    model = xgb.XGBClassifier(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)
    
    # 预测
    y_pred = model.predict(X_test)
    y_proba = model.predict_proba(X_test)[:, 1]
    
    # 评估
    accuracy = accuracy_score(y_test, y_pred)
    auc = roc_auc_score(y_test, y_proba)
    
    print(f"模型准确率: {accuracy:.4f}")
    print(f"模型AUC: {auc:.4f}")
    print("\\n分类报告:")
    print(classification_report(y_test, y_pred))
    
    # 特征重要性
    importance = pd.DataFrame({
        'feature': X.columns,
        'importance': model.feature_importances_
    }).sort_values('importance', ascending=False)
    
    print("\\n特征重要性:")
    print(importance)
    
    return model, importance

churn_model, importance = train_churn_model(X, y)

五、业务应用

5.1 风险员工识别

# 风险员工识别
def identify_risk_employees(df, model, X):
    """
    识别高风险员工
    """
    # 预测离职概率
    churn_proba = model.predict_proba(X)[:, 1]
    df['churn_probability'] = churn_proba
    
    # 识别高风险员工
    high_risk = df[df['churn_probability'] > 0.7]
    
    print(f"高风险员工数: {len(high_risk)}")
    print(f"高风险员工占比: {len(high_risk)/len(df):.2%}")
    
    # 分析高风险员工特征
    if len(high_risk) > 0:
        print("\\n高风险员工特征:")
        print(f"  平均满意度: {high_risk['job_satisfaction'].mean():.2f}")
        print(f"  平均工作年限: {high_risk['years_at_company'].mean():.2f}")
        print(f"  加班比例: {high_risk['overtime'].mean():.2%}")
    
    return high_risk

high_risk_employees = identify_risk_employees(df_employee, churn_model, X)

六、总结与思考

6.1 核心要点

  1. 业务理解:理解HR业务需求
  2. 数据准备:收集员工相关数据
  3. 模型训练:构建预测模型
  4. 业务应用:识别风险员工,制定策略

6.2 思考题

  1. 如何应用预测结果?
  2. 如何制定挽留策略?
  3. 如何评估模型效果?

6.3 实践建议

  1. 数据质量:确保数据准确完整
  2. 特征工程:选择有预测能力的特征
  3. 模型优化:持续优化模型效果
  4. 业务结合:结合HR知识应用

下一节预告:我们将学习二手车价格预测完整案例,特征工程、模型训练、调参全流程。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐