Relatório de Análise de Coorte - Atividade Mensal do Usuário por Posts e Soluções

Este é um relatório de Análise de Coorte em SQL para Atividade do Usuário, para uso dentro do plugin Data Explorer.

:discourse: Este relatório requer que o plugin Discourse Solved esteja ativado.

Este relatório de Análise de Coorte fornece insights sobre o engajamento do usuário, rastreando a atividade de usuários que se inscreveram desde uma data de início especificada. Ele se concentra especificamente em usuários que atendem ou excedem certos limites para posts criados e soluções fornecidas a cada mês após o registro.

Este relatório é valioso para administradores que buscam entender a eficácia de sua comunidade em reter e engajar novos usuários ao longo do tempo, especificamente em relação à postagem e fornecimento de soluções para tópicos. Este relatório também pode ser útil para avaliar a saúde da comunidade e identificar a eficácia das estratégias de crescimento da comunidade.

Usuários Ativos por Mês após Inscrição com Parâmetros Mínimos de Posts + Soluções

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

Explicação da Consulta SQL

Parâmetros

Este relatório usa três parâmetros:

  • start_date: A data a partir da qual começar a rastrear novas inscrições de usuários.
  • min_posts_per_month: O número mínimo de posts que um usuário deve fazer em um mês para ser considerado ativo.
  • min_solutions_per_month: O número mínimo de soluções (respostas aceitas) que um usuário deve fornecer em um mês para ser considerado ativo.

Os usuários devem atender aos requisitos de min_posts_per_month e min_solutions_per_month para serem considerados ativos no mês.

CTEs

A consulta SQL fornecida usa várias Expressões de Tabela Comuns (CTEs) para detalhar o processo de cálculo de usuários ativos por mês após a inscrição, com base nos critérios mínimos de posts e soluções. Aqui está uma explicação de cada CTE:

user_cohorts

Esta CTE identifica as coortes de usuários com base em seu mês de inscrição. Para cada usuário, ela calcula o mês de sua inscrição (cohort) e conta o número total de usuários que se inscreveram no mesmo mês. Isso ajuda a entender o tamanho inicial de cada coorte.

posts_activity

Esta CTE rastreia a atividade dos usuários em termos de posts feitos após sua inscrição. Para cada post, ela calcula quantos meses se passaram desde a data de registro do usuário (months_after_registration) e agrupa isso pela coorte de inscrição do usuário. Isso é usado para rastrear o quão ativos os usuários estão em termos de postagem de conteúdo ao longo do tempo.

solutions_counts

Esta CTE se concentra na contagem de soluções (respostas aceitas) fornecidas pelos usuários. Ela filtra posts marcados como soluções e os conta para cada usuário, garantindo que apenas posts feitos após a inscrição do usuário sejam considerados. Ela também calcula quantos meses se passaram desde a inscrição do usuário para cada solução. Os usuários são incluídos nesta contagem apenas se atenderem ou excederem o número mínimo especificado de soluções por mês.

activity_counts

Esta CTE agrega o número de posts feitos por cada usuário por mês após o registro. Ela agrupa os usuários por sua coorte de inscrição e o número de meses desde o registro, e então conta o número de posts feitos. Apenas os usuários que atendem ou excedem o número mínimo especificado de posts por mês são incluídos nesta contagem.

active_users

Esta CTE combina os dados de solutions_counts e activity_counts para identificar usuários ativos — aqueles que atendem a ambos os critérios de posts e soluções. Ela conta usuários distintos que estão ativos com base nos critérios definidos para posts e soluções, agrupados por sua coorte de inscrição e o número de meses desde o registro.

cohorts_series

Esta CTE gera uma série de números de 0 a 11, representando o número de meses após o registro. Isso é usado para garantir que o relatório final inclua dados para cada mês até 12 meses, mesmo que não haja usuários ativos em alguns meses.

cohorts

Esta CTE agrega os dados de user_cohorts para obter o número total de usuários que se inscreveram em cada coorte. Ela garante que o relatório final inclua o número total de usuários inscritos para cada coorte.

cross_join

Esta CTE realiza um cross join entre a CTE cohorts e a CTE cohorts_series. Isso garante que cada coorte seja representada para cada mês após a inscrição, facilitando o cálculo de usuários ativos para cada mês na etapa final.

final_counts

Esta CTE combina todas as CTEs anteriores para calcular as contagens finais de usuários ativos para cada mês após a inscrição, para cada coorte. Ela usa um left join para corresponder aos usuários ativos da CTE active_users com as coortes e meses gerados na CTE cross_join. Ela garante que cada par coorte-mês tenha uma contagem de usuários ativos, com valor padrão 0 se não houver usuários ativos para esse par.

SELECT Final

A instrução SELECT final na consulta agrupa os usuários em coortes com base em seu mês e ano de inscrição e, em seguida, calcula o número de usuários ativos para cada mês até um ano após a inscrição. Isso é feito por meio de uma combinação de transformações e agregações condicionais, que pivotam os dados em um formato onde cada linha corresponde a uma coorte e cada coluna representa o número de usuários ativos para cada mês após a inscrição, de “Mês 1” a “Mês 12”.

Resultados

O relatório gera uma tabela com as seguintes colunas:

  • Joined In: O mês e ano da coorte (quando os usuários se inscreveram).
  • Users Signed Up: O número total de usuários que se inscreveram naquela coorte.
  • Month 1 a Month 12: O número de usuários ativos para cada mês após a inscrição, até 12 meses.

Exemplo de Resultados

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

Os resultados completos do relatório gerarão dados de um ano após a start_date.

6 curtidas