Este es un informe de análisis de cohortes de actividad de usuarios en versión SQL, para usar dentro del plugin Data Explorer.
El Informe de Análisis de Cohortes está diseñado para proporcionar a los administradores información sobre la participación de los usuarios a lo largo del tiempo. Al analizar la actividad de los usuarios agrupados por su mes de registro (cohortes), este informe rastrea el número de usuarios activos cada mes después del registro que cumplen con un criterio mínimo de actividad de publicación.
Este informe puede ser un recurso valioso para comprender la retención de usuarios, las tendencias de participación, evaluar la salud de la comunidad y la efectividad de las estrategias de crecimiento de la comunidad.
Informe de Análisis de Cohortes - Usuarios Activos por Mes
--[params]
-- date :start_date = 2023-01-01
-- int :min_posts_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 -- Use the start_date parameter to filter users
),
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
),
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 -- Filter users by the minimum posts per month
),
active_users AS (
SELECT
cohort,
months_after_registration,
COUNT(DISTINCT user_id) AS active_users
FROM activity_counts
GROUP BY cohort, 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 -- Aggregate to get the total users signed up for each cohort
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
Explicación de la consulta SQL
El informe opera segmentando a los usuarios en cohortes según el mes en que se unieron. Luego rastrea estas cohortes para ver cuántos usuarios permanecen activos en los meses siguientes, basándose en un número mínimo definido de publicaciones por mes.
Parámetros
Este informe tiene dos parámetros:
start_date: La fecha de inicio a partir de la cual se consideran los usuarios para el análisis de cohortes. Los usuarios que se unieron después de esta fecha se incluyen en el informe.min_posts_per_month: El número mínimo de publicaciones que un usuario debe realizar en un mes para ser considerado activo durante ese mes.
CTEs
El Informe de Análisis de Cohortes utiliza varias Expresiones Comunes de Tabla (CTEs) para organizar y procesar datos para el análisis. Cada CTE cumple un propósito específico en la consulta general, basándose en las anteriores para producir finalmente el informe final. Aquí hay un desglose de cómo opera cada CTE:
1. user_cohorts
Esta CTE identifica las cohortes basándose en el mes en que los usuarios se unieron. Para cada usuario, calcula la cohorte a la que pertenece truncando su marca de tiempo created_at al mes. También cuenta el número de usuarios que se registraron en cada cohorte.
- Operaciones Clave:
DATE_TRUNC('month', created_at) AS cohort: Trunca la marca de tiempocreated_ata la granularidad del mes, agrupando efectivamente a los usuarios por su mes de registro.COUNT(id) OVER (PARTITION BY DATE_TRUNC('month', created_at)): Cuenta el número de usuarios en cada cohorte.
2. posts_activity
Esta CTE rastrea la actividad de publicación de los usuarios en relación con su fecha de registro. Une las tablas posts y users para asociar cada publicación con el usuario que la realizó y calcula cuántos meses han pasado desde el registro del usuario en el momento de cada publicación.
- Operaciones Clave:
EXTRACT(YEAR FROM AGE(p.created_at, u.created_at)) * 12 + EXTRACT(MONTH FROM AGE(p.created_at, u.created_at)): Calcula el número de meses transcurridos desde el registro del usuario para cada publicación.DATE_TRUNC('month', u.created_at) AS cohort: Identifica la cohorte del usuario basándose en su mes de registro.
3. activity_counts
Esta CTE agrega la actividad de publicación de posts_activity para contar el número de publicaciones que cada usuario realizó en cada mes después del registro. Filtra estos recuentos para incluir solo a los usuarios que cumplen con la actividad mínima de publicación especificada por el parámetro min_posts_per_month.
- Operaciones Clave:
GROUP BY cohort, months_after_registration, user_id: Agrupa los datos por cohorte, meses después del registro y ID de usuario para prepararlos para contar las publicaciones.HAVING COUNT(user_id) >= :min_posts_per_month: Filtra los datos agrupados para incluir solo a los usuarios que realizaron al menos el número mínimo de publicaciones en un mes.
4. active_users
Esta CTE agrega aún más los datos de activity_counts para contar el número de usuarios activos distintos en cada cohorte para cada mes después del registro.
- Operaciones Clave:
COUNT(DISTINCT user_id) AS active_users: Cuenta el número de usuarios activos únicos en cada cohorte para cada mes después del registro.
5. cohorts_series
Esta CTE genera una serie de enteros del 0 al 11, que representan los meses posteriores al registro. Esta serie se utiliza para garantizar que el informe final incluya todos los meses hasta 12 para cada cohorte, incluso si no hay datos de actividad para algunos meses.
- Operaciones Clave:
generate_series(0, 11): Genera una serie de enteros del 0 al 11.
6. cohorts
Esta CTE agrega los datos de user_cohorts para obtener el número total de usuarios registrados para cada cohorte.
- Operaciones Clave:
MAX(users_signed_up) AS users_signed_up: Agrega el número total de usuarios registrados para cada cohorte.
7. cross_join
Esta CTE realiza una unión cruzada entre cohorts y cohorts_series para crear una cuadrícula de todas las combinaciones posibles de cohortes y meses posteriores al registro. Esto garantiza que el informe final incluya filas para cada mes para cada cohorte, facilitando el cálculo de usuarios activos por mes.
8. final_counts
Esta CTE combina los datos de cross_join y active_users para calcular el recuento final de usuarios activos para cada cohorte para cada mes posterior al registro. Utiliza una unión izquierda para garantizar que se incluyan todas las combinaciones de cohortes y meses, incluso si no hay usuarios activos para algunos.
- Operaciones Clave:
COALESCE(au.active_users, 0) AS active_users: Asegura que el informe muestre 0 usuarios activos para combinaciones sin actividad, en lugar de dejarlas en blanco.
La SELECT final fuera de las CTEs luego formatea y presenta estos datos, mostrando el número de usuarios registrados y el número de usuarios activos para cada mes posterior al registro para cada cohorte.
Resultados
El informe genera una tabla con las siguientes columnas:
- Joined In: El mes y año en que se creó la cohorte, lo que indica cuándo se registraron estos usuarios.
- Users Signed Up: El número total de usuarios que se registraron en esa cohorte.
- Month 1 a Month 12: Cada una de estas columnas representa el número de usuarios activos para la cohorte en cada mes subsiguiente después de unirse, hasta 12 meses. Un usuario activo se define como alguien que ha realizado al menos el número mínimo de publicaciones especificado por el parámetro
min_posts_per_month.
Resultados de Ejemplo
| 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 | 120 | 40 | 8 | 4 | 3 | 3 | 3 | 4 | 3 | 2 | 1 | 1 | 4 |
| Feb 2023 | 119 | 40 | 7 | 5 | 3 | 2 | 2 | 7 | 2 | 2 | 2 | 1 | 1 |
| … | … | … | … | … | … | … | … | … | … | … | … | … | … |
Los resultados completos del informe mostrarán datos de un año después de la start_date.