Prédire et prévenir les départs en entreprise
⭐⭐⭐⭐ Difficulté: Avancé | ⏱️ Durée: 60 minutes
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%.
"""
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