Rétention par cohorte mensuelle
Chaque client est rattaché à sa cohorte (premier mois d'achat), l'âge en mois est pivoté, et les colonnes M1/M2/M3 expriment la rétention en pourcentage de la cohorte initiale.
Cas d'usage
Suivre si les clients acquis pendant les soldes reviennent autant que les autres.
Prérequis
PySpark 3.x
Python
from pyspark.sql import functions as F
base = commandes.withColumn("mois", F.trunc("order_date", "month"))
cohorte = base.groupBy("customer_id").agg(F.min("mois").alias("cohorte"))
retention = (
base.join(cohorte, "customer_id")
.withColumn("age_mois", F.months_between("mois", "cohorte").cast("int"))
.groupBy("cohorte").pivot("age_mois", [0, 1, 2, 3])
.agg(F.countDistinct("customer_id"))
)
for m in [1, 2, 3]:
retention = retention.withColumn(
f"M{m}", F.round(F.col(str(m)) / F.col("0") * 100, 1))
retention.select("cohorte", F.col("0").alias("clients"), "M1", "M2", "M3") \
.orderBy("cohorte").show()Résultat
+----------+-------+----+----+----+ | cohorte|clients| M1| M2| M3| +----------+-------+----+----+----+ |2026-01-01| 8,204|34.1|22.8|18.5| |2026-02-01| 6,917|31.7|21.2|17.9| |2026-03-01| 12,480|19.4|11.0| 8.2| |2026-04-01| 7,308|33.2|22.5|null| |2026-05-01| 7,841|32.9|null|null| +----------+-------+----+----+----+ La cohorte de mars (soldes, 12 480 clients) retient 2x moins : acquis par le prix, partis avec lui — recalibrer le coût d'acquisition de l'opération
PySparkCohorteRétentionpivot