Chaque ligne du jeu de données (200+ mouvements fictifs) est un événement daté — embauche ou départ — avec département, poste, motif et ancienneté.
Construction d'indicateurs RH (turnover, ancienneté), requêtes SQL sur un journal d'événements, agrégations conditionnelles en Python.
| ID | Date | Département | Poste | Type | Motif | Ancienneté (ans) |
|---|
Chaque embauche ou départ est enregistré comme un événement daté, relié aux dimensions Département, Poste et Motif — le format le plus courant pour du reporting RH sur un Data Warehouse.
Voici quelques extraits de code utilisés pour la conception de ce projet.
Question métier : quel est le taux de turnover glissant sur 12 mois par département, pour prioriser les actions RH ?
WITH departs_12m AS (
SELECT
d.nom_departement,
COUNT(*) AS nb_departs
FROM fact_mouvements f
JOIN dim_departement d ON d.id_departement = f.id_departement
WHERE f.type = 'Depart'
AND f.date >= DATEADD(month, -12, CURRENT_DATE)
GROUP BY d.nom_departement
),
effectif AS (
SELECT nom_departement, effectif_moyen_12m
FROM dim_departement_effectif
)
SELECT
dp.nom_departement,
dp.nb_departs,
e.effectif_moyen_12m,
ROUND(100.0 * dp.nb_departs / NULLIF(e.effectif_moyen_12m, 0), 1) AS taux_turnover_pct
FROM departs_12m dp
JOIN effectif e ON e.nom_departement = dp.nom_departement
ORDER BY taux_turnover_pct DESC;
Identification des départements dont le turnover dépasse significativement la moyenne de l'entreprise — même logique que les insights affichés ci-dessus.
import pandas as pd
df = pd.read_sql("SELECT * FROM fact_mouvements", conn)
departs = df[df["type"] == "Depart"]
turnover_dept = (
departs.groupby("departement")
.size()
.div(EFFECTIF_REFERENCE)
.mul(100)
.rename("taux_turnover_pct")
.sort_values(ascending=False)
)
moyenne = turnover_dept.mean()
a_surveiller = turnover_dept[turnover_dept > moyenne * 1.3]
print(f"Turnover moyen entreprise : {moyenne:.1f}%")
print("Departements a surveiller :", a_surveiller.round(1).to_dict())