Rapport d'analyse de cohorte - Activité mensuelle des utilisateurs par publications et solutions

Ceci est une version SQL d’un rapport d’analyse de cohorte pour l’activité des utilisateurs, à utiliser dans le plugin Data Explorer.

:discourse: Ce rapport nécessite que le plugin Discourse Solved soit activé.

Ce rapport d’analyse de cohorte fournit des informations sur l’engagement des utilisateurs en suivant l’activité des utilisateurs qui se sont inscrits depuis une date de début spécifiée. Il se concentre spécifiquement sur les utilisateurs qui atteignent ou dépassent certains seuils pour les publications créées et les solutions fournies chaque mois après leur inscription.

Ce rapport est précieux pour les administrateurs cherchant à comprendre l’efficacité de leur communauté à retenir et à engager les nouveaux utilisateurs au fil du temps, en particulier en ce qui concerne la publication et la fourniture de solutions aux sujets. Ce rapport peut également être utile pour évaluer la santé de la communauté et identifier l’efficacité des stratégies de croissance de la communauté.

Utilisateurs actifs par mois après inscription avec paramètres Min Posts + Solutions

--[params]
-- date :start_date = 2023-01-01
-- int :min_posts_per_month = 1
-- int :min_solutions_per_month = 1

WITH user_cohorts AS (
    SELECT
        id AS user_id,
        DATE_TRUNC('month', created_at) AS cohort,
        COUNT(id) OVER (PARTITION BY DATE_TRUNC('month', created_at)) AS users_signed_up
    FROM users
    WHERE created_at >= :start_date
),
posts_activity AS (
    SELECT
        p.user_id,
        EXTRACT(YEAR FROM AGE(p.created_at, u.created_at)) * 12 + EXTRACT(MONTH FROM AGE(p.created_at, u.created_at)) AS months_after_registration,
        DATE_TRUNC('month', u.created_at) AS cohort
    FROM posts p
    JOIN users u ON p.user_id = u.id
    WHERE p.created_at >= u.created_at
),
solutions_counts AS (
    SELECT
        p.user_id,
        COUNT(p.user_id) as solutions_count,
        EXTRACT(YEAR FROM AGE(p.created_at, u.created_at)) * 12 + EXTRACT(MONTH FROM AGE(p.created_at, u.created_at)) AS months_after_registration,
        DATE_TRUNC('month', u.created_at) AS cohort
    FROM discourse_solved_solved_topics dsst
    INNER JOIN posts p ON p.id = dsst.answer_post_id
    JOIN topics t ON t.id = p.topic_id
    JOIN users u ON p.user_id = u.id
    WHERE p.created_at >= u.created_at
    GROUP BY months_after_registration, cohort, p.user_id
    HAVING COUNT(p.user_id) >= :min_solutions_per_month
),
activity_counts AS (
    SELECT
        cohort,
        months_after_registration,
        COUNT(user_id) AS posts_count,
        user_id
    FROM posts_activity
    GROUP BY cohort, months_after_registration, user_id
    HAVING COUNT(user_id) >= :min_posts_per_month
),
active_users AS (
    SELECT
        sc.cohort,
        sc.months_after_registration,
        COUNT(DISTINCT ac.user_id) AS active_users
    FROM solutions_counts sc
    FULL JOIN activity_counts ac ON sc.user_id = ac.user_id
    AND sc.months_after_registration = ac.months_after_registration
    AND sc.cohort = ac.cohort
    GROUP BY sc.cohort, sc.months_after_registration
),
cohorts_series AS (
    SELECT generate_series AS months_after_registration
    FROM generate_series(0, 11)
),
cohorts AS (
    SELECT
        cohort,
        MAX(users_signed_up) AS users_signed_up
    FROM user_cohorts
    GROUP BY cohort
),
cross_join AS (
    SELECT
        c.cohort,
        c.users_signed_up,
        cs.months_after_registration
    FROM cohorts c
    CROSS JOIN cohorts_series cs
),
final_counts AS (
    SELECT
        cj.cohort,
        cj.users_signed_up,
        cj.months_after_registration,
        COALESCE(au.active_users, 0) AS active_users
    FROM cross_join cj
    LEFT JOIN active_users au ON au.cohort = cj.cohort AND au.months_after_registration = cj.months_after_registration
)
SELECT
    TO_CHAR(cohort, 'Mon YYYY') AS "Joined In", -- Include the year in the Joined In column
    users_signed_up AS "Users Signed Up",
    MAX(CASE WHEN months_after_registration = 0 THEN active_users END) AS "Month 1",
    MAX(CASE WHEN months_after_registration = 1 THEN active_users END) AS "Month 2",
    MAX(CASE WHEN months_after_registration = 2 THEN active_users END) AS "Month 3",
    MAX(CASE WHEN months_after_registration = 3 THEN active_users END) AS "Month 4",
    MAX(CASE WHEN months_after_registration = 4 THEN active_users END) AS "Month 5",
    MAX(CASE WHEN months_after_registration = 5 THEN active_users END) AS "Month 6",
    MAX(CASE WHEN months_after_registration = 6 THEN active_users END) AS "Month 7",
    MAX(CASE WHEN months_after_registration = 7 THEN active_users END) AS "Month 8",
    MAX(CASE WHEN months_after_registration = 8 THEN active_users END) AS "Month 9",
    MAX(CASE WHEN months_after_registration = 9 THEN active_users END) AS "Month 10",
    MAX(CASE WHEN months_after_registration = 10 THEN active_users END) AS "Month 11",
    MAX(CASE WHEN months_after_registration = 11 THEN active_users END) AS "Month 12"
FROM final_counts
GROUP BY cohort, users_signed_up
ORDER BY cohort

