Spark

Retención por cohorte mensual

Cada cliente se vincula a su cohorte (primer mes de compra), la antigüedad en meses se pivota, y las columnas M1/M2/M3 expresan la retención como porcentaje de la cohorte inicial.

Requisitos

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()

Resultado

+----------+-------+----+----+----+
|   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

Snippets relacionados

Volver al Data Lab