📊 Problématique Business

Contexte : L'entreprise a 25% de turnover (vs 15% marché).

Coût : Chaque départ coûte 50k€ (recrutement, formation, perte productivité).

Objectif : Prédire les départs 3 mois avant et réduire turnover à 18%.

🗂️ Dataset

🎯 Facteurs Analysés

  • Satisfaction travail
  • Équilibre vie pro/perso
  • Années depuis promotion
  • Distance domicile-travail
  • Niveau salaire vs marché

🛠️ Stack Technique

Python Polars Scikit-learn SHAP Streamlit Random Forest

💻 Code de Démarrage

"""
PROJET 4 : People Analytics - Prédiction Turnover
Modèle ML pour prédire les départs
"""

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report

# Préparer les données
def prepare_ml_data(df):
    df_ml = df.copy()
    
    # Encoder les variables catégorielles
    df_ml["Gender"] = df_ml["Gender"].map({"M": 0, "F": 1})
    df_ml["OverTime"] = df_ml["OverTime"].map({"No": 0, "Yes": 1})
    df_ml["Attrition"] = df_ml["Attrition"].map({"No": 0, "Yes": 1})
    
    # One-hot encoding pour Department
    df_ml = pd.get_dummies(df_ml, columns=["Department"], prefix="Dept")
    
    # Séparer features et target
    X = df_ml.drop(["EmployeeID", "Attrition"], axis=1)
    y = df_ml["Attrition"]
    
    return X, y

# Entraîner le modèle
def train_model(X, y):
    # Split train/test
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42, stratify=y
    )
    
    # Random Forest
    model = RandomForestClassifier(
        n_estimators=100,
        max_depth=10,
        random_state=42,
        class_weight="balanced"
    )
    
    model.fit(X_train, y_train)
    
    # Prédictions
    y_pred = model.predict(X_test)
    
    # Évaluation
    accuracy = accuracy_score(y_test, y_pred)
    print(f"Accuracy : {accuracy:.2%}")
    print(classification_report(y_test, y_pred))
    
    # Feature importance
    feature_importance = pd.DataFrame({
        "feature": X.columns,
        "importance": model.feature_importances_
    }).sort_values("importance", ascending=False).head(10)
    
    print("\nTop 10 facteurs de turnover :")
    print(feature_importance)
    
    return model

# Identifier les employés à risque
def identify_at_risk(df, model, X, threshold=0.6):
    predictions = model.predict_proba(X)[:, 1]
    df["TurnoverRisk"] = predictions
    
    at_risk = df[df["TurnoverRisk"] > threshold]
    print(f"\n⚠️ {len(at_risk)} employés à risque élevé")
    
    return at_risk

📁 Fichier complet : projets/code/projet4_turnover_starter.py