Explication de la requête SQL

Paramètres

Ce rapport utilise trois paramètres :

  • start_date : La date à partir de laquelle commencer le suivi des nouvelles inscriptions d’utilisateurs.
  • min_posts_per_month : Le nombre minimum de publications qu’un utilisateur doit effectuer par mois pour être considéré comme actif.
  • min_solutions_per_month : Le nombre minimum de solutions (réponses acceptées) qu’un utilisateur doit fournir par mois pour être considéré comme actif.

Les utilisateurs doivent satisfaire aux exigences min_posts_per_month et min_solutions_per_month pour être considérés comme actifs pour le mois.

CTEs

La requête SQL fournie utilise plusieurs expressions de table communes (CTE) pour décomposer le processus de calcul des utilisateurs actifs par mois après l’inscription, en fonction des critères minimaux de publications et de solutions. Voici une explication de chaque CTE :

user_cohorts

Cette CTE identifie les cohortes d’utilisateurs en fonction de leur mois d’inscription. Pour chaque utilisateur, elle calcule le mois de son inscription (cohort) et compte le nombre total d’utilisateurs qui se sont inscrits le même mois. Cela permet de comprendre la taille initiale de chaque cohorte.

posts_activity

Cette CTE suit l’activité des utilisateurs en termes de publications effectuées après leur inscription. Pour chaque publication, elle calcule le nombre de mois écoulés depuis la date d’inscription de l’utilisateur (months_after_registration) et regroupe ces informations par cohorte d’inscription de l’utilisateur. Ceci est utilisé pour suivre l’activité des utilisateurs en termes de publication de contenu au fil du temps.

solutions_counts

Cette CTE se concentre sur le comptage des solutions (réponses acceptées) fournies par les utilisateurs. Elle filtre les publications marquées comme solutions et les compte pour chaque utilisateur, en s’assurant que seules les publications effectuées après l’inscription de l’utilisateur sont prises en compte. Elle calcule également le nombre de mois écoulés depuis l’inscription de l’utilisateur pour chaque solution. Les utilisateurs ne sont inclus dans ce décompte que s’ils atteignent ou dépassent le nombre minimum spécifié de solutions par mois.

activity_counts

Cette CTE agrège le nombre de publications effectuées par chaque utilisateur par mois après l’inscription. Elle regroupe les utilisateurs par leur cohorte d’inscription et le nombre de mois depuis l’inscription, puis compte le nombre de publications effectuées. Seuls les utilisateurs qui atteignent ou dépassent le nombre minimum spécifié de publications par mois sont inclus dans ce décompte.

active_users

Cette CTE combine les données de solutions_counts et activity_counts pour identifier les utilisateurs actifs, c’est-à-dire ceux qui répondent aux critères de publication et de solution. Elle compte les utilisateurs distincts qui sont actifs en fonction des critères définis pour les publications et les solutions, regroupés par leur cohorte d’inscription et le nombre de mois depuis l’inscription.

cohorts_series

Cette CTE génère une série de nombres de 0 à 11, représentant le nombre de mois après l’inscription. Ceci est utilisé pour s’assurer que le rapport final inclut des données pour chaque mois jusqu’à 12 mois, même s’il n’y a pas d’utilisateurs actifs certains mois.

cohorts

Cette CTE agrège les données de user_cohorts pour obtenir le nombre total d’utilisateurs inscrits dans chaque cohorte. Elle garantit que le rapport final inclut le nombre total d’utilisateurs inscrits pour chaque cohorte.

cross_join

Cette CTE effectue une jointure croisée entre la CTE cohorts et la CTE cohorts_series. Cela garantit que chaque cohorte est représentée pour chaque mois après l’inscription, facilitant le calcul des utilisateurs actifs pour chaque mois dans l’étape finale.

final_counts

Cette CTE combine toutes les CTE précédentes pour calculer les décomptes finaux d’utilisateurs actifs pour chaque mois après l’inscription, pour chaque cohorte. Elle utilise une jointure gauche pour faire correspondre les utilisateurs actifs de la CTE active_users avec les cohortes et les mois générés dans la CTE cross_join. Elle garantit que chaque paire cohorte-mois a un décompte d’utilisateurs actifs, avec une valeur par défaut de 0 s’il n’y a pas d’utilisateurs actifs pour cette paire.

SELECT final

La SELECT finale de la requête regroupe les utilisateurs en cohortes en fonction de leur mois et année d’inscription, puis calcule le nombre d’utilisateurs actifs pour chaque mois jusqu’à un an après l’inscription. Ceci est fait grâce à une combinaison de transformations et d’agrégations conditionnelles, qui transforment les données dans un format où chaque ligne correspond à une cohorte, et chaque colonne représente le nombre d’utilisateurs actifs pour chaque mois après l’inscription, de “Mois 1” à “Mois 12”.

Résultats

Le rapport génère un tableau avec les colonnes suivantes :

  • Joined In : Le mois et l’année de la cohorte (quand les utilisateurs se sont inscrits).
  • Users Signed Up : Le nombre total d’utilisateurs qui se sont inscrits dans cette cohorte.
  • Month 1 à Month 12 : Le nombre d’utilisateurs actifs pour chaque mois après l’inscription, jusqu’à 12 mois.

Exemple de résultats

Joined In Users Signed Up Month 1 Month 2 Month 3 Month 4 Month 5 Month 6 Month 7 Month 8 Month 9 Month 10 Month 11 Month 12
Jan 2023 50 40 8 4 3 3 3 4 3 2 1 1 4
Feb 2023 63 40 7 5 3 2 2 7 2 2 2 1 1

Les résultats complets du rapport fourniront une année de données après la start_date.

6 « J'aime »